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 922dd9be2e6537fa49b196a3754dad0f7c9bce81..069b8686ddcdfc8dd969de30e0218e30b86ebc8b 100644
--- a/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
+++ b/common/source/java/ch/systemsx/cisd/common/parser/TabFileLoader.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.common.parser;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.InputStream;
@@ -28,6 +29,7 @@ import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.LineIterator;
 import org.apache.commons.lang.StringUtils;
@@ -36,6 +38,7 @@ import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
 import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.common.parser.filter.AlwaysAcceptLineFilter;
 import ch.systemsx.cisd.common.parser.filter.ILineFilter;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 
 /**
  * Convenient class to load (or iterate over) a tab file, a reader or a stream. The loader delivers
@@ -143,17 +146,17 @@ public class TabFileLoader<T>
         assert file != null : "Given file must not be null";
         assert file.isFile() : "Given file '" + file.getAbsolutePath() + "' is not a file.";
 
-        FileReader reader = null;
+        FileInputStream inputStream = null;
         try
         {
-            reader = new FileReader(file);
-            return load(reader);
+            inputStream = FileUtils.openInputStream(file);
+            return load(inputStream);
         } catch (final IOException ex)
         {
             throw new IOExceptionUnchecked(ex);
         } finally
         {
-            IOUtils.closeQuietly(reader);
+            IOUtils.closeQuietly(inputStream);
         }
     }
 
@@ -476,7 +479,8 @@ public class TabFileLoader<T>
 
     private Iterator<Line> createLineIterator(final InputStream stream) throws IOException
     {
-        final LineIterator lineIterator = IOUtils.lineIterator(stream, "UTF-8");
+        final LineIterator lineIterator =
+                IOUtils.lineIterator(stream, UnicodeUtils.DEFAULT_UNICODE_CHARSET);
         final Iterator<Line> iterator = new TabFileLineIterator(lineIterator);
         return iterator;
     }
diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java b/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..5bf5236b4ad7d6c17db6dedd21f746098d15d8da
--- /dev/null
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/UnicodeUtils.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2007 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.common.utilities;
+
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.io.UnsupportedEncodingException;
+
+import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
+
+/**
+ * Utilities for dealing with file encoding.
+ * 
+ * @author Piotr Buczek
+ */
+public final class UnicodeUtils
+{
+    /** default Unicode encoding used for strings - UTF-8 */
+    public static final String DEFAULT_UNICODE_CHARSET = "UTF-8";
+
+    private UnicodeUtils()
+    {
+        // Can not be instantiated.
+    }
+
+    /**
+     * @return {@link Reader} that uses the default Unicode encoding.
+     * @throws EnvironmentFailureException if the encoding is not supported (shouldn't happen).
+     * @see #DEFAULT_UNICODE_CHARSET
+     */
+    public final static Reader createReader(InputStream inputStream)
+            throws EnvironmentFailureException
+    {
+        return createReader(inputStream, DEFAULT_UNICODE_CHARSET);
+    }
+
+    /**
+     * @return {@link Reader} that uses the given encoding.
+     * @throws EnvironmentFailureException if the encoding is not supported.
+     */
+    public final static Reader createReader(InputStream inputStream, String encoding)
+            throws EnvironmentFailureException
+    {
+        try
+        {
+            return new InputStreamReader(inputStream, encoding);
+        } catch (UnsupportedEncodingException ex)
+        {
+            throw new EnvironmentFailureException(ex.getMessage());
+        }
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 3d76de87ee2bad680fa7fd00613a6ce014e5200f..31e3619b9f01ed80fb2422af54df522c61db157a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -16,8 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.server;
 
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
+import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -41,6 +40,7 @@ import ch.systemsx.cisd.common.parser.ParserException;
 import ch.systemsx.cisd.common.servlet.IRequestContextProvider;
 import ch.systemsx.cisd.common.spring.IUncheckedMultipartFile;
 import ch.systemsx.cisd.common.utilities.BeanUtils;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ArchivingResult;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.AttachmentVersions;
@@ -79,7 +79,6 @@ import ch.systemsx.cisd.openbis.generic.client.web.server.translator.UserFailure
 import ch.systemsx.cisd.openbis.generic.client.web.server.util.TSVRenderer;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolderWithPermId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
@@ -1288,18 +1287,9 @@ public final class CommonClientService extends AbstractClientService implements
             final List<VocabularyTerm> results = new ArrayList<VocabularyTerm>();
             for (final IUncheckedMultipartFile multipartFile : uploadedFiles.iterable())
             {
-                StringReader stringReader;
-                try
-                {
-                    stringReader =
-                            new StringReader(new String(multipartFile.getBytes(),
-                                    BasicConstant.UTF_ENCODING));
-                } catch (UnsupportedEncodingException ex)
-                {
-                    throw new UserFailureException(ex.getMessage());
-                }
+                Reader reader = UnicodeUtils.createReader(multipartFile.getInputStream());
                 final List<VocabularyTerm> loadedTerms =
-                        tabFileLoader.load(new DelegatedReader(stringReader, multipartFile
+                        tabFileLoader.load(new DelegatedReader(reader, multipartFile
                                 .getOriginalFilename()));
                 results.addAll(loadedTerms);
             }
@@ -1311,7 +1301,6 @@ public final class CommonClientService extends AbstractClientService implements
             }
             return results;
         }
-
     }
 
     public void addVocabularyTerms(TechId vocabularyId, List<String> vocabularyTerms,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java
index 38b6a1a6dbdfa441c0db6c960dc9a06b2d0c2c79..989f6f3934ea768e53d98b7999d842970e2d2d83 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/FileExportServiceServlet.java
@@ -23,6 +23,7 @@ import org.apache.commons.lang.StringUtils;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
 
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.common.utilities.OSKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientService;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
@@ -51,7 +52,7 @@ public class FileExportServiceServlet extends AbstractFileDownloadServlet
             OSKind osKind = HttpUtils.figureOperatingSystemKind(request);
             String lineSeparator = osKind.getLineSeparator();
             String fileContent = service.getExportTable(exportDataKey, lineSeparator);
-            byte[] value = fileContent.getBytes();
+            byte[] value = fileContent.getBytes(UnicodeUtils.DEFAULT_UNICODE_CHARSET);
             String fileName = "exportedData.txt";
             return new FileContent(value, fileName);
         } else
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java
index 4d12959e56a12651f26dec52ad4073ba44ec258a..ac26dc4a7bf15576330e04d48b049f4d0c0164e0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java
@@ -23,9 +23,6 @@ package ch.systemsx.cisd.openbis.generic.shared.basic;
  */
 public class BasicConstant
 {
-    /** default encoding used for strings - UTF-8 */
-    public static final String UTF_ENCODING = "UTF-8";
-
     /** Maximum length of a file name for uploading data sets to CIFEX. */
     public static final int MAX_LENGTH_OF_FILE_NAME = 250;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java
index ea470420dc63e4db88eb5ef0df8423830dcfc489..675bf2e929e823802f48278dcd57eb496a92d1dd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/parser/BisTabFileLoader.java
@@ -67,8 +67,8 @@ public final class BisTabFileLoader<T> extends TabFileLoader<T>
             final NamedReader namedReader)
     {
         final String message = ex.getMessage();
-        throw UserFailureException.fromTemplate(ERROR_IN_FILE_MESSAGE_FORMAT, namedReader
-                .getReaderName(), message);
+        throw UserFailureException.fromTemplate(ERROR_IN_FILE_MESSAGE_FORMAT,
+                namedReader.getReaderName(), message);
     }
 
     //
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 39828304027871c992a024d53e4d3e19da4da0e0..c96860d886989b123ad4aeb04c04743f2858311b 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
@@ -17,7 +17,7 @@
 package ch.systemsx.cisd.openbis.generic.shared.parser;
 
 import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.Reader;
 import java.io.StringReader;
 import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
-import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchOperationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
@@ -191,9 +191,10 @@ public class SampleUploadSectionsParser
     private static List<FileSection> extractSections(InputStream stream)
     {
         List<FileSection> sections = new ArrayList<FileSection>();
-        InputStreamReader reader = new InputStreamReader(stream);
+        Reader reader = null;
         try
         {
+            reader = UnicodeUtils.createReader(stream);
             LineIterator it = IOUtils.lineIterator(reader);
             StringBuilder sb = null;
             String sectionName = null;
@@ -267,7 +268,7 @@ public class SampleUploadSectionsParser
             } else
             {
                 sampleSections.add(new FileSection(new String(multipartFile.getBytes(),
-                        BasicConstant.UTF_ENCODING), sampleType.getCode()));
+                        UnicodeUtils.DEFAULT_UNICODE_CHARSET), sampleType.getCode()));
             }
             int sampleCounter = 0;
             for (FileSection fs : sampleSections)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java
index 9b9c6367a817e4d93619ef552f2465ee99a95eef..84427112c89ea6b9054d653d89e1bf8a093e8280 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/DataSetLoader.java
@@ -15,7 +15,6 @@
  */
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.server;
 
-import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -26,6 +25,7 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -61,7 +61,7 @@ public class DataSetLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = new InputStreamReader(file.getInputStream());
+            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
             final List<NewDataSet> loadedMaterials =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newObjects.addAll(loadedMaterials);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java
index 7a2ce897af5e36e30c2d153ec0980fbdb2920927..23b9e0b945f4b56f697fd56841174b68d8be3942 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/ExperimentLoader.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.server;
 
-import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -27,6 +26,7 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewBasicExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -64,7 +64,7 @@ public class ExperimentLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = new InputStreamReader(file.getInputStream());
+            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
             final List<NewBasicExperiment> loadedExperiments =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newExperiments.addAll(loadedExperiments);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java
index ea7f61fc61df827b5867866e5aa35665e5290d13..613a18dd2275e18f23132609e9bf0635821335a9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/MaterialLoader.java
@@ -1,6 +1,5 @@
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.server;
 
-import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -11,6 +10,7 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -41,7 +41,7 @@ public class MaterialLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = new InputStreamReader(file.getInputStream());
+            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
             final List<NewMaterial> loadedMaterials =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newMaterials.addAll(loadedMaterials);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java
index abc6eeff31440fc7074b743e528a480fc3baadff..a5ef23ae77aae32759daada1047589695360416c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/UpdatedExperimentLoader.java
@@ -16,7 +16,6 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.server;
 
-import java.io.InputStreamReader;
 import java.io.Reader;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -27,6 +26,7 @@ import ch.systemsx.cisd.common.parser.IParserObjectFactory;
 import ch.systemsx.cisd.common.parser.IParserObjectFactoryFactory;
 import ch.systemsx.cisd.common.parser.IPropertyMapper;
 import ch.systemsx.cisd.common.parser.ParserException;
+import ch.systemsx.cisd.common.utilities.UnicodeUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BatchRegistrationResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.UpdatedBasicExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.parser.BisTabFileLoader;
@@ -64,7 +64,7 @@ public class UpdatedExperimentLoader
         results = new ArrayList<BatchRegistrationResult>(files.size());
         for (final NamedInputStream file : files)
         {
-            final Reader reader = new InputStreamReader(file.getInputStream());
+            final Reader reader = UnicodeUtils.createReader(file.getInputStream());
             final List<UpdatedBasicExperiment> loadedExperiments =
                     tabFileLoader.load(new DelegatedReader(reader, file.getOriginalFilename()));
             newExperiments.addAll(loadedExperiments);