You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@streampipes.apache.org by ri...@apache.org on 2020/06/04 19:20:37 UTC

[incubator-streampipes] 01/01: [STREAMPIPES-145] Add new serialization layer, add initial skeleton of new Angular-based editor module

This is an automated email from the ASF dual-hosted git repository.

riemer pushed a commit to branch STREAMPIPES-145
in repository https://gitbox.apache.org/repos/asf/incubator-streampipes.git

commit 6fc805fa5abbe4916951353f7c90fc9f02555c0c
Author: Dominik Riemer <ri...@fzi.de>
AuthorDate: Thu Jun 4 21:20:18 2020 +0200

    [STREAMPIPES-145] Add new serialization layer, add initial skeleton of new Angular-based editor module
---
 .../backend/StreamPipesResourceConfig.java         |   37 +-
 .../streampipes/connect/adapter/Adapter.java       |    4 +-
 .../TransformSchemaAdapterPipelineElement.java     |    2 +-
 .../elements/TransformStreamAdapterElement.java    |    4 +-
 .../client/user/ShiroAuthenticationRequest.java    |    4 +
 streampipes-model/pom.xml                          |  151 +-
 .../org/apache/streampipes/model/AdapterType.java  |   16 +
 .../streampipes/model/DataProcessorType.java       |   15 +
 .../org/apache/streampipes/model/DataSinkType.java |   16 +
 .../org/apache/streampipes/model/SpDataStream.java |   14 +-
 .../streampipes/model/annotation/TsIgnore.java     |    7 +-
 .../streampipes/model/annotation/TsModel.java      |    7 +-
 .../model/base/AbstractStreamPipesEntity.java      |   18 +-
 .../model/base/ConsumableStreamPipesEntity.java    |   12 +-
 .../model/base/InvocableStreamPipesEntity.java     |   17 +-
 .../model/base/StreamPipesJsonLdContainer.java     |   10 +-
 .../model/base/UnnamedStreamPipesEntity.java       |   73 +-
 .../streampipes/model/connect/ListDescription.java |   56 -
 .../model/connect/adapter/AdapterDescription.java  |   14 +-
 .../connect/adapter/AdapterSetDescription.java     |    5 +
 .../connect/adapter/AdapterStreamDescription.java  |    5 +
 .../model/connect/grounding/FormatDescription.java |    7 +-
 .../rules/TransformationRuleDescription.java       |    9 +
 .../CreateNestedRuleDescription.java               |    2 +-
 .../{Schema => schema}/DeleteRuleDescription.java  |    2 +-
 .../{Schema => schema}/MoveRuleDescription.java    |    2 +-
 .../{Schema => schema}/RenameRuleDescription.java  |    2 +-
 .../SchemaTransformationRuleDescription.java       |    9 +-
 .../EventRateTransformationRuleDescription.java    |    2 +-
 ...oveDuplicatesTransformationRuleDescription.java |    2 +-
 .../StreamTransformationRuleDescription.java       |    8 +-
 .../value/ValueTransformationRuleDescription.java  |    7 +
 .../model/dashboard/DashboardEntity.java           |   11 +-
 .../model/graph/DataProcessorDescription.java      |    5 +-
 .../model/graph/DataProcessorInvocation.java       |    9 +-
 .../model/graph/DataSinkDescription.java           |    5 +-
 .../model/graph/DataSinkInvocation.java            |    7 +-
 .../model/graph/DataSourceDescription.java         |    9 +-
 .../model/grounding/TopicDefinition.java           |    5 +
 .../model/grounding/TransportProtocol.java         |   12 +-
 .../streampipes/model/output/OutputStrategy.java   |   18 +-
 .../quality/EventPropertyQualityDefinition.java    |    7 +
 .../quality/EventStreamQualityDefinition.java      |    5 +
 .../model/quality/MeasurementProperty.java         |    7 +-
 .../streampipes/model/schema/EventProperty.java    |   14 +-
 .../model/schema/ValueSpecification.java           |    5 +
 .../model/staticproperty/MappingProperty.java      |   13 +-
 .../model/staticproperty/MappingPropertyNary.java  |    5 +-
 .../model/staticproperty/OneOfStaticProperty.java  |    4 +
 .../RuntimeResolvableAnyStaticProperty.java        |    3 +-
 .../RuntimeResolvableOneOfStaticProperty.java      |    3 +-
 .../staticproperty/SelectionStaticProperty.java    |   12 +-
 .../model/staticproperty/StaticProperty.java       |   22 +
 .../streampipes/model/util/RdfIdGenerator.java     |   15 +-
 .../connect/adapter/AdapterDescriptionTest.java    |    6 +-
 .../JacksonSerialized.java}                        |   13 +-
 .../shared/serializer/GsonClientModelProvider.java |    7 +
 .../rest/shared/serializer/GsonJerseyProvider.java |   22 +-
 .../rest/shared/serializer/GsonWithIdProvider.java |    7 +
 .../shared/serializer/GsonWithoutIdProvider.java   |    9 +-
 ...vider.java => JacksonSerializationFeature.java} |   29 +-
 .../rest/shared/serializer/JsonLdProvider.java     |   11 +-
 .../streampipes/rest/shared/util/JsonLdUtils.java  |   25 +-
 .../streampipes/rest/shared/util/SpMediaType.java  |    4 +
 .../rest/impl/OntologyPipelineElement.java         |   23 +-
 .../rest/impl/SemanticEventConsumer.java           |   19 +-
 .../rest/impl/SemanticEventProcessingAgent.java    |   35 +-
 .../rest/impl/SemanticEventProducer.java           |   19 +-
 .../serializers/json/GsonSerializer.java           |   12 +-
 .../jsonld/CustomAnnotationProvider.java           |   14 +-
 .../apache/streampipes/vocabulary/StreamPipes.java |    1 +
 ui/deployment/dev/config.yml                       |    1 +
 ui/deployment/modules.yml                          |   15 +
 .../app/connect/model/CodeInputStaticProperty.ts   |   22 +-
 .../app/connect/model/DataProcessorInvocation.ts   |    8 +-
 ui/src/app/connect/model/DataSinkInvocation.ts     |    8 +-
 ...aSinkInvocation.ts => DataSourceDescription.ts} |   18 +-
 ui/src/app/connect/model/DataStreamDescription.ts  |   11 +-
 .../connect/model/InvocableStreamPipesEntity.ts    |   18 +-
 ui/src/app/connect/model/NamedStreamPipesEntity.ts |    2 +
 .../app/connect/model/UnnamedStreamPipesEntity.ts  |    1 -
 .../app/connect/model/grounding/EventGrounding.ts  |   35 +-
 .../model/grounding/JmsTransportProtocol.ts        |    0
 .../model/grounding/KafkaTransportProtocol.ts      |    0
 .../app/connect/model/grounding/TopicDefinition.ts |   12 +-
 .../app/connect/model/grounding/TransportFormat.ts |   20 +-
 .../TransportProtocol.ts}                          |   24 +-
 .../UserDefinedOutputStrategy.ts}                  |   23 +-
 ui/src/app/core-model/gen/streampipes-model.ts     | 2587 ++++++++++++++++++++
 .../pipeline-assembly.component.css                |    0
 .../pipeline-assembly.component.html               |    0
 .../pipeline-assembly.component.ts                 |   20 +-
 .../pipeline-element-icon-stand.component.css      |    0
 .../pipeline-element-icon-stand.component.html     |   95 +
 .../pipeline-element-icon-stand.component.ts       |  107 +
 .../pipeline-element.component.css                 |    0
 .../pipeline-element.component.html                |   22 +
 .../pipeline-element/pipeline-element.component.ts |   98 +
 ui/src/app/editor-v2/editor.component.css          |    0
 ui/src/app/editor-v2/editor.component.html         |   43 +
 ui/src/app/editor-v2/editor.component.ts           |  104 +
 ui/src/app/editor-v2/editor.module.ts              |   84 +
 ui/src/app/editor-v2/services/editor.service.ts    |   81 +
 .../platform-services/tsonld-serializer.service.ts |   12 +
 ui/src/app/services/image-checker.service.ts       |    3 +
 105 files changed, 3970 insertions(+), 495 deletions(-)

diff --git a/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesResourceConfig.java b/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesResourceConfig.java
index e5b4868..478e7aa 100644
--- a/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesResourceConfig.java
+++ b/streampipes-backend/src/main/java/org/apache/streampipes/backend/StreamPipesResourceConfig.java
@@ -18,41 +18,7 @@
 
 package org.apache.streampipes.backend;
 
-import org.apache.streampipes.rest.impl.ApplicationLink;
-import org.apache.streampipes.rest.impl.AssetDashboard;
-import org.apache.streampipes.rest.impl.Authentication;
-import org.apache.streampipes.rest.impl.AutoComplete;
-import org.apache.streampipes.rest.impl.ConsulConfig;
-import org.apache.streampipes.rest.impl.ContainerProvidedOptions;
-import org.apache.streampipes.rest.impl.Couchdb;
-import org.apache.streampipes.rest.impl.DataStream;
-import org.apache.streampipes.rest.impl.Deployment;
-import org.apache.streampipes.rest.impl.InternalPipelineTemplates;
-import org.apache.streampipes.rest.impl.MeasurementUnitResource;
-import org.apache.streampipes.rest.impl.Notification;
-import org.apache.streampipes.rest.impl.OntologyContext;
-import org.apache.streampipes.rest.impl.OntologyKnowledge;
-import org.apache.streampipes.rest.impl.OntologyMeasurementUnit;
-import org.apache.streampipes.rest.impl.OntologyPipelineElement;
-import org.apache.streampipes.rest.impl.PipelineCache;
-import org.apache.streampipes.rest.impl.PipelineCategory;
-import org.apache.streampipes.rest.impl.PipelineElementAsset;
-import org.apache.streampipes.rest.impl.PipelineElementCategory;
-import org.apache.streampipes.rest.impl.PipelineElementFile;
-import org.apache.streampipes.rest.impl.PipelineElementImport;
-import org.apache.streampipes.rest.impl.PipelineElementRuntimeInfo;
-import org.apache.streampipes.rest.impl.PipelineTemplate;
-import org.apache.streampipes.rest.impl.PipelineWithUserResource;
-import org.apache.streampipes.rest.impl.RdfEndpoint;
-import org.apache.streampipes.rest.impl.SemanticEventConsumer;
-import org.apache.streampipes.rest.impl.SemanticEventProcessingAgent;
-import org.apache.streampipes.rest.impl.SemanticEventProducer;
-import org.apache.streampipes.rest.impl.Setup;
-import org.apache.streampipes.rest.impl.StreamPipesLogs;
-import org.apache.streampipes.rest.impl.User;
-import org.apache.streampipes.rest.impl.Version;
-import org.apache.streampipes.rest.impl.VirtualSensor;
-import org.apache.streampipes.rest.impl.Visualization;
+import org.apache.streampipes.rest.impl.*;
 import org.apache.streampipes.rest.impl.dashboard.Dashboard;
 import org.apache.streampipes.rest.impl.dashboard.DashboardWidget;
 import org.apache.streampipes.rest.impl.dashboard.VisualizablePipeline;
@@ -137,6 +103,7 @@ public class StreamPipesResourceConfig extends ResourceConfig {
     register(GsonWithoutIdProvider.class);
     register(GsonClientModelProvider.class);
     register(JsonLdProvider.class);
+    //register(JacksonFeature.class);
     register(MultiPartFeature.class);
   }
 
diff --git a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/Adapter.java b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/Adapter.java
index d738322..a0f8881 100644
--- a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/Adapter.java
+++ b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/Adapter.java
@@ -35,8 +35,8 @@ import org.apache.streampipes.connect.adapter.preprocessing.elements.TransformSt
 import org.apache.streampipes.connect.adapter.preprocessing.elements.TransformValueAdapterPipelineElement;
 import org.apache.streampipes.model.connect.adapter.AdapterDescription;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
-import org.apache.streampipes.model.connect.rules.Stream.EventRateTransformationRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.RemoveDuplicatesTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.RemoveDuplicatesTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription;
diff --git a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformSchemaAdapterPipelineElement.java b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformSchemaAdapterPipelineElement.java
index 111e711..cd860d0 100644
--- a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformSchemaAdapterPipelineElement.java
+++ b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformSchemaAdapterPipelineElement.java
@@ -25,7 +25,7 @@ import org.apache.streampipes.connect.adapter.preprocessing.Util;
 import org.apache.streampipes.connect.adapter.preprocessing.transform.*;
 import org.apache.streampipes.connect.adapter.preprocessing.transform.schema.*;
 import org.apache.streampipes.model.connect.rules.*;
-import org.apache.streampipes.model.connect.rules.Schema.*;
+import org.apache.streampipes.model.connect.rules.schema.*;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformStreamAdapterElement.java b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformStreamAdapterElement.java
index 065c89b..499c3e0 100644
--- a/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformStreamAdapterElement.java
+++ b/streampipes-connect/src/main/java/org/apache/streampipes/connect/adapter/preprocessing/elements/TransformStreamAdapterElement.java
@@ -24,8 +24,8 @@ import org.apache.streampipes.connect.adapter.model.pipeline.AdapterPipelineElem
 import org.apache.streampipes.connect.adapter.preprocessing.transform.TransformationRule;
 import org.apache.streampipes.connect.adapter.preprocessing.transform.stream.EventRateTransformationRule;
 import org.apache.streampipes.connect.adapter.preprocessing.transform.stream.StreamEventTransformer;
-import org.apache.streampipes.model.connect.rules.Stream.EventRateTransformationRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.StreamTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.StreamTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
 
 import java.util.ArrayList;
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java
index 1fa0a2a..cd620a5 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java
+++ b/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java
@@ -22,6 +22,10 @@ public class ShiroAuthenticationRequest {
 
 	private String username;
 	private String password;
+
+	public ShiroAuthenticationRequest() {
+
+	}
 	
 	public ShiroAuthenticationRequest(String username, String password) {
 		super();
diff --git a/streampipes-model/pom.xml b/streampipes-model/pom.xml
index cd1f2d4..5987518 100644
--- a/streampipes-model/pom.xml
+++ b/streampipes-model/pom.xml
@@ -16,64 +16,111 @@
   ~
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-	<modelVersion>4.0.0</modelVersion>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
 
-	<artifactId>streampipes-model</artifactId>
-	<parent>
-		<groupId>org.apache.streampipes</groupId>
-		<artifactId>streampipes-parent</artifactId>
-		<version>0.67.0-SNAPSHOT</version>
-	</parent>
-	<dependencies>
-		<!-- StreamPipes dependencies -->
-		<dependency>
-			<groupId>org.apache.streampipes</groupId>
-			<artifactId>streampipes-commons</artifactId>
-			<version>0.67.0-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.streampipes</groupId>
-			<artifactId>streampipes-logging</artifactId>
-			<version>0.67.0-SNAPSHOT</version>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.streampipes</groupId>
-			<artifactId>streampipes-vocabulary</artifactId>
-			<version>0.67.0-SNAPSHOT</version>
-		</dependency>
-
-		<!-- External dependencies -->
-		<dependency>
-			<groupId>com.google.code.gson</groupId>
-			<artifactId>gson</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>com.github.drapostolos</groupId>
-			<artifactId>type-parser</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>javax.persistence</groupId>
-			<artifactId>persistence-api</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>io.fogsy</groupId>
-			<artifactId>empire-annotations</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>io.fogsy</groupId>
-			<artifactId>empire-core</artifactId>
-		</dependency>
-		<dependency>
-			<groupId>org.apache.httpcomponents</groupId>
-			<artifactId>httpclient-osgi</artifactId>
-		</dependency>
+    <artifactId>streampipes-model</artifactId>
+    <parent>
+        <groupId>org.apache.streampipes</groupId>
+        <artifactId>streampipes-parent</artifactId>
+        <version>0.67.0-SNAPSHOT</version>
+    </parent>
+    <dependencies>
+        <!-- StreamPipes dependencies -->
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-commons</artifactId>
+            <version>0.67.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-logging</artifactId>
+            <version>0.67.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-vocabulary</artifactId>
+            <version>0.67.0-SNAPSHOT</version>
+        </dependency>
+        <!-- External dependencies -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.drapostolos</groupId>
+            <artifactId>type-parser</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>javax.persistence</groupId>
+            <artifactId>persistence-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.fogsy</groupId>
+            <artifactId>empire-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>io.fogsy</groupId>
+            <artifactId>empire-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient-osgi</artifactId>
+        </dependency>
 
-		<!-- Test dependencies -->
+        <!-- Test dependencies -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
     </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>cz.habarta.typescript-generator</groupId>
+                <artifactId>typescript-generator-maven-plugin</artifactId>
+                <version>2.23.603</version>
+                <executions>
+                    <execution>
+                        <id>generate</id>
+                        <goals>
+                            <goal>generate</goal>
+                        </goals>
+                        <phase>process-classes</phase>
+                    </execution>
+                </executions>
+                <configuration>
+                    <jsonLibrary>jackson2</jsonLibrary>
+                    <classesWithAnnotations>
+                        <annotation>org.apache.streampipes.model.annotation.TsModel</annotation>
+                    </classesWithAnnotations>
+                    <excludePropertyAnnotations>
+                        <annotation>org.apache.streampipes.model.annotation.TsIgnore</annotation>
+                    </excludePropertyAnnotations>
+                    <excludeClasses>
+                        <class>io.fogsy.empire.core.empire.SupportsRdfId</class>
+                        <class>java.io.Serializable</class>
+                    </excludeClasses>
+                    <outputKind>module</outputKind>
+                    <outputFileType>implementationFile</outputFileType>
+                    <outputKind>module</outputKind>
+                    <disableTaggedUnions>false</disableTaggedUnions>
+                    <mapClasses>asClasses</mapClasses>
+                    <sortDeclarations>true</sortDeclarations>
+                    <tsNoCheck>true</tsNoCheck>
+                    <extensions>
+                        <extension>cz.habarta.typescript.generator.ext.JsonDeserializationExtension</extension>
+                    </extensions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
 </project>
\ No newline at end of file
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/AdapterType.java b/streampipes-model/src/main/java/org/apache/streampipes/model/AdapterType.java
index 6272396..e64c450 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/AdapterType.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/AdapterType.java
@@ -17,6 +17,13 @@
  */
 package org.apache.streampipes.model;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.streampipes.model.annotation.TsModel;
+
+@TsModel
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
 public enum AdapterType {
 
   Generic("Generic Adapters", ""),
@@ -37,6 +44,10 @@ public enum AdapterType {
     this.description = description;
   }
 
+  public String getCode() {
+    return this.name();
+  }
+
   public String getLabel() {
     return label;
   }
@@ -44,4 +55,9 @@ public enum AdapterType {
   public String getDescription() {
     return description;
   }
+
+  @JsonCreator
+  public static AdapterType fromString(JsonNode json) {
+    return AdapterType.valueOf(json.get("code").asText());
+  }
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/DataProcessorType.java b/streampipes-model/src/main/java/org/apache/streampipes/model/DataProcessorType.java
index f4940e3..a12275b 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/DataProcessorType.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/DataProcessorType.java
@@ -18,7 +18,13 @@
 
 package org.apache.streampipes.model;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.streampipes.model.annotation.TsModel;
 
+@TsModel
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
 public enum DataProcessorType {
 
 	FILTER("Filter", "b"),
@@ -39,6 +45,10 @@ public enum DataProcessorType {
 		this.description = description;
 	}
 
+	public String getCode() {
+		return this.name();
+	}
+
 	public String getLabel() {
 		return label;
 	}
@@ -46,4 +56,9 @@ public enum DataProcessorType {
 	public String getDescription() {
 		return description;
 	}
+
+	@JsonCreator
+	public static AdapterType fromString(JsonNode json) {
+		return AdapterType.valueOf(json.get("code").asText());
+	}
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/DataSinkType.java b/streampipes-model/src/main/java/org/apache/streampipes/model/DataSinkType.java
index 79f2859..a8a213e 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/DataSinkType.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/DataSinkType.java
@@ -18,6 +18,13 @@
 
 package org.apache.streampipes.model;
 
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.streampipes.model.annotation.TsModel;
+
+@TsModel
+@JsonFormat(shape = JsonFormat.Shape.OBJECT)
 public enum DataSinkType {
 
   VISUALIZATION_CHART("Charts", ""),
@@ -36,6 +43,10 @@ public enum DataSinkType {
     this.description = description;
   }
 
+  public String getCode() {
+    return this.name();
+  }
+
   public String getLabel() {
     return label;
   }
@@ -43,4 +54,9 @@ public enum DataSinkType {
   public String getDescription() {
     return description;
   }
+
+  @JsonCreator
+  public static AdapterType fromString(JsonNode json) {
+    return AdapterType.valueOf(json.get("code").asText());
+  }
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataStream.java b/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataStream.java
index db509f1..f6c09b7 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataStream.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/SpDataStream.java
@@ -18,9 +18,10 @@
 
 package org.apache.streampipes.model;
 
-import org.apache.commons.lang.RandomStringUtils;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
+import org.apache.commons.lang.RandomStringUtils;
 import org.apache.streampipes.model.base.NamedStreamPipesEntity;
 import org.apache.streampipes.model.grounding.EventGrounding;
 import org.apache.streampipes.model.quality.EventStreamQualityDefinition;
@@ -31,18 +32,17 @@ import org.apache.streampipes.model.schema.EventSchema;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
+import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
 @RdfsClass(StreamPipes.DATA_STREAM)
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(SpDataStream.class),
+        @JsonSubTypes.Type(SpDataSet.class)
+})
 public class SpDataStream extends NamedStreamPipesEntity {
 
   private static final long serialVersionUID = -5732549347563182863L;
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/streampipes-model/src/main/java/org/apache/streampipes/model/annotation/TsIgnore.java
similarity index 85%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
copy to streampipes-model/src/main/java/org/apache/streampipes/model/annotation/TsIgnore.java
index 7f22a1b..25a63b8 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/annotation/TsIgnore.java
@@ -1,4 +1,4 @@
-/*
+package org.apache.streampipes.model.annotation;/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -15,9 +15,6 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.shared.util;
 
-public class SpMediaType {
-
-  public static final String JSONLD = "application/ld+json";
+public @interface TsIgnore {
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/streampipes-model/src/main/java/org/apache/streampipes/model/annotation/TsModel.java
similarity index 85%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
copy to streampipes-model/src/main/java/org/apache/streampipes/model/annotation/TsModel.java
index 7f22a1b..3c1e6d3 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/annotation/TsModel.java
@@ -1,4 +1,4 @@
-/*
+package org.apache.streampipes.model.annotation;/*
  * Licensed to the Apache Software Foundation (ASF) under one or more
  * contributor license agreements.  See the NOTICE file distributed with
  * this work for additional information regarding copyright ownership.
@@ -15,9 +15,6 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.shared.util;
 
-public class SpMediaType {
-
-  public static final String JSONLD = "application/ld+json";
+public @interface TsModel {
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/AbstractStreamPipesEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/AbstractStreamPipesEntity.java
index 5034990..85119fb 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/AbstractStreamPipesEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/AbstractStreamPipesEntity.java
@@ -19,14 +19,14 @@
 package org.apache.streampipes.model.base;
 
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.core.empire.SupportsRdfId;
 import io.fogsy.empire.core.empire.annotation.SupportsRdfIdImpl;
-import org.apache.streampipes.vocabulary.RDF;
-import org.apache.streampipes.vocabulary.RDFS;
-import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.vocabulary.SSN;
-import org.apache.streampipes.vocabulary.StreamPipes;
+import org.apache.streampipes.model.annotation.TsModel;
+import org.apache.streampipes.vocabulary.*;
 
 import java.io.Serializable;
 
@@ -38,6 +38,12 @@ import java.io.Serializable;
 @Namespaces({StreamPipes.NS_PREFIX, StreamPipes.NS,
 				"dc",   "http://purl.org/dc/terms/", RDFS.NS_PREFIX, RDFS.NS, RDF.NS_PREFIX, RDF.NS, SO.NS_PREFIX, SO.NS,
 				SSN.NS_PREFIX, SSN.NS})
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, property="@class")
+@JsonSubTypes({
+				@JsonSubTypes.Type(NamedStreamPipesEntity.class),
+				@JsonSubTypes.Type(UnnamedStreamPipesEntity.class)
+})
+@TsModel
 public class AbstractStreamPipesEntity implements SupportsRdfId, Serializable {
 
 	private static final long serialVersionUID = -8593749314663582071L;
@@ -50,6 +56,7 @@ public class AbstractStreamPipesEntity implements SupportsRdfId, Serializable {
 
 	@SuppressWarnings("rawtypes")
 	@Override
+	@JsonIgnore
 	public RdfKey getRdfId() {
 		return myId.getRdfId();
 	}
@@ -57,6 +64,7 @@ public class AbstractStreamPipesEntity implements SupportsRdfId, Serializable {
 
 	@SuppressWarnings("rawtypes")
 	@Override
+	@JsonIgnore
 	public void setRdfId(RdfKey arg0) {
 		myId.setRdfId(arg0);	
 	}
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/ConsumableStreamPipesEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/ConsumableStreamPipesEntity.java
index 569b5a2..04bafaa 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/ConsumableStreamPipesEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/ConsumableStreamPipesEntity.java
@@ -18,21 +18,27 @@
 
 package org.apache.streampipes.model.base;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import org.apache.streampipes.model.SpDataStream;
+import org.apache.streampipes.model.graph.DataProcessorDescription;
+import org.apache.streampipes.model.graph.DataSinkDescription;
 import org.apache.streampipes.model.grounding.EventGrounding;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
+import java.util.ArrayList;
+import java.util.List;
 
+@JsonSubTypes({
+        @JsonSubTypes.Type(DataProcessorDescription.class),
+        @JsonSubTypes.Type(DataSinkDescription.class)
+})
 public abstract class ConsumableStreamPipesEntity extends NamedStreamPipesEntity {
 
   private static final long serialVersionUID = -6617391345752016449L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/InvocableStreamPipesEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/InvocableStreamPipesEntity.java
index 6736149..206e99b 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/InvocableStreamPipesEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/InvocableStreamPipesEntity.java
@@ -18,23 +18,29 @@
 
 package org.apache.streampipes.model.base;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import org.apache.streampipes.logging.LoggerFactory;
 import org.apache.streampipes.logging.api.Logger;
 import org.apache.streampipes.model.SpDataStream;
+import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.model.graph.DataSinkInvocation;
 import org.apache.streampipes.model.grounding.EventGrounding;
 import org.apache.streampipes.model.monitoring.ElementStatusInfoSettings;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
 import javax.persistence.OneToOne;
+import java.util.List;
 
+@JsonSubTypes({
+        @JsonSubTypes.Type(DataProcessorInvocation.class),
+        @JsonSubTypes.Type(DataSinkInvocation.class),
+})
 public abstract class InvocableStreamPipesEntity extends NamedStreamPipesEntity {
 
   private static final long serialVersionUID = 2727573914765473470L;
@@ -57,6 +63,9 @@ public abstract class InvocableStreamPipesEntity extends NamedStreamPipesEntity
   @RdfProperty(StreamPipes.STATUS_INFO_SETTINGS)
   private ElementStatusInfoSettings statusInfoSettings;
 
+  @OneToOne(fetch = FetchType.EAGER,
+          cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+  @RdfProperty(StreamPipes.SUPPORTED_GROUNDING)
   private EventGrounding supportedGrounding;
 
   @RdfProperty(StreamPipes.CORRESPONDING_PIPELINE)
@@ -65,8 +74,12 @@ public abstract class InvocableStreamPipesEntity extends NamedStreamPipesEntity
   @RdfProperty(StreamPipes.CORRESPONDING_USER)
   private String correspondingUser;
 
+  @OneToMany(fetch = FetchType.EAGER,
+          cascade = {CascadeType.ALL})
+  @RdfProperty(StreamPipes.REQUIRES_STREAM)
   private List<SpDataStream> streamRequirements;
 
+  //@RdfProperty(StreamPipes.PE_CONFIGURED)
   private boolean configured;
 
   public InvocableStreamPipesEntity() {
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/StreamPipesJsonLdContainer.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/StreamPipesJsonLdContainer.java
index f1437ac..d6761a8 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/StreamPipesJsonLdContainer.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/StreamPipesJsonLdContainer.java
@@ -18,15 +18,14 @@
 
 package org.apache.streampipes.model.base;
 
-import org.apache.streampipes.vocabulary.StreamPipes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
-
-import java.util.List;
+import org.apache.streampipes.vocabulary.StreamPipes;
 
 import javax.persistence.CascadeType;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.List;
 
 @RdfsClass(StreamPipes.ENTITY_CONTAINER)
 public class StreamPipesJsonLdContainer extends UnnamedStreamPipesEntity {
@@ -45,6 +44,11 @@ public class StreamPipesJsonLdContainer extends UnnamedStreamPipesEntity {
     this.containedElements = containedElements;
   }
 
+  public StreamPipesJsonLdContainer(StreamPipesJsonLdContainer other) {
+    super(other);
+    this.containedElements = other.getContainedElements();
+  }
+
   public List<? extends AbstractStreamPipesEntity> getContainedElements() {
     return containedElements;
   }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/UnnamedStreamPipesEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/UnnamedStreamPipesEntity.java
index d6e38da..68ac6bc 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/UnnamedStreamPipesEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/UnnamedStreamPipesEntity.java
@@ -19,31 +19,90 @@
 package org.apache.streampipes.model.base;
 
 
-import org.apache.commons.lang.RandomStringUtils;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfId;
 import io.fogsy.empire.annotations.RdfProperty;
+import org.apache.streampipes.model.annotation.TsIgnore;
+import org.apache.streampipes.model.connect.guess.DomainPropertyProbability;
+import org.apache.streampipes.model.connect.guess.DomainPropertyProbabilityList;
+import org.apache.streampipes.model.connect.guess.GuessSchema;
+import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
+import org.apache.streampipes.model.connect.worker.ConnectWorkerContainer;
+import org.apache.streampipes.model.dashboard.DashboardEntity;
+import org.apache.streampipes.model.dashboard.DashboardWidgetSettings;
+import org.apache.streampipes.model.datalake.DataLakeMeasure;
+import org.apache.streampipes.model.grounding.*;
+import org.apache.streampipes.model.monitoring.ElementStatusInfoSettings;
+import org.apache.streampipes.model.output.OutputStrategy;
+import org.apache.streampipes.model.output.PropertyRenameRule;
+import org.apache.streampipes.model.output.TransformOperation;
+import org.apache.streampipes.model.quality.*;
+import org.apache.streampipes.model.runtime.RuntimeOptionsRequest;
+import org.apache.streampipes.model.schema.EventProperty;
+import org.apache.streampipes.model.schema.EventSchema;
+import org.apache.streampipes.model.schema.ValueSpecification;
+import org.apache.streampipes.model.staticproperty.Option;
+import org.apache.streampipes.model.staticproperty.PropertyValueSpecification;
+import org.apache.streampipes.model.staticproperty.StaticProperty;
+import org.apache.streampipes.model.staticproperty.SupportedProperty;
+import org.apache.streampipes.model.template.BoundPipelineElement;
+import org.apache.streampipes.model.template.PipelineTemplateDescriptionContainer;
+import org.apache.streampipes.model.template.PipelineTemplateInvocation;
+import org.apache.streampipes.model.util.RdfIdGenerator;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
 /**
  * unnamed SEPA elements (that do not require any readable identifier)
  */
+@JsonSubTypes({
+        @JsonSubTypes.Type(StreamPipesJsonLdContainer.class),
+        @JsonSubTypes.Type(DomainPropertyProbability.class),
+        @JsonSubTypes.Type(DomainPropertyProbabilityList.class),
+        @JsonSubTypes.Type(GuessSchema.class),
+        @JsonSubTypes.Type(TransformationRuleDescription.class),
+        @JsonSubTypes.Type(ConnectWorkerContainer.class),
+        @JsonSubTypes.Type(DashboardEntity.class),
+        @JsonSubTypes.Type(DashboardWidgetSettings.class),
+        @JsonSubTypes.Type(DataLakeMeasure.class),
+        @JsonSubTypes.Type(EventGrounding.class),
+        @JsonSubTypes.Type(TopicDefinition.class),
+        @JsonSubTypes.Type(TransportFormat.class),
+        @JsonSubTypes.Type(TransportProtocol.class),
+        @JsonSubTypes.Type(WildcardTopicMapping.class),
+        @JsonSubTypes.Type(ElementStatusInfoSettings.class),
+        @JsonSubTypes.Type(OutputStrategy.class),
+        @JsonSubTypes.Type(PropertyRenameRule.class),
+        @JsonSubTypes.Type(TransformOperation.class),
+        @JsonSubTypes.Type(EventPropertyQualityRequirement.class),
+        @JsonSubTypes.Type(EventStreamQualityRequirement.class),
+        @JsonSubTypes.Type(MeasurementCapability.class),
+        @JsonSubTypes.Type(MeasurementObject.class),
+        @JsonSubTypes.Type(MeasurementProperty.class),
+        @JsonSubTypes.Type(RuntimeOptionsRequest.class),
+        @JsonSubTypes.Type(EventProperty.class),
+        @JsonSubTypes.Type(EventSchema.class),
+        @JsonSubTypes.Type(ValueSpecification.class),
+        @JsonSubTypes.Type(Option.class),
+        @JsonSubTypes.Type(PropertyValueSpecification.class),
+        @JsonSubTypes.Type(StaticProperty.class),
+        @JsonSubTypes.Type(SupportedProperty.class),
+        @JsonSubTypes.Type(BoundPipelineElement.class),
+        @JsonSubTypes.Type(PipelineTemplateDescriptionContainer.class),
+        @JsonSubTypes.Type(PipelineTemplateInvocation.class),
+})
 public abstract class UnnamedStreamPipesEntity extends AbstractStreamPipesEntity {
 
   private static final long serialVersionUID = 8051137255998890188L;
 
-  private static final String prefix = "urn:streampipes.org:spi:";
-
   @RdfId
   @RdfProperty(StreamPipes.HAS_ELEMENT_NAME)
+  @TsIgnore
   private String elementId;
 
 
   public UnnamedStreamPipesEntity() {
     super();
-    this.elementId = prefix
-            + this.getClass().getSimpleName().toLowerCase()
-            + ":"
-            + RandomStringUtils.randomAlphabetic(6);
+    this.elementId = RdfIdGenerator.makeRdfId(this);
   }
 
   public UnnamedStreamPipesEntity(UnnamedStreamPipesEntity other) {
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/ListDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/ListDescription.java
deleted file mode 100644
index 9dc35c6..0000000
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/ListDescription.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.streampipes.model.connect;
-
-import io.fogsy.empire.annotations.Namespaces;
-import io.fogsy.empire.annotations.RdfProperty;
-import io.fogsy.empire.annotations.RdfsClass;
-import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
-import java.util.ArrayList;
-import java.util.List;
-
-@Namespaces({"sp", "https://streampipes.org/vocabulary/v1/\""})
-@RdfsClass("sp:List")
-@Entity
-public class ListDescription <T> extends UnnamedStreamPipesEntity {
-    // TODO not sure if I can deserialize it in the client
-
-    @OneToMany(fetch = FetchType.EAGER,
-            cascade = {CascadeType.ALL})
-    @RdfProperty("sp:list")
-    private List<T> list;
-
-    public ListDescription() {
-        super();
-        list = new ArrayList<>();
-    }
-
-    public List<T> getList() {
-        return list;
-    }
-
-    public void setList(List<T> list) {
-        this.list = list;
-    }
-}
\ No newline at end of file
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterDescription.java
index 9549433..d6805c4 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterDescription.java
@@ -18,14 +18,15 @@
 
 package org.apache.streampipes.model.connect.adapter;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.google.gson.annotations.SerializedName;
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.NamedStreamPipesEntity;
-import org.apache.streampipes.model.connect.rules.Schema.SchemaTransformationRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.StreamTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.SchemaTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.StreamTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.ValueTransformationRuleDescription;
 import org.apache.streampipes.model.grounding.EventGrounding;
 import org.apache.streampipes.model.grounding.KafkaTransportProtocol;
@@ -35,17 +36,20 @@ import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 
 @Namespaces({"sp", "https://streampipes.org/vocabulary/v1/"})
 @RdfsClass("sp:AdapterDescription")
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(AdapterSetDescription.class),
+        @JsonSubTypes.Type(AdapterStreamDescription.class)
+})
 public abstract class AdapterDescription extends NamedStreamPipesEntity {
 
     @RdfProperty("sp:couchDBId")
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterSetDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterSetDescription.java
index 457ca9e..5a20ef7 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterSetDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterSetDescription.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.connect.adapter;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
@@ -28,6 +29,10 @@ import javax.persistence.Entity;
 @Namespaces({"sp", "https://streampipes.org/vocabulary/v1/"})
 @RdfsClass("sp:AdapterSetDescription")
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(GenericAdapterSetDescription.class),
+        @JsonSubTypes.Type(SpecificAdapterSetDescription.class)
+})
 public abstract class AdapterSetDescription extends AdapterDescription {
 
     public AdapterSetDescription() {
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterStreamDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterStreamDescription.java
index 52c4d05..2dd8de0 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterStreamDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/adapter/AdapterStreamDescription.java
@@ -17,6 +17,7 @@
  */
 
 package org.apache.streampipes.model.connect.adapter;
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
@@ -28,6 +29,10 @@ import javax.persistence.Entity;
 @Namespaces({"sp", "https://streampipes.org/vocabulary/v1/"})
 @RdfsClass(StreamPipes.ADAPTER_STREAM_DESCRIPTION)
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(SpecificAdapterStreamDescription.class),
+        @JsonSubTypes.Type(SpecificAdapterStreamDescription.class)
+})
 public abstract class AdapterStreamDescription extends AdapterDescription {
 
     @RdfProperty("sp:hasDataStream")
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/grounding/FormatDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/grounding/FormatDescription.java
index 2a8ae58..6c0fac4 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/grounding/FormatDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/grounding/FormatDescription.java
@@ -26,13 +26,12 @@ import org.apache.streampipes.model.base.NamedStreamPipesEntity;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.util.Cloner;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 
 
 @Namespaces({"sp", "https://streampipes.org/vocabulary/v1/"})
@@ -40,8 +39,6 @@ import javax.persistence.OneToMany;
 @Entity
 public class FormatDescription extends NamedStreamPipesEntity {
 
-
-
     @OneToMany(fetch = FetchType.EAGER,
             cascade = {CascadeType.ALL})
     @RdfProperty("sp:config")
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/TransformationRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/TransformationRuleDescription.java
index 55c611d..e7df785 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/TransformationRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/TransformationRuleDescription.java
@@ -18,9 +18,13 @@
 
 package org.apache.streampipes.model.connect.rules;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
+import org.apache.streampipes.model.connect.rules.schema.SchemaTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.StreamTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.value.ValueTransformationRuleDescription;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
 import javax.persistence.Entity;
@@ -28,6 +32,11 @@ import javax.persistence.Entity;
 @Namespaces({StreamPipes.NS_PREFIX, StreamPipes.NS})
 @RdfsClass(StreamPipes.TRANSFORM_RULE_DESCRIPTION)
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(ValueTransformationRuleDescription.class),
+        @JsonSubTypes.Type(StreamTransformationRuleDescription.class),
+        @JsonSubTypes.Type(SchemaTransformationRuleDescription.class),
+})
 public abstract class TransformationRuleDescription extends UnnamedStreamPipesEntity {
 
 
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/CreateNestedRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/CreateNestedRuleDescription.java
similarity index 96%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/CreateNestedRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/CreateNestedRuleDescription.java
index 9780e2a..6390cc6 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/CreateNestedRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/CreateNestedRuleDescription.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+package org.apache.streampipes.model.connect.rules.schema;
 
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/DeleteRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/DeleteRuleDescription.java
similarity index 96%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/DeleteRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/DeleteRuleDescription.java
index f2c53e6..0c3aad7 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/DeleteRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/DeleteRuleDescription.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+package org.apache.streampipes.model.connect.rules.schema;
 
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/MoveRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/MoveRuleDescription.java
similarity index 97%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/MoveRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/MoveRuleDescription.java
index fcd0372..f8402c3 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/MoveRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/MoveRuleDescription.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+package org.apache.streampipes.model.connect.rules.schema;
 
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/RenameRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/RenameRuleDescription.java
similarity index 97%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/RenameRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/RenameRuleDescription.java
index dd881c6..b38dd8e 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/RenameRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/RenameRuleDescription.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+package org.apache.streampipes.model.connect.rules.schema;
 
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/SchemaTransformationRuleDescription.java
similarity index 76%
copy from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java
copy to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/SchemaTransformationRuleDescription.java
index 79123f7..45a5b9b 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/schema/SchemaTransformationRuleDescription.java
@@ -16,10 +16,17 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+package org.apache.streampipes.model.connect.rules.schema;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
 
+@JsonSubTypes({
+        @JsonSubTypes.Type(CreateNestedRuleDescription.class),
+        @JsonSubTypes.Type(DeleteRuleDescription.class),
+        @JsonSubTypes.Type(RenameRuleDescription.class),
+        @JsonSubTypes.Type(MoveRuleDescription.class),
+})
 public abstract class SchemaTransformationRuleDescription extends TransformationRuleDescription {
 
     public SchemaTransformationRuleDescription() {
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/EventRateTransformationRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/EventRateTransformationRuleDescription.java
similarity index 97%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/EventRateTransformationRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/EventRateTransformationRuleDescription.java
index f557bb1..5465844 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/EventRateTransformationRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/EventRateTransformationRuleDescription.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Stream;
+package org.apache.streampipes.model.connect.rules.stream;
 
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/RemoveDuplicatesTransformationRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/RemoveDuplicatesTransformationRuleDescription.java
similarity index 96%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/RemoveDuplicatesTransformationRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/RemoveDuplicatesTransformationRuleDescription.java
index d847569..24c4b00 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/RemoveDuplicatesTransformationRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/RemoveDuplicatesTransformationRuleDescription.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Stream;
+package org.apache.streampipes.model.connect.rules.stream;
 
 import io.fogsy.empire.annotations.Namespaces;
 import io.fogsy.empire.annotations.RdfProperty;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/StreamTransformationRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/StreamTransformationRuleDescription.java
similarity index 80%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/StreamTransformationRuleDescription.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/StreamTransformationRuleDescription.java
index 05bc7d4..5e6bca2 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Stream/StreamTransformationRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/stream/StreamTransformationRuleDescription.java
@@ -16,11 +16,15 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Stream;
+package org.apache.streampipes.model.connect.rules.stream;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
 
-
+@JsonSubTypes({
+        @JsonSubTypes.Type(EventRateTransformationRuleDescription.class),
+        @JsonSubTypes.Type(RemoveDuplicatesTransformationRuleDescription.class),
+})
 public abstract class StreamTransformationRuleDescription extends TransformationRuleDescription {
 
     public StreamTransformationRuleDescription() {
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/value/ValueTransformationRuleDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/value/ValueTransformationRuleDescription.java
index abbffdd..0729606 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/value/ValueTransformationRuleDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/value/ValueTransformationRuleDescription.java
@@ -18,8 +18,15 @@
 
 package org.apache.streampipes.model.connect.rules.value;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
 
+@JsonSubTypes({
+        @JsonSubTypes.Type(AddTimestampRuleDescription.class),
+        @JsonSubTypes.Type(AddValueTransformationRuleDescription.class),
+        @JsonSubTypes.Type(TimestampTranfsformationRuleDescription.class),
+        @JsonSubTypes.Type(UnitTransformRuleDescription.class),
+})
 public abstract class ValueTransformationRuleDescription extends TransformationRuleDescription {
 
     public ValueTransformationRuleDescription() {
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java
index 6e05071..78133d8 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/dashboard/DashboardEntity.java
@@ -18,11 +18,13 @@
 
 package org.apache.streampipes.model.dashboard;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import com.google.gson.annotations.SerializedName;
-import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
-import org.apache.streampipes.vocabulary.StreamPipes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
+import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
+import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
+import org.apache.streampipes.vocabulary.StreamPipes;
 
 import javax.persistence.Entity;
 import javax.persistence.MappedSuperclass;
@@ -30,6 +32,11 @@ import javax.persistence.MappedSuperclass;
 @RdfsClass(StreamPipes.DASHBOARD_ENTITY)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(DashboardWidgetModel.class),
+        @JsonSubTypes.Type(VisualizablePipeline.class),
+        @JsonSubTypes.Type(DataExplorerWidgetModel.class)
+})
 public abstract class DashboardEntity extends UnnamedStreamPipesEntity {
 
   @RdfProperty("sp:couchDbId")
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorDescription.java
index 75e6afc..0921ed4 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorDescription.java
@@ -27,13 +27,12 @@ import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 
 @RdfsClass(StreamPipes.DATA_PROCESSOR_DESCRIPTION)
 @Entity
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorInvocation.java b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorInvocation.java
index 043ec09..fbaafe7 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorInvocation.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataProcessorInvocation.java
@@ -25,18 +25,14 @@ import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
 import org.apache.streampipes.model.output.OutputStrategy;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.util.Cloner;
+import org.apache.streampipes.model.util.RdfIdGenerator;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
+import javax.persistence.*;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
 @RdfsClass(StreamPipes.DATA_PROCESSOR_INVOCATION)
 @Entity
 public class DataProcessorInvocation extends InvocableStreamPipesEntity implements Serializable {
@@ -74,6 +70,7 @@ public class DataProcessorInvocation extends InvocableStreamPipesEntity implemen
     this.setStreamRequirements(sepa.getSpDataStreams());
     this.setAppId(sepa.getAppId());
     this.setIncludesAssets(sepa.isIncludesAssets());
+    this.setElementId(RdfIdGenerator.makeRdfId(this));
     //this.setUri(belongsTo +"/" +getElementId());
   }
 
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkDescription.java
index 909d738..3b7b4d6 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkDescription.java
@@ -24,13 +24,12 @@ import org.apache.streampipes.model.base.ConsumableStreamPipesEntity;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 
 @RdfsClass(StreamPipes.DATA_SINK_DESCRIPTION)
 @Entity
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkInvocation.java b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkInvocation.java
index 564c82a..a07dc21 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkInvocation.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSinkInvocation.java
@@ -22,15 +22,15 @@ import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.InvocableStreamPipesEntity;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
+import org.apache.streampipes.model.util.RdfIdGenerator;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 
 @RdfsClass(StreamPipes.DATA_SINK_INVOCATION)
 @Entity
@@ -61,6 +61,7 @@ public class DataSinkInvocation extends InvocableStreamPipesEntity {
     this.setStreamRequirements(sec.getSpDataStreams());
     this.setAppId(sec.getAppId());
     this.setIncludesAssets(sec.isIncludesAssets());
+    this.setElementId(RdfIdGenerator.makeRdfId(this));
     //this.setUri(belongsTo +"/" +getElementId());
   }
 
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSourceDescription.java b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSourceDescription.java
index 8f86f3e..e793829 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSourceDescription.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/graph/DataSourceDescription.java
@@ -21,24 +21,25 @@ package org.apache.streampipes.model.graph;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.SpDataStream;
+import org.apache.streampipes.model.annotation.TsModel;
 import org.apache.streampipes.model.base.NamedStreamPipesEntity;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 
 /**
  * class that represents Semantic Event Producers.
  */
 @RdfsClass(StreamPipes.DATA_SOURCE_DESCRIPTION)
 @Entity
+@TsModel
 public class DataSourceDescription extends NamedStreamPipesEntity {
 
   private static final long serialVersionUID = 5607030219013954697L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TopicDefinition.java b/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TopicDefinition.java
index 89f1ea6..9588096 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TopicDefinition.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TopicDefinition.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.grounding;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
@@ -29,6 +30,10 @@ import javax.persistence.MappedSuperclass;
 @RdfsClass(StreamPipes.TOPIC_DEFINITION)
 @Entity
 @MappedSuperclass
+@JsonSubTypes({
+        @JsonSubTypes.Type(SimpleTopicDefinition.class),
+        @JsonSubTypes.Type(WildcardTopicDefinition.class)
+})
 public abstract class TopicDefinition extends UnnamedStreamPipesEntity {
 
   @RdfProperty(StreamPipes.HAS_ACTUAL_TOPIC_NAME)
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TransportProtocol.java b/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TransportProtocol.java
index 3d65d45..36f2d01 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TransportProtocol.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/grounding/TransportProtocol.java
@@ -18,21 +18,23 @@
 
 package org.apache.streampipes.model.grounding;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToOne;
+import javax.persistence.*;
 
 @RdfsClass(StreamPipes.TRANSPORT_PROTOCOL)
 @Entity
 @MappedSuperclass
+@JsonSubTypes({
+				@JsonSubTypes.Type(JmsTransportProtocol.class),
+				@JsonSubTypes.Type(KafkaTransportProtocol.class),
+				@JsonSubTypes.Type(MqttTransportProtocol.class),
+})
 public abstract class TransportProtocol extends UnnamedStreamPipesEntity {
 	
 	private static final long serialVersionUID = 7625791395504335184L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/output/OutputStrategy.java b/streampipes-model/src/main/java/org/apache/streampipes/model/output/OutputStrategy.java
index 5fdedf3..5916039 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/output/OutputStrategy.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/output/OutputStrategy.java
@@ -18,24 +18,30 @@
 
 package org.apache.streampipes.model.output;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
+import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToMany;
-
 @RdfsClass(StreamPipes.OUTPUT_STRATEGY)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(AppendOutputStrategy.class),
+        @JsonSubTypes.Type(CustomOutputStrategy.class),
+        @JsonSubTypes.Type(CustomTransformOutputStrategy.class),
+        @JsonSubTypes.Type(FixedOutputStrategy.class),
+        @JsonSubTypes.Type(KeepOutputStrategy.class),
+        @JsonSubTypes.Type(ListOutputStrategy.class),
+        @JsonSubTypes.Type(TransformOutputStrategy.class),
+        @JsonSubTypes.Type(UserDefinedOutputStrategy.class),
+})
 public abstract class OutputStrategy extends UnnamedStreamPipesEntity {
 
   private static final long serialVersionUID = 1953204905003864143L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventPropertyQualityDefinition.java b/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventPropertyQualityDefinition.java
index c9feb94..19581da 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventPropertyQualityDefinition.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventPropertyQualityDefinition.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.quality;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
@@ -27,6 +28,12 @@ import javax.persistence.MappedSuperclass;
 @RdfsClass(StreamPipes.EVENT_PROPERTY_QUALITY_DEFINITION)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+				@JsonSubTypes.Type(Accuracy.class),
+				@JsonSubTypes.Type(MeasurementRange.class),
+				@JsonSubTypes.Type(Precision.class),
+				@JsonSubTypes.Type(Resolution.class),
+})
 public abstract class EventPropertyQualityDefinition extends MeasurementProperty /*implements Comparable<EventPropertyQualityDefinition>*/{
 
 	private static final long serialVersionUID = -3849772043514528797L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventStreamQualityDefinition.java b/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventStreamQualityDefinition.java
index bcb161b..1b50c83 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventStreamQualityDefinition.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/quality/EventStreamQualityDefinition.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.quality;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
@@ -27,6 +28,10 @@ import javax.persistence.MappedSuperclass;
 @RdfsClass(StreamPipes.EVENT_STREAM_QUALITY_DEFINITION)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+				@JsonSubTypes.Type(Frequency.class),
+				@JsonSubTypes.Type(Latency.class),
+})
 public class EventStreamQualityDefinition extends MeasurementProperty {
 
 	private static final long serialVersionUID = 6310763356941481868L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/quality/MeasurementProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/quality/MeasurementProperty.java
index d991a1b..5beb21a 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/quality/MeasurementProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/quality/MeasurementProperty.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.quality;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
 import org.apache.streampipes.vocabulary.SSN;
@@ -26,7 +27,11 @@ import javax.persistence.Entity;
 
 @RdfsClass(SSN.MEASUREMENT_PROPERTY)
 @Entity
-public class MeasurementProperty extends UnnamedStreamPipesEntity {
+@JsonSubTypes({
+				@JsonSubTypes.Type(EventPropertyQualityDefinition.class),
+				@JsonSubTypes.Type(EventStreamQualityDefinition.class)
+})
+public abstract class MeasurementProperty extends UnnamedStreamPipesEntity {
 
 	private static final long serialVersionUID = 8527800469513813552L;
 
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/schema/EventProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/schema/EventProperty.java
index 9277395..f3c3bf6 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/schema/EventProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/schema/EventProperty.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.schema;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
@@ -27,21 +28,20 @@ import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.RDFS;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
+import javax.persistence.*;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
 @RdfsClass(StreamPipes.EVENT_PROPERTY)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(EventPropertyList.class),
+        @JsonSubTypes.Type(EventPropertyNested.class),
+        @JsonSubTypes.Type(EventPropertyPrimitive.class)
+})
 public abstract class EventProperty extends UnnamedStreamPipesEntity {
 
   private static final long serialVersionUID = 7079045979946059387L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/schema/ValueSpecification.java b/streampipes-model/src/main/java/org/apache/streampipes/model/schema/ValueSpecification.java
index 0895c14..7ee076c 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/schema/ValueSpecification.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/schema/ValueSpecification.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.schema;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
 import org.apache.streampipes.vocabulary.StreamPipes;
@@ -28,6 +29,10 @@ import javax.persistence.MappedSuperclass;
 @RdfsClass(StreamPipes.VALUE_SPECIFICATION)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+				@JsonSubTypes.Type(QuantitativeValue.class),
+				@JsonSubTypes.Type(Enumeration.class),
+})
 public abstract class ValueSpecification extends UnnamedStreamPipesEntity {
 
 	private static final long serialVersionUID = 1L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingProperty.java
index f8f8b79..2e9ef39 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingProperty.java
@@ -18,23 +18,22 @@
 
 package org.apache.streampipes.model.staticproperty;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
+import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
 @RdfsClass(StreamPipes.MAPPING_PROPERTY)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(MappingPropertyNary.class),
+        @JsonSubTypes.Type(MappingPropertyUnary.class)
+})
 public abstract class MappingProperty extends StaticProperty {
 
   private static final long serialVersionUID = -7849999126274124847L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingPropertyNary.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingPropertyNary.java
index c00d793..9eaf7f0 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingPropertyNary.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/MappingPropertyNary.java
@@ -22,13 +22,12 @@ import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.ArrayList;
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.ArrayList;
+import java.util.List;
 
 @RdfsClass(StreamPipes.MAPPING_PROPERTY_NARY)
 @Entity
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/OneOfStaticProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/OneOfStaticProperty.java
index c75103b..30f9b07 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/OneOfStaticProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/OneOfStaticProperty.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.model.staticproperty;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
@@ -25,6 +26,9 @@ import javax.persistence.Entity;
 
 @RdfsClass(StreamPipes.ONE_OF_STATIC_PROPERTY)
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(RuntimeResolvableOneOfStaticProperty.class),
+})
 public class OneOfStaticProperty extends SelectionStaticProperty {
 
   private static final long serialVersionUID = 3483290363677184344L;
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableAnyStaticProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableAnyStaticProperty.java
index 39edfbd..9cb27ca 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableAnyStaticProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableAnyStaticProperty.java
@@ -21,12 +21,11 @@ import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.List;
 
 @RdfsClass(StreamPipes.RUNTIME_RESOLVABLE_ANY_STATIC_PROPERTY)
 @Entity
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableOneOfStaticProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableOneOfStaticProperty.java
index 6ca0c4c..d03b8fc 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableOneOfStaticProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/RuntimeResolvableOneOfStaticProperty.java
@@ -21,12 +21,11 @@ import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
-import java.util.List;
-
 import javax.persistence.CascadeType;
 import javax.persistence.Entity;
 import javax.persistence.FetchType;
 import javax.persistence.OneToMany;
+import java.util.List;
 
 @RdfsClass(StreamPipes.RUNTIME_RESOLVABLE_ONE_OF_STATIC_PROPERTY)
 @Entity
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/SelectionStaticProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/SelectionStaticProperty.java
index 14b4814..c6e278c 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/SelectionStaticProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/SelectionStaticProperty.java
@@ -17,23 +17,23 @@
  */
 package org.apache.streampipes.model.staticproperty;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
 import org.apache.streampipes.model.util.Cloner;
 import org.apache.streampipes.vocabulary.StreamPipes;
 
+import javax.persistence.*;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToMany;
-
 @RdfsClass(StreamPipes.SELECTION_STATIC_PROPERTY)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(AnyStaticProperty.class),
+        @JsonSubTypes.Type(OneOfStaticProperty.class)
+})
 public abstract class SelectionStaticProperty extends StaticProperty {
 
   @OneToMany(fetch = FetchType.EAGER,
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/StaticProperty.java b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/StaticProperty.java
index 96fd610..95ba91f 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/StaticProperty.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/staticproperty/StaticProperty.java
@@ -18,8 +18,10 @@
 
 package org.apache.streampipes.model.staticproperty;
 
+import com.fasterxml.jackson.annotation.JsonSubTypes;
 import io.fogsy.empire.annotations.RdfProperty;
 import io.fogsy.empire.annotations.RdfsClass;
+import org.apache.streampipes.model.annotation.TsModel;
 import org.apache.streampipes.model.base.UnnamedStreamPipesEntity;
 import org.apache.streampipes.vocabulary.RDFS;
 import org.apache.streampipes.vocabulary.SO;
@@ -31,6 +33,26 @@ import javax.persistence.MappedSuperclass;
 @RdfsClass(StreamPipes.STATIC_PROPERTY)
 @MappedSuperclass
 @Entity
+@JsonSubTypes({
+        @JsonSubTypes.Type(AnyStaticProperty.class),
+        @JsonSubTypes.Type(CodeInputStaticProperty.class),
+        @JsonSubTypes.Type(CollectionStaticProperty.class),
+        @JsonSubTypes.Type(ColorPickerStaticProperty.class),
+        @JsonSubTypes.Type(DomainStaticProperty.class),
+        @JsonSubTypes.Type(FileStaticProperty.class),
+        @JsonSubTypes.Type(FreeTextStaticProperty.class),
+        @JsonSubTypes.Type(MappingPropertyUnary.class),
+        @JsonSubTypes.Type(MappingPropertyNary.class),
+        @JsonSubTypes.Type(MatchingStaticProperty.class),
+        @JsonSubTypes.Type(OneOfStaticProperty.class),
+        @JsonSubTypes.Type(RuntimeResolvableAnyStaticProperty.class),
+        @JsonSubTypes.Type(RuntimeResolvableOneOfStaticProperty.class),
+        @JsonSubTypes.Type(SecretStaticProperty.class),
+        @JsonSubTypes.Type(StaticPropertyAlternative.class),
+        @JsonSubTypes.Type(StaticPropertyAlternatives.class),
+        @JsonSubTypes.Type(StaticPropertyGroup.class),
+})
+@TsModel
 public abstract class StaticProperty extends UnnamedStreamPipesEntity {
 
   private static final long serialVersionUID = 2509153122084646025L;
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/streampipes-model/src/main/java/org/apache/streampipes/model/util/RdfIdGenerator.java
similarity index 67%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
copy to streampipes-model/src/main/java/org/apache/streampipes/model/util/RdfIdGenerator.java
index 7f22a1b..a63243d 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/util/RdfIdGenerator.java
@@ -15,9 +15,18 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.shared.util;
+package org.apache.streampipes.model.util;
 
-public class SpMediaType {
+import org.apache.commons.lang.RandomStringUtils;
 
-  public static final String JSONLD = "application/ld+json";
+public class RdfIdGenerator {
+
+  private static final String prefix = "urn:streampipes.org:spi:";
+
+  public static String makeRdfId(Object obj) {
+    return prefix
+            + obj.getClass().getSimpleName().toLowerCase()
+            + ":"
+            + RandomStringUtils.randomAlphabetic(6);
+  }
 }
diff --git a/streampipes-model/src/test/java/org/apache/streampipes/model/connect/adapter/AdapterDescriptionTest.java b/streampipes-model/src/test/java/org/apache/streampipes/model/connect/adapter/AdapterDescriptionTest.java
index 3aff24d..43ec00d 100644
--- a/streampipes-model/src/test/java/org/apache/streampipes/model/connect/adapter/AdapterDescriptionTest.java
+++ b/streampipes-model/src/test/java/org/apache/streampipes/model/connect/adapter/AdapterDescriptionTest.java
@@ -20,9 +20,9 @@ package org.apache.streampipes.model.connect.adapter;
 
 import org.junit.Before;
 import org.junit.Test;
-import org.apache.streampipes.model.connect.rules.Schema.CreateNestedRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.DeleteRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.MoveRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.CreateNestedRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.MoveRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.UnitTransformRuleDescription;
 
 import java.util.ArrayList;
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/annotation/JacksonSerialized.java
similarity index 67%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
copy to streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/annotation/JacksonSerialized.java
index 7f22a1b..33af951 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/annotation/JacksonSerialized.java
@@ -15,9 +15,16 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.shared.util;
+package org.apache.streampipes.rest.shared.annotation;
 
-public class SpMediaType {
+import javax.ws.rs.NameBinding;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 
-  public static final String JSONLD = "application/ld+json";
+@NameBinding
+@Target({ElementType.TYPE, ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+public @interface JacksonSerialized {
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java
index 092e38e..07eac86 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java
@@ -26,6 +26,8 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Provider;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
 
 @Provider
 @GsonClientModel
@@ -37,4 +39,9 @@ public class GsonClientModelProvider extends GsonJerseyProvider {
     protected Gson getGsonSerializer() {
         return Utils.getGson();
     }
+
+    @Override
+    protected boolean requiredAnnotationsPresent(Annotation[] annotations) {
+        return Arrays.stream(annotations).anyMatch(a -> a.annotationType().equals(GsonClientModel.class));
+    }
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonJerseyProvider.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonJerseyProvider.java
index be3b11c..cd2eac7 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonJerseyProvider.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonJerseyProvider.java
@@ -20,19 +20,14 @@ package org.apache.streampipes.rest.shared.serializer;
 
 import com.google.gson.Gson;
 
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.ext.MessageBodyReader;
 import javax.ws.rs.ext.MessageBodyWriter;
+import java.io.*;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
 
 
 public abstract class GsonJerseyProvider implements MessageBodyWriter<Object>,
@@ -45,7 +40,7 @@ public abstract class GsonJerseyProvider implements MessageBodyWriter<Object>,
     @Override
     public boolean isReadable(Class<?> type, Type genericType,
                               Annotation[] annotations, MediaType mediaType) {
-        return true;
+        return jsonSerialized(mediaType) && requiredAnnotationsPresent(annotations);
     }
 
     @Override
@@ -74,7 +69,7 @@ public abstract class GsonJerseyProvider implements MessageBodyWriter<Object>,
     @Override
     public boolean isWriteable(Class<?> type, Type genericType,
                                Annotation[] annotations, MediaType mediaType) {
-        return true;
+        return jsonSerialized(mediaType) && requiredAnnotationsPresent(annotations);
     }
 
     @Override
@@ -105,4 +100,11 @@ public abstract class GsonJerseyProvider implements MessageBodyWriter<Object>,
             writer.close();
         }
     }
+
+    protected boolean jsonSerialized(MediaType mediaType) {
+        return mediaType.getType().equals(MediaType.APPLICATION_JSON_TYPE.getType()) &&
+                mediaType.getSubtype().equals(MediaType.APPLICATION_JSON_TYPE.getSubtype());
+    }
+
+    protected abstract boolean requiredAnnotationsPresent(Annotation[] annotations);
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithIdProvider.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithIdProvider.java
index 7dab403..cbe1ba6 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithIdProvider.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithIdProvider.java
@@ -27,6 +27,8 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Provider;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
 
 @Provider
 @Priority(1)
@@ -39,4 +41,9 @@ public class GsonWithIdProvider extends GsonJerseyProvider {
     protected Gson getGsonSerializer() {
         return Utils.getGson();
     }
+
+    @Override
+    protected boolean requiredAnnotationsPresent(Annotation[] annotations) {
+        return Arrays.stream(annotations).anyMatch(a -> a.annotationType().equals(GsonWithIds.class));
+    }
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithoutIdProvider.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithoutIdProvider.java
index 12b3633..cd7d5c1 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithoutIdProvider.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonWithoutIdProvider.java
@@ -19,14 +19,16 @@
 package org.apache.streampipes.rest.shared.serializer;
 
 import com.google.gson.Gson;
-import org.apache.streampipes.serializers.json.GsonSerializer;
 import org.apache.streampipes.rest.shared.annotation.GsonWithoutIds;
+import org.apache.streampipes.serializers.json.GsonSerializer;
 
 import javax.annotation.Priority;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.ext.Provider;
+import java.lang.annotation.Annotation;
+import java.util.Arrays;
 
 @Provider
 @Priority(2)
@@ -39,4 +41,9 @@ public class GsonWithoutIdProvider extends GsonJerseyProvider {
     protected Gson getGsonSerializer() {
         return GsonSerializer.getGsonWithIds();
     }
+
+    @Override
+    protected boolean requiredAnnotationsPresent(Annotation[] annotations) {
+        return Arrays.stream(annotations).anyMatch(a -> a.annotationType().equals(GsonWithoutIds.class));
+    }
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JacksonSerializationFeature.java
similarity index 58%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java
copy to streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JacksonSerializationFeature.java
index 092e38e..4c4bf01 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/GsonClientModelProvider.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JacksonSerializationFeature.java
@@ -15,26 +15,25 @@
  * limitations under the License.
  *
  */
-
 package org.apache.streampipes.rest.shared.serializer;
 
-import com.google.gson.Gson;
-import org.apache.streampipes.rest.shared.annotation.GsonClientModel;
-import org.apache.streampipes.serializers.json.Utils;
+import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
+import org.glassfish.jersey.jackson.JacksonFeature;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
+import javax.ws.rs.container.DynamicFeature;
+import javax.ws.rs.container.ResourceInfo;
+import javax.ws.rs.core.FeatureContext;
 import javax.ws.rs.ext.Provider;
+import java.util.Arrays;
 
 @Provider
-@GsonClientModel
-@Produces(MediaType.APPLICATION_JSON)
-@Consumes(MediaType.APPLICATION_JSON)
-public class GsonClientModelProvider extends GsonJerseyProvider {
-
-    @Override
-    protected Gson getGsonSerializer() {
-        return Utils.getGson();
+public class JacksonSerializationFeature implements DynamicFeature {
+  @Override
+  public void configure(ResourceInfo resInfo, FeatureContext ctx) {
+    if (Arrays
+            .stream(resInfo.getResourceMethod().getDeclaredAnnotations())
+            .anyMatch(a -> a.annotationType().equals(JacksonSerialized.class))) {
+      ctx.register(JacksonFeature.class);
     }
+  }
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JsonLdProvider.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JsonLdProvider.java
index f9ccde5..6c5ab5f 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JsonLdProvider.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/serializer/JsonLdProvider.java
@@ -18,7 +18,6 @@
 package org.apache.streampipes.rest.shared.serializer;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.streampipes.rest.shared.annotation.JsonLdSerialized;
 import org.apache.streampipes.rest.shared.util.JsonLdUtils;
 import org.apache.streampipes.rest.shared.util.SpMediaType;
 import org.apache.streampipes.serializers.jsonld.JsonLdTransformer;
@@ -36,7 +35,6 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 
 @Provider
-@JsonLdSerialized
 @Produces(SpMediaType.JSONLD)
 @Consumes(SpMediaType.JSONLD)
 public class JsonLdProvider implements MessageBodyWriter<Object>,
@@ -46,7 +44,7 @@ public class JsonLdProvider implements MessageBodyWriter<Object>,
 
   @Override
   public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-    return true;
+    return jsonLdSerialized(mediaType);
   }
 
   @Override
@@ -60,7 +58,7 @@ public class JsonLdProvider implements MessageBodyWriter<Object>,
 
   @Override
   public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
-    return true;
+    return jsonLdSerialized(mediaType);
   }
 
   @Override
@@ -75,4 +73,9 @@ public class JsonLdProvider implements MessageBodyWriter<Object>,
       writer.write(JsonLdUtils.toJsonLD(o));
     }
   }
+
+  protected boolean jsonLdSerialized(MediaType mediaType) {
+    return mediaType.getType().equals(SpMediaType.JSONLD_TYPE.getType()) &&
+            mediaType.getSubtype().equals(SpMediaType.JSONLD_TYPE.getSubtype());
+  }
 }
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/JsonLdUtils.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/JsonLdUtils.java
index 788005e..f26cf9d 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/JsonLdUtils.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/JsonLdUtils.java
@@ -18,14 +18,18 @@
 
 package org.apache.streampipes.rest.shared.util;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.streampipes.commons.Utils;
 import io.fogsy.empire.core.empire.annotation.InvalidRdfException;
+import org.apache.streampipes.commons.Utils;
+import org.apache.streampipes.model.base.AbstractStreamPipesEntity;
+import org.apache.streampipes.model.base.StreamPipesJsonLdContainer;
 import org.apache.streampipes.serializers.jsonld.JsonLdTransformer;
+import org.eclipse.rdf4j.model.Model;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
+import java.util.List;
 
 public class JsonLdUtils {
 
@@ -33,14 +37,23 @@ public class JsonLdUtils {
 
     public static String toJsonLD(Object o) {
         JsonLdTransformer jsonLdTransformer = new JsonLdTransformer();
-        String result = null;
         try {
-            result = Utils.asString(jsonLdTransformer.toJsonLd(o));
+            if (o instanceof List) {
+                return Utils.asString(createJsonLdContainer(jsonLdTransformer,
+                        (List<? extends AbstractStreamPipesEntity>) o));
+            } else {
+                return Utils.asString(jsonLdTransformer.toJsonLd(o));
+            }
         } catch (IllegalAccessException | InvocationTargetException | InvalidRdfException | ClassNotFoundException e) {
             logger.error("Could not serialize JsonLd", e);
         }
+        return null;
+    }
+
+    private static Model createJsonLdContainer(JsonLdTransformer jsonLdTransformer, List<? extends AbstractStreamPipesEntity> o)
+            throws InvocationTargetException, ClassNotFoundException, InvalidRdfException, IllegalAccessException {
 
-        return result;
+        return jsonLdTransformer.toJsonLd(new StreamPipesJsonLdContainer(o));
     }
 
     public static <T> T fromJsonLd(String json, Class<T> clazz) {
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
index 7f22a1b..dc11779 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
@@ -17,7 +17,11 @@
  */
 package org.apache.streampipes.rest.shared.util;
 
+import javax.ws.rs.core.MediaType;
+
 public class SpMediaType {
 
   public static final String JSONLD = "application/ld+json";
+
+  public static final MediaType JSONLD_TYPE = new MediaType("application", "ld+json");
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyPipelineElement.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyPipelineElement.java
index 2a93575..0f14a6f 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyPipelineElement.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyPipelineElement.java
@@ -18,7 +18,6 @@
 
 package org.apache.streampipes.rest.impl;
 
-import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
@@ -28,21 +27,15 @@ import org.apache.streampipes.model.graph.DataSinkDescription;
 import org.apache.streampipes.model.graph.DataSourceDescription;
 import org.apache.streampipes.rest.api.IOntologyPipelineElement;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
-import org.apache.streampipes.serializers.json.GsonSerializer;
 import org.apache.streampipes.storage.management.StorageManager;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.List;
 
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
 @Path("/v2/ontology")
 public class OntologyPipelineElement extends AbstractRestInterface implements IOntologyPipelineElement {
 
@@ -146,14 +139,4 @@ public class OntologyPipelineElement extends AbstractRestInterface implements IO
 
     return jsonObj;
   }
-
-  private Gson getGson(boolean keepIds) {
-    if (keepIds) {
-      return GsonSerializer.getGsonWithIds();
-    } else {
-      return GsonSerializer.getGsonWithoutIds();
-    }
-  }
-
-
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventConsumer.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventConsumer.java
index 1cafd0d..aec4833 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventConsumer.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventConsumer.java
@@ -26,23 +26,18 @@ import org.apache.streampipes.model.graph.DataSinkDescription;
 import org.apache.streampipes.model.graph.DataSinkInvocation;
 import org.apache.streampipes.rest.api.IPipelineElement;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
+import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
+import org.apache.streampipes.rest.shared.util.SpMediaType;
 import org.apache.streampipes.storage.api.IPipelineElementDescriptionStorage;
 import org.apache.streampipes.storage.rdf4j.filter.Filter;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import java.net.URISyntaxException;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
 @Path("/v2/users/{username}/actions")
 public class SemanticEventConsumer extends AbstractRestInterface implements IPipelineElement {
 
@@ -73,8 +68,8 @@ public class SemanticEventConsumer extends AbstractRestInterface implements IPip
   @GET
   @Path("/own")
   @RequiresAuthentication
-  @Produces(MediaType.APPLICATION_JSON)
-  @GsonWithIds
+  @Produces({MediaType.APPLICATION_JSON, SpMediaType.JSONLD})
+  @JacksonSerialized
   @Override
   public Response getOwn(@PathParam("username") String username) {
     List<DataSinkDescription> secs = Filter.byUri(getPipelineElementRdfStorage().getAllDataSinks(),
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProcessingAgent.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProcessingAgent.java
index 1023fd1..9fa9d12 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProcessingAgent.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProcessingAgent.java
@@ -18,30 +18,24 @@
 
 package org.apache.streampipes.rest.impl;
 
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
 import org.apache.shiro.authz.annotation.RequiresAuthentication;
-
 import org.apache.streampipes.model.client.messages.NotificationType;
 import org.apache.streampipes.model.client.messages.Notifications;
 import org.apache.streampipes.model.graph.DataProcessorDescription;
+import org.apache.streampipes.model.graph.DataProcessorInvocation;
 import org.apache.streampipes.rest.api.IPipelineElement;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
+import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
+import org.apache.streampipes.rest.shared.util.SpMediaType;
 import org.apache.streampipes.storage.rdf4j.filter.Filter;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.stream.Collectors;
+
 @Path("/v2/users/{username}/sepas")
 public class SemanticEventProcessingAgent extends AbstractRestInterface implements IPipelineElement {
 
@@ -72,13 +66,16 @@ public class SemanticEventProcessingAgent extends AbstractRestInterface implemen
 	@GET
 	@Path("/own")
 	@RequiresAuthentication
-	@Produces(MediaType.APPLICATION_JSON)
-	@GsonWithIds
+	@JacksonSerialized
+	@Produces({MediaType.APPLICATION_JSON, SpMediaType.JSONLD})
 	@Override
 	public Response getOwn(@PathParam("username") String username) {
 		List<DataProcessorDescription> sepas = Filter.byUri(getPipelineElementRdfStorage().getAllDataProcessors(),
 				getUserService().getOwnSepaUris(username));
-		List<DataProcessorInvocation> si = sepas.stream().map(s -> new DataProcessorInvocation(new DataProcessorInvocation(s))).collect(Collectors.toList());
+		List<DataProcessorInvocation> si = sepas
+						.stream()
+						.map(s -> new DataProcessorInvocation(new DataProcessorInvocation(s)))
+						.collect(Collectors.toList());
 
 		return ok(si);
 	}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProducer.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProducer.java
index 01cb1c0..d31d0bf 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProducer.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/SemanticEventProducer.java
@@ -25,22 +25,17 @@ import org.apache.streampipes.model.client.messages.Notifications;
 import org.apache.streampipes.model.graph.DataSourceDescription;
 import org.apache.streampipes.rest.api.IPipelineElement;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
+import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
+import org.apache.streampipes.rest.shared.util.SpMediaType;
 import org.apache.streampipes.storage.rdf4j.filter.Filter;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import java.net.URISyntaxException;
 import java.util.List;
 import java.util.stream.Collectors;
 
-import javax.ws.rs.DELETE;
-import javax.ws.rs.FormParam;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
-
 @Path("/v2/users/{username}/sources")
 public class SemanticEventProducer extends AbstractRestInterface implements IPipelineElement {
 
@@ -90,8 +85,8 @@ public class SemanticEventProducer extends AbstractRestInterface implements IPip
 	@GET
 	@Path("/own")
 	@RequiresAuthentication
-	@Produces(MediaType.APPLICATION_JSON)
-	@GsonWithIds
+	@Produces({MediaType.APPLICATION_JSON, SpMediaType.JSONLD})
+	@JacksonSerialized
 	@Override
 	public Response getOwn(@PathParam("username") String username) {
 		List<DataSourceDescription> seps = Filter.byUri(getPipelineElementRdfStorage().getAllDataSources(),
diff --git a/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java b/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
index 088fa68..70c6ca2 100644
--- a/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
+++ b/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/json/GsonSerializer.java
@@ -25,12 +25,12 @@ import com.google.gson.GsonBuilder;
 import org.apache.streampipes.model.*;
 import org.apache.streampipes.model.client.messages.Message;
 import org.apache.streampipes.model.connect.adapter.*;
-import org.apache.streampipes.model.connect.rules.Schema.CreateNestedRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.DeleteRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.MoveRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.RenameRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.EventRateTransformationRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.RemoveDuplicatesTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.CreateNestedRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.MoveRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.RenameRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.RemoveDuplicatesTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription;
diff --git a/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/jsonld/CustomAnnotationProvider.java b/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/jsonld/CustomAnnotationProvider.java
index c881353..8370ef1 100644
--- a/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/jsonld/CustomAnnotationProvider.java
+++ b/streampipes-serializers/src/main/java/org/apache/streampipes/serializers/jsonld/CustomAnnotationProvider.java
@@ -36,12 +36,12 @@ import org.apache.streampipes.model.connect.grounding.ProtocolDescriptionList;
 import org.apache.streampipes.model.connect.guess.DomainPropertyProbability;
 import org.apache.streampipes.model.connect.guess.DomainPropertyProbabilityList;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
-import org.apache.streampipes.model.connect.rules.Schema.CreateNestedRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.DeleteRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.MoveRuleDescription;
-import org.apache.streampipes.model.connect.rules.Schema.RenameRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.EventRateTransformationRuleDescription;
-import org.apache.streampipes.model.connect.rules.Stream.RemoveDuplicatesTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.CreateNestedRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.MoveRuleDescription;
+import org.apache.streampipes.model.connect.rules.schema.RenameRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription;
+import org.apache.streampipes.model.connect.rules.stream.RemoveDuplicatesTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription;
 import org.apache.streampipes.model.connect.rules.value.TimestampTranfsformationRuleDescription;
@@ -64,8 +64,6 @@ import org.apache.streampipes.model.grounding.SimpleTopicDefinition;
 import org.apache.streampipes.model.grounding.TransportFormat;
 import org.apache.streampipes.model.grounding.TransportProtocol;
 import org.apache.streampipes.model.grounding.WildcardTopicDefinition;
-import org.apache.streampipes.model.graph.*;
-import org.apache.streampipes.model.grounding.*;
 import org.apache.streampipes.model.monitoring.ElementStatusInfoSettings;
 import org.apache.streampipes.model.output.*;
 import org.apache.streampipes.model.quality.*;
diff --git a/streampipes-vocabulary/src/main/java/org/apache/streampipes/vocabulary/StreamPipes.java b/streampipes-vocabulary/src/main/java/org/apache/streampipes/vocabulary/StreamPipes.java
index 69b07c2..fb65a75 100644
--- a/streampipes-vocabulary/src/main/java/org/apache/streampipes/vocabulary/StreamPipes.java
+++ b/streampipes-vocabulary/src/main/java/org/apache/streampipes/vocabulary/StreamPipes.java
@@ -395,4 +395,5 @@ public class StreamPipes {
   public static final String HAS_CODE_INPUT = NS + "hasCodeInput";
   public static final String HAS_CODE_TEMPLATE = NS + "hasCodeTemplate";
   public static final String USER_DEFINED_OUTPUT_STRATEGY = NS + "UserDefinedOutputStrategy";
+  public static final String PE_CONFIGURED = NS + "isPeConfigured" ;
 }
diff --git a/ui/deployment/dev/config.yml b/ui/deployment/dev/config.yml
index 568a8c6..3efb6ec 100644
--- a/ui/deployment/dev/config.yml
+++ b/ui/deployment/dev/config.yml
@@ -28,3 +28,4 @@ modules:
   - spDataExplorer
   - spConfiguration
   - spDataExplorer2
+  - spEditor2
diff --git a/ui/deployment/modules.yml b/ui/deployment/modules.yml
index 65231fe..515ecde 100644
--- a/ui/deployment/modules.yml
+++ b/ui/deployment/modules.yml
@@ -170,4 +170,19 @@ spDataExplorer2:
   description: 'data-explorer-v2'
   icon: 'navigation:ic_apps_24px'
   homeImage: '/assets/img/home/configuration.png'
+  admin: false
+spEditor2:
+  ng5: True
+  ng1_templateUrl: ''
+  ng1_controller: ''
+  ng5_moduleName: 'EditorModule'
+  ng5_component: 'EditorComponent'
+  ng5_componentPath: '../editor-v2/editor.component'
+  path: './editor-v2/editor.module'
+  link: 'streampipes.editor2'
+  url: '/editor2'
+  title: 'Editor'
+  description: 'editor-v2'
+  icon: 'action:ic_dashboard_24px'
+  homeImage: '/assets/img/home/configuration.png'
   admin: false
\ No newline at end of file
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java b/ui/src/app/connect/model/CodeInputStaticProperty.ts
similarity index 62%
copy from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java
copy to ui/src/app/connect/model/CodeInputStaticProperty.ts
index 79123f7..20fd079 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java
+++ b/ui/src/app/connect/model/CodeInputStaticProperty.ts
@@ -16,18 +16,24 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+import {RdfsClass} from "../../platform-services/tsonld/RdfsClass";
+import {StaticProperty} from "./StaticProperty";
+import {RdfProperty} from "../../platform-services/tsonld/RdfsProperty";
 
-import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
+@RdfsClass('sp:CodeInputStaticProperty')
+export class CodeInputStaticProperty extends StaticProperty {
 
-public abstract class SchemaTransformationRuleDescription extends TransformationRuleDescription {
+    @RdfProperty('sp:hasLanguage')
+    public language: string;
 
-    public SchemaTransformationRuleDescription() {
-        super();
-    }
+    @RdfProperty('sp:hasCodeTemplate')
+    public codeTemplate: string;
+
+    @RdfProperty('hasCodeInput')
+    public value: string;
 
-    public SchemaTransformationRuleDescription(TransformationRuleDescription other) {
+    constructor() {
         super();
     }
 
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/connect/model/DataProcessorInvocation.ts b/ui/src/app/connect/model/DataProcessorInvocation.ts
index a484525..2060db8 100644
--- a/ui/src/app/connect/model/DataProcessorInvocation.ts
+++ b/ui/src/app/connect/model/DataProcessorInvocation.ts
@@ -21,16 +21,14 @@ import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
 import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
 import {DataStreamDescription} from './DataStreamDescription';
 import {OutputStrategy} from './output/OutputStrategy';
+import {InvocableStreamPipesEntity} from "./InvocableStreamPipesEntity";
 
 @RdfsClass('sp:DataProcessorInvocation')
-export class DataProcessorInvocation {
+export class DataProcessorInvocation extends InvocableStreamPipesEntity {
 
     @RdfId
     public id: string;
 
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#label')
-    public label: string;
-
     @RdfProperty('sp:produces')
     public outputStream: DataStreamDescription;
 
@@ -41,7 +39,7 @@ export class DataProcessorInvocation {
     public category: string[];
 
     constructor(id: string) {
-        this.id = id;
+        super(id);
     }
 
 }
\ No newline at end of file
diff --git a/ui/src/app/connect/model/DataSinkInvocation.ts b/ui/src/app/connect/model/DataSinkInvocation.ts
index a3d9544..a91ddfc 100644
--- a/ui/src/app/connect/model/DataSinkInvocation.ts
+++ b/ui/src/app/connect/model/DataSinkInvocation.ts
@@ -19,18 +19,16 @@
 import {RdfId} from '../../platform-services/tsonld/RdfId';
 import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
 import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
+import {InvocableStreamPipesEntity} from "./InvocableStreamPipesEntity";
 
 @RdfsClass('sp:DataSinkInvocation')
-export class DataSinkInvocation {
+export class DataSinkInvocation extends InvocableStreamPipesEntity {
 
     @RdfId
     public id: string;
 
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#label')
-    public label: string;
-
     constructor(id: string) {
-        this.id = id;
+        super(id);
     }
 
 }
diff --git a/ui/src/app/connect/model/DataSinkInvocation.ts b/ui/src/app/connect/model/DataSourceDescription.ts
similarity index 74%
copy from ui/src/app/connect/model/DataSinkInvocation.ts
copy to ui/src/app/connect/model/DataSourceDescription.ts
index a3d9544..b25a8af 100644
--- a/ui/src/app/connect/model/DataSinkInvocation.ts
+++ b/ui/src/app/connect/model/DataSourceDescription.ts
@@ -16,21 +16,19 @@
  *
  */
 
-import {RdfId} from '../../platform-services/tsonld/RdfId';
 import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
 import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
+import {NamedStreamPipesEntity} from "./NamedStreamPipesEntity";
+import {DataStreamDescription} from "./DataStreamDescription";
 
-@RdfsClass('sp:DataSinkInvocation')
-export class DataSinkInvocation {
+@RdfsClass('sp:DataSourceDescription')
+export class DataSourceDescription extends NamedStreamPipesEntity {
 
-    @RdfId
-    public id: string;
-
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#label')
-    public label: string;
+    @RdfProperty('sp:produces')
+    public spDataStreams: DataStreamDescription[];
 
     constructor(id: string) {
-        this.id = id;
+        super(id);
     }
 
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/connect/model/DataStreamDescription.ts b/ui/src/app/connect/model/DataStreamDescription.ts
index eeb90db..f18acb3 100644
--- a/ui/src/app/connect/model/DataStreamDescription.ts
+++ b/ui/src/app/connect/model/DataStreamDescription.ts
@@ -20,19 +20,14 @@ import {RdfId} from '../../platform-services/tsonld/RdfId';
 import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
 import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
 import {EventSchema} from '../schema-editor/model/EventSchema';
+import {NamedStreamPipesEntity} from "./NamedStreamPipesEntity";
 
 @RdfsClass('sp:DataStream')
-export class DataStreamDescription {
+export class DataStreamDescription extends NamedStreamPipesEntity {
 
     @RdfId
     public id: string;
 
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#label')
-    public label: string;
-
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#description')
-    public description: string;
-
     @RdfProperty('sp:hasUri')
     public uri: string;
 
@@ -40,7 +35,7 @@ export class DataStreamDescription {
     public eventSchema: EventSchema;
 
     constructor(id: string) {
-        this.id = id;
+        super(id);
     }
 
 }
diff --git a/ui/src/app/connect/model/InvocableStreamPipesEntity.ts b/ui/src/app/connect/model/InvocableStreamPipesEntity.ts
index 9a9eae5..3d081ae 100644
--- a/ui/src/app/connect/model/InvocableStreamPipesEntity.ts
+++ b/ui/src/app/connect/model/InvocableStreamPipesEntity.ts
@@ -20,12 +20,14 @@ import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
 import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
 import {NamedStreamPipesEntity} from "./NamedStreamPipesEntity";
 import {StaticProperty} from "./StaticProperty";
+import {DataStreamDescription} from "./DataStreamDescription";
+import {EventGrounding} from "./grounding/EventGrounding";
 
 @RdfsClass('sp:InvocableStreamPipesEntity')
 export class InvocableStreamPipesEntity extends NamedStreamPipesEntity {
 
-    //@RdfProperty('sp:receivesStream')
-    //public inputStreams: Array<SpDataStream>;
+    @RdfProperty('sp:receivesStream')
+    public inputStreams: DataStreamDescription[];
 
     @RdfProperty('sp:hasStaticProperty')
     public staticProperties: Array<StaticProperty>;
@@ -33,9 +35,21 @@ export class InvocableStreamPipesEntity extends NamedStreamPipesEntity {
     @RdfProperty('sp:belongsTo')
     public belongsTo: string;
 
+    @RdfProperty('sp:supportedGrounding')
+    public supportedGrounding: EventGrounding;
+
     @RdfProperty('sp:correspondingPipeline')
     public correspondingPipeline: string;
 
+    @RdfProperty('sp:hasCorrespondingUser')
+    public correspondingUser: string;
+
+    @RdfProperty('sp:requiresStream')
+    public streamRequirements: DataStreamDescription[];
+
+    @RdfProperty('sp:isPeConfigured')
+    public configured: boolean;
+
     constructor(id: string) {
         super(id);
     }
diff --git a/ui/src/app/connect/model/NamedStreamPipesEntity.ts b/ui/src/app/connect/model/NamedStreamPipesEntity.ts
index 7d272da..80cab38 100644
--- a/ui/src/app/connect/model/NamedStreamPipesEntity.ts
+++ b/ui/src/app/connect/model/NamedStreamPipesEntity.ts
@@ -40,6 +40,8 @@ export class NamedStreamPipesEntity {
     @RdfProperty('sp:hasApplicationLink')
     public applicationLinks: Array<ApplicationLink>;
 
+    public type: string;
+
     constructor(uri: string) {
       this.uri = uri;
     }
diff --git a/ui/src/app/connect/model/UnnamedStreamPipesEntity.ts b/ui/src/app/connect/model/UnnamedStreamPipesEntity.ts
index 9d6025d..9864e0a 100644
--- a/ui/src/app/connect/model/UnnamedStreamPipesEntity.ts
+++ b/ui/src/app/connect/model/UnnamedStreamPipesEntity.ts
@@ -22,7 +22,6 @@ import { RdfsClass } from '../../platform-services/tsonld/RdfsClass';
 @RdfsClass('sp:UnnamedStreamPipesEntity')
 export class UnnamedStreamPipesEntity {
 
-
     @RdfId
     public id: string;
 
diff --git a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java b/ui/src/app/connect/model/grounding/EventGrounding.ts
similarity index 56%
copy from streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java
copy to ui/src/app/connect/model/grounding/EventGrounding.ts
index 1fa0a2a..b66b85c 100644
--- a/streampipes-model-client/src/main/java/org/apache/streampipes/model/client/user/ShiroAuthenticationRequest.java
+++ b/ui/src/app/connect/model/grounding/EventGrounding.ts
@@ -16,31 +16,18 @@
  *
  */
 
-package org.apache.streampipes.model.client.user;
+import {RdfsClass} from "../../../platform-services/tsonld/RdfsClass";
+import {UnnamedStreamPipesEntity} from "../UnnamedStreamPipesEntity";
+import {TransportProtocol} from "./TransportProtocol";
+import {RdfProperty} from "../../../platform-services/tsonld/RdfsProperty";
+import {TransportFormat} from "./TransportFormat";
 
-public class ShiroAuthenticationRequest {
+@RdfsClass('sp:DataStreamGrounding')
+export class EventGrounding extends UnnamedStreamPipesEntity {
 
-	private String username;
-	private String password;
-	
-	public ShiroAuthenticationRequest(String username, String password) {
-		super();
-		this.username = username;
-		this.password = password;
-	}
-	
-	public String getUsername() {
-		return username;
-	}
-	public void setUsername(String username) {
-		this.username = username;
-	}
-	public String getPassword() {
-		return password;
-	}
-	public void setPassword(String password) {
-		this.password = password;
-	}
+    @RdfProperty('sp:hasTransportProtocol')
+    public transportProtocols: TransportProtocol[];
 
-	
+    //@RdfProperty('sp:hasTransportFormat')
+    //public transportFormats: TransportFormat[];
 }
diff --git a/ui/src/app/connect/model/grounding/JmsTransportProtocol.ts b/ui/src/app/connect/model/grounding/JmsTransportProtocol.ts
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/app/connect/model/grounding/KafkaTransportProtocol.ts b/ui/src/app/connect/model/grounding/KafkaTransportProtocol.ts
new file mode 100644
index 0000000..e69de29
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/ui/src/app/connect/model/grounding/TopicDefinition.ts
similarity index 67%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
copy to ui/src/app/connect/model/grounding/TopicDefinition.ts
index 7f22a1b..0be2c63 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/ui/src/app/connect/model/grounding/TopicDefinition.ts
@@ -15,9 +15,15 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.shared.util;
 
-public class SpMediaType {
+import {RdfsClass} from "../../../platform-services/tsonld/RdfsClass";
+import {UnnamedStreamPipesEntity} from "../UnnamedStreamPipesEntity";
+import {RdfProperty} from "../../../platform-services/tsonld/RdfsProperty";
+
+@RdfsClass('sp:TopicDefinition')
+export class TopicDefinition extends UnnamedStreamPipesEntity {
+
+    @RdfProperty('sp:hasActualTopicName')
+    public actualTopicName: String;
 
-  public static final String JSONLD = "application/ld+json";
 }
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java b/ui/src/app/connect/model/grounding/TransportFormat.ts
similarity index 64%
rename from streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java
rename to ui/src/app/connect/model/grounding/TransportFormat.ts
index 79123f7..1663c8f 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/connect/rules/Schema/SchemaTransformationRuleDescription.java
+++ b/ui/src/app/connect/model/grounding/TransportFormat.ts
@@ -16,18 +16,14 @@
  *
  */
 
-package org.apache.streampipes.model.connect.rules.Schema;
+import {RdfsClass} from "../../../platform-services/tsonld/RdfsClass";
+import {UnnamedStreamPipesEntity} from "../UnnamedStreamPipesEntity";
+import {RdfProperty} from "../../../platform-services/tsonld/RdfsProperty";
+import {URI} from "../URI";
 
-import org.apache.streampipes.model.connect.rules.TransformationRuleDescription;
-
-public abstract class SchemaTransformationRuleDescription extends TransformationRuleDescription {
-
-    public SchemaTransformationRuleDescription() {
-        super();
-    }
-
-    public SchemaTransformationRuleDescription(TransformationRuleDescription other) {
-        super();
-    }
+@RdfsClass('sp:TransportFormat')
+export class TransportFormat extends UnnamedStreamPipesEntity {
 
+    //@RdfProperty('http://www.w3.org/1999/02/22-rdf-syntax-ns#type')
+    //public rdfType: URI[];
 }
diff --git a/ui/src/app/connect/model/DataSinkInvocation.ts b/ui/src/app/connect/model/grounding/TransportProtocol.ts
similarity index 61%
copy from ui/src/app/connect/model/DataSinkInvocation.ts
copy to ui/src/app/connect/model/grounding/TransportProtocol.ts
index a3d9544..1208465 100644
--- a/ui/src/app/connect/model/DataSinkInvocation.ts
+++ b/ui/src/app/connect/model/grounding/TransportProtocol.ts
@@ -16,21 +16,17 @@
  *
  */
 
-import {RdfId} from '../../platform-services/tsonld/RdfId';
-import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
-import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
+import {RdfsClass} from "../../../platform-services/tsonld/RdfsClass";
+import {UnnamedStreamPipesEntity} from "../UnnamedStreamPipesEntity";
+import {RdfProperty} from "../../../platform-services/tsonld/RdfsProperty";
+import {TopicDefinition} from "./TopicDefinition";
 
-@RdfsClass('sp:DataSinkInvocation')
-export class DataSinkInvocation {
+@RdfsClass('sp:TransportProtocol')
+export class TransportProtocol extends UnnamedStreamPipesEntity {
 
-    @RdfId
-    public id: string;
-
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#label')
-    public label: string;
-
-    constructor(id: string) {
-        this.id = id;
-    }
+    @RdfProperty('sp:brokerHostname')
+    public brokerHostname: String;
 
+    @RdfProperty('sp:topic')
+    public topicDefinition: TopicDefinition;
 }
diff --git a/ui/src/app/connect/model/DataSinkInvocation.ts b/ui/src/app/connect/model/output/UserDefinedOutputStrategy.ts
similarity index 63%
copy from ui/src/app/connect/model/DataSinkInvocation.ts
copy to ui/src/app/connect/model/output/UserDefinedOutputStrategy.ts
index a3d9544..5234d82 100644
--- a/ui/src/app/connect/model/DataSinkInvocation.ts
+++ b/ui/src/app/connect/model/output/UserDefinedOutputStrategy.ts
@@ -16,21 +16,18 @@
  *
  */
 
-import {RdfId} from '../../platform-services/tsonld/RdfId';
-import {RdfProperty} from '../../platform-services/tsonld/RdfsProperty';
-import {RdfsClass} from '../../platform-services/tsonld/RdfsClass';
+import {RdfsClass} from "../../../platform-services/tsonld/RdfsClass";
+import {OutputStrategy} from "./OutputStrategy";
+import {RdfProperty} from "../../../platform-services/tsonld/RdfsProperty";
+import {EventProperty} from "../../schema-editor/model/EventProperty";
 
-@RdfsClass('sp:DataSinkInvocation')
-export class DataSinkInvocation {
+@RdfsClass('sp:UserDefinedOutputStrategy')
+export class UserDefinedOutputStrategy extends OutputStrategy {
 
-    @RdfId
-    public id: string;
-
-    @RdfProperty('http://www.w3.org/2000/01/rdf-schema#label')
-    public label: string;
+    @RdfProperty('sp:producesProperty')
+    public eventProperties: EventProperty [];
 
     constructor(id: string) {
-        this.id = id;
+        super(id);
     }
-
-}
+}
\ No newline at end of file
diff --git a/ui/src/app/core-model/gen/streampipes-model.ts b/ui/src/app/core-model/gen/streampipes-model.ts
new file mode 100644
index 0000000..36cadc9
--- /dev/null
+++ b/ui/src/app/core-model/gen/streampipes-model.ts
@@ -0,0 +1,2587 @@
+/* tslint:disable */
+/* eslint-disable */
+// @ts-nocheck
+// Generated using typescript-generator version 2.23.603 on 2020-06-02 23:02:02.
+
+export class AbstractStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.base.NamedStreamPipesEntity" | "org.apache.streampipes.model.connect.grounding.ProtocolDescription" | "org.apache.streampipes.model.connect.adapter.AdapterDescription" | "org.apache.streampipes.model.connect.adapter.AdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.Adap [...]
+
+    static fromData(data: AbstractStreamPipesEntity, target?: AbstractStreamPipesEntity): AbstractStreamPipesEntity {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AbstractStreamPipesEntity();
+        instance["@class"] = data["@class"];
+        return instance;
+    }
+
+    static fromDataUnion(data: AbstractStreamPipesEntityUnion): AbstractStreamPipesEntityUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.base.NamedStreamPipesEntity":
+                return NamedStreamPipesEntity.fromData(data);
+            case "org.apache.streampipes.model.base.UnnamedStreamPipesEntity":
+                return UnnamedStreamPipesEntity.fromData(data);
+        }
+    }
+}
+
+export class UnnamedStreamPipesEntity extends AbstractStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.base.UnnamedStreamPipesEntity" | "org.apache.streampipes.model.staticproperty.StaticProperty" | "org.apache.streampipes.model.staticproperty.CodeInputStaticProperty" | "org.apache.streampipes.model.staticproperty.CollectionStaticProperty" | "org.apache.streampipes.model.staticproperty.ColorPickerStaticProperty" | "org.apache.streampipes.model.staticproperty.DomainStaticProperty" | "org.apache.streampipes.model.staticproperty.FileStaticProperty" [...]
+    elementId: string;
+
+    static fromData(data: UnnamedStreamPipesEntity, target?: UnnamedStreamPipesEntity): UnnamedStreamPipesEntity {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new UnnamedStreamPipesEntity();
+        super.fromData(data, instance);
+        instance.elementId = data.elementId;
+        return instance;
+    }
+
+    static fromDataUnion(data: UnnamedStreamPipesEntityUnion): UnnamedStreamPipesEntityUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.base.StreamPipesJsonLdContainer":
+                return StreamPipesJsonLdContainer.fromData(data);
+            case "org.apache.streampipes.model.connect.guess.DomainPropertyProbability":
+                return DomainPropertyProbability.fromData(data);
+            case "org.apache.streampipes.model.connect.guess.DomainPropertyProbabilityList":
+                return DomainPropertyProbabilityList.fromData(data);
+            case "org.apache.streampipes.model.connect.guess.GuessSchema":
+                return GuessSchema.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.TransformationRuleDescription":
+                return TransformationRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.worker.ConnectWorkerContainer":
+                return ConnectWorkerContainer.fromData(data);
+            case "org.apache.streampipes.model.dashboard.DashboardEntity":
+                return DashboardEntity.fromData(data);
+            case "org.apache.streampipes.model.dashboard.DashboardWidgetSettings":
+                return DashboardWidgetSettings.fromData(data);
+            case "org.apache.streampipes.model.datalake.DataLakeMeasure":
+                return DataLakeMeasure.fromData(data);
+            case "org.apache.streampipes.model.grounding.EventGrounding":
+                return EventGrounding.fromData(data);
+            case "org.apache.streampipes.model.grounding.TopicDefinition":
+                return TopicDefinition.fromData(data);
+            case "org.apache.streampipes.model.grounding.TransportFormat":
+                return TransportFormat.fromData(data);
+            case "org.apache.streampipes.model.grounding.TransportProtocol":
+                return TransportProtocol.fromData(data);
+            case "org.apache.streampipes.model.grounding.WildcardTopicMapping":
+                return WildcardTopicMapping.fromData(data);
+            case "org.apache.streampipes.model.monitoring.ElementStatusInfoSettings":
+                return ElementStatusInfoSettings.fromData(data);
+            case "org.apache.streampipes.model.output.OutputStrategy":
+                return OutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.PropertyRenameRule":
+                return PropertyRenameRule.fromData(data);
+            case "org.apache.streampipes.model.output.TransformOperation":
+                return TransformOperation.fromData(data);
+            case "org.apache.streampipes.model.quality.EventPropertyQualityRequirement":
+                return EventPropertyQualityRequirement.fromData(data);
+            case "org.apache.streampipes.model.quality.EventStreamQualityRequirement":
+                return EventStreamQualityRequirement.fromData(data);
+            case "org.apache.streampipes.model.quality.MeasurementCapability":
+                return MeasurementCapability.fromData(data);
+            case "org.apache.streampipes.model.quality.MeasurementObject":
+                return MeasurementObject.fromData(data);
+            case "org.apache.streampipes.model.quality.MeasurementProperty":
+                return MeasurementProperty.fromData(data);
+            case "org.apache.streampipes.model.runtime.RuntimeOptionsRequest":
+                return RuntimeOptionsRequest.fromData(data);
+            case "org.apache.streampipes.model.schema.EventProperty":
+                return EventProperty.fromData(data);
+            case "org.apache.streampipes.model.schema.EventSchema":
+                return EventSchema.fromData(data);
+            case "org.apache.streampipes.model.schema.ValueSpecification":
+                return ValueSpecification.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.Option":
+                return Option.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.PropertyValueSpecification":
+                return PropertyValueSpecification.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.StaticProperty":
+                return StaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.SupportedProperty":
+                return SupportedProperty.fromData(data);
+            case "org.apache.streampipes.model.template.BoundPipelineElement":
+                return BoundPipelineElement.fromData(data);
+            case "org.apache.streampipes.model.template.PipelineTemplateDescriptionContainer":
+                return PipelineTemplateDescriptionContainer.fromData(data);
+            case "org.apache.streampipes.model.template.PipelineTemplateInvocation":
+                return PipelineTemplateInvocation.fromData(data);
+        }
+    }
+}
+
+export class MeasurementProperty extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.quality.MeasurementProperty" | "org.apache.streampipes.model.quality.EventPropertyQualityDefinition" | "org.apache.streampipes.model.quality.Accuracy" | "org.apache.streampipes.model.quality.MeasurementRange" | "org.apache.streampipes.model.quality.Precision" | "org.apache.streampipes.model.quality.Resolution" | "org.apache.streampipes.model.quality.EventStreamQualityDefinition" | "org.apache.streampipes.model.quality.Frequency" | "org.apache.s [...]
+
+    static fromData(data: MeasurementProperty, target?: MeasurementProperty): MeasurementProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MeasurementProperty();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: MeasurementPropertyUnion): MeasurementPropertyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.quality.EventPropertyQualityDefinition":
+                return EventPropertyQualityDefinition.fromData(data);
+            case "org.apache.streampipes.model.quality.EventStreamQualityDefinition":
+                return EventStreamQualityDefinition.fromData(data);
+        }
+    }
+}
+
+export class EventPropertyQualityDefinition extends MeasurementProperty {
+    "@class": "org.apache.streampipes.model.quality.EventPropertyQualityDefinition" | "org.apache.streampipes.model.quality.Accuracy" | "org.apache.streampipes.model.quality.MeasurementRange" | "org.apache.streampipes.model.quality.Precision" | "org.apache.streampipes.model.quality.Resolution";
+
+    static fromData(data: EventPropertyQualityDefinition, target?: EventPropertyQualityDefinition): EventPropertyQualityDefinition {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventPropertyQualityDefinition();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: EventPropertyQualityDefinitionUnion): EventPropertyQualityDefinitionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.quality.Accuracy":
+                return Accuracy.fromData(data);
+            case "org.apache.streampipes.model.quality.MeasurementRange":
+                return MeasurementRange.fromData(data);
+            case "org.apache.streampipes.model.quality.Precision":
+                return Precision.fromData(data);
+            case "org.apache.streampipes.model.quality.Resolution":
+                return Resolution.fromData(data);
+        }
+    }
+}
+
+export class Accuracy extends EventPropertyQualityDefinition {
+    "@class": "org.apache.streampipes.model.quality.Accuracy";
+    quantityValue: number;
+
+    static fromData(data: Accuracy, target?: Accuracy): Accuracy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Accuracy();
+        super.fromData(data, instance);
+        instance.quantityValue = data.quantityValue;
+        return instance;
+    }
+}
+
+export class NamedStreamPipesEntity extends AbstractStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.base.NamedStreamPipesEntity" | "org.apache.streampipes.model.connect.grounding.ProtocolDescription" | "org.apache.streampipes.model.connect.adapter.AdapterDescription" | "org.apache.streampipes.model.connect.adapter.AdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.Adap [...]
+    appId: string;
+    applicationLinks: ApplicationLink[];
+    connectedTo: string[];
+    description: string;
+    dom: string;
+    elementId: string;
+    iconUrl: string;
+    includedAssets: string[];
+    includedLocales: string[];
+    includesAssets: boolean;
+    includesLocales: boolean;
+    name: string;
+    uri: string;
+
+    static fromData(data: NamedStreamPipesEntity, target?: NamedStreamPipesEntity): NamedStreamPipesEntity {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new NamedStreamPipesEntity();
+        super.fromData(data, instance);
+        instance.name = data.name;
+        instance.description = data.description;
+        instance.iconUrl = data.iconUrl;
+        instance.elementId = data.elementId;
+        instance.appId = data.appId;
+        instance.includesAssets = data.includesAssets;
+        instance.includesLocales = data.includesLocales;
+        instance.includedAssets = __getCopyArrayFn(__identity<string>())(data.includedAssets);
+        instance.includedLocales = __getCopyArrayFn(__identity<string>())(data.includedLocales);
+        instance.applicationLinks = __getCopyArrayFn(ApplicationLink.fromData)(data.applicationLinks);
+        instance.connectedTo = __getCopyArrayFn(__identity<string>())(data.connectedTo);
+        instance.uri = data.uri;
+        instance.dom = data.dom;
+        return instance;
+    }
+}
+
+export class AdapterDescription extends NamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.adapter.AdapterDescription" | "org.apache.streampipes.model.connect.adapter.AdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.AdapterStreamDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterStreamDescription";
+    adapterId: string;
+    adapterType: string;
+    category: string[];
+    config: StaticPropertyUnion[];
+    eventGrounding: EventGrounding;
+    icon: string;
+    id: string;
+    rev: string;
+    rules: TransformationRuleDescriptionUnion[];
+    schemaRules: any[];
+    streamRules: any[];
+    userName: string;
+    valueRules: any[];
+
+    static fromData(data: AdapterDescription, target?: AdapterDescription): AdapterDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AdapterDescription();
+        super.fromData(data, instance);
+        instance.id = data.id;
+        instance.rev = data.rev;
+        instance.adapterId = data.adapterId;
+        instance.userName = data.userName;
+        instance.eventGrounding = EventGrounding.fromData(data.eventGrounding);
+        instance.adapterType = data.adapterType;
+        instance.icon = data.icon;
+        instance.config = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.config);
+        instance.rules = __getCopyArrayFn(TransformationRuleDescription.fromDataUnion)(data.rules);
+        instance.category = __getCopyArrayFn(__identity<string>())(data.category);
+        instance.streamRules = __getCopyArrayFn(__identity<any>())(data.streamRules);
+        instance.schemaRules = __getCopyArrayFn(__identity<any>())(data.schemaRules);
+        instance.valueRules = __getCopyArrayFn(__identity<any>())(data.valueRules);
+        return instance;
+    }
+
+    static fromDataUnion(data: AdapterDescriptionUnion): AdapterDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.adapter.AdapterSetDescription":
+                return AdapterSetDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.adapter.AdapterStreamDescription":
+                return AdapterStreamDescription.fromData(data);
+        }
+    }
+}
+
+export class AdapterSetDescription extends AdapterDescription {
+    "@class": "org.apache.streampipes.model.connect.adapter.AdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription";
+    dataSet: SpDataSet;
+    stopPipeline: boolean;
+
+    static fromData(data: AdapterSetDescription, target?: AdapterSetDescription): AdapterSetDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AdapterSetDescription();
+        super.fromData(data, instance);
+        instance.dataSet = SpDataSet.fromData(data.dataSet);
+        instance.stopPipeline = data.stopPipeline;
+        return instance;
+    }
+
+    static fromDataUnion(data: AdapterSetDescriptionUnion): AdapterSetDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription":
+                return GenericAdapterSetDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription":
+                return SpecificAdapterSetDescription.fromData(data);
+        }
+    }
+}
+
+export class AdapterStreamDescription extends AdapterDescription {
+    "@class": "org.apache.streampipes.model.connect.adapter.AdapterStreamDescription" | "org.apache.streampipes.model.connect.adapter.SpecificAdapterStreamDescription";
+    dataStream: SpDataStreamUnion;
+
+    static fromData(data: AdapterStreamDescription, target?: AdapterStreamDescription): AdapterStreamDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AdapterStreamDescription();
+        super.fromData(data, instance);
+        instance.dataStream = SpDataStream.fromDataUnion(data.dataStream);
+        return instance;
+    }
+
+    static fromDataUnion(data: AdapterStreamDescriptionUnion): AdapterStreamDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.adapter.SpecificAdapterStreamDescription":
+                return SpecificAdapterStreamDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.adapter.SpecificAdapterStreamDescription":
+                return SpecificAdapterStreamDescription.fromData(data);
+        }
+    }
+}
+
+export class AdapterType {
+    code: string;
+    description: string;
+    label: string;
+
+    static fromData(data: AdapterType, target?: AdapterType): AdapterType {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AdapterType();
+        instance.label = data.label;
+        instance.description = data.description;
+        instance.code = data.code;
+        return instance;
+    }
+}
+
+export class TransformationRuleDescription extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.rules.TransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.value.ValueTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription" | "org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.value.TimestampTranfsformationRuleDescription" | "org.apache.streampipes.model.connect.rules.valu [...]
+
+    static fromData(data: TransformationRuleDescription, target?: TransformationRuleDescription): TransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TransformationRuleDescription();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: TransformationRuleDescriptionUnion): TransformationRuleDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.rules.value.ValueTransformationRuleDescription":
+                return ValueTransformationRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.stream.StreamTransformationRuleDescription":
+                return StreamTransformationRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.schema.SchemaTransformationRuleDescription":
+                return SchemaTransformationRuleDescription.fromData(data);
+        }
+    }
+}
+
+export class ValueTransformationRuleDescription extends TransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.value.ValueTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription" | "org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.value.TimestampTranfsformationRuleDescription" | "org.apache.streampipes.model.connect.rules.value.UnitTransformRuleDescription";
+
+    static fromData(data: ValueTransformationRuleDescription, target?: ValueTransformationRuleDescription): ValueTransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ValueTransformationRuleDescription();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: ValueTransformationRuleDescriptionUnion): ValueTransformationRuleDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription":
+                return AddTimestampRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription":
+                return AddValueTransformationRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.value.TimestampTranfsformationRuleDescription":
+                return TimestampTranfsformationRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.value.UnitTransformRuleDescription":
+                return UnitTransformRuleDescription.fromData(data);
+        }
+    }
+}
+
+export class AddTimestampRuleDescription extends ValueTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.value.AddTimestampRuleDescription";
+    runtimeKey: string;
+
+    static fromData(data: AddTimestampRuleDescription, target?: AddTimestampRuleDescription): AddTimestampRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AddTimestampRuleDescription();
+        super.fromData(data, instance);
+        instance.runtimeKey = data.runtimeKey;
+        return instance;
+    }
+}
+
+export class AddValueTransformationRuleDescription extends ValueTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.value.AddValueTransformationRuleDescription";
+    runtimeKey: string;
+    staticValue: string;
+
+    static fromData(data: AddValueTransformationRuleDescription, target?: AddValueTransformationRuleDescription): AddValueTransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AddValueTransformationRuleDescription();
+        super.fromData(data, instance);
+        instance.runtimeKey = data.runtimeKey;
+        instance.staticValue = data.staticValue;
+        return instance;
+    }
+}
+
+export class StaticProperty extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.staticproperty.StaticProperty" | "org.apache.streampipes.model.staticproperty.CodeInputStaticProperty" | "org.apache.streampipes.model.staticproperty.CollectionStaticProperty" | "org.apache.streampipes.model.staticproperty.ColorPickerStaticProperty" | "org.apache.streampipes.model.staticproperty.DomainStaticProperty" | "org.apache.streampipes.model.staticproperty.FileStaticProperty" | "org.apache.streampipes.model.staticproperty.FreeTextStaticP [...]
+    description: string;
+    index: number;
+    internalName: string;
+    label: string;
+    predefined: boolean;
+    staticPropertyType: StaticPropertyType;
+    valueRequired: boolean;
+
+    static fromData(data: StaticProperty, target?: StaticProperty): StaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new StaticProperty();
+        super.fromData(data, instance);
+        instance.index = data.index;
+        instance.label = data.label;
+        instance.description = data.description;
+        instance.internalName = data.internalName;
+        instance.valueRequired = data.valueRequired;
+        instance.predefined = data.predefined;
+        instance.staticPropertyType = data.staticPropertyType;
+        return instance;
+    }
+
+    static fromDataUnion(data: StaticPropertyUnion): StaticPropertyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.staticproperty.AnyStaticProperty":
+                return AnyStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.CodeInputStaticProperty":
+                return CodeInputStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.CollectionStaticProperty":
+                return CollectionStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.ColorPickerStaticProperty":
+                return ColorPickerStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.DomainStaticProperty":
+                return DomainStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.FileStaticProperty":
+                return FileStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.FreeTextStaticProperty":
+                return FreeTextStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.MappingPropertyUnary":
+                return MappingPropertyUnary.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.MappingPropertyNary":
+                return MappingPropertyNary.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.MatchingStaticProperty":
+                return MatchingStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.OneOfStaticProperty":
+                return OneOfStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.RuntimeResolvableAnyStaticProperty":
+                return RuntimeResolvableAnyStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.RuntimeResolvableOneOfStaticProperty":
+                return RuntimeResolvableOneOfStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.SecretStaticProperty":
+                return SecretStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.StaticPropertyAlternative":
+                return StaticPropertyAlternative.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.StaticPropertyAlternatives":
+                return StaticPropertyAlternatives.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.StaticPropertyGroup":
+                return StaticPropertyGroup.fromData(data);
+        }
+    }
+}
+
+export class SelectionStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.SelectionStaticProperty" | "org.apache.streampipes.model.staticproperty.AnyStaticProperty" | "org.apache.streampipes.model.staticproperty.RuntimeResolvableAnyStaticProperty" | "org.apache.streampipes.model.staticproperty.OneOfStaticProperty" | "org.apache.streampipes.model.staticproperty.RuntimeResolvableOneOfStaticProperty";
+    horizontalRendering: boolean;
+    options: Option[];
+
+    static fromData(data: SelectionStaticProperty, target?: SelectionStaticProperty): SelectionStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SelectionStaticProperty();
+        super.fromData(data, instance);
+        instance.options = __getCopyArrayFn(Option.fromData)(data.options);
+        instance.horizontalRendering = data.horizontalRendering;
+        return instance;
+    }
+
+    static fromDataUnion(data: SelectionStaticPropertyUnion): SelectionStaticPropertyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.staticproperty.AnyStaticProperty":
+                return AnyStaticProperty.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.OneOfStaticProperty":
+                return OneOfStaticProperty.fromData(data);
+        }
+    }
+}
+
+export class AnyStaticProperty extends SelectionStaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.AnyStaticProperty" | "org.apache.streampipes.model.staticproperty.RuntimeResolvableAnyStaticProperty";
+
+    static fromData(data: AnyStaticProperty, target?: AnyStaticProperty): AnyStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AnyStaticProperty();
+        super.fromData(data, instance);
+        return instance;
+    }
+}
+
+export class OutputStrategy extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.output.OutputStrategy" | "org.apache.streampipes.model.output.AppendOutputStrategy" | "org.apache.streampipes.model.output.CustomOutputStrategy" | "org.apache.streampipes.model.output.CustomTransformOutputStrategy" | "org.apache.streampipes.model.output.FixedOutputStrategy" | "org.apache.streampipes.model.output.KeepOutputStrategy" | "org.apache.streampipes.model.output.ListOutputStrategy" | "org.apache.streampipes.model.output.TransformOutputS [...]
+    name: string;
+    renameRules: PropertyRenameRule[];
+
+    static fromData(data: OutputStrategy, target?: OutputStrategy): OutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new OutputStrategy();
+        super.fromData(data, instance);
+        instance.name = data.name;
+        instance.renameRules = __getCopyArrayFn(PropertyRenameRule.fromData)(data.renameRules);
+        return instance;
+    }
+
+    static fromDataUnion(data: OutputStrategyUnion): OutputStrategyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.output.AppendOutputStrategy":
+                return AppendOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.CustomOutputStrategy":
+                return CustomOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.CustomTransformOutputStrategy":
+                return CustomTransformOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.FixedOutputStrategy":
+                return FixedOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.KeepOutputStrategy":
+                return KeepOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.ListOutputStrategy":
+                return ListOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.TransformOutputStrategy":
+                return TransformOutputStrategy.fromData(data);
+            case "org.apache.streampipes.model.output.UserDefinedOutputStrategy":
+                return UserDefinedOutputStrategy.fromData(data);
+        }
+    }
+}
+
+export class AppendOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.AppendOutputStrategy";
+    eventProperties: EventPropertyUnion[];
+
+    static fromData(data: AppendOutputStrategy, target?: AppendOutputStrategy): AppendOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new AppendOutputStrategy();
+        super.fromData(data, instance);
+        instance.eventProperties = __getCopyArrayFn(EventProperty.fromDataUnion)(data.eventProperties);
+        return instance;
+    }
+}
+
+export class ApplicationLink extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.ApplicationLink";
+    applicationDescription: string;
+    applicationIconUrl: string;
+    applicationLinkType: string;
+    applicationName: string;
+    applicationUrl: string;
+
+    static fromData(data: ApplicationLink, target?: ApplicationLink): ApplicationLink {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ApplicationLink();
+        super.fromData(data, instance);
+        instance.applicationName = data.applicationName;
+        instance.applicationDescription = data.applicationDescription;
+        instance.applicationUrl = data.applicationUrl;
+        instance.applicationIconUrl = data.applicationIconUrl;
+        instance.applicationLinkType = data.applicationLinkType;
+        return instance;
+    }
+}
+
+export class BoundPipelineElement extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.template.BoundPipelineElement";
+    connectedTo: BoundPipelineElement[];
+    pipelineElementTemplate: InvocableStreamPipesEntityUnion;
+
+    static fromData(data: BoundPipelineElement, target?: BoundPipelineElement): BoundPipelineElement {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new BoundPipelineElement();
+        super.fromData(data, instance);
+        instance.pipelineElementTemplate = InvocableStreamPipesEntity.fromDataUnion(data.pipelineElementTemplate);
+        instance.connectedTo = __getCopyArrayFn(BoundPipelineElement.fromData)(data.connectedTo);
+        return instance;
+    }
+}
+
+export class CodeInputStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.CodeInputStaticProperty";
+    codeTemplate: string;
+    language: string;
+    value: string;
+
+    static fromData(data: CodeInputStaticProperty, target?: CodeInputStaticProperty): CodeInputStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new CodeInputStaticProperty();
+        super.fromData(data, instance);
+        instance.language = data.language;
+        instance.codeTemplate = data.codeTemplate;
+        instance.value = data.value;
+        return instance;
+    }
+}
+
+export class CollectionStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.CollectionStaticProperty";
+    memberType: string;
+    members: StaticPropertyUnion[];
+    staticPropertyTemplate: StaticPropertyUnion;
+
+    static fromData(data: CollectionStaticProperty, target?: CollectionStaticProperty): CollectionStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new CollectionStaticProperty();
+        super.fromData(data, instance);
+        instance.staticPropertyTemplate = StaticProperty.fromDataUnion(data.staticPropertyTemplate);
+        instance.members = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.members);
+        instance.memberType = data.memberType;
+        return instance;
+    }
+}
+
+export class ColorPickerStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.ColorPickerStaticProperty";
+    selectedColor: string;
+
+    static fromData(data: ColorPickerStaticProperty, target?: ColorPickerStaticProperty): ColorPickerStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ColorPickerStaticProperty();
+        super.fromData(data, instance);
+        instance.selectedColor = data.selectedColor;
+        return instance;
+    }
+}
+
+export interface Comparable<T> {
+}
+
+export class ConnectWorkerContainer extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.worker.ConnectWorkerContainer";
+    adapters: AdapterDescriptionUnion[];
+    endpointUrl: string;
+    id: string;
+    protocols: ProtocolDescription[];
+    rev: string;
+
+    static fromData(data: ConnectWorkerContainer, target?: ConnectWorkerContainer): ConnectWorkerContainer {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ConnectWorkerContainer();
+        super.fromData(data, instance);
+        instance.id = data.id;
+        instance.rev = data.rev;
+        instance.endpointUrl = data.endpointUrl;
+        instance.protocols = __getCopyArrayFn(ProtocolDescription.fromData)(data.protocols);
+        instance.adapters = __getCopyArrayFn(AdapterDescription.fromDataUnion)(data.adapters);
+        return instance;
+    }
+}
+
+export class SchemaTransformationRuleDescription extends TransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.schema.SchemaTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.schema.CreateNestedRuleDescription" | "org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription" | "org.apache.streampipes.model.connect.rules.schema.RenameRuleDescription" | "org.apache.streampipes.model.connect.rules.schema.MoveRuleDescription";
+
+    static fromData(data: SchemaTransformationRuleDescription, target?: SchemaTransformationRuleDescription): SchemaTransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SchemaTransformationRuleDescription();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: SchemaTransformationRuleDescriptionUnion): SchemaTransformationRuleDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.rules.schema.CreateNestedRuleDescription":
+                return CreateNestedRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription":
+                return DeleteRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.schema.RenameRuleDescription":
+                return RenameRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.schema.MoveRuleDescription":
+                return MoveRuleDescription.fromData(data);
+        }
+    }
+}
+
+export class CreateNestedRuleDescription extends SchemaTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.schema.CreateNestedRuleDescription";
+    runtimeKey: string;
+
+    static fromData(data: CreateNestedRuleDescription, target?: CreateNestedRuleDescription): CreateNestedRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new CreateNestedRuleDescription();
+        super.fromData(data, instance);
+        instance.runtimeKey = data.runtimeKey;
+        return instance;
+    }
+}
+
+export class CustomOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.CustomOutputStrategy";
+    availablePropertyKeys: string[];
+    outputRight: boolean;
+    selectedPropertyKeys: string[];
+
+    static fromData(data: CustomOutputStrategy, target?: CustomOutputStrategy): CustomOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new CustomOutputStrategy();
+        super.fromData(data, instance);
+        instance.selectedPropertyKeys = __getCopyArrayFn(__identity<string>())(data.selectedPropertyKeys);
+        instance.outputRight = data.outputRight;
+        instance.availablePropertyKeys = __getCopyArrayFn(__identity<string>())(data.availablePropertyKeys);
+        return instance;
+    }
+}
+
+export class CustomTransformOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.CustomTransformOutputStrategy";
+    eventProperties: EventPropertyUnion[];
+
+    static fromData(data: CustomTransformOutputStrategy, target?: CustomTransformOutputStrategy): CustomTransformOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new CustomTransformOutputStrategy();
+        super.fromData(data, instance);
+        instance.eventProperties = __getCopyArrayFn(EventProperty.fromDataUnion)(data.eventProperties);
+        return instance;
+    }
+}
+
+export class DashboardEntity extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.dashboard.DashboardEntity" | "org.apache.streampipes.model.dashboard.DashboardWidgetModel" | "org.apache.streampipes.model.dashboard.VisualizablePipeline" | "org.apache.streampipes.model.datalake.DataExplorerWidgetModel";
+    id: string;
+    rev: string;
+
+    static fromData(data: DashboardEntity, target?: DashboardEntity): DashboardEntity {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DashboardEntity();
+        super.fromData(data, instance);
+        instance.id = data.id;
+        instance.rev = data.rev;
+        return instance;
+    }
+
+    static fromDataUnion(data: DashboardEntityUnion): DashboardEntityUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.dashboard.DashboardWidgetModel":
+                return DashboardWidgetModel.fromData(data);
+            case "org.apache.streampipes.model.dashboard.VisualizablePipeline":
+                return VisualizablePipeline.fromData(data);
+            case "org.apache.streampipes.model.datalake.DataExplorerWidgetModel":
+                return DataExplorerWidgetModel.fromData(data);
+        }
+    }
+}
+
+export class DashboardWidgetModel extends DashboardEntity {
+    "@class": "org.apache.streampipes.model.dashboard.DashboardWidgetModel";
+    dashboardWidgetSettings: DashboardWidgetSettings;
+    visualizablePipelineId: string;
+    visualizablePipelineTopic: string;
+    widgetId: string;
+
+    static fromData(data: DashboardWidgetModel, target?: DashboardWidgetModel): DashboardWidgetModel {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DashboardWidgetModel();
+        super.fromData(data, instance);
+        instance.widgetId = data.widgetId;
+        instance.dashboardWidgetSettings = DashboardWidgetSettings.fromData(data.dashboardWidgetSettings);
+        instance.visualizablePipelineId = data.visualizablePipelineId;
+        instance.visualizablePipelineTopic = data.visualizablePipelineTopic;
+        return instance;
+    }
+}
+
+export class DashboardWidgetSettings extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.dashboard.DashboardWidgetSettings";
+    config: StaticPropertyUnion[];
+    requiredSchema: EventSchema;
+    widgetDescription: string;
+    widgetIconName: string;
+    widgetLabel: string;
+    widgetName: string;
+
+    static fromData(data: DashboardWidgetSettings, target?: DashboardWidgetSettings): DashboardWidgetSettings {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DashboardWidgetSettings();
+        super.fromData(data, instance);
+        instance.widgetLabel = data.widgetLabel;
+        instance.widgetName = data.widgetName;
+        instance.config = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.config);
+        instance.requiredSchema = EventSchema.fromData(data.requiredSchema);
+        instance.widgetIconName = data.widgetIconName;
+        instance.widgetDescription = data.widgetDescription;
+        return instance;
+    }
+}
+
+export class DataExplorerWidgetModel extends DashboardEntity {
+    "@class": "org.apache.streampipes.model.datalake.DataExplorerWidgetModel";
+    dataLakeMeasure: DataLakeMeasure;
+    selectedKeys: string;
+    widgetId: string;
+    widgetType: string;
+
+    static fromData(data: DataExplorerWidgetModel, target?: DataExplorerWidgetModel): DataExplorerWidgetModel {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DataExplorerWidgetModel();
+        super.fromData(data, instance);
+        instance.widgetId = data.widgetId;
+        instance.widgetType = data.widgetType;
+        instance.selectedKeys = data.selectedKeys;
+        instance.dataLakeMeasure = DataLakeMeasure.fromData(data.dataLakeMeasure);
+        return instance;
+    }
+}
+
+export class DataLakeMeasure extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.datalake.DataLakeMeasure";
+    eventSchema: EventSchema;
+    measureName: string;
+
+    static fromData(data: DataLakeMeasure, target?: DataLakeMeasure): DataLakeMeasure {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DataLakeMeasure();
+        super.fromData(data, instance);
+        instance.measureName = data.measureName;
+        instance.eventSchema = EventSchema.fromData(data.eventSchema);
+        return instance;
+    }
+}
+
+export class InvocableStreamPipesEntity extends NamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.base.InvocableStreamPipesEntity" | "org.apache.streampipes.model.graph.DataProcessorInvocation" | "org.apache.streampipes.model.graph.DataSinkInvocation";
+    belongsTo: string;
+    configured: boolean;
+    correspondingPipeline: string;
+    correspondingUser: string;
+    inputStreams: SpDataStreamUnion[];
+    staticProperties: StaticPropertyUnion[];
+    statusInfoSettings: ElementStatusInfoSettings;
+    streamRequirements: SpDataStreamUnion[];
+    supportedGrounding: EventGrounding;
+
+    static fromData(data: InvocableStreamPipesEntity, target?: InvocableStreamPipesEntity): InvocableStreamPipesEntity {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new InvocableStreamPipesEntity();
+        super.fromData(data, instance);
+        instance.inputStreams = __getCopyArrayFn(SpDataStream.fromDataUnion)(data.inputStreams);
+        instance.staticProperties = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.staticProperties);
+        instance.belongsTo = data.belongsTo;
+        instance.statusInfoSettings = ElementStatusInfoSettings.fromData(data.statusInfoSettings);
+        instance.supportedGrounding = EventGrounding.fromData(data.supportedGrounding);
+        instance.correspondingPipeline = data.correspondingPipeline;
+        instance.correspondingUser = data.correspondingUser;
+        instance.streamRequirements = __getCopyArrayFn(SpDataStream.fromDataUnion)(data.streamRequirements);
+        instance.configured = data.configured;
+        return instance;
+    }
+
+    static fromDataUnion(data: InvocableStreamPipesEntityUnion): InvocableStreamPipesEntityUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.graph.DataProcessorInvocation":
+                return DataProcessorInvocation.fromData(data);
+            case "org.apache.streampipes.model.graph.DataSinkInvocation":
+                return DataSinkInvocation.fromData(data);
+        }
+    }
+}
+
+export class DataProcessorInvocation extends InvocableStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.graph.DataProcessorInvocation";
+    category: string[];
+    outputStrategies: OutputStrategyUnion[];
+    outputStream: SpDataStreamUnion;
+    pathName: string;
+
+    static fromData(data: DataProcessorInvocation, target?: DataProcessorInvocation): DataProcessorInvocation {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DataProcessorInvocation();
+        super.fromData(data, instance);
+        instance.outputStream = SpDataStream.fromDataUnion(data.outputStream);
+        instance.outputStrategies = __getCopyArrayFn(OutputStrategy.fromDataUnion)(data.outputStrategies);
+        instance.pathName = data.pathName;
+        instance.category = __getCopyArrayFn(__identity<string>())(data.category);
+        return instance;
+    }
+}
+
+export class DataProcessorType {
+    code: string;
+    description: string;
+    label: string;
+
+    static fromData(data: DataProcessorType, target?: DataProcessorType): DataProcessorType {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DataProcessorType();
+        instance.label = data.label;
+        instance.description = data.description;
+        instance.code = data.code;
+        return instance;
+    }
+}
+
+export class DataSinkInvocation extends InvocableStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.graph.DataSinkInvocation";
+    category: string[];
+
+    static fromData(data: DataSinkInvocation, target?: DataSinkInvocation): DataSinkInvocation {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DataSinkInvocation();
+        super.fromData(data, instance);
+        instance.category = __getCopyArrayFn(__identity<string>())(data.category);
+        return instance;
+    }
+}
+
+export class DataSinkType {
+    code: string;
+    description: string;
+    label: string;
+
+    static fromData(data: DataSinkType, target?: DataSinkType): DataSinkType {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DataSinkType();
+        instance.label = data.label;
+        instance.description = data.description;
+        instance.code = data.code;
+        return instance;
+    }
+}
+
+export class DeleteRuleDescription extends SchemaTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.schema.DeleteRuleDescription";
+    runtimeKey: string;
+
+    static fromData(data: DeleteRuleDescription, target?: DeleteRuleDescription): DeleteRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DeleteRuleDescription();
+        super.fromData(data, instance);
+        instance.runtimeKey = data.runtimeKey;
+        return instance;
+    }
+}
+
+export class DomainPropertyProbability extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.guess.DomainPropertyProbability";
+    domainProperty: string;
+    probability: string;
+
+    static fromData(data: DomainPropertyProbability, target?: DomainPropertyProbability): DomainPropertyProbability {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DomainPropertyProbability();
+        super.fromData(data, instance);
+        instance.domainProperty = data.domainProperty;
+        instance.probability = data.probability;
+        return instance;
+    }
+}
+
+export class DomainPropertyProbabilityList extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.guess.DomainPropertyProbabilityList";
+    list: DomainPropertyProbability[];
+    runtimeName: string;
+
+    static fromData(data: DomainPropertyProbabilityList, target?: DomainPropertyProbabilityList): DomainPropertyProbabilityList {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DomainPropertyProbabilityList();
+        super.fromData(data, instance);
+        instance.runtimeName = data.runtimeName;
+        instance.list = __getCopyArrayFn(DomainPropertyProbability.fromData)(data.list);
+        return instance;
+    }
+}
+
+export class DomainStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.DomainStaticProperty";
+    requiredClass: string;
+    supportedProperties: SupportedProperty[];
+
+    static fromData(data: DomainStaticProperty, target?: DomainStaticProperty): DomainStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new DomainStaticProperty();
+        super.fromData(data, instance);
+        instance.requiredClass = data.requiredClass;
+        instance.supportedProperties = __getCopyArrayFn(SupportedProperty.fromData)(data.supportedProperties);
+        return instance;
+    }
+}
+
+export class ElementStatusInfoSettings extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.monitoring.ElementStatusInfoSettings";
+    elementIdentifier: string;
+    errorTopic: string;
+    kafkaHost: string;
+    kafkaPort: number;
+    statsTopic: string;
+
+    static fromData(data: ElementStatusInfoSettings, target?: ElementStatusInfoSettings): ElementStatusInfoSettings {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ElementStatusInfoSettings();
+        super.fromData(data, instance);
+        instance.elementIdentifier = data.elementIdentifier;
+        instance.kafkaHost = data.kafkaHost;
+        instance.kafkaPort = data.kafkaPort;
+        instance.errorTopic = data.errorTopic;
+        instance.statsTopic = data.statsTopic;
+        return instance;
+    }
+}
+
+export class ValueSpecification extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.schema.ValueSpecification" | "org.apache.streampipes.model.schema.QuantitativeValue" | "org.apache.streampipes.model.schema.Enumeration";
+
+    static fromData(data: ValueSpecification, target?: ValueSpecification): ValueSpecification {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ValueSpecification();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: ValueSpecificationUnion): ValueSpecificationUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.schema.QuantitativeValue":
+                return QuantitativeValue.fromData(data);
+            case "org.apache.streampipes.model.schema.Enumeration":
+                return Enumeration.fromData(data);
+        }
+    }
+}
+
+export class Enumeration extends ValueSpecification {
+    "@class": "org.apache.streampipes.model.schema.Enumeration";
+    description: string;
+    label: string;
+    runtimeValues: string[];
+
+    static fromData(data: Enumeration, target?: Enumeration): Enumeration {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Enumeration();
+        super.fromData(data, instance);
+        instance.label = data.label;
+        instance.description = data.description;
+        instance.runtimeValues = __getCopyArrayFn(__identity<string>())(data.runtimeValues);
+        return instance;
+    }
+}
+
+export class EventGrounding extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.grounding.EventGrounding";
+    transportFormats: TransportFormat[];
+    transportProtocol: TransportProtocolUnion;
+    transportProtocols: TransportProtocolUnion[];
+
+    static fromData(data: EventGrounding, target?: EventGrounding): EventGrounding {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventGrounding();
+        super.fromData(data, instance);
+        instance.transportProtocols = __getCopyArrayFn(TransportProtocol.fromDataUnion)(data.transportProtocols);
+        instance.transportFormats = __getCopyArrayFn(TransportFormat.fromData)(data.transportFormats);
+        instance.transportProtocol = TransportProtocol.fromDataUnion(data.transportProtocol);
+        return instance;
+    }
+}
+
+export class EventProperty extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.schema.EventProperty" | "org.apache.streampipes.model.schema.EventPropertyList" | "org.apache.streampipes.model.schema.EventPropertyNested" | "org.apache.streampipes.model.schema.EventPropertyPrimitive";
+    description: string;
+    domainProperties: URI[];
+    eventPropertyQualities: EventPropertyQualityDefinitionUnion[];
+    index: number;
+    label: string;
+    propertyScope: string;
+    required: boolean;
+    requiresEventPropertyQualities: EventPropertyQualityRequirement[];
+    runtimeId: string;
+    runtimeName: string;
+
+    static fromData(data: EventProperty, target?: EventProperty): EventProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventProperty();
+        super.fromData(data, instance);
+        instance.label = data.label;
+        instance.description = data.description;
+        instance.runtimeName = data.runtimeName;
+        instance.required = data.required;
+        instance.domainProperties = __getCopyArrayFn(URI.fromData)(data.domainProperties);
+        instance.eventPropertyQualities = __getCopyArrayFn(EventPropertyQualityDefinition.fromDataUnion)(data.eventPropertyQualities);
+        instance.requiresEventPropertyQualities = __getCopyArrayFn(EventPropertyQualityRequirement.fromData)(data.requiresEventPropertyQualities);
+        instance.propertyScope = data.propertyScope;
+        instance.index = data.index;
+        instance.runtimeId = data.runtimeId;
+        return instance;
+    }
+
+    static fromDataUnion(data: EventPropertyUnion): EventPropertyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.schema.EventPropertyList":
+                return EventPropertyList.fromData(data);
+            case "org.apache.streampipes.model.schema.EventPropertyNested":
+                return EventPropertyNested.fromData(data);
+            case "org.apache.streampipes.model.schema.EventPropertyPrimitive":
+                return EventPropertyPrimitive.fromData(data);
+        }
+    }
+}
+
+export class EventPropertyList extends EventProperty {
+    "@class": "org.apache.streampipes.model.schema.EventPropertyList";
+    eventProperty: EventPropertyUnion;
+
+    static fromData(data: EventPropertyList, target?: EventPropertyList): EventPropertyList {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventPropertyList();
+        super.fromData(data, instance);
+        instance.eventProperty = EventProperty.fromDataUnion(data.eventProperty);
+        return instance;
+    }
+}
+
+export class EventPropertyNested extends EventProperty {
+    "@class": "org.apache.streampipes.model.schema.EventPropertyNested";
+    eventProperties: EventPropertyUnion[];
+
+    static fromData(data: EventPropertyNested, target?: EventPropertyNested): EventPropertyNested {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventPropertyNested();
+        super.fromData(data, instance);
+        instance.eventProperties = __getCopyArrayFn(EventProperty.fromDataUnion)(data.eventProperties);
+        return instance;
+    }
+}
+
+export class EventPropertyPrimitive extends EventProperty {
+    "@class": "org.apache.streampipes.model.schema.EventPropertyPrimitive";
+    measurementUnit: URI;
+    runtimeType: string;
+    valueSpecification: ValueSpecificationUnion;
+
+    static fromData(data: EventPropertyPrimitive, target?: EventPropertyPrimitive): EventPropertyPrimitive {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventPropertyPrimitive();
+        super.fromData(data, instance);
+        instance.runtimeType = data.runtimeType;
+        instance.measurementUnit = URI.fromData(data.measurementUnit);
+        instance.valueSpecification = ValueSpecification.fromDataUnion(data.valueSpecification);
+        return instance;
+    }
+}
+
+export class EventPropertyQualityRequirement extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.quality.EventPropertyQualityRequirement";
+    maximumPropertyQuality: EventPropertyQualityDefinitionUnion;
+    minimumPropertyQuality: EventPropertyQualityDefinitionUnion;
+
+    static fromData(data: EventPropertyQualityRequirement, target?: EventPropertyQualityRequirement): EventPropertyQualityRequirement {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventPropertyQualityRequirement();
+        super.fromData(data, instance);
+        instance.minimumPropertyQuality = EventPropertyQualityDefinition.fromDataUnion(data.minimumPropertyQuality);
+        instance.maximumPropertyQuality = EventPropertyQualityDefinition.fromDataUnion(data.maximumPropertyQuality);
+        return instance;
+    }
+}
+
+export class StreamTransformationRuleDescription extends TransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.stream.StreamTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription" | "org.apache.streampipes.model.connect.rules.stream.RemoveDuplicatesTransformationRuleDescription";
+
+    static fromData(data: StreamTransformationRuleDescription, target?: StreamTransformationRuleDescription): StreamTransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new StreamTransformationRuleDescription();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: StreamTransformationRuleDescriptionUnion): StreamTransformationRuleDescriptionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription":
+                return EventRateTransformationRuleDescription.fromData(data);
+            case "org.apache.streampipes.model.connect.rules.stream.RemoveDuplicatesTransformationRuleDescription":
+                return RemoveDuplicatesTransformationRuleDescription.fromData(data);
+        }
+    }
+}
+
+export class EventRateTransformationRuleDescription extends StreamTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.stream.EventRateTransformationRuleDescription";
+    aggregationTimeWindow: number;
+    aggregationType: string;
+
+    static fromData(data: EventRateTransformationRuleDescription, target?: EventRateTransformationRuleDescription): EventRateTransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventRateTransformationRuleDescription();
+        super.fromData(data, instance);
+        instance.aggregationTimeWindow = data.aggregationTimeWindow;
+        instance.aggregationType = data.aggregationType;
+        return instance;
+    }
+}
+
+export class EventSchema extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.schema.EventSchema";
+    eventProperties: EventPropertyUnion[];
+
+    static fromData(data: EventSchema, target?: EventSchema): EventSchema {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventSchema();
+        super.fromData(data, instance);
+        instance.eventProperties = __getCopyArrayFn(EventProperty.fromDataUnion)(data.eventProperties);
+        return instance;
+    }
+}
+
+export class EventStreamQualityDefinition extends MeasurementProperty {
+    "@class": "org.apache.streampipes.model.quality.EventStreamQualityDefinition" | "org.apache.streampipes.model.quality.Frequency" | "org.apache.streampipes.model.quality.Latency";
+
+    static fromData(data: EventStreamQualityDefinition, target?: EventStreamQualityDefinition): EventStreamQualityDefinition {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventStreamQualityDefinition();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: EventStreamQualityDefinitionUnion): EventStreamQualityDefinitionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.quality.Frequency":
+                return Frequency.fromData(data);
+            case "org.apache.streampipes.model.quality.Latency":
+                return Latency.fromData(data);
+        }
+    }
+}
+
+export class EventStreamQualityRequirement extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.quality.EventStreamQualityRequirement";
+    maximumStreamQuality: EventStreamQualityDefinitionUnion;
+    minimumStreamQuality: EventStreamQualityDefinitionUnion;
+
+    static fromData(data: EventStreamQualityRequirement, target?: EventStreamQualityRequirement): EventStreamQualityRequirement {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new EventStreamQualityRequirement();
+        super.fromData(data, instance);
+        instance.minimumStreamQuality = EventStreamQualityDefinition.fromDataUnion(data.minimumStreamQuality);
+        instance.maximumStreamQuality = EventStreamQualityDefinition.fromDataUnion(data.maximumStreamQuality);
+        return instance;
+    }
+}
+
+export class FileStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.FileStaticProperty";
+    endpointUrl: string;
+    locationPath: string;
+
+    static fromData(data: FileStaticProperty, target?: FileStaticProperty): FileStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new FileStaticProperty();
+        super.fromData(data, instance);
+        instance.endpointUrl = data.endpointUrl;
+        instance.locationPath = data.locationPath;
+        return instance;
+    }
+}
+
+export class FixedOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.FixedOutputStrategy";
+    eventProperties: EventPropertyUnion[];
+
+    static fromData(data: FixedOutputStrategy, target?: FixedOutputStrategy): FixedOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new FixedOutputStrategy();
+        super.fromData(data, instance);
+        instance.eventProperties = __getCopyArrayFn(EventProperty.fromDataUnion)(data.eventProperties);
+        return instance;
+    }
+}
+
+export class FormatDescription extends NamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.grounding.FormatDescription";
+    config: StaticPropertyUnion[];
+
+    static fromData(data: FormatDescription, target?: FormatDescription): FormatDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new FormatDescription();
+        super.fromData(data, instance);
+        instance.config = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.config);
+        return instance;
+    }
+}
+
+export class FreeTextStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.FreeTextStaticProperty";
+    htmlAllowed: boolean;
+    mapsTo: string;
+    multiLine: boolean;
+    placeholdersSupported: boolean;
+    requiredDatatype: URI;
+    requiredDomainProperty: URI;
+    value: string;
+    valueSpecification: PropertyValueSpecification;
+
+    static fromData(data: FreeTextStaticProperty, target?: FreeTextStaticProperty): FreeTextStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new FreeTextStaticProperty();
+        super.fromData(data, instance);
+        instance.value = data.value;
+        instance.requiredDatatype = URI.fromData(data.requiredDatatype);
+        instance.requiredDomainProperty = URI.fromData(data.requiredDomainProperty);
+        instance.mapsTo = data.mapsTo;
+        instance.multiLine = data.multiLine;
+        instance.htmlAllowed = data.htmlAllowed;
+        instance.placeholdersSupported = data.placeholdersSupported;
+        instance.valueSpecification = PropertyValueSpecification.fromData(data.valueSpecification);
+        return instance;
+    }
+}
+
+export class Frequency extends EventStreamQualityDefinition {
+    "@class": "org.apache.streampipes.model.quality.Frequency";
+    quantityValue: number;
+
+    static fromData(data: Frequency, target?: Frequency): Frequency {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Frequency();
+        super.fromData(data, instance);
+        instance.quantityValue = data.quantityValue;
+        return instance;
+    }
+}
+
+export interface GenericAdapterDescription {
+    eventSchema: EventSchema;
+    formatDescription: FormatDescription;
+    protocolDescription: ProtocolDescription;
+    rules: TransformationRuleDescriptionUnion[];
+}
+
+export class GenericAdapterSetDescription extends AdapterSetDescription implements GenericAdapterDescription {
+    "@class": "org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription";
+    eventSchema: EventSchema;
+    formatDescription: FormatDescription;
+    protocolDescription: ProtocolDescription;
+
+    static fromData(data: GenericAdapterSetDescription, target?: GenericAdapterSetDescription): GenericAdapterSetDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new GenericAdapterSetDescription();
+        super.fromData(data, instance);
+        instance.protocolDescription = ProtocolDescription.fromData(data.protocolDescription);
+        instance.formatDescription = FormatDescription.fromData(data.formatDescription);
+        instance.eventSchema = EventSchema.fromData(data.eventSchema);
+        return instance;
+    }
+}
+
+export class GuessSchema extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.guess.GuessSchema";
+    eventSchema: EventSchema;
+    propertyProbabilityList: DomainPropertyProbabilityList[];
+
+    static fromData(data: GuessSchema, target?: GuessSchema): GuessSchema {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new GuessSchema();
+        super.fromData(data, instance);
+        instance.eventSchema = EventSchema.fromData(data.eventSchema);
+        instance.propertyProbabilityList = __getCopyArrayFn(DomainPropertyProbabilityList.fromData)(data.propertyProbabilityList);
+        return instance;
+    }
+}
+
+export class TransportProtocol extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.grounding.TransportProtocol" | "org.apache.streampipes.model.grounding.JmsTransportProtocol" | "org.apache.streampipes.model.grounding.KafkaTransportProtocol" | "org.apache.streampipes.model.grounding.MqttTransportProtocol";
+    brokerHostname: string;
+    topicDefinition: TopicDefinitionUnion;
+
+    static fromData(data: TransportProtocol, target?: TransportProtocol): TransportProtocol {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TransportProtocol();
+        super.fromData(data, instance);
+        instance.brokerHostname = data.brokerHostname;
+        instance.topicDefinition = TopicDefinition.fromDataUnion(data.topicDefinition);
+        return instance;
+    }
+
+    static fromDataUnion(data: TransportProtocolUnion): TransportProtocolUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.grounding.JmsTransportProtocol":
+                return JmsTransportProtocol.fromData(data);
+            case "org.apache.streampipes.model.grounding.KafkaTransportProtocol":
+                return KafkaTransportProtocol.fromData(data);
+            case "org.apache.streampipes.model.grounding.MqttTransportProtocol":
+                return MqttTransportProtocol.fromData(data);
+        }
+    }
+}
+
+export class JmsTransportProtocol extends TransportProtocol {
+    "@class": "org.apache.streampipes.model.grounding.JmsTransportProtocol";
+    port: number;
+
+    static fromData(data: JmsTransportProtocol, target?: JmsTransportProtocol): JmsTransportProtocol {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new JmsTransportProtocol();
+        super.fromData(data, instance);
+        instance.port = data.port;
+        return instance;
+    }
+}
+
+export class KafkaTransportProtocol extends TransportProtocol {
+    "@class": "org.apache.streampipes.model.grounding.KafkaTransportProtocol";
+    acks: string;
+    batchSize: string;
+    groupId: string;
+    kafkaPort: number;
+    lingerMs: number;
+    messageMaxBytes: string;
+    offset: string;
+    zookeeperHost: string;
+    zookeeperPort: number;
+
+    static fromData(data: KafkaTransportProtocol, target?: KafkaTransportProtocol): KafkaTransportProtocol {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new KafkaTransportProtocol();
+        super.fromData(data, instance);
+        instance.zookeeperHost = data.zookeeperHost;
+        instance.zookeeperPort = data.zookeeperPort;
+        instance.kafkaPort = data.kafkaPort;
+        instance.lingerMs = data.lingerMs;
+        instance.messageMaxBytes = data.messageMaxBytes;
+        instance.acks = data.acks;
+        instance.batchSize = data.batchSize;
+        instance.offset = data.offset;
+        instance.groupId = data.groupId;
+        return instance;
+    }
+}
+
+export class KeepOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.KeepOutputStrategy";
+    eventName: string;
+    keepBoth: boolean;
+
+    static fromData(data: KeepOutputStrategy, target?: KeepOutputStrategy): KeepOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new KeepOutputStrategy();
+        super.fromData(data, instance);
+        instance.eventName = data.eventName;
+        instance.keepBoth = data.keepBoth;
+        return instance;
+    }
+}
+
+export class Latency extends EventStreamQualityDefinition {
+    "@class": "org.apache.streampipes.model.quality.Latency";
+    quantityValue: number;
+
+    static fromData(data: Latency, target?: Latency): Latency {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Latency();
+        super.fromData(data, instance);
+        instance.quantityValue = data.quantityValue;
+        return instance;
+    }
+}
+
+export class ListOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.ListOutputStrategy";
+    propertyName: string;
+
+    static fromData(data: ListOutputStrategy, target?: ListOutputStrategy): ListOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ListOutputStrategy();
+        super.fromData(data, instance);
+        instance.propertyName = data.propertyName;
+        return instance;
+    }
+}
+
+export class MappingProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.MappingProperty" | "org.apache.streampipes.model.staticproperty.MappingPropertyUnary" | "org.apache.streampipes.model.staticproperty.MappingPropertyNary";
+    mapsFromOptions: string[];
+    propertyScope: string;
+    requirementSelector: string;
+
+    static fromData(data: MappingProperty, target?: MappingProperty): MappingProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MappingProperty();
+        super.fromData(data, instance);
+        instance.requirementSelector = data.requirementSelector;
+        instance.mapsFromOptions = __getCopyArrayFn(__identity<string>())(data.mapsFromOptions);
+        instance.propertyScope = data.propertyScope;
+        return instance;
+    }
+
+    static fromDataUnion(data: MappingPropertyUnion): MappingPropertyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.staticproperty.MappingPropertyNary":
+                return MappingPropertyNary.fromData(data);
+            case "org.apache.streampipes.model.staticproperty.MappingPropertyUnary":
+                return MappingPropertyUnary.fromData(data);
+        }
+    }
+}
+
+export class MappingPropertyNary extends MappingProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.MappingPropertyNary";
+    selectedProperties: string[];
+
+    static fromData(data: MappingPropertyNary, target?: MappingPropertyNary): MappingPropertyNary {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MappingPropertyNary();
+        super.fromData(data, instance);
+        instance.selectedProperties = __getCopyArrayFn(__identity<string>())(data.selectedProperties);
+        return instance;
+    }
+}
+
+export class MappingPropertyUnary extends MappingProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.MappingPropertyUnary";
+    selectedProperty: string;
+
+    static fromData(data: MappingPropertyUnary, target?: MappingPropertyUnary): MappingPropertyUnary {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MappingPropertyUnary();
+        super.fromData(data, instance);
+        instance.selectedProperty = data.selectedProperty;
+        return instance;
+    }
+}
+
+export class MatchingStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.MatchingStaticProperty";
+    matchLeft: URI;
+    matchRight: URI;
+
+    static fromData(data: MatchingStaticProperty, target?: MatchingStaticProperty): MatchingStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MatchingStaticProperty();
+        super.fromData(data, instance);
+        instance.matchLeft = URI.fromData(data.matchLeft);
+        instance.matchRight = URI.fromData(data.matchRight);
+        return instance;
+    }
+}
+
+export class MeasurementCapability extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.quality.MeasurementCapability";
+    capability: URI;
+
+    static fromData(data: MeasurementCapability, target?: MeasurementCapability): MeasurementCapability {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MeasurementCapability();
+        super.fromData(data, instance);
+        instance.capability = URI.fromData(data.capability);
+        return instance;
+    }
+}
+
+export class MeasurementObject extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.quality.MeasurementObject";
+    measuresObject: URI;
+
+    static fromData(data: MeasurementObject, target?: MeasurementObject): MeasurementObject {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MeasurementObject();
+        super.fromData(data, instance);
+        instance.measuresObject = URI.fromData(data.measuresObject);
+        return instance;
+    }
+}
+
+export class MeasurementRange extends EventPropertyQualityDefinition {
+    "@class": "org.apache.streampipes.model.quality.MeasurementRange";
+    maxValue: number;
+    minValue: number;
+
+    static fromData(data: MeasurementRange, target?: MeasurementRange): MeasurementRange {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MeasurementRange();
+        super.fromData(data, instance);
+        instance.minValue = data.minValue;
+        instance.maxValue = data.maxValue;
+        return instance;
+    }
+}
+
+export class MoveRuleDescription extends SchemaTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.schema.MoveRuleDescription";
+    newRuntimeKey: string;
+    oldRuntimeKey: string;
+
+    static fromData(data: MoveRuleDescription, target?: MoveRuleDescription): MoveRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MoveRuleDescription();
+        super.fromData(data, instance);
+        instance.oldRuntimeKey = data.oldRuntimeKey;
+        instance.newRuntimeKey = data.newRuntimeKey;
+        return instance;
+    }
+}
+
+export class MqttTransportProtocol extends TransportProtocol {
+    "@class": "org.apache.streampipes.model.grounding.MqttTransportProtocol";
+    port: number;
+
+    static fromData(data: MqttTransportProtocol, target?: MqttTransportProtocol): MqttTransportProtocol {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new MqttTransportProtocol();
+        super.fromData(data, instance);
+        instance.port = data.port;
+        return instance;
+    }
+}
+
+export class OneOfStaticProperty extends SelectionStaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.OneOfStaticProperty" | "org.apache.streampipes.model.staticproperty.RuntimeResolvableOneOfStaticProperty";
+
+    static fromData(data: OneOfStaticProperty, target?: OneOfStaticProperty): OneOfStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new OneOfStaticProperty();
+        super.fromData(data, instance);
+        return instance;
+    }
+
+    static fromDataUnion(data: OneOfStaticPropertyUnion): OneOfStaticPropertyUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.staticproperty.RuntimeResolvableOneOfStaticProperty":
+                return RuntimeResolvableOneOfStaticProperty.fromData(data);
+        }
+    }
+}
+
+export class Option extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.staticproperty.Option";
+    internalName: string;
+    name: string;
+    selected: boolean;
+
+    static fromData(data: Option, target?: Option): Option {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Option();
+        super.fromData(data, instance);
+        instance.name = data.name;
+        instance.selected = data.selected;
+        instance.internalName = data.internalName;
+        return instance;
+    }
+}
+
+export class PipelineTemplateDescription extends NamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.template.PipelineTemplateDescription";
+    boundTo: BoundPipelineElement[];
+    pipelineTemplateDescription: string;
+    pipelineTemplateId: string;
+    pipelineTemplateName: string;
+
+    static fromData(data: PipelineTemplateDescription, target?: PipelineTemplateDescription): PipelineTemplateDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new PipelineTemplateDescription();
+        super.fromData(data, instance);
+        instance.boundTo = __getCopyArrayFn(BoundPipelineElement.fromData)(data.boundTo);
+        instance.pipelineTemplateDescription = data.pipelineTemplateDescription;
+        instance.pipelineTemplateId = data.pipelineTemplateId;
+        instance.pipelineTemplateName = data.pipelineTemplateName;
+        return instance;
+    }
+}
+
+export class PipelineTemplateDescriptionContainer extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.template.PipelineTemplateDescriptionContainer";
+    list: PipelineTemplateDescription[];
+
+    static fromData(data: PipelineTemplateDescriptionContainer, target?: PipelineTemplateDescriptionContainer): PipelineTemplateDescriptionContainer {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new PipelineTemplateDescriptionContainer();
+        super.fromData(data, instance);
+        instance.list = __getCopyArrayFn(PipelineTemplateDescription.fromData)(data.list);
+        return instance;
+    }
+}
+
+export class PipelineTemplateInvocation extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.template.PipelineTemplateInvocation";
+    dataSetId: string;
+    kviName: string;
+    pipelineTemplateDescription: PipelineTemplateDescription;
+    pipelineTemplateId: string;
+    staticProperties: StaticPropertyUnion[];
+
+    static fromData(data: PipelineTemplateInvocation, target?: PipelineTemplateInvocation): PipelineTemplateInvocation {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new PipelineTemplateInvocation();
+        super.fromData(data, instance);
+        instance.kviName = data.kviName;
+        instance.dataSetId = data.dataSetId;
+        instance.pipelineTemplateId = data.pipelineTemplateId;
+        instance.pipelineTemplateDescription = PipelineTemplateDescription.fromData(data.pipelineTemplateDescription);
+        instance.staticProperties = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.staticProperties);
+        return instance;
+    }
+}
+
+export class Precision extends EventPropertyQualityDefinition {
+    "@class": "org.apache.streampipes.model.quality.Precision";
+    quantityValue: number;
+
+    static fromData(data: Precision, target?: Precision): Precision {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Precision();
+        super.fromData(data, instance);
+        instance.quantityValue = data.quantityValue;
+        return instance;
+    }
+}
+
+export class PropertyRenameRule extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.output.PropertyRenameRule";
+    newRuntimeName: string;
+    runtimeId: string;
+
+    static fromData(data: PropertyRenameRule, target?: PropertyRenameRule): PropertyRenameRule {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new PropertyRenameRule();
+        super.fromData(data, instance);
+        instance.runtimeId = data.runtimeId;
+        instance.newRuntimeName = data.newRuntimeName;
+        return instance;
+    }
+}
+
+export class PropertyValueSpecification extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.staticproperty.PropertyValueSpecification";
+    maxValue: number;
+    minValue: number;
+    step: number;
+
+    static fromData(data: PropertyValueSpecification, target?: PropertyValueSpecification): PropertyValueSpecification {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new PropertyValueSpecification();
+        super.fromData(data, instance);
+        instance.minValue = data.minValue;
+        instance.maxValue = data.maxValue;
+        instance.step = data.step;
+        return instance;
+    }
+}
+
+export class ProtocolDescription extends NamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.connect.grounding.ProtocolDescription";
+    category: string[];
+    config: StaticPropertyUnion[];
+    sourceType: string;
+
+    static fromData(data: ProtocolDescription, target?: ProtocolDescription): ProtocolDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new ProtocolDescription();
+        super.fromData(data, instance);
+        instance.sourceType = data.sourceType;
+        instance.config = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.config);
+        instance.category = __getCopyArrayFn(__identity<string>())(data.category);
+        return instance;
+    }
+}
+
+export class QuantitativeValue extends ValueSpecification {
+    "@class": "org.apache.streampipes.model.schema.QuantitativeValue";
+    maxValue: number;
+    minValue: number;
+    step: number;
+
+    static fromData(data: QuantitativeValue, target?: QuantitativeValue): QuantitativeValue {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new QuantitativeValue();
+        super.fromData(data, instance);
+        instance.minValue = data.minValue;
+        instance.maxValue = data.maxValue;
+        instance.step = data.step;
+        return instance;
+    }
+}
+
+export class RemoveDuplicatesTransformationRuleDescription extends StreamTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.stream.RemoveDuplicatesTransformationRuleDescription";
+    filterTimeWindow: string;
+
+    static fromData(data: RemoveDuplicatesTransformationRuleDescription, target?: RemoveDuplicatesTransformationRuleDescription): RemoveDuplicatesTransformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new RemoveDuplicatesTransformationRuleDescription();
+        super.fromData(data, instance);
+        instance.filterTimeWindow = data.filterTimeWindow;
+        return instance;
+    }
+}
+
+export class RenameRuleDescription extends SchemaTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.schema.RenameRuleDescription";
+    newRuntimeKey: string;
+    oldRuntimeKey: string;
+
+    static fromData(data: RenameRuleDescription, target?: RenameRuleDescription): RenameRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new RenameRuleDescription();
+        super.fromData(data, instance);
+        instance.oldRuntimeKey = data.oldRuntimeKey;
+        instance.newRuntimeKey = data.newRuntimeKey;
+        return instance;
+    }
+}
+
+export class Resolution extends EventPropertyQualityDefinition {
+    "@class": "org.apache.streampipes.model.quality.Resolution";
+    quantityValue: number;
+
+    static fromData(data: Resolution, target?: Resolution): Resolution {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new Resolution();
+        super.fromData(data, instance);
+        instance.quantityValue = data.quantityValue;
+        return instance;
+    }
+}
+
+export class RuntimeOptionsRequest extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.runtime.RuntimeOptionsRequest";
+    appId: string;
+    inputStreams: SpDataStreamUnion[];
+    requestId: string;
+    staticProperties: StaticPropertyUnion[];
+
+    static fromData(data: RuntimeOptionsRequest, target?: RuntimeOptionsRequest): RuntimeOptionsRequest {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new RuntimeOptionsRequest();
+        super.fromData(data, instance);
+        instance.requestId = data.requestId;
+        instance.appId = data.appId;
+        instance.staticProperties = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.staticProperties);
+        instance.inputStreams = __getCopyArrayFn(SpDataStream.fromDataUnion)(data.inputStreams);
+        return instance;
+    }
+}
+
+export class RuntimeResolvableAnyStaticProperty extends AnyStaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.RuntimeResolvableAnyStaticProperty";
+    dependsOn: string[];
+
+    static fromData(data: RuntimeResolvableAnyStaticProperty, target?: RuntimeResolvableAnyStaticProperty): RuntimeResolvableAnyStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new RuntimeResolvableAnyStaticProperty();
+        super.fromData(data, instance);
+        instance.dependsOn = __getCopyArrayFn(__identity<string>())(data.dependsOn);
+        return instance;
+    }
+}
+
+export class RuntimeResolvableOneOfStaticProperty extends OneOfStaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.RuntimeResolvableOneOfStaticProperty";
+    dependsOn: string[];
+
+    static fromData(data: RuntimeResolvableOneOfStaticProperty, target?: RuntimeResolvableOneOfStaticProperty): RuntimeResolvableOneOfStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new RuntimeResolvableOneOfStaticProperty();
+        super.fromData(data, instance);
+        instance.dependsOn = __getCopyArrayFn(__identity<string>())(data.dependsOn);
+        return instance;
+    }
+}
+
+export class SecretStaticProperty extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.SecretStaticProperty";
+    encrypted: boolean;
+    value: string;
+
+    static fromData(data: SecretStaticProperty, target?: SecretStaticProperty): SecretStaticProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SecretStaticProperty();
+        super.fromData(data, instance);
+        instance.value = data.value;
+        instance.encrypted = data.encrypted;
+        return instance;
+    }
+}
+
+export class TopicDefinition extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.grounding.TopicDefinition" | "org.apache.streampipes.model.grounding.SimpleTopicDefinition" | "org.apache.streampipes.model.grounding.WildcardTopicDefinition";
+    actualTopicName: string;
+
+    static fromData(data: TopicDefinition, target?: TopicDefinition): TopicDefinition {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TopicDefinition();
+        super.fromData(data, instance);
+        instance.actualTopicName = data.actualTopicName;
+        return instance;
+    }
+
+    static fromDataUnion(data: TopicDefinitionUnion): TopicDefinitionUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.grounding.SimpleTopicDefinition":
+                return SimpleTopicDefinition.fromData(data);
+            case "org.apache.streampipes.model.grounding.WildcardTopicDefinition":
+                return WildcardTopicDefinition.fromData(data);
+        }
+    }
+}
+
+export class SimpleTopicDefinition extends TopicDefinition {
+    "@class": "org.apache.streampipes.model.grounding.SimpleTopicDefinition";
+
+    static fromData(data: SimpleTopicDefinition, target?: SimpleTopicDefinition): SimpleTopicDefinition {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SimpleTopicDefinition();
+        super.fromData(data, instance);
+        return instance;
+    }
+}
+
+export class SpDataStream extends NamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.SpDataStream" | "org.apache.streampipes.model.SpDataSet";
+    category: string[];
+    eventGrounding: EventGrounding;
+    eventSchema: EventSchema;
+    hasEventStreamQualities: EventStreamQualityDefinitionUnion[];
+    index: number;
+    measurementCapability: MeasurementCapability[];
+    measurementObject: MeasurementObject[];
+    requiresEventStreamQualities: EventStreamQualityRequirement[];
+
+    static fromData(data: SpDataStream, target?: SpDataStream): SpDataStream {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SpDataStream();
+        super.fromData(data, instance);
+        instance.hasEventStreamQualities = __getCopyArrayFn(EventStreamQualityDefinition.fromDataUnion)(data.hasEventStreamQualities);
+        instance.requiresEventStreamQualities = __getCopyArrayFn(EventStreamQualityRequirement.fromData)(data.requiresEventStreamQualities);
+        instance.eventGrounding = EventGrounding.fromData(data.eventGrounding);
+        instance.eventSchema = EventSchema.fromData(data.eventSchema);
+        instance.measurementCapability = __getCopyArrayFn(MeasurementCapability.fromData)(data.measurementCapability);
+        instance.measurementObject = __getCopyArrayFn(MeasurementObject.fromData)(data.measurementObject);
+        instance.index = data.index;
+        instance.category = __getCopyArrayFn(__identity<string>())(data.category);
+        return instance;
+    }
+
+    static fromDataUnion(data: SpDataStreamUnion): SpDataStreamUnion {
+        if (!data) {
+            return data;
+        }
+        switch (data["@class"]) {
+            case "org.apache.streampipes.model.SpDataStream":
+                return SpDataStream.fromData(data);
+            case "org.apache.streampipes.model.SpDataSet":
+                return SpDataSet.fromData(data);
+        }
+    }
+}
+
+export class SpDataSet extends SpDataStream {
+    "@class": "org.apache.streampipes.model.SpDataSet";
+    actualTopicName: string;
+    brokerHostname: string;
+    correspondingPipeline: string;
+    datasetInvocationId: string;
+    supportedGrounding: EventGrounding;
+
+    static fromData(data: SpDataSet, target?: SpDataSet): SpDataSet {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SpDataSet();
+        super.fromData(data, instance);
+        instance.supportedGrounding = EventGrounding.fromData(data.supportedGrounding);
+        instance.datasetInvocationId = data.datasetInvocationId;
+        instance.correspondingPipeline = data.correspondingPipeline;
+        instance.brokerHostname = data.brokerHostname;
+        instance.actualTopicName = data.actualTopicName;
+        return instance;
+    }
+}
+
+export class SpecificAdapterSetDescription extends AdapterSetDescription {
+    "@class": "org.apache.streampipes.model.connect.adapter.SpecificAdapterSetDescription";
+
+    static fromData(data: SpecificAdapterSetDescription, target?: SpecificAdapterSetDescription): SpecificAdapterSetDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SpecificAdapterSetDescription();
+        super.fromData(data, instance);
+        return instance;
+    }
+}
+
+export class SpecificAdapterStreamDescription extends AdapterStreamDescription {
+    "@class": "org.apache.streampipes.model.connect.adapter.SpecificAdapterStreamDescription";
+
+    static fromData(data: SpecificAdapterStreamDescription, target?: SpecificAdapterStreamDescription): SpecificAdapterStreamDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SpecificAdapterStreamDescription();
+        super.fromData(data, instance);
+        return instance;
+    }
+}
+
+export class StaticPropertyAlternative extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.StaticPropertyAlternative";
+    selected: boolean;
+    staticProperty: StaticPropertyUnion;
+
+    static fromData(data: StaticPropertyAlternative, target?: StaticPropertyAlternative): StaticPropertyAlternative {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new StaticPropertyAlternative();
+        super.fromData(data, instance);
+        instance.selected = data.selected;
+        instance.staticProperty = StaticProperty.fromDataUnion(data.staticProperty);
+        return instance;
+    }
+}
+
+export class StaticPropertyAlternatives extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.StaticPropertyAlternatives";
+    alternatives: StaticPropertyAlternative[];
+
+    static fromData(data: StaticPropertyAlternatives, target?: StaticPropertyAlternatives): StaticPropertyAlternatives {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new StaticPropertyAlternatives();
+        super.fromData(data, instance);
+        instance.alternatives = __getCopyArrayFn(StaticPropertyAlternative.fromData)(data.alternatives);
+        return instance;
+    }
+}
+
+export class StaticPropertyGroup extends StaticProperty {
+    "@class": "org.apache.streampipes.model.staticproperty.StaticPropertyGroup";
+    horizontalRendering: boolean;
+    showLabel: boolean;
+    staticProperties: StaticPropertyUnion[];
+
+    static fromData(data: StaticPropertyGroup, target?: StaticPropertyGroup): StaticPropertyGroup {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new StaticPropertyGroup();
+        super.fromData(data, instance);
+        instance.staticProperties = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.staticProperties);
+        instance.showLabel = data.showLabel;
+        instance.horizontalRendering = data.horizontalRendering;
+        return instance;
+    }
+}
+
+export class StreamPipesJsonLdContainer extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.base.StreamPipesJsonLdContainer";
+    containedElements: AbstractStreamPipesEntityUnion[];
+
+    static fromData(data: StreamPipesJsonLdContainer, target?: StreamPipesJsonLdContainer): StreamPipesJsonLdContainer {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new StreamPipesJsonLdContainer();
+        super.fromData(data, instance);
+        instance.containedElements = __getCopyArrayFn(AbstractStreamPipesEntity.fromDataUnion)(data.containedElements);
+        return instance;
+    }
+}
+
+export class SupportedProperty extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.staticproperty.SupportedProperty";
+    propertyId: string;
+    value: string;
+    valueRequired: boolean;
+
+    static fromData(data: SupportedProperty, target?: SupportedProperty): SupportedProperty {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new SupportedProperty();
+        super.fromData(data, instance);
+        instance.propertyId = data.propertyId;
+        instance.valueRequired = data.valueRequired;
+        instance.value = data.value;
+        return instance;
+    }
+}
+
+export class TimestampTranfsformationRuleDescription extends ValueTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.value.TimestampTranfsformationRuleDescription";
+    formatString: string;
+    mode: string;
+    multiplier: number;
+    runtimeKey: string;
+
+    static fromData(data: TimestampTranfsformationRuleDescription, target?: TimestampTranfsformationRuleDescription): TimestampTranfsformationRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TimestampTranfsformationRuleDescription();
+        super.fromData(data, instance);
+        instance.runtimeKey = data.runtimeKey;
+        instance.mode = data.mode;
+        instance.formatString = data.formatString;
+        instance.multiplier = data.multiplier;
+        return instance;
+    }
+}
+
+export class TransformOperation extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.output.TransformOperation";
+    mappingPropertyInternalName: string;
+    sourceStaticProperty: string;
+    targetValue: string;
+    transformationScope: string;
+
+    static fromData(data: TransformOperation, target?: TransformOperation): TransformOperation {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TransformOperation();
+        super.fromData(data, instance);
+        instance.mappingPropertyInternalName = data.mappingPropertyInternalName;
+        instance.sourceStaticProperty = data.sourceStaticProperty;
+        instance.transformationScope = data.transformationScope;
+        instance.targetValue = data.targetValue;
+        return instance;
+    }
+}
+
+export class TransformOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.TransformOutputStrategy";
+    transformOperations: TransformOperation[];
+
+    static fromData(data: TransformOutputStrategy, target?: TransformOutputStrategy): TransformOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TransformOutputStrategy();
+        super.fromData(data, instance);
+        instance.transformOperations = __getCopyArrayFn(TransformOperation.fromData)(data.transformOperations);
+        return instance;
+    }
+}
+
+export class TransportFormat extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.grounding.TransportFormat";
+    rdfType: URI[];
+
+    static fromData(data: TransportFormat, target?: TransportFormat): TransportFormat {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new TransportFormat();
+        super.fromData(data, instance);
+        instance.rdfType = __getCopyArrayFn(URI.fromData)(data.rdfType);
+        return instance;
+    }
+}
+
+export class URI implements Comparable<URI> {
+
+    static fromData(data: URI, target?: URI): URI {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new URI();
+        return instance;
+    }
+}
+
+export class UnitTransformRuleDescription extends ValueTransformationRuleDescription {
+    "@class": "org.apache.streampipes.model.connect.rules.value.UnitTransformRuleDescription";
+    fromUnitRessourceURL: string;
+    runtimeKey: string;
+    toUnitRessourceURL: string;
+
+    static fromData(data: UnitTransformRuleDescription, target?: UnitTransformRuleDescription): UnitTransformRuleDescription {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new UnitTransformRuleDescription();
+        super.fromData(data, instance);
+        instance.runtimeKey = data.runtimeKey;
+        instance.fromUnitRessourceURL = data.fromUnitRessourceURL;
+        instance.toUnitRessourceURL = data.toUnitRessourceURL;
+        return instance;
+    }
+}
+
+export class UserDefinedOutputStrategy extends OutputStrategy {
+    "@class": "org.apache.streampipes.model.output.UserDefinedOutputStrategy";
+    eventProperties: EventPropertyUnion[];
+
+    static fromData(data: UserDefinedOutputStrategy, target?: UserDefinedOutputStrategy): UserDefinedOutputStrategy {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new UserDefinedOutputStrategy();
+        super.fromData(data, instance);
+        instance.eventProperties = __getCopyArrayFn(EventProperty.fromDataUnion)(data.eventProperties);
+        return instance;
+    }
+}
+
+export class VisualizablePipeline extends DashboardEntity {
+    "@class": "org.apache.streampipes.model.dashboard.VisualizablePipeline";
+    pipelineId: string;
+    schema: EventSchema;
+    topic: string;
+    visualizationName: string;
+
+    static fromData(data: VisualizablePipeline, target?: VisualizablePipeline): VisualizablePipeline {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new VisualizablePipeline();
+        super.fromData(data, instance);
+        instance.pipelineId = data.pipelineId;
+        instance.schema = EventSchema.fromData(data.schema);
+        instance.visualizationName = data.visualizationName;
+        instance.topic = data.topic;
+        return instance;
+    }
+}
+
+export class WildcardTopicDefinition extends TopicDefinition {
+    "@class": "org.apache.streampipes.model.grounding.WildcardTopicDefinition";
+    wildcardTopicMappings: WildcardTopicMapping[];
+    wildcardTopicName: string;
+
+    static fromData(data: WildcardTopicDefinition, target?: WildcardTopicDefinition): WildcardTopicDefinition {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new WildcardTopicDefinition();
+        super.fromData(data, instance);
+        instance.wildcardTopicName = data.wildcardTopicName;
+        instance.wildcardTopicMappings = __getCopyArrayFn(WildcardTopicMapping.fromData)(data.wildcardTopicMappings);
+        return instance;
+    }
+}
+
+export class WildcardTopicMapping extends UnnamedStreamPipesEntity {
+    "@class": "org.apache.streampipes.model.grounding.WildcardTopicMapping";
+    mappedRuntimeName: string;
+    mappingId: string;
+    selectedMapping: string;
+    topicParameterType: string;
+
+    static fromData(data: WildcardTopicMapping, target?: WildcardTopicMapping): WildcardTopicMapping {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new WildcardTopicMapping();
+        super.fromData(data, instance);
+        instance.topicParameterType = data.topicParameterType;
+        instance.mappingId = data.mappingId;
+        instance.mappedRuntimeName = data.mappedRuntimeName;
+        instance.selectedMapping = data.selectedMapping;
+        return instance;
+    }
+}
+
+export type AbstractStreamPipesEntityUnion = NamedStreamPipesEntity | UnnamedStreamPipesEntity;
+
+export type AdapterDescriptionUnion = AdapterSetDescription | AdapterStreamDescription;
+
+export type AdapterSetDescriptionUnion = GenericAdapterSetDescription | SpecificAdapterSetDescription;
+
+export type AdapterStreamDescriptionUnion = SpecificAdapterStreamDescription;
+
+export type DashboardEntityUnion = DashboardWidgetModel | VisualizablePipeline | DataExplorerWidgetModel;
+
+export type EventPropertyQualityDefinitionUnion = Accuracy | MeasurementRange | Precision | Resolution;
+
+export type EventPropertyUnion = EventPropertyList | EventPropertyNested | EventPropertyPrimitive;
+
+export type EventStreamQualityDefinitionUnion = Frequency | Latency;
+
+export type InvocableStreamPipesEntityUnion = DataProcessorInvocation | DataSinkInvocation;
+
+export type MappingPropertyUnion = MappingPropertyNary | MappingPropertyUnary;
+
+export type MeasurementPropertyUnion = EventPropertyQualityDefinition | EventStreamQualityDefinition;
+
+export type OneOfStaticPropertyUnion = RuntimeResolvableOneOfStaticProperty;
+
+export type OutputStrategyUnion = AppendOutputStrategy | CustomOutputStrategy | CustomTransformOutputStrategy | FixedOutputStrategy | KeepOutputStrategy | ListOutputStrategy | TransformOutputStrategy | UserDefinedOutputStrategy;
+
+export type SchemaTransformationRuleDescriptionUnion = CreateNestedRuleDescription | DeleteRuleDescription | RenameRuleDescription | MoveRuleDescription;
+
+export type SelectionStaticPropertyUnion = AnyStaticProperty | OneOfStaticProperty;
+
+export type SpDataStreamUnion = SpDataStream | SpDataSet;
+
+export type StaticPropertyType = "AnyStaticProperty" | "CollectionStaticProperty" | "ColorPickerStaticProperty" | "DomainStaticProperty" | "FreeTextStaticProperty" | "FileStaticProperty" | "MappingPropertyUnary" | "MappingPropertyNary" | "MatchingStaticProperty" | "OneOfStaticProperty" | "RuntimeResolvableAnyStaticProperty" | "RuntimeResolvableOneOfStaticProperty" | "StaticPropertyGroup" | "StaticPropertyAlternatives" | "StaticPropertyAlternative" | "SecretStaticProperty" | "CodeInputSta [...]
+
+export type StaticPropertyUnion = AnyStaticProperty | CodeInputStaticProperty | CollectionStaticProperty | ColorPickerStaticProperty | DomainStaticProperty | FileStaticProperty | FreeTextStaticProperty | MappingPropertyUnary | MappingPropertyNary | MatchingStaticProperty | OneOfStaticProperty | RuntimeResolvableAnyStaticProperty | RuntimeResolvableOneOfStaticProperty | SecretStaticProperty | StaticPropertyAlternative | StaticPropertyAlternatives | StaticPropertyGroup;
+
+export type StreamTransformationRuleDescriptionUnion = EventRateTransformationRuleDescription | RemoveDuplicatesTransformationRuleDescription;
+
+export type TopicDefinitionUnion = SimpleTopicDefinition | WildcardTopicDefinition;
+
+export type TransformationRuleDescriptionUnion = ValueTransformationRuleDescription | StreamTransformationRuleDescription | SchemaTransformationRuleDescription;
+
+export type TransportProtocolUnion = JmsTransportProtocol | KafkaTransportProtocol | MqttTransportProtocol;
+
+export type UnnamedStreamPipesEntityUnion = StreamPipesJsonLdContainer | DomainPropertyProbability | DomainPropertyProbabilityList | GuessSchema | TransformationRuleDescription | ConnectWorkerContainer | DashboardEntity | DashboardWidgetSettings | DataLakeMeasure | EventGrounding | TopicDefinition | TransportFormat | TransportProtocol | WildcardTopicMapping | ElementStatusInfoSettings | OutputStrategy | PropertyRenameRule | TransformOperation | EventPropertyQualityRequirement | EventStre [...]
+
+export type ValueSpecificationUnion = QuantitativeValue | Enumeration;
+
+export type ValueTransformationRuleDescriptionUnion = AddTimestampRuleDescription | AddValueTransformationRuleDescription | TimestampTranfsformationRuleDescription | UnitTransformRuleDescription;
+
+function __getCopyArrayFn<T>(itemCopyFn: (item: T) => T): (array: T[]) => T[] {
+    return (array: T[]) => __copyArray(array, itemCopyFn);
+}
+
+function __copyArray<T>(array: T[], itemCopyFn: (item: T) => T): T[] {
+    return array && array.map(item => item && itemCopyFn(item));
+}
+
+function __getCopyObjectFn<T>(itemCopyFn: (item: T) => T): (object: { [index: string]: T }) => { [index: string]: T } {
+    return (object: { [index: string]: T }) => __copyObject(object, itemCopyFn);
+}
+
+function __copyObject<T>(object: { [index: string]: T }, itemCopyFn: (item: T) => T): { [index: string]: T } {
+    if (!object) {
+        return object;
+    }
+    const result: any = {};
+    for (const key in object) {
+        if (object.hasOwnProperty(key)) {
+            const value = object[key];
+            result[key] = value && itemCopyFn(value);
+        }
+    }
+    return result;
+}
+
+function __identity<T>(): (value: T) => T {
+    return value => value;
+}
diff --git a/ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.css b/ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.html b/ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.html
new file mode 100644
index 0000000..e69de29
diff --git a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java b/ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.ts
similarity index 72%
copy from streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
copy to ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.ts
index 7f22a1b..3a31d2c 100644
--- a/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/util/SpMediaType.java
+++ b/ui/src/app/editor-v2/components/pipeline-assembly/pipeline-assembly.component.ts
@@ -15,9 +15,21 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.shared.util;
 
-public class SpMediaType {
+import {
+    Component,
+    OnInit,
+} from "@angular/core";
 
-  public static final String JSONLD = "application/ld+json";
-}
+
+@Component({
+    selector: 'pipeline-assembly',
+    templateUrl: './pipeline-assembly.component.html',
+    styleUrls: ['./pipeline-assembly.component.css']
+})
+export class PipelineAssemblyComponent implements OnInit {
+
+    ngOnInit(): void {
+    }
+
+}
\ No newline at end of file
diff --git a/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.css b/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.html b/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.html
new file mode 100644
index 0000000..67b171a
--- /dev/null
+++ b/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.html
@@ -0,0 +1,95 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You 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.
+  ~
+  -->
+
+<div class="editorIconStandOptions" style="padding:0px;">
+    <div fxFlex="100" fxLayout="row" fxLayoutAlign="start start" style="padding-top:2px;padding-left:10px;">
+
+        <div fxLayoutAlign="start center" fxLayout="row">
+            <div fxLayout="row" style="margin-right: 5px">
+                <i class="material-icons">search</i>
+                <input type="text" ng-model="elementFilter" placeholder="Find Element"
+                       style="background-color:#f6f6f6;border: none;border-bottom: solid 2px rgb(27, 20, 100);">&nbsp;
+            </div>
+            <div fxLayout="row">
+                <button mat-button [matMenuTriggerFor]="menu"><i class="material-icons">list</i>Filter by category</button>
+                <mat-menu #menu="matMenu">
+                    <button mat-menu-item>
+                        <i class="material-icons">done</i>&nbsp;Select all
+                    </button>
+                    <button mat-menu-item>
+                        <i class="material-icons">clear</i>&nbsp;Deselect all
+                    </button>
+                </mat-menu>
+<!--                <md-menu-bar>-->
+<!--                    <md-menu>-->
+<!--                        <button ng-click="$mdOpenMenu()" class="sp-accent">-->
+<!--                            <md-icon md-svg-icon="action:ic_view_list_24px"-->
+<!--                                     class="sp-accent"></md-icon>-->
+<!--                            Filter by category-->
+<!--                        </button>-->
+<!--                        <md-menu-content>-->
+<!--                            <md-menu-item class="md-indent">-->
+<!--                                <md-icon md-svg-icon="action:ic_done_24px"-->
+<!--                                         class="sp-accent"></md-icon>-->
+<!--                                <md-button ng-click="ctrl.selectAllOptions()">&nbsp;Select all</md-button>-->
+<!--                            </md-menu-item>-->
+<!--                            <md-menu-item class="md-indent">-->
+<!--                                <md-icon md-svg-icon="content:ic_clear_24px"-->
+<!--                                         class="sp-accent"></md-icon>-->
+<!--                                <md-button ng-click="ctrl.deselectAllOptions()">&nbsp;Deselect all</md-button>-->
+<!--                            </md-menu-item>-->
+<!--                            <md-menu-divider></md-menu-divider>-->
+<!--                            <div ng-repeat="option in ctrl.availableOptions[ctrl.activeType] | orderBy: 'label'">-->
+<!--                                <md-menu-item class="md-indent">-->
+<!--                                    <md-icon md-svg-icon="action:ic_visibility_24px"-->
+<!--                                             class="sp-accent"-->
+<!--                                             ng-if="ctrl.optionSelected(option)"></md-icon>-->
+<!--                                    <md-icon md-svg-icon="action:ic_visibility_off_24px"-->
+<!--                                             class="sp-accent"-->
+<!--                                             ng-if="!ctrl.optionSelected(option)"></md-icon>-->
+<!--                                    <md-button ng-click="ctrl.toggleFilter(option)">&nbsp;{{option.label}}-->
+<!--                                    </md-button>-->
+<!--                                </md-menu-item>-->
+<!--                            </div>-->
+<!--                        </md-menu-content>-->
+<!--                    </md-menu>-->
+<!--                </md-menu-bar>-->
+            </div>
+        </div>
+    </div>
+</div>
+<div flex id="editor-icon-stand" class="icon-stand" *ngIf="currentElements">
+    <span id="{{ element.name }}" (mouseenter)="updateMouseOver(element.name)"
+          (mouseleave)="updateMouseOver('')"
+          *ngFor="let element of currentElements"
+          my-data-bind class="draggable-icon tt"
+          [ngClass]="element.type">
+        <span id="container" style="position:relative;display:block;width:80px;height:80px;">
+        <pipeline-element id="pe-icon-stand-{{ element.appId }}" style="margin-left:-3%" [iconStandSize]="true" [pipelineElement]="element"
+                          [preview]="false"></pipeline-element>
+            <span style="display:block;width:100%;height:100%;position:absolute; top:0; left:0;"
+                  ng-if="currentElementName==element.name">
+                <span class="help-button-icon-stand" style="z-index:10"><md-button
+                        ng-click="openHelpDialog(element)"
+                        class="md-icon-button"
+                        style="margin:0px;font-size:20px;">?</md-button>
+                </span>
+            </span>
+        </span>
+    </span>
+</div>
\ No newline at end of file
diff --git a/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.ts b/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.ts
new file mode 100644
index 0000000..cc6bc5c
--- /dev/null
+++ b/ui/src/app/editor-v2/components/pipeline-element-icon-stand/pipeline-element-icon-stand.component.ts
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ */
+
+import {
+    Component, Input,
+    OnInit,
+} from "@angular/core";
+import * as angular from "angular";
+import {RestApi} from "../../../services/rest-api.service";
+
+
+@Component({
+    selector: 'pipeline-element-icon-stand',
+    templateUrl: './pipeline-element-icon-stand.component.html',
+    styleUrls: ['./pipeline-element-icon-stand.component.css']
+})
+export class PipelineElementIconStandComponent implements OnInit {
+
+    @Input()
+    activeType: string;
+
+    @Input()
+    currentElements: Array<any>;
+
+    elementFilter: string;
+    availableOptions: any = [];
+    selectedOptions: any = [];
+
+    constructor(private RestApi: RestApi) {
+
+    }
+
+    ngOnInit(): void {
+        this.loadOptions(this.activeType);
+    }
+
+    openHelpDialog(pipelineElement) {
+        //this.EditorDialogManager.openHelpDialog(pipelineElement);
+    }
+
+    updateMouseOver(elementName) {
+        //this.currentElementName = elementName;
+    }
+
+    loadOptions(type?) {
+        this.RestApi.getEpCategories()
+            .then(msg => {
+                let s = msg;
+                this.handleCategoriesSuccess("stream", s);
+                this.handleCategoriesSuccess("set", s);
+            });
+
+        this.RestApi.getEpaCategories()
+            .then(s => this.handleCategoriesSuccess("sepa", s));
+
+        this.RestApi.getEcCategories()
+            .then(s => this.handleCategoriesSuccess("action", s));
+
+    };
+
+    getOptions(type) {
+        this.selectAllOptions();
+        //return this.availableOptions[type];
+    }
+
+
+    handleCategoriesSuccess(type, result) {
+        this.availableOptions[type] = result.data;
+        this.selectAllOptions();
+    }
+
+    toggleFilter(option) {
+        this.selectedOptions = [];
+        this.selectedOptions.push(option.type);
+    }
+
+    optionSelected(option) {
+        return this.selectedOptions.indexOf(option.type) > -1;
+    }
+
+    selectAllOptions() {
+        this.selectedOptions = [];
+        angular.forEach(this.availableOptions[this.activeType], o => {
+            this.selectedOptions.push(o.type);
+        });
+    }
+
+    deselectAllOptions() {
+        this.selectedOptions = [];
+    }
+
+}
\ No newline at end of file
diff --git a/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.css b/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.html b/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.html
new file mode 100644
index 0000000..0c579e2
--- /dev/null
+++ b/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.html
@@ -0,0 +1,22 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You 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.
+  ~
+  -->
+
+<img src="{{iconUrl}}" *ngIf="showImage" style="{{iconSizeCss()}}">
+<span *ngIf="!showImage" class="element-text-icon">
+            {{iconText}}
+</span>
\ No newline at end of file
diff --git a/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.ts b/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.ts
new file mode 100644
index 0000000..e6dc952
--- /dev/null
+++ b/ui/src/app/editor-v2/components/pipeline-element/pipeline-element.component.ts
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ */
+
+import {
+    Component, Input,
+    OnInit,
+} from "@angular/core";
+import * as angular from "angular";
+import {RestApi} from "../../../services/rest-api.service";
+import {ElementIconText} from "../../../services/get-element-icon-text.service";
+import {ImageChecker} from "../../../services/image-checker.service";
+
+
+@Component({
+    selector: 'pipeline-element',
+    templateUrl: './pipeline-element.component.html',
+    styleUrls: ['./pipeline-element.component.css']
+})
+export class PipelineElementComponent implements OnInit {
+
+    showImage: any;
+    iconText: any;
+
+    @Input()
+    pipelineElement: any;
+
+    @Input()
+    preview: any;
+
+    @Input()
+    iconSize: any;
+
+    @Input()
+    iconStandSize: any;
+
+    iconUrl: any;
+
+    constructor(private ImageChecker: ImageChecker,
+                private RestApi: RestApi,
+                private ElementIconText: ElementIconText) {
+
+    }
+
+    ngOnInit(): void {
+        console.log(this.pipelineElement);
+        this.iconText =  this.ElementIconText.getElementIconText(this.pipelineElement.name);
+        this.checkImageAvailable();
+    }
+
+    checkImageAvailable() {
+        if (this.pipelineElement.includesAssets) {
+            this.fetchImage(this.makeAssetIconUrl())
+        } else {
+            this.fetchImage(this.pipelineElement.iconUrl);
+        }
+    }
+
+    fetchImage(imageUrl) {
+        this.ImageChecker.imageExists(imageUrl, (exists) => {
+            this.iconUrl = imageUrl;
+            this.showImage = exists;
+        })
+    }
+
+    makeAssetIconUrl() {
+        return this.RestApi.getAssetUrl(this.pipelineElement.appId) +"/icon";
+    }
+
+    iconSizeCss() {
+        if (this.iconSize) {
+            return 'width:35px;height:35px;';
+        }
+        else if (this.preview) {
+            return 'width:50px;height:50px;';
+        } else if (this.iconStandSize) {
+            return 'width:50px;height:50px;margin-top:-5px;'
+        } else {
+            return 'width:70px;height:70px;';
+        }
+    }
+
+
+}
\ No newline at end of file
diff --git a/ui/src/app/editor-v2/editor.component.css b/ui/src/app/editor-v2/editor.component.css
new file mode 100644
index 0000000..e69de29
diff --git a/ui/src/app/editor-v2/editor.component.html b/ui/src/app/editor-v2/editor.component.html
new file mode 100644
index 0000000..152ea70
--- /dev/null
+++ b/ui/src/app/editor-v2/editor.component.html
@@ -0,0 +1,43 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one or more
+  ~ contributor license agreements.  See the NOTICE file distributed with
+  ~ this work for additional information regarding copyright ownership.
+  ~ The ASF licenses this file to You 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.
+  ~
+  -->
+
+<div fxLayout="column" class="page-container">
+    <div fxLayout="row" style="padding:0px;background-color:#f6f6f6;">
+        <div fxFlex="100" style="line-height:24px;border-bottom:1px solid #ccc">
+            <div fxFlex="100" fxLayout="row">
+                <div fxFlex fxLayoutAlign="start center">
+                    <mat-tab-group [selectedIndex]="selectedIndex" (selectedIndexChange)="selectPipelineElements($event)">
+                        <mat-tab *ngFor="let tab of tabs" label="{{tab.title}}"></mat-tab>
+                    </mat-tab-group>
+                </div>
+            </div>
+        </div>
+    </div>
+
+    <div class="fixed-height page-container-padding-inner" fxLayout="column" fxFlex="100">
+        <div id="shepherd-test"
+             style="background-color:#f6f6f6;padding:0px;border-bottom:1px solid #ffffff">
+            <pipeline-element-icon-stand [activeType]="activeType"
+                                         [currentElements]="currentElements"
+                                         element-filter="ctrl.elementFilter">
+            </pipeline-element-icon-stand>
+        </div>
+<!--        <pipeline-assembly raw-pipeline-model="ctrl.rawPipelineModel" all-elements="ctrl.allElements"-->
+<!--                           current-modified-pipeline-id="ctrl.currentModifiedPipelineId"></pipeline-assembly>-->
+    </div>
+</div>
diff --git a/ui/src/app/editor-v2/editor.component.ts b/ui/src/app/editor-v2/editor.component.ts
new file mode 100644
index 0000000..68a54ea
--- /dev/null
+++ b/ui/src/app/editor-v2/editor.component.ts
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ */
+
+import {Component, OnInit} from "@angular/core";
+import {EditorService} from "./services/editor.service";
+import {DataStreamDescription} from "../connect/model/DataStreamDescription";
+import {DataSinkInvocation} from "../connect/model/DataSinkInvocation";
+import {DataSourceDescription} from "../connect/model/DataSourceDescription";
+import {DataProcessorInvocation} from "../core-model/gen/streampipes-model";
+
+@Component({
+    selector: 'editor',
+    templateUrl: './editor.component.html',
+    styleUrls: ['./editor.component.css']
+})
+export class EditorComponent implements OnInit {
+
+    selectedIndex: number = 1;
+    activeType: string = "stream";
+
+    availableDataStreams: DataStreamDescription[] = [];
+    availableDataProcessors: DataProcessorInvocation[] = [];
+    availableDataSinks: DataSinkInvocation[] = [];
+
+    allElements: any = [];
+    currentElements: any = [];
+
+    tabs = [
+        {
+            title: 'Data Sets',
+            type: 'set',
+        },
+        {
+            title: 'Data Streams',
+            type: 'stream',
+        },
+        {
+            title: 'Data Processors',
+            type: 'processor',
+        },
+        {
+            title: 'Data Sinks',
+            type: 'sink',
+        }
+    ];
+
+    constructor(private editorService: EditorService) {
+    }
+
+    public ngOnInit() {
+        this.editorService.getDataProcessors().subscribe(processors => {
+            //processors.forEach(processor => processor.type = "processor");
+            this.availableDataProcessors = processors;
+            console.log(processors);
+            this.allElements["processor"] = this.availableDataProcessors;
+        });
+        // this.editorService.getDataSources().subscribe(sources => {
+        //     this.availableDataStreams = this.collectStreams(sources);
+        //     this.allElements["stream"] = this.availableDataStreams;
+        // });
+        // this.editorService.getDataSinks().subscribe(sinks => {
+        //     sinks.forEach(processor => processor.type = "sink");
+        //     this.availableDataSinks = sinks;
+        //     this.allElements["sink"] = this.availableDataSinks;
+        // })
+    }
+
+    private collectStreams(sources: Array<DataSourceDescription>) {
+        let streams: DataStreamDescription[] = [];
+        sources.forEach(source => {
+            if (!Array.isArray(source.spDataStreams)) {
+                source.spDataStreams = [source.spDataStreams];
+            }
+            source.spDataStreams.forEach(stream => {
+                stream.type = "stream";
+                streams.push(stream);
+            });
+        });
+        return streams;
+    }
+
+
+    selectPipelineElements(index : number) {
+        this.selectedIndex = index;
+        this.activeType = this.tabs[index].type;
+        this.currentElements = this.allElements[this.activeType];
+    }
+
+}
diff --git a/ui/src/app/editor-v2/editor.module.ts b/ui/src/app/editor-v2/editor.module.ts
new file mode 100644
index 0000000..dd4e8d8
--- /dev/null
+++ b/ui/src/app/editor-v2/editor.module.ts
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ */
+
+import {NgModule} from '@angular/core';
+import {CommonModule} from '@angular/common';
+import {FlexLayoutModule} from '@angular/flex-layout';
+import {GridsterModule} from 'angular-gridster2';
+import {MatTabsModule} from "@angular/material/tabs";
+import {CustomMaterialModule} from "../CustomMaterial/custom-material.module";
+import {FormsModule} from "@angular/forms";
+import {ElementIconText} from "../services/get-element-icon-text.service";
+import {InjectableRxStompConfig, RxStompService, rxStompServiceFactory} from "@stomp/ng2-stompjs";
+import {SemanticTypeUtilsService} from '../core-services/semantic-type/semantic-type-utils.service';
+import {EditorComponent} from "./editor.component";
+import {ConnectModule} from "../connect/connect.module";
+import {EditorService} from "./services/editor.service";
+import {PipelineElementIconStandComponent} from "./components/pipeline-element-icon-stand/pipeline-element-icon-stand.component";
+import {PipelineAssemblyComponent} from "./components/pipeline-assembly/pipeline-assembly.component";
+import {ImageChecker} from "../services/image-checker.service";
+import {PipelineElementComponent} from "./components/pipeline-element/pipeline-element.component";
+
+
+@NgModule({
+    imports: [
+        CommonModule,
+        MatTabsModule,
+        FlexLayoutModule,
+        GridsterModule,
+        CommonModule,
+        FlexLayoutModule,
+        CustomMaterialModule,
+        FormsModule,
+        ConnectModule
+    ],
+    declarations: [
+        EditorComponent,
+        PipelineAssemblyComponent,
+        PipelineElementIconStandComponent,
+        PipelineElementComponent
+    ],
+    providers: [
+        EditorService,
+        SemanticTypeUtilsService,
+        {
+            provide: 'RestApi',
+            useFactory: ($injector: any) => $injector.get('RestApi'),
+            deps: ['$injector'],
+        },
+        ElementIconText,
+        ImageChecker,
+        {
+            provide: '$state',
+            useFactory: ($injector: any) => $injector.get('$state'),
+            deps: ['$injector']
+        }
+    ],
+    exports: [
+        EditorComponent
+    ],
+    entryComponents: [
+        EditorComponent,
+    ]
+})
+export class EditorModule {
+
+    constructor() {
+    }
+
+}
\ No newline at end of file
diff --git a/ui/src/app/editor-v2/services/editor.service.ts b/ui/src/app/editor-v2/services/editor.service.ts
new file mode 100644
index 0000000..5e29981
--- /dev/null
+++ b/ui/src/app/editor-v2/services/editor.service.ts
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ *
+ */
+
+import {Injectable} from "@angular/core";
+import {HttpClient, HttpHeaders} from "@angular/common/http";
+import {AuthStatusService} from "../../services/auth-status.service";
+import {TsonLdSerializerService} from "../../platform-services/tsonld-serializer.service";
+import {Observable} from "rxjs";
+import {DataProcessorInvocation, DataSinkInvocation} from "../../core-model/gen/streampipes-model";
+import {DataSourceDescription} from "../../connect/model/DataSourceDescription";
+
+@Injectable()
+export class EditorService {
+
+    constructor(private http: HttpClient,
+                private authStatusService: AuthStatusService,
+                private tsonLdSerializerService: TsonLdSerializerService) {
+    }
+
+    getDataProcessors(): Observable<Array<DataProcessorInvocation>> {
+        return this.http.get(this.dataProcessorsUrl + "/own").map(data => {
+            return (data as []).map(dpi => DataProcessorInvocation.fromData(dpi));
+        })
+    }
+
+    getDataSinks(): Observable<Array<DataSinkInvocation>> {
+        return this.http.get(this.dataSinksUrl + "/own", this.jsonLdHeaders()).map(data => {
+            return this.tsonLdSerializerService.fromJsonLdContainer(data, "sp:DataSinkInvocation");
+        })
+    }
+
+    getDataSources(): Observable<Array<DataSourceDescription>> {
+        return this.http.get(this.dataSourcesUrl + "/own", this.jsonLdHeaders()).map(data => {
+            return this.tsonLdSerializerService.fromJsonLdContainer(data, "sp:DataSourceDescription");
+        })
+    }
+
+    private get baseUrl(): string {
+        return '/streampipes-backend';
+    }
+
+    private get dataProcessorsUrl(): string {
+        return this.baseUrl + '/api/v2/users/' + this.authStatusService.email + '/sepas'
+    }
+
+    private get dataSourcesUrl(): string {
+        return this.baseUrl + '/api/v2/users/' + this.authStatusService.email + '/sources'
+    }
+
+    private get dataSinksUrl(): string {
+        return this.baseUrl + '/api/v2/users/' + this.authStatusService.email + '/actions'
+    }
+
+    private get ownPath() {
+        return "/own";
+    }
+
+    jsonLdHeaders(): any {
+        return {
+            headers: new HttpHeaders({
+                'Accept': 'application/ld+json',
+            }),
+        };
+    }
+
+}
\ No newline at end of file
diff --git a/ui/src/app/platform-services/tsonld-serializer.service.ts b/ui/src/app/platform-services/tsonld-serializer.service.ts
index f60dc66..730bf44 100644
--- a/ui/src/app/platform-services/tsonld-serializer.service.ts
+++ b/ui/src/app/platform-services/tsonld-serializer.service.ts
@@ -98,6 +98,12 @@ import {ColorPickerStaticProperty} from "../connect/model/ColorPickerStaticPrope
 import {MappingPropertyNary} from "../connect/model/MappingPropertyNary";
 import { DataExplorerWidgetModel } from "../core-model/datalake/DataExplorerWidgetModel";
 import { DataLakeMeasure } from "../core-model/datalake/DataLakeMeasure";
+import {UserDefinedOutputStrategy} from "../connect/model/output/UserDefinedOutputStrategy";
+import {CodeInputStaticProperty} from "../connect/model/CodeInputStaticProperty";
+import {DataSourceDescription} from "../connect/model/DataSourceDescription";
+import {EventGrounding} from "../connect/model/grounding/EventGrounding";
+import {TransportFormat} from "../connect/model/grounding/TransportFormat";
+import {TransportProtocol} from "../connect/model/grounding/TransportProtocol";
 
 
 @Injectable()
@@ -122,6 +128,10 @@ export class TsonLdSerializerService {
         tsonld.addClassMapping(SpecificAdapterStreamDescription);
         tsonld.addClassMapping(DataSetDescription);
         tsonld.addClassMapping(DataStreamDescription);
+        tsonld.addClassMapping(DataSourceDescription);
+        tsonld.addClassMapping(EventGrounding);
+        tsonld.addClassMapping(TransportFormat);
+        tsonld.addClassMapping(TransportProtocol);
         tsonld.addClassMapping(EventSchema);
         tsonld.addClassMapping(EventProperty);
         tsonld.addClassMapping(EventPropertyNested);
@@ -164,6 +174,7 @@ export class TsonLdSerializerService {
         tsonld.addClassMapping(BoundPipelineElement);
 
         tsonld.addClassMapping(AppendOutputStrategy);
+        tsonld.addClassMapping(CodeInputStaticProperty)
         tsonld.addClassMapping(CustomOutputStrategy);
         tsonld.addClassMapping(CustomTransformOutputStrategy);
         tsonld.addClassMapping(FixedOutputStrategy);
@@ -173,6 +184,7 @@ export class TsonLdSerializerService {
         tsonld.addClassMapping(PropertyRenameRule);
         tsonld.addClassMapping(TransformOperation);
         tsonld.addClassMapping(TransformOutputStrategy);
+        tsonld.addClassMapping(UserDefinedOutputStrategy);
 
         tsonld.addClassMapping(RuntimeResolvableAnyStaticProperty);
         tsonld.addClassMapping(RuntimeResolvableOneOfStaticProperty);
diff --git a/ui/src/app/services/image-checker.service.ts b/ui/src/app/services/image-checker.service.ts
index 2e2ae92..c958899 100644
--- a/ui/src/app/services/image-checker.service.ts
+++ b/ui/src/app/services/image-checker.service.ts
@@ -16,6 +16,9 @@
  *
  */
 
+import {Injectable} from "@angular/core";
+
+@Injectable()
 export class ImageChecker {
 
     constructor() {}