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 2021/01/03 14:21:13 UTC

[incubator-streampipes] branch STREAMPIPES-272 updated: [STREAMPIPES-272] Clean up Rest API

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

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


The following commit(s) were added to refs/heads/STREAMPIPES-272 by this push:
     new 97f8af3  [STREAMPIPES-272] Clean up Rest API
97f8af3 is described below

commit 97f8af352bf69872df8b2c3aa9380bdc765ecbce
Author: Dominik Riemer <ri...@fzi.de>
AuthorDate: Sun Jan 3 15:20:52 2021 +0100

    [STREAMPIPES-272] Clean up Rest API
---
 .../backend/StreamPipesResourceConfig.java         |  4 ++
 .../master/management/SourcesManagementTest.java   | 30 +++++----
 .../model/template/PipelineElementTemplate.java    | 76 ++++++++++++++++++++++
 .../template/PipelineElementTemplateConfig.java    | 44 +++++++++----
 streampipes-platform-services/pom.xml              | 17 +++++
 .../ps/PipelineElementTemplateResource.java        | 36 ++++++----
 .../streampipes/rest/shared/api/CRUDResource.java  | 14 ++--
 .../shared/impl/AbstractSharedRestInterface.java   | 54 +++++++++------
 .../streampipes/rest/api/IApplicationLink.java     | 27 --------
 .../org/apache/streampipes/rest/api/ICategory.java | 38 -----------
 .../apache/streampipes/rest/api/IConsulConfig.java | 37 -----------
 .../org/apache/streampipes/rest/api/ICouchdb.java  | 27 --------
 .../org/apache/streampipes/rest/api/ILogs.java     | 29 ---------
 .../rest/api/IMeasurementUnitResource.java         | 26 --------
 .../apache/streampipes/rest/api/INotification.java | 34 ----------
 .../streampipes/rest/api/IOntologyContext.java     | 34 ----------
 .../streampipes/rest/api/IOntologyKnowledge.java   | 70 --------------------
 .../rest/api/IOntologyMeasurementUnit.java         | 30 ---------
 .../rest/api/IOntologyPipelineElement.java         | 37 -----------
 .../streampipes/rest/api/IPipelineCache.java       | 30 ---------
 .../rest/api/IPipelineElementAsset.java            | 29 ---------
 .../streampipes/rest/api/IPipelineElementFile.java | 33 ----------
 .../rest/api/IPipelineElementRuntimeInfo.java      | 27 --------
 .../streampipes/rest/api/IPipelineTemplate.java    | 33 ----------
 .../apache/streampipes/rest/api/IRdfEndpoint.java  | 34 ----------
 .../org/apache/streampipes/rest/api/ISetup.java    | 34 ----------
 .../org/apache/streampipes/rest/api/IUser.java     | 30 ---------
 .../org/apache/streampipes/rest/api/IVersion.java  | 27 --------
 .../streampipes/rest/api/IVirtualSensor.java       | 29 ---------
 .../streampipes/rest/api/IVisualization.java       | 26 --------
 .../rest/api/InternalPipelineTemplate.java         | 29 ---------
 .../streampipes/rest/api/connect/SpConnect.java    | 22 -------
 .../streampipes/rest/api/dashboard/IDashboard.java | 36 ----------
 .../rest/api/dashboard/IDashboardWidget.java       | 36 ----------
 .../rest/api/dashboard/IVisualizablePipeline.java  | 32 ---------
 .../rest/api/dataexplorer/IDataExplorerWidget.java | 36 ----------
 .../rest/impl/AbstractRestInterface.java           | 36 +---------
 .../streampipes/rest/impl/AssetDashboard.java      | 23 ++-----
 .../streampipes/rest/impl/Authentication.java      | 24 ++-----
 .../streampipes/rest/impl/CategoryResource.java    |  8 +--
 .../apache/streampipes/rest/impl/ConsulConfig.java | 26 ++------
 .../org/apache/streampipes/rest/impl/Couchdb.java  |  6 +-
 .../rest/impl/InternalPipelineTemplates.java       |  3 +-
 .../streampipes/rest/impl/LabelResource.java       |  9 +--
 .../rest/impl/MeasurementUnitResource.java         |  5 +-
 .../apache/streampipes/rest/impl/Notification.java | 16 +----
 .../streampipes/rest/impl/OntologyContext.java     | 23 ++-----
 .../streampipes/rest/impl/OntologyKnowledge.java   | 45 +++----------
 .../rest/impl/OntologyMeasurementUnit.java         | 10 +--
 .../rest/impl/OntologyPipelineElement.java         |  9 +--
 .../streampipes/rest/impl/PipelineCache.java       | 17 +----
 .../rest/impl/PipelineElementAsset.java            |  9 +--
 .../rest/impl/PipelineElementCategory.java         |  7 +-
 .../streampipes/rest/impl/PipelineElementFile.java |  4 +-
 .../rest/impl/PipelineElementRuntimeInfo.java      |  5 +-
 .../streampipes/rest/impl/PipelineTemplate.java    | 49 +++++++-------
 .../rest/impl/PipelineWithUserResource.java        | 14 +---
 .../apache/streampipes/rest/impl/RdfEndpoint.java  |  7 +-
 .../org/apache/streampipes/rest/impl/Setup.java    | 24 +------
 .../streampipes/rest/impl/StreamPipesLogs.java     | 21 +++---
 .../org/apache/streampipes/rest/impl/User.java     | 12 +---
 .../org/apache/streampipes/rest/impl/Version.java  |  5 +-
 .../streampipes/rest/impl/VirtualSensor.java       |  5 +-
 .../streampipes/rest/impl/Visualization.java       |  4 +-
 .../impl/dashboard/AbstractDashboardResource.java  | 16 +----
 .../rest/impl/dashboard/DashboardWidget.java       |  8 +--
 .../rest/impl/dashboard/VisualizablePipeline.java  |  7 +-
 .../rest/impl/datalake/DataLakeWidgetResource.java |  8 +--
 streampipes-serializers-json/pom.xml               |  9 ++-
 .../serializers/json/TestGsonSerializer.java       | 29 ++++-----
 .../serializers/json/TestJacksonSerializer.java    | 42 ++++++++++++
 .../utils/PipelineElementTemplateHelpers.java      | 52 +++++++++++++++
 ui/src/app/core-model/gen/streampipes-model.ts     | 51 ++++++++-------
 73 files changed, 450 insertions(+), 1385 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 75f3114..cdb7577 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
@@ -19,6 +19,7 @@
 package org.apache.streampipes.backend;
 
 import org.apache.streampipes.connect.container.master.rest.*;
+import org.apache.streampipes.container.api.PipelineElementTemplateResource;
 import org.apache.streampipes.rest.impl.*;
 import org.apache.streampipes.rest.impl.dashboard.Dashboard;
 import org.apache.streampipes.rest.impl.dashboard.DashboardWidget;
@@ -104,6 +105,9 @@ public class StreamPipesResourceConfig extends ResourceConfig {
     register(JsonLdProvider.class);
     register(JacksonSerializationProvider.class);
     register(MultiPartFeature.class);
+    
+    // Platform Services
+    register(PipelineElementTemplateResource.class);
 
 
     // Connect Master
diff --git a/streampipes-connect-container-master/src/test/java/org/streampipes/connect/container/master/management/SourcesManagementTest.java b/streampipes-connect-container-master/src/test/java/org/streampipes/connect/container/master/management/SourcesManagementTest.java
index f01fb63..16a64d2 100644
--- a/streampipes-connect-container-master/src/test/java/org/streampipes/connect/container/master/management/SourcesManagementTest.java
+++ b/streampipes-connect-container-master/src/test/java/org/streampipes/connect/container/master/management/SourcesManagementTest.java
@@ -18,13 +18,11 @@
 
 package org.apache.streampipes.connect.container.master.management;
 
-import static org.junit.Assert.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.*;
-import static org.powermock.api.mockito.PowerMockito.doNothing;
-import static org.powermock.api.mockito.PowerMockito.verifyStatic;
-
+import org.apache.streampipes.connect.adapter.exception.AdapterException;
+import org.apache.streampipes.model.SpDataSet;
+import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+import org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription;
+import org.apache.streampipes.storage.couchdb.impl.AdapterStorageImpl;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
@@ -33,15 +31,17 @@ import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PowerMockIgnore;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
-import org.apache.streampipes.connect.adapter.exception.AdapterException;
-import org.apache.streampipes.model.SpDataSet;
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.connect.adapter.GenericAdapterSetDescription;
-import org.apache.streampipes.storage.couchdb.impl.AdapterStorageImpl;
 
 import java.util.Arrays;
 import java.util.List;
 
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.*;
+import static org.powermock.api.mockito.PowerMockito.doNothing;
+import static org.powermock.api.mockito.PowerMockito.verifyStatic;
+
 @RunWith(PowerMockRunner.class)
 @PrepareForTest({ WorkerRestClient.class })
 @PowerMockIgnore({"com.sun.org.apache.xerces.*", "javax.xml.*", "org.xml.*", "javax.management.*"})
@@ -152,15 +152,17 @@ public class SourcesManagementTest {
                 "\"name\":\"Adapter Stream\"," +
                 "\"description\":\"This stream is generated by an StreamPipes Connect adapter. ID of adapter: id_1234\"," +
                 "\"type\":\"source\"," +
+                "\"editable\":true," +
                 "\"streams\":[" +
                 "{" +
                 "\"uri\":\"id_1234\"," +
                 "\"name\":\"GenericAdapterSetDescription\"," +
                 "\"description\":\"\"," +
-                "\"type\":\"set\"" +
+                "\"type\":\"set\"," +
+                "\"editable\":false" +
                 "}" +
                 "]" +
                 "}" +
                 "]";
     }
-}
\ No newline at end of file
+}
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java b/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java
new file mode 100644
index 0000000..a37cc70
--- /dev/null
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplate.java
@@ -0,0 +1,76 @@
+/*
+ * 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.template;
+
+import org.apache.streampipes.model.shared.annotation.TsModel;
+
+import java.util.Map;
+
+@TsModel
+public class PipelineElementTemplate {
+
+  private String templateName;
+  private String templateDescription;
+  private String basePipelineElementAppId;
+
+  Map<String, PipelineElementTemplateConfig> templateConfigs;
+
+  public PipelineElementTemplate(String templateName,
+                                 String templateDescription,
+                                 Map<String, PipelineElementTemplateConfig> templateConfigs) {
+    this.templateName = templateName;
+    this.templateDescription = templateDescription;
+    this.templateConfigs = templateConfigs;
+  }
+
+  public PipelineElementTemplate() {
+  }
+
+  public String getTemplateName() {
+    return templateName;
+  }
+
+  public void setTemplateName(String templateName) {
+    this.templateName = templateName;
+  }
+
+  public String getTemplateDescription() {
+    return templateDescription;
+  }
+
+  public void setTemplateDescription(String templateDescription) {
+    this.templateDescription = templateDescription;
+  }
+
+  public Map<String, PipelineElementTemplateConfig> getTemplateConfigs() {
+    return templateConfigs;
+  }
+
+  public void setTemplateConfigs(Map<String, PipelineElementTemplateConfig> templateConfigs) {
+    this.templateConfigs = templateConfigs;
+  }
+
+  public String getBasePipelineElementAppId() {
+    return basePipelineElementAppId;
+  }
+
+  public void setBasePipelineElementAppId(String basePipelineElementAppId) {
+    this.basePipelineElementAppId = basePipelineElementAppId;
+  }
+}
+
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipeline.java b/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplateConfig.java
similarity index 50%
rename from streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipeline.java
rename to streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplateConfig.java
index 14a1292..6354106 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipeline.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/template/PipelineElementTemplateConfig.java
@@ -15,29 +15,45 @@
  * limitations under the License.
  *
  */
+package org.apache.streampipes.model.template;
 
-package org.apache.streampipes.rest.api;
+public class PipelineElementTemplateConfig {
 
+  private boolean editable;
+  private boolean displayed;
 
-import org.apache.streampipes.model.pipeline.Pipeline;
+  private Object value;
 
-import javax.ws.rs.core.Response;
+  public PipelineElementTemplateConfig(boolean editable, boolean displayed, Object value) {
+    this.editable = editable;
+    this.displayed = displayed;
+    this.value = value;
+  }
 
-public interface IPipeline extends IPipelineElement {
+  public PipelineElementTemplateConfig() {
+  }
 
-  Response addPipeline(String username, Pipeline pipeline);
+  public boolean isEditable() {
+    return editable;
+  }
 
-  Response getSystemPipelines();
+  public void setEditable(boolean editable) {
+    this.editable = editable;
+  }
 
-  Response start(String username, String pipelineId);
+  public boolean isDisplayed() {
+    return displayed;
+  }
 
-  Response stop(String username, String pipelineId);
+  public void setDisplayed(boolean displayed) {
+    this.displayed = displayed;
+  }
 
-  Response recommend(String email, Pipeline pipeline);
+  public Object getValue() {
+    return value;
+  }
 
-  Response update(Pipeline pipeline, String username);
-
-  Response overwritePipeline(String username, String pipelineId, Pipeline pipeline);
-
-  Response getPipelineStatus(String username, String pipelineId);
+  public void setValue(Object value) {
+    this.value = value;
+  }
 }
diff --git a/streampipes-platform-services/pom.xml b/streampipes-platform-services/pom.xml
index 9991b8b..8687f9f 100644
--- a/streampipes-platform-services/pom.xml
+++ b/streampipes-platform-services/pom.xml
@@ -11,5 +11,22 @@
 
     <artifactId>streampipes-platform-services</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-model</artifactId>
+            <version>0.68.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-rest-shared</artifactId>
+            <version>0.68.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-storage-api</artifactId>
+            <version>0.68.0-SNAPSHOT</version>
+        </dependency>
+    </dependencies>
 
 </project>
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IAssetDashboard.java b/streampipes-platform-services/src/main/java/org/apache/streampipes/ps/PipelineElementTemplateResource.java
similarity index 56%
rename from streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IAssetDashboard.java
rename to streampipes-platform-services/src/main/java/org/apache/streampipes/ps/PipelineElementTemplateResource.java
index 7217064..d475b16 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IAssetDashboard.java
+++ b/streampipes-platform-services/src/main/java/org/apache/streampipes/ps/PipelineElementTemplateResource.java
@@ -15,27 +15,37 @@
  * limitations under the License.
  *
  */
-package org.apache.streampipes.rest.api;
+package org.apache.streampipes.ps;
 
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
-
-import java.io.InputStream;
+import org.apache.streampipes.model.template.PipelineElementTemplate;
+import org.apache.streampipes.rest.shared.api.CRUDResource;
 
 import javax.ws.rs.core.Response;
 
-public interface IAssetDashboard {
+public class PipelineElementTemplateResource implements CRUDResource<String, PipelineElementTemplate> {
 
-  Response getAssetDashboard(String dashboardId);
+  @Override
+  public Response getAll() {
+    return null;
+  }
 
-  Response getAllDashboards();
+  @Override
+  public Response getById(String s) {
+    return null;
+  }
 
-  Response storeAssetDashboard(AssetDashboardConfig dashboardConfig);
+  @Override
+  public Response create(PipelineElementTemplate entity) {
+    return null;
+  }
 
-  Response deleteAssetDashboard(String dashboardId);
+  @Override
+  public Response update(String s, PipelineElementTemplate entity) {
+    return null;
+  }
 
-  Response storeDashboardImage(InputStream uploadedInputStream,
-                               FormDataContentDisposition fileDetail);
+  @Override
+  public void delete(String s) {
 
-  Response getDashboardImage(String imageName);
+  }
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementCategory.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/api/CRUDResource.java
similarity index 78%
rename from streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementCategory.java
rename to streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/api/CRUDResource.java
index b914bd1..27eef90 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementCategory.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/api/CRUDResource.java
@@ -15,19 +15,19 @@
  * limitations under the License.
  *
  */
-
-package org.apache.streampipes.rest.api;
+package org.apache.streampipes.rest.shared.api;
 
 import javax.ws.rs.core.Response;
 
-public interface IPipelineElementCategory {
+public interface CRUDResource<ID, T> {
 
-  Response getEps();
+    Response getAll();
 
-  Response getEpaCategories();
+    Response getById(ID id);
 
-  Response getEcCategories();
+    Response create(T entity);
 
-  Response getAdapterCategories();
+    Response update(ID id, T entity);
 
+    void delete(ID id);
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ILabel.java b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/impl/AbstractSharedRestInterface.java
similarity index 51%
rename from streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ILabel.java
rename to streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/impl/AbstractSharedRestInterface.java
index a051bc8..ad11118 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ILabel.java
+++ b/streampipes-rest-shared/src/main/java/org/apache/streampipes/rest/shared/impl/AbstractSharedRestInterface.java
@@ -15,27 +15,43 @@
  * limitations under the License.
  *
  */
+package org.apache.streampipes.rest.shared.impl;
 
-package org.apache.streampipes.rest.api;
+import org.apache.streampipes.serializers.json.GsonSerializer;
 
-import org.apache.streampipes.model.labeling.Category;
-import org.apache.streampipes.model.labeling.Label;
-
-import javax.ws.rs.PathParam;
 import javax.ws.rs.core.Response;
 
-public interface ILabel {
-
-    Response getAllLabels();
-
-    Response getLabel(String labelId);
-
-    Response addLabel(Label label);
-
-    Response updateLabel(String labelId, Label label);
-
-    Response deleteLabel(String labelId);
-
-    Response getLabelsForCategory(String categoryId);
-
+public abstract class AbstractSharedRestInterface {
+
+  protected <T> Response ok(T entity) {
+    return Response
+            .ok(entity)
+            .build();
+  }
+
+  protected <T> Response badRequest(T entity) {
+    return Response
+            .status(400)
+            .entity(entity)
+            .build();
+  }
+
+  protected <T> Response serverError(T entity) {
+    return Response
+            .status(500)
+            .entity(entity)
+            .build();
+  }
+
+  protected Response ok() {
+    return Response.ok().build();
+  }
+
+  protected Response fail() {
+    return Response.serverError().build();
+  }
+
+  protected <T> String toJson(T element) {
+    return GsonSerializer.getGson().toJson(element);
+  }
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IApplicationLink.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IApplicationLink.java
deleted file mode 100644
index d612d93..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IApplicationLink.java
+++ /dev/null
@@ -1,27 +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.rest.api;
-
-
-import javax.ws.rs.core.Response;
-
-public interface IApplicationLink {
-
-    Response getApplicationLinks();
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ICategory.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ICategory.java
deleted file mode 100644
index 6bdb4d6..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ICategory.java
+++ /dev/null
@@ -1,38 +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.rest.api;
-
-import org.apache.streampipes.model.labeling.Category;
-
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.Response;
-
-public interface ICategory {
-
-    Response getAll();
-
-    Response getCategory(String categoryId);
-
-    Response add(Category category);
-
-    Response delete(String key);
-
-    Response update(String categoryId, Category category);
-
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IConsulConfig.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IConsulConfig.java
deleted file mode 100644
index 2fe5ee7..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IConsulConfig.java
+++ /dev/null
@@ -1,37 +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.rest.api;
-
-import org.apache.streampipes.config.backend.MessagingSettings;
-import org.apache.streampipes.config.model.PeConfig;
-
-import javax.ws.rs.core.Response;
-
-public interface IConsulConfig {
-
-    Response getAllServiceConfigs();
-
-    Response saveServiceConfig(PeConfig peConfig);
-
-    Response deleteService(String serviceName);
-
-    Response getMessagingSettings();
-
-    Response updateMessagingSettings(MessagingSettings messagingSettings);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ICouchdb.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ICouchdb.java
deleted file mode 100644
index afa585d..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ICouchdb.java
+++ /dev/null
@@ -1,27 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface ICouchdb {
-
-    Response getAllData(String table);
-
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ILogs.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ILogs.java
deleted file mode 100644
index f937727..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ILogs.java
+++ /dev/null
@@ -1,29 +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.rest.api;
-
-import org.apache.streampipes.logging.model.LogRequest;
-
-import javax.ws.rs.core.Response;
-
-public interface ILogs {
-
-    Response getLogs(LogRequest logRequest);
-
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IMeasurementUnitResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IMeasurementUnitResource.java
deleted file mode 100644
index 2d7a25b..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IMeasurementUnitResource.java
+++ /dev/null
@@ -1,26 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IMeasurementUnitResource {
-
-  Response getMeasurementUnitInfo(String measurementResourceUri);
-
-  Response getAllMeasurementUnits();
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/INotification.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/INotification.java
deleted file mode 100644
index 5801806..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/INotification.java
+++ /dev/null
@@ -1,34 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface INotification {
-
-	Response getNotifications(String notificationTypeId, Integer offset, Integer count);
-
-	Response getUnreadNotifications();
-
-	Response deleteNotification(String notification);
-
-	Response modifyNotificationStatus(String notificationId);
-
-	Response getUnreadNotificationsCount(String username);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyContext.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyContext.java
deleted file mode 100644
index cc98662..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyContext.java
+++ /dev/null
@@ -1,34 +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.rest.api;
-
-import org.apache.streampipes.model.client.ontology.Context;
-
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-
-
-public interface IOntologyContext {
-
-	Response getAvailableContexts();
-
-	Response addContext(InputStream inputFile, Context contextInfo);
-
-	Response deleteContext(String contextId);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyKnowledge.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyKnowledge.java
deleted file mode 100644
index 8da8d72..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyKnowledge.java
+++ /dev/null
@@ -1,70 +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.rest.api;
-
-import org.apache.streampipes.model.client.ontology.Concept;
-import org.apache.streampipes.model.client.ontology.Instance;
-import org.apache.streampipes.model.client.ontology.Namespace;
-import org.apache.streampipes.model.client.ontology.Property;
-import org.apache.streampipes.model.client.ontology.Resource;
-
-import javax.ws.rs.core.Response;
-
-public interface IOntologyKnowledge {
-
-	Response getPropertyHierarchy();
-
-	Response getProperty(String propertyId);
-
-	Response addProperty(Resource elementData);
-
-	Response updateProperty(String propertyId, Property propertyData);
-
-	Response deleteProperty(String propertyId);
-
-
-	Response getTypeHiearchy();
-
-	Response getType(String typeId);
-
-	Response addType(Resource elementData);
-
-	Response updateType(String typeId, Concept elementData);
-
-	Response deleteType(String typeId);
-
-
-	Response addInstance(Resource elementData);
-
-	Response getInstance(String instanceId);
-
-	Response updateInstance(String instanceId, Instance elementData);
-
-	Response deleteInstance(String instanceId);
-	
-	
-	Response getNamespaces();
-
-	Response addNamespace(Namespace namespace);
-	
-	Response deleteNamespace(String prefix);
-
-	
-	
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyMeasurementUnit.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyMeasurementUnit.java
deleted file mode 100644
index d2a35e8..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyMeasurementUnit.java
+++ /dev/null
@@ -1,30 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IOntologyMeasurementUnit {
-
-	Response getAllUnits();
-
-	Response getUnit(String resourceUri);
-
-	Response getAllUnitTypes();
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyPipelineElement.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyPipelineElement.java
deleted file mode 100644
index 6c006e0..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IOntologyPipelineElement.java
+++ /dev/null
@@ -1,37 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IOntologyPipelineElement {
-
-	Response getStreams();
-
-	Response getSepas();
-
-	Response getActions();
-
-	Response getStream(String streamId, boolean keepIds);
-
-	Response getSepa(String sepaId, boolean keepIds);
-
-	Response getAction(String actionId, boolean keepIds);
-	
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineCache.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineCache.java
deleted file mode 100644
index bae7ce7..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineCache.java
+++ /dev/null
@@ -1,30 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IPipelineCache {
-
-  Response updateCachedPipeline(String user, String rawPipelineModel);
-
-  Response getCachedPipeline(String user);
-
-  Response removePipelineFromCache(String user);
-
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementAsset.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementAsset.java
deleted file mode 100644
index 5286ea1..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementAsset.java
+++ /dev/null
@@ -1,29 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IPipelineElementAsset {
-
-  Response getIconAsset(String appId);
-
-  Response getDocumentationAsset(String appId);
-
-  Response getAsset(String appId, String assetName);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementFile.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementFile.java
deleted file mode 100644
index 79c52d6..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementFile.java
+++ /dev/null
@@ -1,33 +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.rest.api;
-
-import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
-
-import javax.ws.rs.core.Response;
-import java.io.InputStream;
-
-public interface IPipelineElementFile {
-
-  Response storeFile(String username, InputStream inputStream, FormDataContentDisposition formData);
-
-  Response getFileInfo(String filteredFiletypes);
-
-  Response deleteFile(String fileId);
-
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementRuntimeInfo.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementRuntimeInfo.java
deleted file mode 100644
index 338d389..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineElementRuntimeInfo.java
+++ /dev/null
@@ -1,27 +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.rest.api;
-
-import org.apache.streampipes.model.SpDataStream;
-
-import javax.ws.rs.core.Response;
-
-public interface IPipelineElementRuntimeInfo {
-
-  Response getRuntimeInfo(SpDataStream spDataStream);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineTemplate.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineTemplate.java
deleted file mode 100644
index f6b2301..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IPipelineTemplate.java
+++ /dev/null
@@ -1,33 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IPipelineTemplate {
-
-  Response getAvailableDataStreams();
-
-  Response getAvailableDataSets();
-
-  Response getPipelineTemplates(String streamId);
-
-  Response generatePipeline(String username, String pipelineTemplateInvocation);
-
-  Response getPipelineTemplateInvocation(String streamId, String pipelineTemplateId);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IRdfEndpoint.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IRdfEndpoint.java
deleted file mode 100644
index b1f2274..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IRdfEndpoint.java
+++ /dev/null
@@ -1,34 +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.rest.api;
-
-import org.apache.streampipes.model.client.endpoint.RdfEndpoint;
-
-import javax.ws.rs.core.Response;
-
-public interface IRdfEndpoint {
-
-    Response getAllEndpoints();
-
-    Response addRdfEndpoint(RdfEndpoint rdfEndpoint);
-
-    Response removeRdfEndpoint(String rdfEndpointId);
-
-    Response getEndpointContents(String username);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ISetup.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ISetup.java
deleted file mode 100644
index 8a50905..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/ISetup.java
+++ /dev/null
@@ -1,34 +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.rest.api;
-
-import org.apache.streampipes.model.client.setup.InitialSettings;
-
-import javax.ws.rs.core.Response;
-
-public interface ISetup {
-
-	Response isConfigured();
-
-	Response configure(InitialSettings settings, Integer currentInstallationStep);
-
-	Response getConfiguration();
-
-	Response updateConfiguration(InitialSettings settings);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IUser.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IUser.java
deleted file mode 100644
index b3312f6..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IUser.java
+++ /dev/null
@@ -1,30 +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.rest.api;
-
-import org.apache.streampipes.model.client.user.User;
-
-import javax.ws.rs.core.Response;
-
-public interface IUser {
-
-    Response getUserDetails(String email);
-
-    Response updateUserDetails(User user);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVersion.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVersion.java
deleted file mode 100644
index 5c303fc..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVersion.java
+++ /dev/null
@@ -1,27 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IVersion {
-
-  Response getVersionInfo();
-
-  Response getSystemInfo();
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVirtualSensor.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVirtualSensor.java
deleted file mode 100644
index 2b29269..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVirtualSensor.java
+++ /dev/null
@@ -1,29 +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.rest.api;
-
-
-import javax.ws.rs.core.Response;
-
-public interface IVirtualSensor {
-
-  Response getVirtualSensors(String username);
-
-  Response addVirtualSensor(String username, String virtualSensorDescription);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVisualization.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVisualization.java
deleted file mode 100644
index 564c1fe..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IVisualization.java
+++ /dev/null
@@ -1,26 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface IVisualization {
-
-	Response getRunningVisualizations();
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/InternalPipelineTemplate.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/InternalPipelineTemplate.java
deleted file mode 100644
index dd555fc..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/InternalPipelineTemplate.java
+++ /dev/null
@@ -1,29 +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.rest.api;
-
-import javax.ws.rs.core.Response;
-
-public interface InternalPipelineTemplate {
-
-    Response getPipelineTemplateInvocation();
-
-    Response generatePipeline(String username, String pipelineId);
-
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/connect/SpConnect.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/connect/SpConnect.java
deleted file mode 100644
index c97ab58..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/connect/SpConnect.java
+++ /dev/null
@@ -1,22 +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.rest.api.connect;
-
-public interface SpConnect {
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IDashboard.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IDashboard.java
deleted file mode 100644
index 31712b5..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IDashboard.java
+++ /dev/null
@@ -1,36 +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.rest.api.dashboard;
-
-import org.apache.streampipes.model.dashboard.DashboardModel;
-
-import javax.ws.rs.core.Response;
-
-public interface IDashboard {
-
-  Response getAllDashboards();
-
-  Response getDashboard(String dashboardId);
-
-  Response modifyDashboard(DashboardModel dashboardModel);
-
-  Response deleteDashboard(String dashboardId);
-
-  Response createDashboard(DashboardModel dashboardModel);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IDashboardWidget.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IDashboardWidget.java
deleted file mode 100644
index c144242..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IDashboardWidget.java
+++ /dev/null
@@ -1,36 +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.rest.api.dashboard;
-
-import org.apache.streampipes.model.dashboard.DashboardWidgetModel;
-
-import javax.ws.rs.core.Response;
-
-public interface IDashboardWidget {
-
-  Response getAllDashboardWidgets();
-
-  Response getDashboardWidget(String widgetId);
-
-  Response modifyDashboardWidget(DashboardWidgetModel dashboardWidgetModel);
-
-  Response deleteDashboardWidget(String widgetId);
-
-  Response createDashboardWidget(DashboardWidgetModel dashboardWidgetModel);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IVisualizablePipeline.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IVisualizablePipeline.java
deleted file mode 100644
index 9a50583..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dashboard/IVisualizablePipeline.java
+++ /dev/null
@@ -1,32 +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.rest.api.dashboard;
-
-import javax.ws.rs.core.Response;
-
-public interface IVisualizablePipeline {
-
-  Response getVisualizablePipelines();
-
-  Response getVisualizablePipeline(String id);
-
-  Response getVisualizablePipelineByTopic(String topic);
-
-  Response getVisualizablePipelineByPipelineIdAndVisualizationName(String pipelineId, String visualizationName);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dataexplorer/IDataExplorerWidget.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dataexplorer/IDataExplorerWidget.java
deleted file mode 100644
index 22b2612..0000000
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/dataexplorer/IDataExplorerWidget.java
+++ /dev/null
@@ -1,36 +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.rest.api.dataexplorer;
-
-import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
-
-import javax.ws.rs.core.Response;
-
-public interface IDataExplorerWidget {
-
-  Response getAllDataExplorerWidgets();
-
-  Response getDataExplorerWidget(String widgetId);
-
-  Response modifyDataExplorerWidget(DataExplorerWidgetModel dataExplorerWidgetModel);
-
-  Response deleteDataExplorerWidget(String widgetId);
-
-  Response createDataExplorerWidget(DataExplorerWidgetModel dataExplorerWidgetModel);
-}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractRestInterface.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractRestInterface.java
index f44dd57..f681c51 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractRestInterface.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AbstractRestInterface.java
@@ -29,7 +29,7 @@ import org.apache.streampipes.model.base.AbstractStreamPipesEntity;
 import org.apache.streampipes.model.base.StreamPipesJsonLdContainer;
 import org.apache.streampipes.model.message.Notification;
 import org.apache.streampipes.model.message.*;
-import org.apache.streampipes.serializers.json.GsonSerializer;
+import org.apache.streampipes.rest.shared.impl.AbstractSharedRestInterface;
 import org.apache.streampipes.serializers.jsonld.JsonLdTransformer;
 import org.apache.streampipes.serializers.jsonld.JsonLdUtils;
 import org.apache.streampipes.storage.api.*;
@@ -45,7 +45,7 @@ import java.net.URISyntaxException;
 import java.net.URLDecoder;
 import java.util.List;
 
-public abstract class AbstractRestInterface {
+public abstract class AbstractRestInterface extends AbstractSharedRestInterface {
 
   protected <T> String toJsonLd(T object) {
     try {
@@ -161,40 +161,8 @@ public abstract class AbstractRestInterface {
             .build();
   }
 
-  protected <T> Response ok(T entity) {
-    return Response
-            .ok(entity)
-            .build();
-  }
-
-  protected <T> Response badRequest(T entity) {
-    return Response
-            .status(400)
-            .entity(entity)
-            .build();
-  }
-
-  protected <T> Response serverError(T entity) {
-    return Response
-            .status(500)
-            .entity(entity)
-            .build();
-  }
-
   protected StreamPipesJsonLdContainer asContainer(List<? extends AbstractStreamPipesEntity> elements) {
     return new StreamPipesJsonLdContainer(elements);
   }
 
-  protected Response ok() {
-    return Response.ok().build();
-  }
-
-  protected Response fail() {
-    return Response.serverError().build();
-  }
-
-  protected <T> String toJson(T element) {
-    return GsonSerializer.getGson().toJson(element);
-  }
-
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboard.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboard.java
index c873ad0..3d35906 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboard.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/AssetDashboard.java
@@ -18,11 +18,13 @@
 package org.apache.streampipes.rest.impl;
 
 import org.apache.commons.io.FileUtils;
+import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
 import org.glassfish.jersey.media.multipart.FormDataParam;
-import org.apache.streampipes.model.client.assetdashboard.AssetDashboardConfig;
-import org.apache.streampipes.rest.api.IAssetDashboard;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -31,38 +33,26 @@ import java.net.URLConnection;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 
-import javax.ws.rs.DELETE;
-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}/asset-dashboards")
-public class AssetDashboard extends AbstractRestInterface implements IAssetDashboard {
+public class AssetDashboard extends AbstractRestInterface {
 
   private static final String APP_ID = "org.apache.streampipes.apps.assetdashboard";
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @Override
   public Response getAssetDashboard(@PathParam("dashboardId") String dashboardId) {
     return ok(getNoSqlStorage().getAssetDashboardStorage().getAssetDashboard(dashboardId));
   }
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAllDashboards() {
     return ok(getNoSqlStorage().getAssetDashboardStorage().getAllAssetDashboards());
   }
 
   @POST
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response storeAssetDashboard(AssetDashboardConfig dashboardConfig) {
     getNoSqlStorage().getAssetDashboardStorage().storeAssetDashboard(dashboardConfig);
     return ok();
@@ -71,7 +61,6 @@ public class AssetDashboard extends AbstractRestInterface implements IAssetDashb
   @DELETE
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @Override
   public Response deleteAssetDashboard(@PathParam("dashboardId") String dashboardId) {
     getNoSqlStorage().getAssetDashboardStorage().deleteAssetDashboard(dashboardId);
     return ok();
@@ -79,7 +68,6 @@ public class AssetDashboard extends AbstractRestInterface implements IAssetDashb
 
   @GET
   @Path("/images/{imageName}")
-  @Override
   public Response getDashboardImage(@PathParam("imageName") String imageName) {
     try {
       java.nio.file.Path path = Paths.get(getTargetFile(imageName));
@@ -97,7 +85,6 @@ public class AssetDashboard extends AbstractRestInterface implements IAssetDashb
   @POST
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/images")
-  @Override
   public Response storeDashboardImage(@FormDataParam("file_upload") InputStream uploadedInputStream,
                                       @FormDataParam("file_upload") FormDataContentDisposition fileDetail) {
     File targetDirectory = new File(getTargetDirectory());
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java
index ff8ce1b..9e07d78 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Authentication.java
@@ -24,39 +24,28 @@ import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.subject.Subject;
 import org.apache.streampipes.config.backend.BackendConfig;
 import org.apache.streampipes.manager.storage.UserManagementService;
+import org.apache.streampipes.model.client.user.*;
 import org.apache.streampipes.model.message.ErrorMessage;
 import org.apache.streampipes.model.message.NotificationType;
 import org.apache.streampipes.model.message.Notifications;
 import org.apache.streampipes.model.message.SuccessMessage;
-import org.apache.streampipes.model.client.user.RegistrationData;
-import org.apache.streampipes.model.client.user.Role;
-import org.apache.streampipes.model.client.user.ShiroAuthenticationRequest;
-import org.apache.streampipes.model.client.user.ShiroAuthenticationResponse;
-import org.apache.streampipes.model.client.user.ShiroAuthenticationResponseFactory;
-import org.apache.streampipes.rest.api.IAuthentication;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 
-import java.util.HashSet;
-import java.util.Set;
-
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.HashSet;
+import java.util.Set;
 
 @Path("/v2/admin")
-public class Authentication extends AbstractRestInterface implements IAuthentication {
+public class Authentication extends AbstractRestInterface {
 
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_JSON)
   @GsonWithIds
   @POST
-  @Override
   @Path("/login")
   public Response doLogin(ShiroAuthenticationRequest token) {
     try {
@@ -71,7 +60,6 @@ public class Authentication extends AbstractRestInterface implements IAuthentica
   @Path("/logout")
   @GET
   @GsonWithIds
-  @Override
   public Response doLogout() {
     Subject subject = SecurityUtils.getSubject();
     subject.logout();
@@ -84,7 +72,6 @@ public class Authentication extends AbstractRestInterface implements IAuthentica
   @GsonWithIds
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_JSON)
-  @Override
   public Response doRegister(RegistrationData data) {
 
     Set<Role> roles = new HashSet<>();
@@ -100,7 +87,6 @@ public class Authentication extends AbstractRestInterface implements IAuthentica
   @GET
   @GsonWithIds
   @Path("/authc")
-  @Override
   public Response userAuthenticated(@Context HttpServletRequest req) {
 
     if (BackendConfig.INSTANCE.isConfigured()) {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CategoryResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CategoryResource.java
index b055355..dd93576 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CategoryResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/CategoryResource.java
@@ -20,7 +20,6 @@ package org.apache.streampipes.rest.impl;
 
 
 import org.apache.streampipes.model.labeling.Category;
-import org.apache.streampipes.rest.api.ICategory;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 
@@ -31,13 +30,12 @@ import java.util.HashMap;
 import java.util.Map;
 
 @Path("/v2/users/{username}/labeling/category")
-public class CategoryResource extends AbstractRestInterface implements ICategory {
+public class CategoryResource extends AbstractRestInterface {
 
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response getAll() {
         return ok(StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -50,7 +48,6 @@ public class CategoryResource extends AbstractRestInterface implements ICategory
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response add(Category category) {
         String categoryId = StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -66,7 +63,6 @@ public class CategoryResource extends AbstractRestInterface implements ICategory
     @Path("/{categoryId}")
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response getCategory(@PathParam("categoryId") String categoryId) {
         return ok(StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -79,7 +75,6 @@ public class CategoryResource extends AbstractRestInterface implements ICategory
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response update(@PathParam("categoryId") String categoryId, Category category) {
         if (!categoryId.equals(category.getId())) {
             String resString = "CategoryId not the same as in message body";
@@ -101,7 +96,6 @@ public class CategoryResource extends AbstractRestInterface implements ICategory
     @Path("/{categoryId}")
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response delete(@PathParam("categoryId") String key) {
         StorageDispatcher.INSTANCE
                 .getNoSqlStore()
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ConsulConfig.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ConsulConfig.java
index df407dc..841ae55 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ConsulConfig.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/ConsulConfig.java
@@ -18,44 +18,36 @@
 
 package org.apache.streampipes.rest.impl;
 
-import static org.apache.streampipes.container.util.ConsulUtil.updateConfig;
-
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import org.apache.streampipes.config.backend.BackendConfig;
 import org.apache.streampipes.config.backend.MessagingSettings;
 import org.apache.streampipes.config.consul.ConsulSpConfig;
 import org.apache.streampipes.config.model.ConfigItem;
 import org.apache.streampipes.config.model.PeConfig;
 import org.apache.streampipes.container.util.ConsulUtil;
-import org.apache.streampipes.rest.api.IConsulConfig;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.Response;
+import static org.apache.streampipes.container.util.ConsulUtil.updateConfig;
 
 @Path("/v2/consul")
-public class ConsulConfig extends AbstractRestInterface implements IConsulConfig {
+public class ConsulConfig extends AbstractRestInterface {
 
   private static Logger LOG = LoggerFactory.getLogger(ConsulConfig.class);
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response getAllServiceConfigs() {
     LOG.info("Request for all service configs");
     Map<String, String> peServices = ConsulUtil.getPeServices();
@@ -95,7 +87,6 @@ public class ConsulConfig extends AbstractRestInterface implements IConsulConfig
   @POST
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response saveServiceConfig(PeConfig peConfig) {
     LOG.info("Request to update a service config");
     for (ConfigItem configItem : peConfig.getConfigs()) {
@@ -149,7 +140,6 @@ public class ConsulConfig extends AbstractRestInterface implements IConsulConfig
   @DELETE
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response deleteService(String serviceName) {
     LOG.info("Request to delete a service config");
     ConsulUtil.deregisterService(serviceName);
@@ -160,7 +150,6 @@ public class ConsulConfig extends AbstractRestInterface implements IConsulConfig
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
   @Path("/messaging")
-  @Override
   public Response getMessagingSettings() {
     return ok(BackendConfig.INSTANCE.getMessagingSettings());
   }
@@ -170,7 +159,6 @@ public class ConsulConfig extends AbstractRestInterface implements IConsulConfig
   @Consumes(MediaType.APPLICATION_JSON)
   @GsonWithIds
   @Path("messaging")
-  @Override
   public Response updateMessagingSettings(MessagingSettings messagingSettings) {
     BackendConfig.INSTANCE.setMessagingSettings(messagingSettings);
     return ok();
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Couchdb.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Couchdb.java
index f6712f6..635115c 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Couchdb.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Couchdb.java
@@ -20,10 +20,9 @@ package org.apache.streampipes.rest.impl;
 
 import com.google.gson.Gson;
 import com.google.gson.JsonObject;
-import org.lightcouch.CouchDbClient;
-import org.apache.streampipes.rest.api.ICouchdb;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.apache.streampipes.storage.couchdb.utils.Utils;
+import org.lightcouch.CouchDbClient;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -34,13 +33,12 @@ import javax.ws.rs.core.Response;
 import java.util.List;
 
 @Path("/v2/couchdb/{table}")
-public class Couchdb extends AbstractRestInterface implements ICouchdb {
+public class Couchdb extends AbstractRestInterface {
 
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @GsonWithIds
-    @Override
     public Response getAllData(@PathParam("table") String table) {
         CouchDbClient couchDbClient = Utils.getCoucbDbClient(table);
 
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/InternalPipelineTemplates.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/InternalPipelineTemplates.java
index ed9478a..d4d19d4 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/InternalPipelineTemplates.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/InternalPipelineTemplates.java
@@ -25,7 +25,6 @@ import org.apache.streampipes.model.graph.DataSinkDescription;
 import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
 import org.apache.streampipes.model.template.PipelineTemplateDescription;
 import org.apache.streampipes.model.template.PipelineTemplateInvocation;
-import org.apache.streampipes.rest.api.InternalPipelineTemplate;
 import org.apache.streampipes.sdk.builder.BoundPipelineElementBuilder;
 import org.apache.streampipes.sdk.builder.PipelineTemplateBuilder;
 import org.apache.streampipes.storage.api.IPipelineElementDescriptionStorage;
@@ -43,7 +42,7 @@ import java.util.List;
 import java.util.Map;
 
 @Path("/v2/users/{username}/internal-pipelines")
-public class InternalPipelineTemplates extends AbstractRestInterface implements InternalPipelineTemplate {
+public class InternalPipelineTemplates extends AbstractRestInterface {
 
     private static final Logger LOG = LoggerFactory.getLogger(InternalPipelineTemplates.class);
     private Map<String, Template> templates;
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/LabelResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/LabelResource.java
index e38d7d4..83ec7ae 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/LabelResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/LabelResource.java
@@ -20,7 +20,6 @@ package org.apache.streampipes.rest.impl;
 
 import org.apache.streampipes.model.labeling.Category;
 import org.apache.streampipes.model.labeling.Label;
-import org.apache.streampipes.rest.api.ILabel;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.storage.management.StorageDispatcher;
 
@@ -31,12 +30,11 @@ import java.util.HashMap;
 import java.util.Map;
 
 @Path("/v2/users/{username}/labeling/label")
-public class LabelResource extends AbstractRestInterface implements ILabel {
+public class LabelResource extends AbstractRestInterface {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response getAllLabels() {
         return ok(StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -48,7 +46,6 @@ public class LabelResource extends AbstractRestInterface implements ILabel {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response addLabel(Label label) {
         Category categoryForLabel = StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -75,7 +72,6 @@ public class LabelResource extends AbstractRestInterface implements ILabel {
     @Path("/{labelId}")
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response getLabel(@PathParam("labelId") String labelId) {
         return ok(StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -88,7 +84,6 @@ public class LabelResource extends AbstractRestInterface implements ILabel {
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response updateLabel(@PathParam("labelId") String labelId, Label label) {
         if (!labelId.equals(label.getId())) {
             String resString = "LabelId not the same as in message body";
@@ -121,7 +116,6 @@ public class LabelResource extends AbstractRestInterface implements ILabel {
     @Path("/{labelId}")
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response deleteLabel(@PathParam("labelId") String labelId) {
         StorageDispatcher.INSTANCE
                 .getNoSqlStore()
@@ -134,7 +128,6 @@ public class LabelResource extends AbstractRestInterface implements ILabel {
     @Path("category/{categoryId}")
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response getLabelsForCategory(@PathParam("categoryId") String categoryId) {
         return ok(StorageDispatcher.INSTANCE
                 .getNoSqlStore()
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/MeasurementUnitResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/MeasurementUnitResource.java
index e67c202..2909b5b 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/MeasurementUnitResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/MeasurementUnitResource.java
@@ -16,7 +16,6 @@
  */
 package org.apache.streampipes.rest.impl;
 
-import org.apache.streampipes.rest.api.IMeasurementUnitResource;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.units.UnitProvider;
@@ -29,12 +28,11 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/users/{username}/measurement-units")
-public class MeasurementUnitResource extends AbstractRestInterface implements IMeasurementUnitResource {
+public class MeasurementUnitResource extends AbstractRestInterface {
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @JacksonSerialized
-  @Override
   public Response getAllMeasurementUnits() {
     return ok(UnitProvider.INSTANCE.getAvailableUnits());
   }
@@ -43,7 +41,6 @@ public class MeasurementUnitResource extends AbstractRestInterface implements IM
   @Path("/{measurementResourceUri}")
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response getMeasurementUnitInfo(@PathParam("measurementResourceUri") String measurementResourceUri) {
     return ok(UnitProvider.INSTANCE.getUnit(measurementResourceUri));
   }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Notification.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Notification.java
index 3b116ab..4247087 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Notification.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Notification.java
@@ -19,26 +19,18 @@
 package org.apache.streampipes.rest.impl;
 
 import org.apache.streampipes.model.message.Notifications;
-import org.apache.streampipes.rest.api.INotification;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
+import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/users/{username}/notifications")
-public class Notification extends AbstractRestInterface implements INotification {
+public class Notification extends AbstractRestInterface {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @GsonWithIds
-    @Override
     public Response getNotifications(@QueryParam("notificationType") String notificationTypeId,
                                      @QueryParam("offset") Integer offset,
                                      @QueryParam("count") Integer count) {
@@ -49,7 +41,6 @@ public class Notification extends AbstractRestInterface implements INotification
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/count")
-    @Override
     public Response getUnreadNotificationsCount(@PathParam("username") String username) {
         return ok(getNotificationStorage()
                 .getUnreadNotificationsCount(username));
@@ -58,7 +49,6 @@ public class Notification extends AbstractRestInterface implements INotification
     @GET
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/unread")
-    @Override
     public Response getUnreadNotifications() {
         return ok(getNotificationStorage()
                 .getUnreadNotifications());
@@ -67,7 +57,6 @@ public class Notification extends AbstractRestInterface implements INotification
     @DELETE
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/{notificationId}")
-    @Override
     public Response deleteNotification(@PathParam("notificationId") String notificationId) {
         boolean success = getNotificationStorage()
                 .deleteNotification(notificationId);
@@ -82,7 +71,6 @@ public class Notification extends AbstractRestInterface implements INotification
     @PUT
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/{notificationId}")
-    @Override
     public Response modifyNotificationStatus(@PathParam("notificationId") String notificationId) {
         boolean success = getNotificationStorage()
                 .changeNotificationStatus(notificationId);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyContext.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyContext.java
index 31150c5..3ebcbd0 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyContext.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyContext.java
@@ -18,30 +18,21 @@
 
 package org.apache.streampipes.rest.impl;
 
-import org.glassfish.jersey.media.multipart.FormDataParam;
-import org.apache.streampipes.storage.management.StorageManager;
-import org.apache.streampipes.model.message.Notifications;
 import org.apache.streampipes.model.client.ontology.Context;
-import org.apache.streampipes.rest.api.IOntologyContext;
-
-import java.io.InputStream;
+import org.apache.streampipes.model.message.Notifications;
+import org.apache.streampipes.storage.management.StorageManager;
+import org.glassfish.jersey.media.multipart.FormDataParam;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-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.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.io.InputStream;
 
 @Path("/v2/contexts")
-public class OntologyContext extends AbstractRestInterface implements IOntologyContext {
+public class OntologyContext extends AbstractRestInterface {
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getAvailableContexts() {
 		return ok(StorageManager
 				.INSTANCE
@@ -52,7 +43,6 @@ public class OntologyContext extends AbstractRestInterface implements IOntologyC
 	@POST
 	@Produces(MediaType.APPLICATION_JSON)
 	@Consumes(MediaType.MULTIPART_FORM_DATA)
-	@Override
 	public Response addContext(@FormDataParam("file") InputStream inputFile, @FormDataParam("context") Context contextInfo) {
 		
 		contextInfo.setInputStream(inputFile);
@@ -72,7 +62,6 @@ public class OntologyContext extends AbstractRestInterface implements IOntologyC
 	@DELETE
 	@Path("/{contextId}")
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response deleteContext(@PathParam("contextId") String contextId) {
 		boolean success = StorageManager.INSTANCE.getContextStorage().deleteContext(contextId);
 		if (success) {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyKnowledge.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyKnowledge.java
index 922b185..b7d523d 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyKnowledge.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyKnowledge.java
@@ -18,36 +18,23 @@
 
 package org.apache.streampipes.rest.impl;
 
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-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.client.ontology.*;
+import org.apache.streampipes.model.message.Notifications;
+import org.apache.streampipes.storage.management.StorageManager;
 import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.eclipse.rdf4j.query.QueryEvaluationException;
 import org.eclipse.rdf4j.repository.RepositoryException;
 
-import org.apache.streampipes.model.message.Notifications;
-import org.apache.streampipes.model.client.ontology.Concept;
-import org.apache.streampipes.model.client.ontology.Instance;
-import org.apache.streampipes.model.client.ontology.Namespace;
-import org.apache.streampipes.model.client.ontology.Property;
-import org.apache.streampipes.model.client.ontology.Resource;
-import org.apache.streampipes.rest.api.IOntologyKnowledge;
-import org.apache.streampipes.storage.management.StorageManager;
+import javax.ws.rs.*;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
 
 @Path("/v2/ontology")
-public class OntologyKnowledge extends AbstractRestInterface implements IOntologyKnowledge {
+public class OntologyKnowledge extends AbstractRestInterface {
 
 	@Path("/types")
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getTypeHiearchy() {
 		try {
 			return ok(StorageManager.INSTANCE.getBackgroundKnowledgeStorage().getClassHierarchy());
@@ -61,7 +48,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 	@Path("/properties")
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getPropertyHierarchy() {
 		try {
 			return ok(StorageManager.INSTANCE.getBackgroundKnowledgeStorage().getPropertyHierarchy());
@@ -76,7 +62,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 	@Path("/properties/{propertyId}")
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getProperty(@PathParam("propertyId") String propertyId) {
 		try {
 			return ok(StorageManager.INSTANCE.getBackgroundKnowledgeStorage().getProperty(propertyId));
@@ -89,7 +74,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 	@Path("/types/{typeId}")
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getType(@PathParam("typeId") String typeId) {
 		try {
 			return ok(StorageManager.INSTANCE.getBackgroundKnowledgeStorage().getConcept(typeId));
@@ -101,7 +85,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		return ok(typeId);
 	}
 
-	@Override
 	@Path("/namespaces")
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
@@ -116,8 +99,7 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 			return ok(Notifications.error("Could not connect to Sesame storage"));
 		}
 	}
-	
-	@Override
+
 	@Path("/namespaces")
 	@POST
 	@Produces(MediaType.APPLICATION_JSON)
@@ -134,7 +116,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		}
 	}
 
-	@Override
 	@Path("/namespaces/{prefix}")
 	@DELETE
 	@Produces(MediaType.APPLICATION_JSON)
@@ -151,7 +132,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		}
 	}
 
-	@Override
 	@Path("/properties")
 	@POST
 	@Produces(MediaType.APPLICATION_JSON)
@@ -168,7 +148,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		}
 	}
 
-	@Override
 	@Path("/types")
 	@POST
 	@Produces(MediaType.APPLICATION_JSON)
@@ -185,7 +164,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		}
 	}
 
-	@Override
 	@Path("/instances")
 	@POST
 	@Produces(MediaType.APPLICATION_JSON)
@@ -202,7 +180,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		}
 	}
 
-	@Override
 	@Path("/properties/{propertyId}")
 	@PUT
 	@Produces(MediaType.APPLICATION_JSON)
@@ -220,7 +197,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		
 	}
 
-	@Override
 	@Path("/types/{typeId}")
 	@PUT
 	@Produces(MediaType.APPLICATION_JSON)
@@ -240,7 +216,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 	@Path("/instances/{instanceId}")
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getInstance(@PathParam("instanceId") String instanceId) {
 		try {
 			return ok(StorageManager
@@ -253,7 +228,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		}
 	}
 
-	@Override
 	@Path("/instances/{instanceId}")
 	@PUT
 	@Produces(MediaType.APPLICATION_JSON)
@@ -266,7 +240,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		else return ok(Notifications.error("Could not update instance. "));
 	}
 
-	@Override
 	@Path("/properties/{propertyId}")
 	@DELETE
 	@Produces(MediaType.APPLICATION_JSON)
@@ -276,7 +249,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		else return ok(Notifications.error("Could not delete property. "));
 	}
 
-	@Override
 	@Path("/types/{typeId}")
 	@DELETE
 	@Produces(MediaType.APPLICATION_JSON)
@@ -286,7 +258,6 @@ public class OntologyKnowledge extends AbstractRestInterface implements IOntolog
 		else return ok(Notifications.error("Could not delete concept. "));
 	}
 
-	@Override
 	@Path("/instances/{instanceId}")
 	@DELETE
 	@Produces(MediaType.APPLICATION_JSON)
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyMeasurementUnit.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyMeasurementUnit.java
index 919d25c..b6a415b 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyMeasurementUnit.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/OntologyMeasurementUnit.java
@@ -18,6 +18,8 @@
 
 package org.apache.streampipes.rest.impl;
 
+import org.apache.streampipes.units.UnitProvider;
+
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
@@ -25,15 +27,11 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-import org.apache.streampipes.rest.api.IOntologyMeasurementUnit;
-import org.apache.streampipes.units.UnitProvider;
-
 @Path("/v2/units")
-public class OntologyMeasurementUnit extends AbstractRestInterface implements IOntologyMeasurementUnit {
+public class OntologyMeasurementUnit extends AbstractRestInterface {
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	@Path("/instances")
 	public Response getAllUnits() {
 		return ok(UnitProvider
@@ -43,7 +41,6 @@ public class OntologyMeasurementUnit extends AbstractRestInterface implements IO
 	
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	@Path("/types")
 	public Response getAllUnitTypes() {
 		return ok(UnitProvider
@@ -54,7 +51,6 @@ public class OntologyMeasurementUnit extends AbstractRestInterface implements IO
 	@GET
 	@Path("/instances/{resourceId}")
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getUnit(@PathParam("resourceId") String resourceUri) {
 		return ok(UnitProvider
 				.INSTANCE
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 7d72dd9..2f102f7 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
@@ -24,7 +24,6 @@ import com.google.gson.JsonPrimitive;
 import org.apache.streampipes.model.SpDataStream;
 import org.apache.streampipes.model.graph.DataProcessorDescription;
 import org.apache.streampipes.model.graph.DataSinkDescription;
-import org.apache.streampipes.rest.api.IOntologyPipelineElement;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.apache.streampipes.storage.management.StorageManager;
 
@@ -35,9 +34,8 @@ import java.util.ArrayList;
 import java.util.List;
 
 @Path("/v2/ontology")
-public class OntologyPipelineElement extends AbstractRestInterface implements IOntologyPipelineElement {
+public class OntologyPipelineElement extends AbstractRestInterface{
 
-  @Override
   @Path("/sources")
   @GET
   @GsonWithIds
@@ -62,7 +60,6 @@ public class OntologyPipelineElement extends AbstractRestInterface implements IO
     return ok(sepaDescription);
   }
 
-  @Override
   @Path("/sepas")
   @GsonWithIds
   @GET
@@ -78,7 +75,6 @@ public class OntologyPipelineElement extends AbstractRestInterface implements IO
 
   }
 
-  @Override
   @Path("/actions")
   @GET
   @GsonWithIds
@@ -93,7 +89,6 @@ public class OntologyPipelineElement extends AbstractRestInterface implements IO
     return ok(result);
   }
 
-  @Override
   public Response getStream(String streamId, @QueryParam("keepIds") boolean keepIds) {
     // TODO Auto-generated method stub
     return null;
@@ -102,7 +97,6 @@ public class OntologyPipelineElement extends AbstractRestInterface implements IO
   @Path("/sepas/{sepaId}")
   @GET
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getSepa(@PathParam("sepaId") String sepaId, @QueryParam("keepIds") boolean keepIds) {
 
     DataProcessorDescription dataProcessorDescription = new DataProcessorDescription(StorageManager.INSTANCE.getPipelineElementStorage().getDataProcessorById(sepaId));
@@ -112,7 +106,6 @@ public class OntologyPipelineElement extends AbstractRestInterface implements IO
   @Path("/actions/{actionId}")
   @GET
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAction(@PathParam("actionId") String actionId, @QueryParam("keepIds") boolean keepIds) {
     DataSinkDescription dataSinkDescription = new DataSinkDescription(StorageManager.INSTANCE.getPipelineElementStorage().getDataSinkById(actionId));
     return ok(dataSinkDescription);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCache.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCache.java
index ca39af2..2711fa2 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCache.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineCache.java
@@ -17,27 +17,18 @@
  */
 package org.apache.streampipes.rest.impl;
 
-import org.apache.streampipes.rest.api.IPipelineCache;
-
-import java.util.concurrent.ConcurrentHashMap;
-
-import javax.ws.rs.DELETE;
-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.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.util.concurrent.ConcurrentHashMap;
 
 @Path("/v2/users/{username}/pipeline-cache")
-public class PipelineCache extends AbstractRestInterface implements IPipelineCache {
+public class PipelineCache extends AbstractRestInterface {
 
   private static ConcurrentHashMap<String, String> cachedPipelines = new ConcurrentHashMap<>();
 
   @POST
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response updateCachedPipeline(@PathParam("username") String user,
                                        String rawPipelineModel) {
     cachedPipelines.put(user, rawPipelineModel);
@@ -46,7 +37,6 @@ public class PipelineCache extends AbstractRestInterface implements IPipelineCac
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getCachedPipeline(@PathParam("username") String user) {
     if (cachedPipelines.containsKey(user)) {
       return ok(cachedPipelines.get(user));
@@ -57,7 +47,6 @@ public class PipelineCache extends AbstractRestInterface implements IPipelineCac
 
   @DELETE
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response removePipelineFromCache(@PathParam("username") String user) {
     cachedPipelines.remove(user);
     return ok();
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementAsset.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementAsset.java
index 939ae44..30e2723 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementAsset.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementAsset.java
@@ -17,12 +17,9 @@
  */
 package org.apache.streampipes.rest.impl;
 
+import org.apache.streampipes.manager.assets.AssetManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.streampipes.manager.assets.AssetManager;
-import org.apache.streampipes.rest.api.IPipelineElementAsset;
-
-import java.io.IOException;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -30,9 +27,10 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
+import java.io.IOException;
 
 @Path("/v2/pe")
-public class PipelineElementAsset extends AbstractRestInterface implements IPipelineElementAsset {
+public class PipelineElementAsset extends AbstractRestInterface {
 
   private static final Logger LOG = LoggerFactory.getLogger(PipelineElementAsset.class);
 
@@ -58,7 +56,6 @@ public class PipelineElementAsset extends AbstractRestInterface implements IPipe
     }
   }
 
-  @Override
   @GET
   @Path("{appId}/assets/{assetName}")
   @Produces("image/png")
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementCategory.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementCategory.java
index f86754d..a551cce 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementCategory.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementCategory.java
@@ -23,7 +23,6 @@ import org.apache.streampipes.model.DataProcessorType;
 import org.apache.streampipes.model.DataSinkType;
 import org.apache.streampipes.model.SpDataStream;
 import org.apache.streampipes.model.client.Category;
-import org.apache.streampipes.rest.api.IPipelineElementCategory;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.storage.management.StorageManager;
 
@@ -36,13 +35,12 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 @Path("/v2/categories")
-public class PipelineElementCategory extends AbstractRestInterface implements IPipelineElementCategory {
+public class PipelineElementCategory extends AbstractRestInterface {
 
 	@GET
 	@Path("/ep")
 	@Produces(MediaType.APPLICATION_JSON)
 	@JacksonSerialized
-	@Override
 	public Response getEps() {
 		return ok(makeCategories(StorageManager.INSTANCE.getPipelineElementStorage().getAllDataStreams()));
 	}
@@ -51,7 +49,6 @@ public class PipelineElementCategory extends AbstractRestInterface implements IP
 	@Path("/epa")
 	@Produces(MediaType.APPLICATION_JSON)
 	@JacksonSerialized
-	@Override
 	public Response getEpaCategories() {
 		return ok(DataProcessorType.values());
 	}
@@ -60,7 +57,6 @@ public class PipelineElementCategory extends AbstractRestInterface implements IP
 	@Path("/adapter")
 	@Produces(MediaType.APPLICATION_JSON)
 	@JacksonSerialized
-	@Override
 	public Response getAdapterCategories() {
 		return ok(AdapterType.values());
 	}
@@ -69,7 +65,6 @@ public class PipelineElementCategory extends AbstractRestInterface implements IP
 	@Path("/ec")
 	@Produces(MediaType.APPLICATION_JSON)
 	@JacksonSerialized
-	@Override
 	public Response getEcCategories() {
 		return ok(DataSinkType.values());
 	}
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementFile.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementFile.java
index c9e4ad3..49e2f6e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementFile.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementFile.java
@@ -19,7 +19,6 @@ package org.apache.streampipes.rest.impl;
 
 import org.apache.streampipes.manager.file.FileManager;
 import org.apache.streampipes.model.client.file.FileMetadata;
-import org.apache.streampipes.rest.api.IPipelineElementFile;
 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
 import org.glassfish.jersey.media.multipart.FormDataParam;
 
@@ -32,7 +31,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 @Path("/v2/users/{username}/files")
-public class PipelineElementFile extends AbstractRestInterface implements IPipelineElementFile {
+public class PipelineElementFile extends AbstractRestInterface {
 
   @POST
   @Consumes(MediaType.MULTIPART_FORM_DATA)
@@ -56,7 +55,6 @@ public class PipelineElementFile extends AbstractRestInterface implements IPipel
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getFileInfo(@QueryParam("filetypes") String filetypes) {
     List<FileMetadata> allFiles = getFileMetadataStorage().getAllFileMetadataDescriptions();
     return filetypes != null ? ok(filterFiletypes(allFiles, filetypes)) : ok(allFiles);
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementRuntimeInfo.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementRuntimeInfo.java
index 98c12ce..fb126be 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementRuntimeInfo.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineElementRuntimeInfo.java
@@ -21,7 +21,6 @@ import org.apache.streampipes.commons.exceptions.SpRuntimeException;
 import org.apache.streampipes.manager.operations.Operations;
 import org.apache.streampipes.model.SpDataStream;
 import org.apache.streampipes.model.message.Notifications;
-import org.apache.streampipes.rest.api.IPipelineElementRuntimeInfo;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 
 import javax.ws.rs.Consumes;
@@ -32,10 +31,8 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/users/{username}/pipeline-element/runtime")
-public class PipelineElementRuntimeInfo extends AbstractRestInterface implements IPipelineElementRuntimeInfo {
+public class PipelineElementRuntimeInfo extends AbstractRestInterface {
 
-
-  @Override
   @POST
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java
index 07126d4..da687a1 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineTemplate.java
@@ -25,7 +25,6 @@ import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
 import org.apache.streampipes.model.template.PipelineTemplateDescription;
 import org.apache.streampipes.model.template.PipelineTemplateDescriptionContainer;
 import org.apache.streampipes.model.template.PipelineTemplateInvocation;
-import org.apache.streampipes.rest.api.IPipelineTemplate;
 import org.apache.streampipes.rest.shared.util.SpMediaType;
 import org.apache.streampipes.serializers.jsonld.JsonLdTransformer;
 import org.apache.streampipes.vocabulary.StreamPipes;
@@ -38,12 +37,11 @@ import java.util.ArrayList;
 import java.util.List;
 
 @Path("/v2/users/{username}/pipeline-templates")
-public class PipelineTemplate extends AbstractRestInterface implements IPipelineTemplate {
+public class PipelineTemplate extends AbstractRestInterface {
 
   @GET
   @Path("/streams")
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAvailableDataStreams() {
     List<SpDataStream> sources = getPipelineElementRdfStorage().getAllDataStreams();
     List<SpDataStream> datasets = new ArrayList<>();
@@ -59,7 +57,6 @@ public class PipelineTemplate extends AbstractRestInterface implements IPipeline
   @GET
   @Path("/sets")
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAvailableDataSets() {
 
     List<SpDataStream> sources = getPipelineElementRdfStorage().getAllDataStreams();
@@ -76,7 +73,6 @@ public class PipelineTemplate extends AbstractRestInterface implements IPipeline
 
   @GET
   @Produces(SpMediaType.JSONLD)
-  @Override
   public Response getPipelineTemplates(@QueryParam("streamId") String streamId) {
     if (streamId != null) {
       return ok(new PipelineTemplateDescriptionContainer(Operations.getCompatiblePipelineTemplates(streamId)));
@@ -89,7 +85,6 @@ public class PipelineTemplate extends AbstractRestInterface implements IPipeline
   @GET
   @Path("/invocation")
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getPipelineTemplateInvocation(@QueryParam("streamId") String streamId,
                                                 @QueryParam("templateId") String pipelineTemplateId) {
     if (pipelineTemplateId != null) {
@@ -103,6 +98,27 @@ public class PipelineTemplate extends AbstractRestInterface implements IPipeline
     }
   }
 
+  @POST
+  @Produces(MediaType.APPLICATION_JSON)
+  public Response generatePipeline(@PathParam("username") String username,
+                                   String pipelineTemplateInvocationString) {
+    try {
+      PipelineTemplateInvocation pipelineTemplateInvocation =
+              new JsonLdTransformer(StreamPipes.PIPELINE_TEMPLATE_INVOCATION)
+                      .fromJsonLd(pipelineTemplateInvocationString, PipelineTemplateInvocation.class);
+
+      PipelineOperationStatus status = Operations
+              .handlePipelineTemplateInvocation(username, pipelineTemplateInvocation);
+
+      return ok(status);
+
+    } catch (IOException e) {
+      e.printStackTrace();
+      return fail();
+    }
+  }
+
+
   private PipelineTemplateDescription getPipelineTemplateDescription(String pipelineTemplateId) {
     return Operations
             .getAllPipelineTemplates()
@@ -123,25 +139,4 @@ public class PipelineTemplate extends AbstractRestInterface implements IPipeline
             .findFirst()
             .get();
   }
-
-  @POST
-  @Produces(MediaType.APPLICATION_JSON)
-  @Override
-  public Response generatePipeline(@PathParam("username") String username,
-                                   String pipelineTemplateInvocationString) {
-    try {
-      PipelineTemplateInvocation pipelineTemplateInvocation =
-              new JsonLdTransformer(StreamPipes.PIPELINE_TEMPLATE_INVOCATION)
-                      .fromJsonLd(pipelineTemplateInvocationString, PipelineTemplateInvocation.class);
-
-      PipelineOperationStatus status = Operations
-              .handlePipelineTemplateInvocation(username, pipelineTemplateInvocation);
-
-      return ok(status);
-
-    } catch (IOException e) {
-      e.printStackTrace();
-      return fail();
-    }
-  }
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineWithUserResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineWithUserResource.java
index 6be4d59..581766f 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineWithUserResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/PipelineWithUserResource.java
@@ -30,7 +30,6 @@ import org.apache.streampipes.model.message.Notifications;
 import org.apache.streampipes.model.message.SuccessMessage;
 import org.apache.streampipes.model.pipeline.Pipeline;
 import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
-import org.apache.streampipes.rest.api.IPipeline;
 import org.apache.streampipes.rest.management.PipelineManagement;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
@@ -44,18 +43,15 @@ import java.util.Date;
 import java.util.UUID;
 
 @Path("/v2/users/{username}/pipelines")
-public class PipelineWithUserResource extends AbstractRestInterface implements IPipeline {
+public class PipelineWithUserResource extends AbstractRestInterface {
 
     private static final Logger logger = LoggerFactory.getLogger(PipelineWithUserResource.class);
 
-    @Override
     public Response getAvailable(String username) {
         // TODO Auto-generated method stub
         return null;
     }
 
-
-    @Override
     public Response getFavorites(String username) {
         // TODO Auto-generated method stub
         return null;
@@ -65,7 +61,6 @@ public class PipelineWithUserResource extends AbstractRestInterface implements I
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/own")
     @JacksonSerialized
-    @Override
     public Response getOwn(@PathParam("username") String username) {
         return ok(getUserService()
                 .getOwnPipelines(username));
@@ -75,18 +70,15 @@ public class PipelineWithUserResource extends AbstractRestInterface implements I
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/system")
     @JacksonSerialized
-    @Override
     public Response getSystemPipelines() {
         return ok(getPipelineStorage().getSystemPipelines());
     }
 
-    @Override
     public Response addFavorite(String username, String elementUri) {
         // TODO Auto-generated method stub
         return null;
     }
 
-    @Override
     public Response removeFavorite(String username, String elementUri) {
         // TODO Auto-generated method stub
         return null;
@@ -96,7 +88,6 @@ public class PipelineWithUserResource extends AbstractRestInterface implements I
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/{pipelineId}/status")
     @GsonWithIds
-    @Override
     public Response getPipelineStatus(@PathParam("username") String username, @PathParam("pipelineId") String pipelineId) {
         return ok(PipelineStatusManager.getPipelineStatus(pipelineId, 5));
     }
@@ -110,7 +101,6 @@ public class PipelineWithUserResource extends AbstractRestInterface implements I
         return statusMessage(Notifications.success("Pipeline deleted"));
     }
 
-    @Override
     public String getAsJsonLd(String elementUri) {
         return null;
     }
@@ -119,7 +109,6 @@ public class PipelineWithUserResource extends AbstractRestInterface implements I
     @Path("/{pipelineId}")
     @Produces(MediaType.APPLICATION_JSON)
     @JacksonSerialized
-    @Override
     public Response getElement(@PathParam("username") String username, @PathParam("pipelineId") String pipelineId) {
         return ok(getPipelineStorage().getPipeline(pipelineId));
     }
@@ -234,7 +223,6 @@ public class PipelineWithUserResource extends AbstractRestInterface implements I
     @Path("/{pipelineId}")
     @Produces(MediaType.APPLICATION_JSON)
     @GsonWithIds
-    @Override
     public Response overwritePipeline(@PathParam("username") String username,
                                       @PathParam("pipelineId") String pipelineId,
                                       Pipeline pipeline) {
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RdfEndpoint.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RdfEndpoint.java
index 0bc2ca6..b1bda30 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RdfEndpoint.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/RdfEndpoint.java
@@ -23,7 +23,6 @@ import org.apache.streampipes.manager.operations.Operations;
 import org.apache.streampipes.model.SpDataSet;
 import org.apache.streampipes.model.base.NamedStreamPipesEntity;
 import org.apache.streampipes.model.client.endpoint.RdfEndpointItem;
-import org.apache.streampipes.rest.api.IRdfEndpoint;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.apache.streampipes.storage.api.IRdfEndpointStorage;
 
@@ -35,12 +34,11 @@ import java.util.List;
 import java.util.stream.Collectors;
 
 @Path("/v2/users/{username}/rdfendpoints")
-public class RdfEndpoint extends AbstractRestInterface implements IRdfEndpoint {
+public class RdfEndpoint extends AbstractRestInterface {
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response getAllEndpoints() {
     //TODO: return the endpoint of passing services
     return ok(getEndpoints());
@@ -49,7 +47,6 @@ public class RdfEndpoint extends AbstractRestInterface implements IRdfEndpoint {
   @POST
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response addRdfEndpoint(org.apache.streampipes.model.client.endpoint.RdfEndpoint rdfEndpoint) {
     getRdfEndpointStorage()
             .addRdfEndpoint(rdfEndpoint);
@@ -63,7 +60,6 @@ public class RdfEndpoint extends AbstractRestInterface implements IRdfEndpoint {
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response removeRdfEndpoint(@PathParam("rdfEndpointId") String rdfEndpointId) {
     getRdfEndpointStorage()
             .removeRdfEndpoint(rdfEndpointId);
@@ -75,7 +71,6 @@ public class RdfEndpoint extends AbstractRestInterface implements IRdfEndpoint {
   @Path("/items")
   @Produces(MediaType.APPLICATION_JSON)
   @GsonWithIds
-  @Override
   public Response getEndpointContents(@PathParam("username") String username) {
     List<org.apache.streampipes.model.client.endpoint.RdfEndpoint> endpoints = getEndpoints();
 
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Setup.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Setup.java
index 2b93bb4..fdc8fa2 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Setup.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Setup.java
@@ -21,10 +21,9 @@ package org.apache.streampipes.rest.impl;
 import com.google.gson.JsonObject;
 import org.apache.streampipes.config.backend.BackendConfig;
 import org.apache.streampipes.manager.setup.Installer;
+import org.apache.streampipes.model.client.setup.InitialSettings;
 import org.apache.streampipes.model.message.Notifications;
 import org.apache.streampipes.model.message.SetupStatusMessage;
-import org.apache.streampipes.model.client.setup.InitialSettings;
-import org.apache.streampipes.rest.api.ISetup;
 import org.apache.streampipes.rest.notifications.NotificationListener;
 import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
@@ -34,12 +33,11 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/setup")
-public class Setup extends AbstractRestInterface implements ISetup {
+public class Setup extends AbstractRestInterface {
 
   @GET
   @Path("/configured")
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response isConfigured() {
     JsonObject obj = new JsonObject();
     if (BackendConfig.INSTANCE.isConfigured()) {
@@ -56,7 +54,6 @@ public class Setup extends AbstractRestInterface implements ISetup {
   @JacksonSerialized
   @Consumes(MediaType.APPLICATION_JSON)
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response configure(InitialSettings settings, @PathParam("currentInstallationStep") Integer currentInstallationStep) {
     SetupStatusMessage message = new Installer(settings).install(currentInstallationStep);
     if (currentInstallationStep == (message.getInstallationStepCount() - 1)) {
@@ -69,7 +66,6 @@ public class Setup extends AbstractRestInterface implements ISetup {
   @Path("/configuration")
   @GsonWithIds
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response updateConfiguration(InitialSettings settings) {
     try {
       // TODO implement update consul configs
@@ -85,20 +81,4 @@ public class Setup extends AbstractRestInterface implements ISetup {
     }
   }
 
-  @GET
-  @Path("/configuration")
-  @Produces(MediaType.APPLICATION_JSON)
-  @GsonWithIds
-  @Override
-  @Deprecated
-  // NOT sure if we need this method
-  public Response getConfiguration() {
-//        InitialSettings is = new InitialSettings();
-//        is.setCouchDBHost(CouchDbConfig.INSTANCE.getHost());
-//        is.setSesameUrl(SesameConfig.INSTANCE.getUri());
-
-//         TODO return here the initial configurations
-    return ok(true);
-  }
-
 }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/StreamPipesLogs.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/StreamPipesLogs.java
index f8b7e27..d2be7a6 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/StreamPipesLogs.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/StreamPipesLogs.java
@@ -20,6 +20,10 @@ package org.apache.streampipes.rest.impl;
 
 import com.google.gson.Gson;
 import org.apache.http.HttpHost;
+import org.apache.streampipes.config.backend.BackendConfig;
+import org.apache.streampipes.logging.model.Log;
+import org.apache.streampipes.logging.model.LogRequest;
+import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 import org.elasticsearch.action.search.ClearScrollRequest;
 import org.elasticsearch.action.search.SearchRequest;
 import org.elasticsearch.action.search.SearchResponse;
@@ -34,13 +38,11 @@ import org.elasticsearch.search.sort.FieldSortBuilder;
 import org.elasticsearch.search.sort.SortOrder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.streampipes.config.backend.BackendConfig;
-import org.apache.streampipes.logging.model.Log;
-import org.apache.streampipes.logging.model.LogRequest;
-import org.apache.streampipes.rest.api.ILogs;
-import org.apache.streampipes.rest.shared.annotation.GsonWithIds;
 
-import javax.ws.rs.*;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import java.io.IOException;
@@ -51,12 +53,10 @@ import java.util.Date;
 import java.util.LinkedList;
 import java.util.Map;
 
-import static org.elasticsearch.index.query.QueryBuilders.boolQuery;
-import static org.elasticsearch.index.query.QueryBuilders.matchPhraseQuery;
-import static org.elasticsearch.index.query.QueryBuilders.rangeQuery;
+import static org.elasticsearch.index.query.QueryBuilders.*;
 
 @Path("/v2/logs")
-public class StreamPipesLogs extends AbstractRestInterface implements ILogs {
+public class StreamPipesLogs extends AbstractRestInterface {
 
     static Logger LOG = LoggerFactory.getLogger(StreamPipesLogs.class);
 
@@ -66,7 +66,6 @@ public class StreamPipesLogs extends AbstractRestInterface implements ILogs {
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
     @GsonWithIds
-    @Override
     public Response getLogs(LogRequest logRequest) {
         LinkedList logs = new LinkedList();
 
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/User.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/User.java
index 2d3e764..4498e21 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/User.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/User.java
@@ -19,23 +19,16 @@
 package org.apache.streampipes.rest.impl;
 
 import org.apache.streampipes.model.message.Notifications;
-import org.apache.streampipes.rest.api.IUser;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/users/{email}")
-public class User extends AbstractRestInterface implements IUser {
+public class User extends AbstractRestInterface {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    @Override
     public Response getUserDetails(@PathParam("email") String email) {
         org.apache.streampipes.model.client.user.User user = getUser(email);
         user.setPassword("");
@@ -50,7 +43,6 @@ public class User extends AbstractRestInterface implements IUser {
     @PUT
     @Consumes(MediaType.APPLICATION_JSON)
     @Produces(MediaType.APPLICATION_JSON)
-    @Override
     public Response updateUserDetails(org.apache.streampipes.model.client.user.User user) {
         if (user != null) {
             org.apache.streampipes.model.client.user.User existingUser = getUser(user.getEmail());
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Version.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Version.java
index 1baddb3..58e844c 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Version.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Version.java
@@ -19,7 +19,6 @@ package org.apache.streampipes.rest.impl;
 
 import org.apache.streampipes.manager.info.SystemInfoProvider;
 import org.apache.streampipes.manager.info.VersionInfoProvider;
-import org.apache.streampipes.rest.api.IVersion;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -28,19 +27,17 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/info")
-public class Version extends AbstractRestInterface implements IVersion {
+public class Version extends AbstractRestInterface {
 
   @GET
   @Path("/versions")
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getVersionInfo() {
     return ok(new VersionInfoProvider().makeVersionInfo());
   }
 
   @GET
   @Path("/system")
-  @Override
   public Response getSystemInfo() {
     return ok(new SystemInfoProvider().getSystemInfo());
   }
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/VirtualSensor.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/VirtualSensor.java
index 1005890..c5ced66 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/VirtualSensor.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/VirtualSensor.java
@@ -20,25 +20,22 @@ package org.apache.streampipes.rest.impl;
 
 import org.apache.streampipes.model.message.NotificationType;
 import org.apache.streampipes.serializers.json.Utils;
-import org.apache.streampipes.rest.api.IVirtualSensor;
 
 import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/users/{username}/block")
-public class VirtualSensor extends AbstractRestInterface implements IVirtualSensor {
+public class VirtualSensor extends AbstractRestInterface {
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response getVirtualSensors(@PathParam("username") String username) {
 		return ok(getPipelineStorage().getVirtualSensors(username));
 	}
 
 	@POST
 	@Produces(MediaType.APPLICATION_JSON)
-	@Override
 	public Response addVirtualSensor(@PathParam("username") String username, String virtualSensorDescription) {
 		org.apache.streampipes.model.VirtualSensor vs = Utils.getGson().fromJson(virtualSensorDescription, org.apache.streampipes.model.VirtualSensor.class);
 		//vs.setPipelineId(UUID.randomUUID().toString());
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Visualization.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Visualization.java
index c4a4fdc..715ac2e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Visualization.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/Visualization.java
@@ -18,8 +18,6 @@
 
 package org.apache.streampipes.rest.impl;
 
-import org.apache.streampipes.rest.api.IVisualization;
-
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
@@ -27,7 +25,7 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/visualizations")
-public class Visualization extends AbstractRestInterface implements IVisualization {
+public class Visualization extends AbstractRestInterface {
 
 	@GET
 	@Produces(MediaType.APPLICATION_JSON)
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
index 0f438b1..96ede46 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/AbstractDashboardResource.java
@@ -19,25 +19,17 @@
 package org.apache.streampipes.rest.impl.dashboard;
 
 import org.apache.streampipes.model.dashboard.DashboardModel;
-import org.apache.streampipes.rest.api.dashboard.IDashboard;
 import org.apache.streampipes.rest.impl.AbstractRestInterface;
 import org.apache.streampipes.storage.api.IDashboardStorage;
 
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
-public abstract class AbstractDashboardResource extends AbstractRestInterface implements IDashboard {
+public abstract class AbstractDashboardResource extends AbstractRestInterface {
 
   @GET
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAllDashboards() {
     return ok(getDashboardStorage().getAllDashboards());
   }
@@ -45,7 +37,6 @@ public abstract class AbstractDashboardResource extends AbstractRestInterface im
   @GET
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @Override
   public Response getDashboard(@PathParam("dashboardId") String dashboardId) {
     return ok(getDashboardStorage().getDashboard(dashboardId));
   }
@@ -53,7 +44,6 @@ public abstract class AbstractDashboardResource extends AbstractRestInterface im
   @PUT
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @Override
   public Response modifyDashboard(DashboardModel dashboardModel) {
     getDashboardStorage().updateDashboard(dashboardModel);
     return ok(getDashboardStorage().getDashboard(dashboardModel.getCouchDbId()));
@@ -62,7 +52,6 @@ public abstract class AbstractDashboardResource extends AbstractRestInterface im
   @DELETE
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{dashboardId}")
-  @Override
   public Response deleteDashboard(@PathParam("dashboardId") String dashboardId) {
     getDashboardStorage().deleteDashboard(dashboardId);
     return ok();
@@ -70,7 +59,6 @@ public abstract class AbstractDashboardResource extends AbstractRestInterface im
 
   @POST
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response createDashboard(DashboardModel dashboardModel) {
     getDashboardStorage().storeDashboard(dashboardModel);
     return ok();
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java
index 624bfad..f7d03ed 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/DashboardWidget.java
@@ -19,7 +19,6 @@
 package org.apache.streampipes.rest.impl.dashboard;
 
 import org.apache.streampipes.model.dashboard.DashboardWidgetModel;
-import org.apache.streampipes.rest.api.dashboard.IDashboardWidget;
 import org.apache.streampipes.rest.impl.AbstractRestInterface;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.storage.api.IDashboardWidgetStorage;
@@ -29,12 +28,11 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v2/users/{username}/dashboard/widgets")
-public class DashboardWidget extends AbstractRestInterface implements IDashboardWidget {
+public class DashboardWidget extends AbstractRestInterface {
 
   @GET
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAllDashboardWidgets() {
     return ok(getDashboardWidgetStorage().getAllDashboardWidgets());
   }
@@ -43,7 +41,6 @@ public class DashboardWidget extends AbstractRestInterface implements IDashboard
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{widgetId}")
-  @Override
   public Response getDashboardWidget(@PathParam("widgetId") String widgetId) {
     return ok(getDashboardWidgetStorage().getDashboardWidget(widgetId));
   }
@@ -53,7 +50,6 @@ public class DashboardWidget extends AbstractRestInterface implements IDashboard
   @Consumes(MediaType.APPLICATION_JSON)
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{widgetId}")
-  @Override
   public Response modifyDashboardWidget(DashboardWidgetModel dashboardWidgetModel) {
     getDashboardWidgetStorage().updateDashboardWidget(dashboardWidgetModel);
     return ok();
@@ -63,7 +59,6 @@ public class DashboardWidget extends AbstractRestInterface implements IDashboard
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{widgetId}")
-  @Override
   public Response deleteDashboardWidget(@PathParam("widgetId") String widgetId) {
     getDashboardWidgetStorage().deleteDashboardWidget(widgetId);
     return ok();
@@ -73,7 +68,6 @@ public class DashboardWidget extends AbstractRestInterface implements IDashboard
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_JSON)
-  @Override
   public Response createDashboardWidget(DashboardWidgetModel dashboardWidgetModel) {
     String widgetId = getDashboardWidgetStorage().storeDashboardWidget(dashboardWidgetModel);
     return ok(getDashboardWidgetStorage().getDashboardWidget(widgetId));
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/VisualizablePipeline.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/VisualizablePipeline.java
index a3d26a8..0eb438e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/VisualizablePipeline.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/dashboard/VisualizablePipeline.java
@@ -18,7 +18,6 @@
 
 package org.apache.streampipes.rest.impl.dashboard;
 
-import org.apache.streampipes.rest.api.dashboard.IVisualizablePipeline;
 import org.apache.streampipes.rest.impl.AbstractRestInterface;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.storage.api.IVisualizablePipelineStorage;
@@ -33,12 +32,11 @@ import java.util.List;
 import java.util.Optional;
 
 @Path("/v2/users/{username}/dashboard/pipelines")
-public class VisualizablePipeline extends AbstractRestInterface implements IVisualizablePipeline {
+public class VisualizablePipeline extends AbstractRestInterface {
 
   @GET
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getVisualizablePipelines() {
     return ok(getVisualizablePipelineStorage().getAllVisualizablePipelines());
   }
@@ -47,7 +45,6 @@ public class VisualizablePipeline extends AbstractRestInterface implements IVisu
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{id}")
-  @Override
   public Response getVisualizablePipeline(@PathParam("id") String id) {
     org.apache.streampipes.model.dashboard.VisualizablePipeline pipeline = getVisualizablePipelineStorage().getVisualizablePipeline(id);
    return pipeline != null ? ok(pipeline) : fail();
@@ -57,7 +54,6 @@ public class VisualizablePipeline extends AbstractRestInterface implements IVisu
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("topic/{topic}")
-  @Override
   public Response getVisualizablePipelineByTopic(@PathParam("topic") String topic) {
     List<org.apache.streampipes.model.dashboard.VisualizablePipeline> pipelines =
             getVisualizablePipelineStorage().getAllVisualizablePipelines();
@@ -72,7 +68,6 @@ public class VisualizablePipeline extends AbstractRestInterface implements IVisu
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("{pipelineId}/{visualizationName}")
-  @Override
   public Response getVisualizablePipelineByPipelineIdAndVisualizationName(@PathParam("pipelineId") String pipelineId,
                                                                           @PathParam("visualizationName") String visualizationName) {
     List<org.apache.streampipes.model.dashboard.VisualizablePipeline> pipelines =
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
index 2e3c2b0..fb41ab7 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
+++ b/streampipes-rest/src/main/java/org/apache/streampipes/rest/impl/datalake/DataLakeWidgetResource.java
@@ -19,7 +19,6 @@
 package org.apache.streampipes.rest.impl.datalake;
 
 import org.apache.streampipes.model.datalake.DataExplorerWidgetModel;
-import org.apache.streampipes.rest.api.dataexplorer.IDataExplorerWidget;
 import org.apache.streampipes.rest.impl.AbstractRestInterface;
 import org.apache.streampipes.rest.shared.annotation.JacksonSerialized;
 import org.apache.streampipes.storage.api.IDataExplorerWidgetStorage;
@@ -29,12 +28,11 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
 @Path("/v3/users/{username}/datalake/dashboard/widgets")
-public class DataLakeWidgetResource extends AbstractRestInterface implements IDataExplorerWidget {
+public class DataLakeWidgetResource extends AbstractRestInterface {
 
   @GET
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
-  @Override
   public Response getAllDataExplorerWidgets() {
     return ok(getDataExplorerWidgetStorage().getAllDataExplorerWidgets());
   }
@@ -43,7 +41,6 @@ public class DataLakeWidgetResource extends AbstractRestInterface implements IDa
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{widgetId}")
-  @Override
   public Response getDataExplorerWidget(@PathParam("widgetId") String widgetId) {
     return ok(getDataExplorerWidgetStorage().getDataExplorerWidget(widgetId));
   }
@@ -53,7 +50,6 @@ public class DataLakeWidgetResource extends AbstractRestInterface implements IDa
   @Consumes(MediaType.APPLICATION_JSON)
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{widgetId}")
-  @Override
   public Response modifyDataExplorerWidget(DataExplorerWidgetModel dataExplorerWidgetModel) {
     getDataExplorerWidgetStorage().updateDataExplorerWidget(dataExplorerWidgetModel);
     return ok();
@@ -63,7 +59,6 @@ public class DataLakeWidgetResource extends AbstractRestInterface implements IDa
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Path("/{widgetId}")
-  @Override
   public Response deleteDataExplorerWidget(@PathParam("widgetId") String widgetId) {
     getDataExplorerWidgetStorage().deleteDataExplorerWidget(widgetId);
     return ok();
@@ -73,7 +68,6 @@ public class DataLakeWidgetResource extends AbstractRestInterface implements IDa
   @JacksonSerialized
   @Produces(MediaType.APPLICATION_JSON)
   @Consumes(MediaType.APPLICATION_JSON)
-  @Override
   public Response createDataExplorerWidget(DataExplorerWidgetModel dataExplorerWidgetModel) {
     String widgetId = getDataExplorerWidgetStorage().storeDataExplorerWidget(dataExplorerWidgetModel);
     return ok(getDataExplorerWidgetStorage().getDataExplorerWidget(widgetId));
diff --git a/streampipes-serializers-json/pom.xml b/streampipes-serializers-json/pom.xml
index ca6c6da..e31c88d 100644
--- a/streampipes-serializers-json/pom.xml
+++ b/streampipes-serializers-json/pom.xml
@@ -46,6 +46,13 @@
             <groupId>com.fasterxml.jackson.core</groupId>
             <artifactId>jackson-databind</artifactId>
         </dependency>
+
+        <!-- Test dependencies -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IAuthentication.java b/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/json/TestGsonSerializer.java
similarity index 50%
rename from streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IAuthentication.java
rename to streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/json/TestGsonSerializer.java
index 2276e76..53d877e 100644
--- a/streampipes-rest/src/main/java/org/apache/streampipes/rest/api/IAuthentication.java
+++ b/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/json/TestGsonSerializer.java
@@ -15,23 +15,22 @@
  * limitations under the License.
  *
  */
+package org.apache.streampipes.serializers.json;
 
-package org.apache.streampipes.rest.api;
+import org.apache.streampipes.model.template.PipelineElementTemplate;
+import org.apache.streampipes.serializers.utils.PipelineElementTemplateHelpers;
+import org.junit.Test;
 
-import org.apache.streampipes.model.client.user.RegistrationData;
-import org.apache.streampipes.model.client.user.ShiroAuthenticationRequest;
+import static org.junit.Assert.assertEquals;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Response;
+public class TestGsonSerializer {
+  @Test
+  public void testPipelineElementTemplateSerialization() {
+    PipelineElementTemplate template = PipelineElementTemplateHelpers.makePipelineElementTemplate();
 
-public interface IAuthentication {
-
-	Response doLogin(ShiroAuthenticationRequest token);
-
-	Response doLogout();
-	
-	Response doRegister(RegistrationData registrationData);
-
-	Response userAuthenticated(HttpServletRequest req);
-	
+    String json = GsonSerializer.getGsonWithIds().toJson(template);
+    PipelineElementTemplate template2 = GsonSerializer.getGsonWithIds().fromJson(json, PipelineElementTemplate.class);
+    PipelineElementTemplateHelpers.assertions(template2);
+    assertEquals(2.0, template2.getTemplateConfigs().get("test-key-2").getValue());
+  }
 }
diff --git a/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/json/TestJacksonSerializer.java b/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/json/TestJacksonSerializer.java
new file mode 100644
index 0000000..4d12e69
--- /dev/null
+++ b/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/json/TestJacksonSerializer.java
@@ -0,0 +1,42 @@
+/*
+ * 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.serializers.json;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import org.apache.streampipes.model.template.PipelineElementTemplate;
+import org.apache.streampipes.serializers.utils.PipelineElementTemplateHelpers;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class TestJacksonSerializer {
+
+  @Test
+  public void testPipelineElementTemplateSerialization() {
+    PipelineElementTemplate template = PipelineElementTemplateHelpers.makePipelineElementTemplate();
+
+    try {
+      String json = JacksonSerializer.getObjectMapper().writeValueAsString(template);
+      PipelineElementTemplate template2 = JacksonSerializer.getObjectMapper().readValue(json, PipelineElementTemplate.class);
+      PipelineElementTemplateHelpers.assertions(template2);
+      assertEquals(2, template2.getTemplateConfigs().get("test-key-2").getValue());
+    } catch (JsonProcessingException e) {
+      e.printStackTrace();
+    }
+  }
+}
diff --git a/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/utils/PipelineElementTemplateHelpers.java b/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/utils/PipelineElementTemplateHelpers.java
new file mode 100644
index 0000000..18f8917
--- /dev/null
+++ b/streampipes-serializers-json/src/test/java/org/apache/streampipes/serializers/utils/PipelineElementTemplateHelpers.java
@@ -0,0 +1,52 @@
+/*
+ * 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.serializers.utils;
+
+import org.apache.streampipes.model.template.PipelineElementTemplate;
+import org.apache.streampipes.model.template.PipelineElementTemplateConfig;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.junit.Assert.*;
+
+public class PipelineElementTemplateHelpers {
+
+  public static PipelineElementTemplate makePipelineElementTemplate() {
+    Map<String, PipelineElementTemplateConfig> configs = new HashMap<>();
+    configs.put("test-key", makeConfig(true, true, "test-string"));
+    configs.put("test-key-2", makeConfig(true, false, 2));
+
+    return new PipelineElementTemplate("name", "description", configs);
+  }
+
+  public static void assertions(PipelineElementTemplate template) {
+    assertEquals("name", template.getTemplateName());
+    assertEquals("description", template.getTemplateDescription());
+    assertEquals(2, template.getTemplateConfigs().size());
+    assertEquals("test-string", template.getTemplateConfigs().get("test-key").getValue());
+    assertTrue(template.getTemplateConfigs().get("test-key").isEditable());
+    assertTrue(template.getTemplateConfigs().get("test-key").isDisplayed());
+    assertTrue(template.getTemplateConfigs().get("test-key-2").isEditable());
+    assertFalse(template.getTemplateConfigs().get("test-key-2").isDisplayed());
+  }
+
+  private static PipelineElementTemplateConfig makeConfig(boolean editable, boolean displayed, Object value) {
+    return new PipelineElementTemplateConfig(editable, displayed, value);
+  }
+}
diff --git a/ui/src/app/core-model/gen/streampipes-model.ts b/ui/src/app/core-model/gen/streampipes-model.ts
index de8b166..5af919b 100644
--- a/ui/src/app/core-model/gen/streampipes-model.ts
+++ b/ui/src/app/core-model/gen/streampipes-model.ts
@@ -1,25 +1,7 @@
-/*
- * 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.
- *
- */
-
 /* tslint:disable */
 /* eslint-disable */
 // @ts-nocheck
-// Generated using typescript-generator version 2.27.744 on 2021-01-02 10:53:55.
+// Generated using typescript-generator version 2.27.744 on 2021-01-02 22:18:05.
 
 export class AbstractStreamPipesEntity {
     "@class": "org.apache.streampipes.model.base.AbstractStreamPipesEntity" | "org.apache.streampipes.model.base.NamedStreamPipesEntity" | "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.AdapterStre [...]
@@ -187,9 +169,9 @@ export class AdapterDescription extends NamedStreamPipesEntity {
         instance.config = __getCopyArrayFn(StaticProperty.fromDataUnion)(data.config);
         instance.rules = __getCopyArrayFn(TransformationRuleDescription.fromDataUnion)(data.rules);
         instance.category = __getCopyArrayFn(__identity<string>())(data.category);
+        instance.valueRules = __getCopyArrayFn(__identity<any>())(data.valueRules);
         instance.streamRules = __getCopyArrayFn(__identity<any>())(data.streamRules);
         instance.schemaRules = __getCopyArrayFn(__identity<any>())(data.schemaRules);
-        instance.valueRules = __getCopyArrayFn(__identity<any>())(data.valueRules);
         instance.couchDBId = data.couchDBId;
         instance._rev = data._rev;
         return instance;
@@ -1601,9 +1583,9 @@ export class GenericAdapterSetDescription extends AdapterSetDescription implemen
         }
         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);
+        instance.formatDescription = FormatDescription.fromData(data.formatDescription);
+        instance.protocolDescription = ProtocolDescription.fromData(data.protocolDescription);
         return instance;
     }
 }
@@ -1620,9 +1602,9 @@ export class GenericAdapterStreamDescription extends AdapterStreamDescription im
         }
         const instance = target || new GenericAdapterStreamDescription();
         super.fromData(data, instance);
-        instance.protocolDescription = ProtocolDescription.fromData(data.protocolDescription);
-        instance.formatDescription = FormatDescription.fromData(data.formatDescription);
         instance.eventSchema = EventSchema.fromData(data.eventSchema);
+        instance.formatDescription = FormatDescription.fromData(data.formatDescription);
+        instance.protocolDescription = ProtocolDescription.fromData(data.protocolDescription);
         return instance;
     }
 }
@@ -2117,6 +2099,25 @@ export class PipelineElementStatus {
     }
 }
 
+export class PipelineElementTemplate {
+    basePipelineElementAppId: string;
+    templateConfigs: { [index: string]: any };
+    templateDescription: string;
+    templateName: string;
+
+    static fromData(data: PipelineElementTemplate, target?: PipelineElementTemplate): PipelineElementTemplate {
+        if (!data) {
+            return data;
+        }
+        const instance = target || new PipelineElementTemplate();
+        instance.templateName = data.templateName;
+        instance.templateDescription = data.templateDescription;
+        instance.basePipelineElementAppId = data.basePipelineElementAppId;
+        instance.templateConfigs = __getCopyObjectFn(__identity<any>())(data.templateConfigs);
+        return instance;
+    }
+}
+
 export class PipelineModification {
     domId: string;
     elementId: string;
@@ -2528,8 +2529,8 @@ export class SpDataSet extends SpDataStream {
         instance.supportedGrounding = EventGrounding.fromData(data.supportedGrounding);
         instance.datasetInvocationId = data.datasetInvocationId;
         instance.correspondingPipeline = data.correspondingPipeline;
-        instance.brokerHostname = data.brokerHostname;
         instance.actualTopicName = data.actualTopicName;
+        instance.brokerHostname = data.brokerHostname;
         return instance;
     }
 }