diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/material/MaterialTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/material/MaterialTranslator.java
index 8e994142241eac4b4af51e72a0d340b2e34f5de3..608e41096851fc9bd6cebdf2e0daee9b792164b4 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/material/MaterialTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/material/MaterialTranslator.java
@@ -42,6 +42,9 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 public class MaterialTranslator extends AbstractCachingTranslator<MaterialPE, Material, MaterialFetchOptions> implements IMaterialTranslator
 {
 
+    @Autowired
+    private IMaterialTypeTranslator typeTranslator;
+
     @Autowired
     private IPropertyTranslator propertyTranslator;
 
@@ -94,5 +97,12 @@ public class MaterialTranslator extends AbstractCachingTranslator<MaterialPE, Ma
             result.setRegistrator(personTranslator.translate(context, materialPe.getRegistrator(), fetchOptions.withRegistrator()));
             result.getFetchOptions().withRegistratorUsing(fetchOptions.withRegistrator());
         }
+
+        if (fetchOptions.hasType())
+        {
+            result.setType(typeTranslator.translate(context, materialPe.getMaterialType(), fetchOptions.withType()));
+            result.getFetchOptions().withTypeUsing(fetchOptions.withType());
+        }
+
     }
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapMaterialTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapMaterialTest.java
index 2b409296fdfc78fc2d44623201a5524817b06030..5b1686a6a4d6d2381f4d0bec3cd9e4d67f031f16 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapMaterialTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapMaterialTest.java
@@ -60,6 +60,8 @@ public class MapMaterialTest extends AbstractDataSetTest
         assertEquals(true, bacteria.getRegistrationDate() != null);
         assertPropertiesNotFetched(bacteria);
 
+        assertEquals(bacteria.getPermId(), bacteriaId);
+
         v3api.logout(sessionToken);
     }
 
@@ -114,6 +116,22 @@ public class MapMaterialTest extends AbstractDataSetTest
 
         assertEquals(selfChildId, childFromProperties.getPermId());
         assertEquals(true, child == childFromProperties);
+    }
+
+    @Test
+    public void testWithType()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        MaterialFetchOptions fetchOptions = new MaterialFetchOptions();
+        fetchOptions.withType();
+
+        MaterialPermId selfId = new MaterialPermId("SRM_1A", "SELF_REF");
+
+        Map<IMaterialId, Material> map = v3api.mapMaterials(sessionToken, Arrays.asList(selfId), fetchOptions);
+
+        Material item = map.get(selfId);
 
+        assertEquals(item.getType().getCode(), "SELF_REF");
     }
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/UpdateMaterialTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/UpdateMaterialTest.java
index c480dce4f468cad0fd6d9747b9ee7727e749b42c..cf9de2caa6ca41377f9e4a6fa90962f17e0579e1 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/UpdateMaterialTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/UpdateMaterialTest.java
@@ -56,4 +56,52 @@ public class UpdateMaterialTest extends AbstractSampleTest
         assertEquals(material.getProperties().get("DESCRIPTION"), description);
     }
 
+    @Test
+    public void testWithMaterialProperties()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        MaterialFetchOptions fetchOptions = new MaterialFetchOptions();
+        fetchOptions.withMaterialProperties().withProperties();
+
+        MaterialPermId selfParentId = new MaterialPermId("SRM_1", "SELF_REF");
+        MaterialPermId selfChildId = new MaterialPermId("SRM_1A", "SELF_REF");
+
+        Map<IMaterialId, Material> map = v3api.mapMaterials(sessionToken, Arrays.asList(selfChildId, selfParentId), fetchOptions);
+
+        Material parent = map.get(selfParentId);
+        Material child = map.get(selfChildId);
+
+        Map<String, Material> materialProperties = parent.getMaterialProperties();
+
+        Material childFromProperties = materialProperties.get("ANY_MATERIAL");
+
+        assertEquals(selfChildId, childFromProperties.getPermId());
+        assertEquals(true, child == childFromProperties);
+    }
+
+    @Test
+    public void testUpdateMaterialProperty()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        MaterialUpdate update = new MaterialUpdate();
+        update.setMaterialId(new MaterialPermId("SRM_1", "SELF_REF"));
+        update.setProperty("ANY_MATERIAL", "1 (GENE)");
+
+        v3api.updateMaterials(sessionToken, Arrays.asList(update));
+
+        MaterialFetchOptions fetchOptions = new MaterialFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withMaterialProperties().withType();
+
+        Map<IMaterialId, Material> map = v3api.mapMaterials(sessionToken, Arrays.asList(update.getMaterialId()), fetchOptions);
+
+        Material material = map.get(update.getMaterialId());
+        assertEquals(material.getProperties().get("ANY_MATERIAL"), "1 (GENE)");
+        Material expectedGene = material.getMaterialProperties().get("ANY_MATERIAL");
+        assertEquals(expectedGene.getCode(), "1");
+        assertEquals(expectedGene.getType().getCode(), "GENE");
+    }
+
 }