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:36 UTC

[incubator-streampipes] branch STREAMPIPES-145 created (now 6fc805f)

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

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


      at 6fc805f  [STREAMPIPES-145] Add new serialization layer, add initial skeleton of new Angular-based editor module

This branch includes the following new commits:

     new 6fc805f  [STREAMPIPES-145] Add new serialization layer, add initial skeleton of new Angular-based editor module

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



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

Posted by ri...@apache.org.
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() {}