diff --git a/api-openbis-java/build.gradle b/api-openbis-java/build.gradle
index dc3bb8dec879c869a07bef02e2b5fa687a98a227..690fdc1c482bcfdc0cb743adf0e5d1c7d6f03966 100644
--- a/api-openbis-java/build.gradle
+++ b/api-openbis-java/build.gradle
@@ -73,10 +73,18 @@ generateTypeScript {
                             "ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria",
                             "ch.ethz.sis.openbis.generic.dssapi.v3.dto.common.operation.IOperationResult",
                             "ch.ethz.sis.openbis.generic.dssapi.v3.dto.service.execute.AbstractExecutionOptionsWithParameters"]
+    mapClasses = "asInterfaces"
     outputKind = 'module'
     outputFileType = 'declarationFile'
-    customTypeNaming = ["ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria:ExternalDmsSearchCriteria", "ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.ExternalDmsSearchCriteria:DSExternalDmsSearchCriteria"]
-    extensionsWithConfiguration = [new ConfiguredExtension(className: 'ch.empa.tsprocessor.MethodExtension', configuration: ['asyncClasses': "[\"ch.ethz.sis.openbis.generic.OpenBIS\"]"])]
+    customTypeNaming = [
+            "ch.ethz.sis.openbis.generic.OpenBIS:facade",
+            "ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.search.ExternalDmsSearchCriteria:ExternalDmsSearchCriteria",
+            "ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.ExternalDmsSearchCriteria:DSExternalDmsSearchCriteria"
+    ]
+    extensionsWithConfiguration = [
+            new ConfiguredExtension(className: 'ch.empa.tsprocessor.MethodExtension', configuration: ['asyncClasses': "[\"ch.ethz.sis.openbis.generic.OpenBIS\"]"]),
+            new ConfiguredExtension(className: 'ch.empa.tsprocessor.OpenBISModuleExtension')
+    ]
     jackson2ModuleDiscovery = true
     outputFile = file('../api-openbis-javascript/src/v3/openbis.d.ts')
 }
diff --git a/lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java b/lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java
new file mode 100644
index 0000000000000000000000000000000000000000..df4c9e48313401c46c6de68bcd1731626922e503
--- /dev/null
+++ b/lib-typescriptprocessor/source/java/ch/empa/tsprocessor/OpenBISModuleExtension.java
@@ -0,0 +1,52 @@
+package ch.empa.tsprocessor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import cz.habarta.typescript.generator.Extension;
+import cz.habarta.typescript.generator.Settings;
+import cz.habarta.typescript.generator.TsType;
+import cz.habarta.typescript.generator.compiler.ModelCompiler;
+import cz.habarta.typescript.generator.compiler.Symbol;
+import cz.habarta.typescript.generator.compiler.TsModelTransformer;
+import cz.habarta.typescript.generator.emitter.EmitterExtensionFeatures;
+import cz.habarta.typescript.generator.emitter.TsBeanCategory;
+import cz.habarta.typescript.generator.emitter.TsBeanModel;
+import cz.habarta.typescript.generator.emitter.TsModel;
+import cz.habarta.typescript.generator.emitter.TsPropertyModel;
+
+public class OpenBISModuleExtension extends Extension
+{
+    @Override public EmitterExtensionFeatures getFeatures()
+    {
+        final EmitterExtensionFeatures features = new EmitterExtensionFeatures();
+        features.generatesRuntimeCode = false;
+        features.generatesModuleCode = true;
+        features.worksWithPackagesMappedToNamespaces = true;
+        features.generatesJaxrsApplicationClient = false;
+        return features;
+    }
+
+    @Override public List<TransformerDefinition> getTransformers()
+    {
+        return List.of(new TransformerDefinition(ModelCompiler.TransformationPhase.AfterDeclarationSorting, (TsModelTransformer) (context, model) ->
+        {
+            List<TsBeanModel> beans = model.getBeans();
+            List<TsPropertyModel> properties = new ArrayList<>();
+
+            for (TsBeanModel bean : beans)
+            {
+                properties.add(new TsPropertyModel(bean.getName().getSimpleName(), new TsType.ReferenceType(bean.getName()), null, true, null));
+            }
+
+            beans.add(new TsBeanModel(null, TsBeanCategory.Data, false, new Symbol("openbis"), null, null, null, null, properties, null, null, null));
+
+            return model.withBeans(beans);
+        }));
+    }
+
+    @Override public void emitElements(final Writer writer, final Settings settings, final boolean exportKeyword, final TsModel model)
+    {
+        writer.writeIndentedLine("export default openbis");
+    }
+}