diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IFileFormatType.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IFileFormatType.java
new file mode 100644
index 0000000000000000000000000000000000000000..81635bf6b982094fd56b1dac0fc00169d6af0d16
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IFileFormatType.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2011 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.jython.api.v1;
+
+/**
+ * @author Kaloyan Enimanev
+ */
+public interface IFileFormatType extends IFileFormatTypeImmutable
+{
+    /**
+     * Set the description for this file format type.
+     */
+    public void setDescription(String description);
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IFileFormatTypeImmutable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IFileFormatTypeImmutable.java
new file mode 100644
index 0000000000000000000000000000000000000000..b397e0b2f9c9a9d090567c3e40e05055182b22f1
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IFileFormatTypeImmutable.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2011 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.jython.api.v1;
+
+/**
+ * @author Kaloyan Enimanev
+ */
+public interface IFileFormatTypeImmutable extends IAbstractType
+{
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IMasterDataRegistrationTransaction.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IMasterDataRegistrationTransaction.java
index 4c9cae53253701b866502c174f70064c964ade6b..13010452ed9f4fe794419054031801ddd986745c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IMasterDataRegistrationTransaction.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/IMasterDataRegistrationTransaction.java
@@ -57,7 +57,7 @@ public interface IMasterDataRegistrationTransaction
     // IVocabulary createNewVocabulary(String code)
     // IVocabularyImmutable getVocabulary(String code)
 
-    // FileTypes not yet implemented
-    // IFileType createFileType(String code)
-    // IFileTypeImmutable getFileType(String code)
+    IFileFormatType createNewFileFormatType(String code);
+
+    IFileFormatTypeImmutable getFileFormatType(String code);
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/EncapsulatedCommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/EncapsulatedCommonServer.java
index f5009fd67da40b1eb8e30941d0eabfc5cddf9649..1122933509b1bb79e625e5071dc8b3babb61fce3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/EncapsulatedCommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/EncapsulatedCommonServer.java
@@ -112,6 +112,17 @@ public class EncapsulatedCommonServer
         return result;
     }
 
+    public List<FileFormatTypeImmutable> listFileFormatTypes()
+    {
+        List<FileFormatTypeImmutable> result = new ArrayList<FileFormatTypeImmutable>();
+        for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType type : commonServer
+                .listFileFormatTypes(sessionToken))
+        {
+            result.add(new FileFormatTypeImmutable(type));
+        }
+        return result;
+    }
+
     public void registerExperimentType(ExperimentTypeImmutable experimentType)
     {
         commonServer.registerExperimentType(sessionToken, experimentType.getExperimentType());
@@ -142,6 +153,11 @@ public class EncapsulatedCommonServer
         commonServer.assignPropertyType(sessionToken, assignment.getAssignment());
     }
 
+    public void registerFileFormatType(FileFormatTypeImmutable fileFormatType)
+    {
+        commonServer.registerFileFormatType(sessionToken, fileFormatType.getFileFormatType());
+    }
+
     public void logout()
     {
         commonServer.logout(sessionToken);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/FileFormatType.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/FileFormatType.java
new file mode 100644
index 0000000000000000000000000000000000000000..ab2440f4bff58c1760739dd7bd153b291c46468c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/FileFormatType.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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.jython.api.v1.impl;
+
+import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IFileFormatType;
+
+/**
+ * @author Kaloyan Enimanev
+ */
+public class FileFormatType extends FileFormatTypeImmutable implements IFileFormatType
+{
+    FileFormatType(String code)
+    {
+        super(code);
+    }
+
+    public void setDescription(String description)
+    {
+        getFileFormatType().setDescription(description);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/FileFormatTypeImmutable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/FileFormatTypeImmutable.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c300433073ae47290d68dcad7e318a5afc63fbc
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/FileFormatTypeImmutable.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2011 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.jython.api.v1.impl;
+
+import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IFileFormatTypeImmutable;
+
+/**
+ * @author Kaloyan Enimanev
+ */
+public class FileFormatTypeImmutable implements IFileFormatTypeImmutable
+{
+
+    private final ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType expType;
+
+    FileFormatTypeImmutable(String code)
+    {
+        this(new ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType());
+        getFileFormatType().setCode(code);
+    }
+
+    FileFormatTypeImmutable(ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType expType)
+    {
+        this.expType = expType;
+    }
+
+    ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType getFileFormatType()
+    {
+        return expType;
+    }
+
+    public String getCode()
+    {
+        return getFileFormatType().getCode();
+    }
+
+    public String getDescription()
+    {
+        return getFileFormatType().getDescription();
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationTransaction.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationTransaction.java
index fe3ac39125264d90981e2e7a8c9aab695e76eff4..90f5cd550c2223a8041fcaaa9986646556d8af18 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationTransaction.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationTransaction.java
@@ -26,6 +26,8 @@ import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IDataSetTypeImmutab
 import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IEntityType;
 import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IExperimentType;
 import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IExperimentTypeImmutable;
+import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IFileFormatType;
+import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IFileFormatTypeImmutable;
 import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IMasterDataRegistrationTransaction;
 import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IMaterialType;
 import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.IMaterialTypeImmutable;
@@ -53,6 +55,8 @@ public class MasterDataRegistrationTransaction implements IMasterDataRegistratio
 
     private final List<PropertyType> createdPropertyTypes = new ArrayList<PropertyType>();
 
+    private final List<FileFormatType> createdFileTypes = new ArrayList<FileFormatType>();
+
     private final List<PropertyAssignment> createdAssignments = new ArrayList<PropertyAssignment>();
 
     private final MasterDataTransactionErrors transactionErrors = new MasterDataTransactionErrors();
@@ -120,6 +124,18 @@ public class MasterDataRegistrationTransaction implements IMasterDataRegistratio
         return findTypeForCode(commonServer.listMaterialTypes(), code);
     }
 
+    public IFileFormatType createNewFileFormatType(String code)
+    {
+        FileFormatType fileFormatType = new FileFormatType(code);
+        createdFileTypes.add(fileFormatType);
+        return fileFormatType;
+    }
+
+    public IFileFormatTypeImmutable getFileFormatType(String code)
+    {
+        return findTypeForCode(commonServer.listFileFormatTypes(), code);
+    }
+
     public IPropertyType createNewPropertyType(String code, DataType dataType)
     {
         PropertyType propertyType = new PropertyType(code, dataType);
@@ -137,22 +153,18 @@ public class MasterDataRegistrationTransaction implements IMasterDataRegistratio
     {
         if (entityType instanceof IExperimentTypeImmutable)
         {
-            return createAssignment(EntityKind.EXPERIMENT, (IExperimentTypeImmutable) entityType,
-                    propertyType);
+            return createAssignment(EntityKind.EXPERIMENT, entityType, propertyType);
         } else if (entityType instanceof ISampleTypeImmutable)
         {
-            return createAssignment(EntityKind.SAMPLE, (ISampleTypeImmutable) entityType,
-                    propertyType);
+            return createAssignment(EntityKind.SAMPLE, entityType, propertyType);
         } else
 
         if (entityType instanceof IDataSetTypeImmutable)
         {
-            return createAssignment(EntityKind.DATA_SET, (IDataSetTypeImmutable) entityType,
-                    propertyType);
+            return createAssignment(EntityKind.DATA_SET, entityType, propertyType);
         } else if (entityType instanceof IMaterialTypeImmutable)
         {
-            return createAssignment(EntityKind.MATERIAL, (IMaterialTypeImmutable) entityType,
-                    propertyType);
+            return createAssignment(EntityKind.MATERIAL, entityType, propertyType);
         }
 
         throw new IllegalArgumentException(
@@ -184,6 +196,7 @@ public class MasterDataRegistrationTransaction implements IMasterDataRegistratio
 
     void commit()
     {
+        registerFileFormatTypes(createdFileTypes);
         registerExperimentTypes(createdExperimentTypes);
         registerSampleTypes(createdSampleTypes);
         registerDataSetTypes(createdDataSetTypes);
@@ -192,6 +205,20 @@ public class MasterDataRegistrationTransaction implements IMasterDataRegistratio
         registerPropertyAssignments(createdAssignments);
     }
 
+    private void registerFileFormatTypes(List<FileFormatType> fileFormatTypes)
+    {
+        for (FileFormatType fileFormatType : fileFormatTypes)
+        {
+            try
+            {
+                commonServer.registerFileFormatType(fileFormatType);
+            } catch (Exception ex)
+            {
+                transactionErrors.addTypeRegistrationError(ex, fileFormatType);
+            }
+        }
+    }
+
     private void registerExperimentTypes(List<ExperimentType> experimentTypes)
     {
         for (ExperimentType experimentType : experimentTypes)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationScriptRunnerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationScriptRunnerTest.java
index 4d81a5e1b91b23319f4dd3911b1706c0e1a6f870..32b01e09b0c476c97abf905efe5ff60f446c3254 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationScriptRunnerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/MasterDataRegistrationScriptRunnerTest.java
@@ -17,6 +17,8 @@
 package ch.systemsx.cisd.openbis.generic.client.jython.api.v1.impl;
 
 import java.io.File;
+import java.util.Arrays;
+import java.util.List;
 
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -31,6 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
@@ -63,7 +66,8 @@ public class MasterDataRegistrationScriptRunnerTest extends AssertJUnit
         EncapsulatedCommonServer encapsulatedServer =
                 new EncapsulatedCommonServer(commonServer, SESSION_TOKEN);
         errorLogger = new AssertingLogger();
-        pluginScriptRunner = new MasterDataRegistrationScriptRunner(encapsulatedServer, errorLogger);
+        pluginScriptRunner =
+                new MasterDataRegistrationScriptRunner(encapsulatedServer, errorLogger);
 
     }
 
@@ -81,9 +85,13 @@ public class MasterDataRegistrationScriptRunnerTest extends AssertJUnit
                 new RecordingMatcher<PropertyType>();
         final RecordingMatcher<NewETPTAssignment> assignmentMatcher =
                 new RecordingMatcher<NewETPTAssignment>();
+        final RecordingMatcher<FileFormatType> fileFormatMatcher =
+                new RecordingMatcher<FileFormatType>();
         context.checking(new Expectations()
             {
                 {
+                    one(commonServer).registerFileFormatType(with(equal(SESSION_TOKEN)),
+                            with(fileFormatMatcher));
                     one(commonServer).registerExperimentType(with(equal(SESSION_TOKEN)),
                             with(experimentTypeMatcher));
                     one(commonServer).registerSampleType(with(equal(SESSION_TOKEN)),
@@ -103,6 +111,11 @@ public class MasterDataRegistrationScriptRunnerTest extends AssertJUnit
         pluginScriptRunner.executeScript(scriptFile);
         errorLogger.assertNumberOfMessage(0);
 
+        assertEquals(1, fileFormatMatcher.getRecordedObjects().size());
+        FileFormatType fileFormatType = fileFormatMatcher.recordedObject();
+        assertEquals("FILE-FORMAT-TYPE", fileFormatType.getCode());
+        assertEquals("File format type description.", fileFormatType.getDescription());
+
         assertEquals(1, experimentTypeMatcher.getRecordedObjects().size());
         ExperimentType experimentType = experimentTypeMatcher.recordedObject();
         assertEquals("EXPERIMENT-TYPE", experimentType.getCode());
@@ -163,6 +176,9 @@ public class MasterDataRegistrationScriptRunnerTest extends AssertJUnit
         context.checking(new Expectations()
             {
                 {
+                    one(commonServer).registerFileFormatType(with(any(String.class)),
+                            with(any(FileFormatType.class)));
+                    will(throwException(new RuntimeException("FAILED0")));
                     one(commonServer).registerExperimentType(with(any(String.class)),
                             with(any(ExperimentType.class)));
                     will(throwException(new RuntimeException("FAILED1")));
@@ -186,22 +202,26 @@ public class MasterDataRegistrationScriptRunnerTest extends AssertJUnit
 
         File scriptFile = getScriptFile("simple-transaction.py");
         pluginScriptRunner.executeScript(scriptFile);
-        errorLogger.assertNumberOfMessage(9);
-        errorLogger.assertMatches(0, LogLevel.ERROR,
-                "Failed to commit all transactions for script .*");
-        errorLogger.assertEq(1, LogLevel.ERROR,
-                "Failed to register type 'EXPERIMENT-TYPE': FAILED1");
-        errorLogger.assertEq(2, LogLevel.ERROR, "Failed to register type 'SAMPLE-TYPE': FAILED2");
-        errorLogger.assertEq(3, LogLevel.ERROR, "Failed to register type 'DATA-SET-TYPE': FAILED3");
-        errorLogger.assertEq(4, LogLevel.ERROR, "Failed to register type 'MATERIAL-TYPE': FAILED4");
-        errorLogger.assertEq(5, LogLevel.ERROR,
-                "Failed to register type 'VARCHAR-PROPERTY-TYPE': FAILED5");
-        errorLogger.assertEq(6, LogLevel.ERROR,
-                "Failed to register type 'MATERIAL-PROPERTY-TYPE': FAILED5");
-        errorLogger.assertEq(7, LogLevel.ERROR,
-                "Failed to assign property 'SAMPLE-TYPE' <-> 'MATERIAL-PROPERTY-TYPE': FAILED6");
-        errorLogger.assertEq(8, LogLevel.ERROR,
-                "Failed to assign property 'EXPERIMENT-TYPE' <-> 'VARCHAR-PROPERTY-TYPE': FAILED6");
+
+        List<String> errorLines =
+                Arrays.asList(
+                        "Failed to commit all transactions for script .*",
+                        "Failed to register type 'FILE-FORMAT-TYPE': FAILED0",
+                        "Failed to register type 'EXPERIMENT-TYPE': FAILED1",
+                        "Failed to register type 'SAMPLE-TYPE': FAILED2",
+                        "Failed to register type 'DATA-SET-TYPE': FAILED3",
+                        "Failed to register type 'MATERIAL-TYPE': FAILED4",
+                        "Failed to register type 'VARCHAR-PROPERTY-TYPE': FAILED5",
+                        "Failed to register type 'MATERIAL-PROPERTY-TYPE': FAILED5",
+                        "Failed to assign property 'SAMPLE-TYPE' <-> 'MATERIAL-PROPERTY-TYPE': FAILED6",
+                        "Failed to assign property 'EXPERIMENT-TYPE' <-> 'VARCHAR-PROPERTY-TYPE': FAILED6");
+
+        errorLogger.assertNumberOfMessage(errorLines.size());
+        errorLogger.assertMatches(0, LogLevel.ERROR, errorLines.get(0));
+        for (int i = 1; i < errorLines.size(); i++)
+        {
+            errorLogger.assertEq(i, LogLevel.ERROR, errorLines.get(i));
+        }
     }
 
     private File getScriptFile(String scriptFilename)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/simple-transaction.py b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/simple-transaction.py
index e0c33fa86757fdcd0f89bab47e2ff1ec792dddb0..28955b66a30f84706bdda5a55b6938f4cdf8e421 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/simple-transaction.py
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/jython/api/v1/impl/simple-transaction.py
@@ -2,6 +2,9 @@ import ch.systemsx.cisd.openbis.generic.client.jython.api.v1.DataType as DataTyp
 
 tr = service.transaction()
 
+fileFormatType = tr.createNewFileFormatType('FILE-FORMAT-TYPE')
+fileFormatType.setDescription('File format type description.')
+
 expType = tr.createNewExperimentType('EXPERIMENT-TYPE')
 expType.setDescription('Experiment type description.')
 
@@ -28,12 +31,6 @@ materialPropertyType.setLabel('MATERIAL')
 materialPropertyType.setMaterialType(materialType)
 materialPropertyType.setManagedInternally(False)
 
-#xmlPropertyType = tr.createNewPropertyType('XML-PROPERTY-TYPE', DataType.XML)
-#xmlPropertyType.setDescription('XML property type description.')
-#xmlPropertyType.setLabel('XML')
-#xmlPropertyType.setXmlSchema('')
-#xmlPropertyType.setTransformation('')
-
 assigment1 = tr.assignPropertyType(sampleType, materialPropertyType)
 assigment1.setMandatory(True)