Repository: apache/streampipes
Pull request #2154 (2023-11-08 14:42:24)

New E2E-Tests for data view
<!--
  ~ 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.
  ~
  -->
  
  <!--
Thanks for contributing! Here are some tips you can follow to help us incorporate your contribution quickly and easily:
1. If this is your first time, please read our contributor guidelines:
    - https://streampipes.apache.org/getinvolved.html
    - https://cwiki.apache.org/confluence/display/STREAMPIPES/Getting+Started
2. Make sure the PR title is formatted like: `[#<GitHub issue id>] PR title ...`
3. If the PR is unfinished, add '[WIP]' in your PR title, e.g., `[WIP][#<GitHub issue id>] PR title ...`.
4. Please write your PR title to summarize what this PR proposes/fixes.
5. Link the PR to the corresponding GitHub issue (if present) in the `Development` section in the right menu bar. 
6. Be sure to keep the PR description updated to reflect all changes.
7. If possible, provide a concise example to reproduce the issue for a faster review.
8. Make sure tests pass via `mvn clean install`.
9. (Optional) If the contribution is large, please file an Apache ICLA
    - http://apache.org/licenses/icla.pdf
-->

### Purpose
<!--
Please clarify what changes you are proposing and describe how those changes will address the issue.
Furthermore, describe potential consequences the changes might have.
--> Adds two new E2E-Tests for data view: Testing functionality of table view and time series view. Validates that new graphs are displayed correctly and that filtering is working.

### Remarks
<!--
Is there anything left we need to pay attention on?
Are there some references that might be important? E.g. links to Confluence, or discussions
on the mailing list or GitHub.
-->
PR introduces (a) breaking change(s): no

PR introduces (a) deprecation(s): no

Marcelfrueh: Unfortunately, both tests are flaky: Changing the filter settings throws the error: ResizeObserver loop completed with undelivered notifications. Errors occur when adding a filter (line 55 in table.spec.ts and line 77 in timeSeriesSave.spec.ts)
Marcelfrueh: Added 5 new Tests for different widgets in data view: Now testing the functionality of table, time series, 2D-correlation, distribution, heatmap, map and indicator.
To avoid the error message "ResizeObserver loop completed with undelivered notifications" when adding a filter, the test for the filter is excluded from the UI tests.
Marcelfrueh: Done!



Patch:
diff --git a/installer/cli/README.md b/installer/cli/README.md
index 478b22d8d4..e189c71a83 100644
--- a/installer/cli/README.md
+++ b/installer/cli/README.md
@@ -152,12 +152,12 @@ streampipes pull
 
 **Stop** existing StreamPipes containers
 ```bash
-streampipes stop pipeline-elements-all-jvm
+streampipes stop extensions-all-jvm
 ```
 
 **Start** existing StreamPipes containers
 ```bash
-streampipes start pipeline-elements-all-jvm
+streampipes start extensions-all-jvm
 ```
 
 **Restart** existing services
@@ -165,7 +165,7 @@ streampipes start pipeline-elements-all-jvm
 # restart backend consul container
 streampipes restart backend consul
 # restart existing services by removing and recreating container instance
-streampipes restart --force-create pipeline-elements-all-jvm
+streampipes restart --force-create extensions-all-jvm
 ```
 
 **Clean** your system and remove created StreamPipes Docker volumes, StreamPipes docker network and dangling StreamPipes images of old image layers.
@@ -215,7 +215,7 @@ As of now, this step has to be done **manually**. All environments are located i
 ├── backend               # developing core backend features
 ├── basic                 # wanna run core, UI, connect etc from the IDE?
 ├── full                  # full version containing more pipeline elements
-├── lite                  # few pipeline elements, less memory  
+├── lite                  # few pipeline elements, less memory
 ├── pipeline-element      # developing new pipeline-elements
 └── ui                    # developing UI features
 ```
diff --git a/installer/cli/bin/commands/info b/installer/cli/bin/commands/info
index 75b39ac8ea..1ded1a0747 100755
--- a/installer/cli/bin/commands/info
+++ b/installer/cli/bin/commands/info
@@ -34,7 +34,7 @@ fi
 
 cat <<EOF
 Version:      $(show_version)
-GitHub:       https://github.com/apache/incubator-streampipes-installer
+GitHub:       https://github.com/apache/streampipes-installer
 Website:      https://streampipes.apache.org
 Bug Report:   dev@streampipes.apache.org
 
diff --git a/installer/cli/environments/full b/installer/cli/environments/full
index fee496d0ed..f751a50862 100644
--- a/installer/cli/environments/full
+++ b/installer/cli/environments/full
@@ -16,8 +16,7 @@
 [environment:full]
 ui
 backend
-connect-adapters
-connect-adapters-iiot
+extensions-all-jvm
 consul
 couchdb
 jobmanager
@@ -25,5 +24,4 @@ taskmanager
 zookeeper
 kafka
 influxdb
-pipeline-elements-all-jvm
 pipeline-elements-all-flink
diff --git a/installer/scripts/epsg/Readme.md b/installer/scripts/epsg/Readme.md
index f14236bb73..95effeeeee 100644
--- a/installer/scripts/epsg/Readme.md
+++ b/installer/scripts/epsg/Readme.md
@@ -67,7 +67,7 @@ Coming soon
 
 The database, in which the epsg data will be imported, is already included as a service (Postgres DB). The Only step the user has to do is to fill the database with the required scripts.
 
-Therefore, the following empty scripts must be replaced in the `incubator-streampipes/installer/scripts/epsg` folder
+Therefore, the following empty scripts must be replaced in the `streampipes/installer/scripts/epsg` folder
 
 * PostgreSQL_Table_Script.sql
 * PostgreSQL_Data_Script.sql
@@ -90,14 +90,14 @@ Unzip the folder and replace files
 * PostgreSQL_Data_Script.sql
 * PostgreSQL_FKey_Script.sql
 
-in the `incubator-streampipes/installer/scripts/epsg` folder.
+in the `streampipes/installer/scripts/epsg` folder.
 
 For indexing the imported data and get better performance, go to 
 <a href="https://github.com/apache/sis/blob/master/core/sis-referencing/src/main/resources/org/apache/sis/referencing/factory/sql/EPSG_Finish.sql" target="_blank">this file</a>
 and replace it with the
 * EPSG_FINISH.sql
 
-in the `incubator-streampipes/installer/scripts/epsg` folder.
+in the `streampipes/installer/scripts/epsg` folder.
 
 # Import into Database
 
diff --git a/pom.xml b/pom.xml
index fef4b34cc0..8b951dcf83 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,4 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
+
 <!--
 ~ Licensed to the Apache Software Foundation (ASF) under one or more
 ~ contributor license agreements.  See the NOTICE file distributed with
@@ -105,7 +106,7 @@
         <plexus-component-annotations.version>2.1.1</plexus-component-annotations.version>
         <plexus-interactivity-api.version>1.1</plexus-interactivity-api.version>
         <plexus-utils.version>3.5.0</plexus-utils.version>
-        <postgresql.version>42.6.0</postgresql.version>
+        <postgresql.version>42.7.0</postgresql.version>
         <protobuf.version>3.25.0</protobuf.version>
         <pulsar.version>2.10.1</pulsar.version>
         <quartz.version>2.3.2</quartz.version>
@@ -143,6 +144,7 @@
         <maven.dependency.check.plugin.version>8.4.0</maven.dependency.check.plugin.version>
         <maven-shade-plugin.version>3.4.1</maven-shade-plugin.version>
         <maven.version>3.8.7</maven.version>
+        <typescript-generator-maven-plugin.version>3.2.1263</typescript-generator-maven-plugin.version>
 
 
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -956,6 +958,11 @@
 
         <pluginManagement>
             <plugins>
+                <plugin>
+                    <groupId>cz.habarta.typescript-generator</groupId>
+                    <artifactId>typescript-generator-maven-plugin</artifactId>
+                    <version>${typescript-generator-maven-plugin.version}</version>
+                </plugin>
                 <plugin>
                     <groupId>net.revelc.code.formatter</groupId>
                     <artifactId>formatter-maven-plugin</artifactId>
diff --git a/run-validation-system.sh b/run-validation-system.sh
index 6d0f334c51..f950977b7e 100644
--- a/run-validation-system.sh
+++ b/run-validation-system.sh
@@ -13,4 +13,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-docker-compose up -d && ../incubator-streampipes-extensions/docker-compose up -d
+docker-compose up -d && ../streampipes-extensions/docker-compose up -d
diff --git a/streampipes-extensions/docker-compose.yml b/streampipes-extensions/docker-compose.yml
index aba955dbfc..302a1d651c 100644
--- a/streampipes-extensions/docker-compose.yml
+++ b/streampipes-extensions/docker-compose.yml
@@ -33,14 +33,14 @@ x-logging:
 
 services:
 
-  #### apache/incubator-streampipes-extensions
+  #### apache/streampipes-extensions
   connect-worker-main:
     build:
       context: ./streampipes-connect-adapters
       dockerfile: Dockerfile
       args:
         BASE_IMAGE: adoptopenjdk/openjdk8-openj9:alpine
-    image: incubator-streampipes_connect-worker-main:release-validation
+    image: streampipes_connect-worker-main:release-validation
     environment:
       - SP_CONNECT_CONTAINER_HOST=connect-master
       - SP_CONNECT_CONTAINER_WORKER=connect-worker-main
@@ -48,26 +48,26 @@ services:
     networks:
       spnet:
 
-  pipeline-elements-all-jvm:
+  extensions-all-jvm:
     build:
-      context: ./streampipes-pipeline-elements-all-jvm
+      context: ./streampipes-extensions-all-jvm
       dockerfile: Dockerfile
       args:
         BASE_IMAGE: adoptopenjdk/openjdk8-openj9:alpine
-    image: incubator-streampipes_pipeline-elements-all-jvm:release-validation
+    image: streampipes_extensions-all-jvm:release-validation
     volumes:
     - files:/spImages
     logging: *default-logging
     networks:
       spnet:
 
-  pipeline-elements-all-flink:
+  pipeline-elements-experimental-flink:
     build:
-      context: ./streampipes-pipeline-elements-all-flink
+      context: ./streampipes-pipeline-elements-experimental-flink
       dockerfile: Dockerfile
       args:
         BASE_IMAGE: adoptopenjdk/openjdk8-openj9:alpine
-    image: incubator-streampipes_pipeline-elements-all-flink:release-validation
+    image: streampipes_pipeline-elements-experimental-flink:release-validation
     logging: *default-logging
     networks:
       spnet:
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/iolink/IfmAlMqttAdapter.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/iolink/IfmAlMqttAdapter.java
index 5a0648112d..9c9fc05caf 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/iolink/IfmAlMqttAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/iolink/IfmAlMqttAdapter.java
@@ -77,7 +77,7 @@ public class IfmAlMqttAdapter implements StreamPipesAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, IfmAlMqttAdapter::new)
+        .create(ID, 0, IfmAlMqttAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.Generic, AdapterType.Manufacturing)
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/ros/RosBridgeAdapter.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/ros/RosBridgeAdapter.java
index c86ea31abe..675461ecbe 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/ros/RosBridgeAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/ros/RosBridgeAdapter.java
@@ -92,7 +92,7 @@ public class RosBridgeAdapter implements StreamPipesAdapter, ResolvesContainerPr
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, RosBridgeAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, RosBridgeAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.Manufacturing)
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/simulator/machine/MachineDataSimulatorAdapter.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/simulator/machine/MachineDataSimulatorAdapter.java
index bef53062ca..2af0b55e1f 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/simulator/machine/MachineDataSimulatorAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/simulator/machine/MachineDataSimulatorAdapter.java
@@ -43,7 +43,7 @@ public class MachineDataSimulatorAdapter implements StreamPipesAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, MachineDataSimulatorAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, MachineDataSimulatorAdapter::new)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN)
         .withCategory(AdapterType.Debugging)
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
index f9ad62a2c9..744982a888 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/FileReplayAdapter.java
@@ -80,7 +80,7 @@ public class FileReplayAdapter implements StreamPipesAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, FileReplayAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, FileReplayAdapter::new)
         .withSupportedParsers(
             new JsonParsers(),
             new CsvParser(),
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpServerProtocol.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpServerProtocol.java
index 5fc242cc1f..c068e31593 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpServerProtocol.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpServerProtocol.java
@@ -103,7 +103,7 @@ public class HttpServerProtocol implements StreamPipesAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, HttpServerProtocol::new)
+        .create(ID, 0, HttpServerProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpStreamProtocol.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpStreamProtocol.java
index ade3d66cb5..376f20f294 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpStreamProtocol.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/protocol/stream/HttpStreamProtocol.java
@@ -106,7 +106,7 @@ public class HttpStreamProtocol implements StreamPipesAdapter, IPullAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, HttpStreamProtocol::new)
+        .create(ID, 0, HttpStreamProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN)
diff --git a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/image/stream/ImageStreamAdapter.java b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/image/stream/ImageStreamAdapter.java
index 52758308d1..405afdc1c1 100644
--- a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/image/stream/ImageStreamAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/image/stream/ImageStreamAdapter.java
@@ -46,7 +46,7 @@ public class ImageStreamAdapter implements StreamPipesAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, ImageStreamAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, ImageStreamAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .requiredIntegerParameter(Labels.withId(ImageZipUtils.INTERVAL_KEY))
diff --git a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/iss/IssAdapter.java b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/iss/IssAdapter.java
index b2d53617a2..bf9cb5bcb7 100644
--- a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/iss/IssAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/iss/IssAdapter.java
@@ -103,7 +103,7 @@ public class IssAdapter implements StreamPipesAdapter, IPullAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, IssAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, IssAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.OpenData)
diff --git a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioMQTTAdapter.java b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioMQTTAdapter.java
index a9edfc5cf5..4211057832 100644
--- a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioMQTTAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioMQTTAdapter.java
@@ -53,7 +53,7 @@ public class NetioMQTTAdapter implements StreamPipesAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, NetioMQTTAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, NetioMQTTAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.Energy)
diff --git a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioRestAdapter.java b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioRestAdapter.java
index 998115bc5d..20989d98fa 100644
--- a/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioRestAdapter.java
+++ b/streampipes-extensions/streampipes-connect-adapters/src/main/java/org/apache/streampipes/connect/adapters/netio/NetioRestAdapter.java
@@ -125,7 +125,7 @@ public class NetioRestAdapter implements StreamPipesAdapter, IPullAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, NetioRestAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, NetioRestAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.Energy)
diff --git a/streampipes-extensions/streampipes-connectors-influx/src/main/java/org/apache/streampipes/extensions/connectors/influx/adapter/InfluxDbStreamAdapter.java b/streampipes-extensions/streampipes-connectors-influx/src/main/java/org/apache/streampipes/extensions/connectors/influx/adapter/InfluxDbStreamAdapter.java
index 8c9ff23755..495edc2824 100644
--- a/streampipes-extensions/streampipes-connectors-influx/src/main/java/org/apache/streampipes/extensions/connectors/influx/adapter/InfluxDbStreamAdapter.java
+++ b/streampipes-extensions/streampipes-connectors-influx/src/main/java/org/apache/streampipes/extensions/connectors/influx/adapter/InfluxDbStreamAdapter.java
@@ -57,7 +57,7 @@ public class InfluxDbStreamAdapter implements StreamPipesAdapter {
 
   @Override
   public IAdapterConfiguration declareConfig() {
-    var builder = AdapterConfigurationBuilder.create(ID, InfluxDbStreamAdapter::new)
+    var builder = AdapterConfigurationBuilder.create(ID, 0, InfluxDbStreamAdapter::new)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN);
 
diff --git a/streampipes-extensions/streampipes-connectors-kafka/src/main/java/org/apache/streampipes/extensions/connectors/kafka/adapter/KafkaProtocol.java b/streampipes-extensions/streampipes-connectors-kafka/src/main/java/org/apache/streampipes/extensions/connectors/kafka/adapter/KafkaProtocol.java
index f8b0340d51..e7df3dcc15 100644
--- a/streampipes-extensions/streampipes-connectors-kafka/src/main/java/org/apache/streampipes/extensions/connectors/kafka/adapter/KafkaProtocol.java
+++ b/streampipes-extensions/streampipes-connectors-kafka/src/main/java/org/apache/streampipes/extensions/connectors/kafka/adapter/KafkaProtocol.java
@@ -145,7 +145,7 @@ public class KafkaProtocol implements StreamPipesAdapter, SupportsRuntimeConfig
     latestAlternative.setSelected(true);
 
     return AdapterConfigurationBuilder
-        .create(ID, KafkaProtocol::new)
+        .create(ID, 0, KafkaProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN)
diff --git a/streampipes-extensions/streampipes-connectors-mqtt/src/main/java/org/apache/streampipes/extensions/connectors/mqtt/adapter/MqttProtocol.java b/streampipes-extensions/streampipes-connectors-mqtt/src/main/java/org/apache/streampipes/extensions/connectors/mqtt/adapter/MqttProtocol.java
index b27f2205f0..1399794a89 100644
--- a/streampipes-extensions/streampipes-connectors-mqtt/src/main/java/org/apache/streampipes/extensions/connectors/mqtt/adapter/MqttProtocol.java
+++ b/streampipes-extensions/streampipes-connectors-mqtt/src/main/java/org/apache/streampipes/extensions/connectors/mqtt/adapter/MqttProtocol.java
@@ -60,7 +60,7 @@ public class MqttProtocol implements StreamPipesAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, MqttProtocol::new)
+        .create(ID, 0, MqttProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
diff --git a/streampipes-extensions/streampipes-connectors-nats/src/main/java/org/apache/streampipes/extensions/connectors/nats/adapter/NatsProtocol.java b/streampipes-extensions/streampipes-connectors-nats/src/main/java/org/apache/streampipes/extensions/connectors/nats/adapter/NatsProtocol.java
index 5be2374586..6cbb2a07ae 100644
--- a/streampipes-extensions/streampipes-connectors-nats/src/main/java/org/apache/streampipes/extensions/connectors/nats/adapter/NatsProtocol.java
+++ b/streampipes-extensions/streampipes-connectors-nats/src/main/java/org/apache/streampipes/extensions/connectors/nats/adapter/NatsProtocol.java
@@ -108,7 +108,7 @@ public class NatsProtocol implements StreamPipesAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, NatsProtocol::new)
+        .create(ID, 0, NatsProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withCategory(AdapterType.Generic)
         .withLocales(Locales.EN)
diff --git a/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/adapter/OpcUaAdapter.java b/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/adapter/OpcUaAdapter.java
index 5df4f6329d..6af0bd28fd 100644
--- a/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/adapter/OpcUaAdapter.java
+++ b/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/adapter/OpcUaAdapter.java
@@ -143,7 +143,7 @@ public class OpcUaAdapter implements StreamPipesAdapter, IPullAdapter, SupportsR
     boolean emptyValueReceived = false;
     List<DataValue> returnValues =
         response.get(this.getPollingInterval().value(), this.getPollingInterval().timeUnit());
-    if (returnValues.size() == 0) {
+    if (returnValues.isEmpty()) {
       emptyValueReceived = true;
       LOG.warn("Empty value object returned - event will not be sent");
     } else {
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java
index 6938ead546..1487c77ae7 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java
@@ -266,14 +266,14 @@ public class Plc4xModbusAdapter implements StreamPipesAdapter, IPullAdapter {
   }
 
   /**
-   * Describe the adapter adapter and define what user inputs are required. Currently users can just select one node,
+   * Describe the adapter and define what user inputs are required. Currently users can just select one node,
    * this will be extended in the future
    *
    * @return description of adapter
    */
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, Plc4xModbusAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, Plc4xModbusAdapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.Manufacturing)
diff --git a/streampipes-extensions/streampipes-connectors-pulsar/src/main/java/org/apache/streampipes/extensions/connectors/pulsar/adapter/PulsarProtocol.java b/streampipes-extensions/streampipes-connectors-pulsar/src/main/java/org/apache/streampipes/extensions/connectors/pulsar/adapter/PulsarProtocol.java
index 04ea26dead..c22567564d 100644
--- a/streampipes-extensions/streampipes-connectors-pulsar/src/main/java/org/apache/streampipes/extensions/connectors/pulsar/adapter/PulsarProtocol.java
+++ b/streampipes-extensions/streampipes-connectors-pulsar/src/main/java/org/apache/streampipes/extensions/connectors/pulsar/adapter/PulsarProtocol.java
@@ -94,7 +94,7 @@ public class PulsarProtocol implements StreamPipesAdapter, SupportsRuntimeConfig
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, PulsarProtocol::new)
+        .create(ID, 0, PulsarProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN)
diff --git a/streampipes-extensions/streampipes-connectors-rocketmq/src/main/java/org/apache/streampipes/extensions/connectors/rocketmq/adapter/RocketMQProtocol.java b/streampipes-extensions/streampipes-connectors-rocketmq/src/main/java/org/apache/streampipes/extensions/connectors/rocketmq/adapter/RocketMQProtocol.java
index 02970e3630..adedfbab38 100644
--- a/streampipes-extensions/streampipes-connectors-rocketmq/src/main/java/org/apache/streampipes/extensions/connectors/rocketmq/adapter/RocketMQProtocol.java
+++ b/streampipes-extensions/streampipes-connectors-rocketmq/src/main/java/org/apache/streampipes/extensions/connectors/rocketmq/adapter/RocketMQProtocol.java
@@ -73,7 +73,7 @@ public class RocketMQProtocol implements StreamPipesAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, RocketMQProtocol::new)
+        .create(ID, 0, RocketMQProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN)
diff --git a/streampipes-extensions/streampipes-connectors-tubemq/src/main/java/org/apache/streampipes/extensions/connectors/tubemq/adapter/TubeMQProtocol.java b/streampipes-extensions/streampipes-connectors-tubemq/src/main/java/org/apache/streampipes/extensions/connectors/tubemq/adapter/TubeMQProtocol.java
index 84ed9b8289..8fe027fe9a 100644
--- a/streampipes-extensions/streampipes-connectors-tubemq/src/main/java/org/apache/streampipes/extensions/connectors/tubemq/adapter/TubeMQProtocol.java
+++ b/streampipes-extensions/streampipes-connectors-tubemq/src/main/java/org/apache/streampipes/extensions/connectors/tubemq/adapter/TubeMQProtocol.java
@@ -102,7 +102,7 @@ public class TubeMQProtocol implements StreamPipesAdapter {
   @Override
   public IAdapterConfiguration declareConfig() {
     return AdapterConfigurationBuilder
-        .create(ID, TubeMQProtocol::new)
+        .create(ID, 0, TubeMQProtocol::new)
         .withSupportedParsers(Parsers.defaultParsers())
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withLocales(Locales.EN)
diff --git a/streampipes-extensions/streampipes-processors-enricher-jvm/pom.xml b/streampipes-extensions/streampipes-processors-enricher-jvm/pom.xml
index 0412231f7b..bf759ac5ff 100644
--- a/streampipes-extensions/streampipes-processors-enricher-jvm/pom.xml
+++ b/streampipes-extensions/streampipes-processors-enricher-jvm/pom.xml
@@ -45,6 +45,12 @@
             <groupId>org.graalvm.js</groupId>
             <artifactId>js-scriptengine</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-test-utils</artifactId>
+            <version>0.95.0-SNAPSHOT</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/streampipes-extensions/streampipes-processors-enricher-jvm/src/main/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/SizeMeasureProcessor.java b/streampipes-extensions/streampipes-processors-enricher-jvm/src/main/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/SizeMeasureProcessor.java
index 850afe333a..78e5a82f33 100644
--- a/streampipes-extensions/streampipes-processors-enricher-jvm/src/main/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/SizeMeasureProcessor.java
+++ b/streampipes-extensions/streampipes-processors-enricher-jvm/src/main/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/SizeMeasureProcessor.java
@@ -43,7 +43,7 @@ import java.io.ObjectOutputStream;
 
 public class SizeMeasureProcessor extends StreamPipesDataProcessor {
 
-  private static final String SIZE_UNIT = "sizeUnit";
+  static final String SIZE_UNIT = "sizeUnit";
   static final String BYTE_SIZE = "BYTE";
   static final String KILOBYTE_SIZE = "KILOBYTE";
   static final String MEGABYTE_SIZE = "MEGABYTE";
diff --git a/streampipes-maven-plugin/README.md b/streampipes-maven-plugin/README.md
index 01f30b6f13..70c9fffb5b 100644
--- a/streampipes-maven-plugin/README.md
+++ b/streampipes-maven-plugin/README.md
@@ -37,7 +37,7 @@ By default, the goal runs in the `package` phase.
 ### Command line
 
 ```bash
-# Switch to a directory containing StreamPipes extensions and an Init class, e.g., streampipes-extensions-all-jvm
+# Switch to a directory containing StreamPipes extensions and an Init class, e.g., extensions-all-jvm
 
 mvn streampipes:extract-docs -DinitClass=org.apache.streampipes.extensions.all.jvm.AllExtensionsInit
 ```
diff --git a/streampipes-model-client/pom.xml b/streampipes-model-client/pom.xml
index 59452446eb..aed5bbfbfd 100644
--- a/streampipes-model-client/pom.xml
+++ b/streampipes-model-client/pom.xml
@@ -60,7 +60,6 @@
             <plugin>
                 <groupId>cz.habarta.typescript-generator</groupId>
                 <artifactId>typescript-generator-maven-plugin</artifactId>
-                <version>3.2.1263</version>
                 <executions>
                     <execution>
                         <id>generate</id>
diff --git a/streampipes-model/pom.xml b/streampipes-model/pom.xml
index 7a4dae6a6c..be1c634faf 100644
--- a/streampipes-model/pom.xml
+++ b/streampipes-model/pom.xml
@@ -78,7 +78,6 @@
             <plugin>
                 <groupId>cz.habarta.typescript-generator</groupId>
                 <artifactId>typescript-generator-maven-plugin</artifactId>
-                <version>3.2.1263</version>
                 <executions>
                     <execution>
                         <id>generate</id>
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/assets/AssetLinkBuilder.java b/streampipes-model/src/main/java/org/apache/streampipes/model/assets/AssetLinkBuilder.java
new file mode 100644
index 0000000000..68f127a0f6
--- /dev/null
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/assets/AssetLinkBuilder.java
@@ -0,0 +1,119 @@
+/*
+ * 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.assets;
+
+/**
+ * Builder class for creating instances of {@link AssetLink}.
+ * <p>
+ * Example usage:
+ * <pre>
+ * {@code
+ * AssetLink assetLink = AssetLinkBuilder.create()
+ *     .withResourceId("123")
+ *     .withLinkType("type")
+ *     .withLinkLabel("label")
+ *     .withQueryHint("hint")
+ *     .withEditingDisabled(false)
+ *     .build();
+ * }
+ * </pre>
+ */
+public class AssetLinkBuilder {
+  private final AssetLink assetLink;
+
+  /**
+   * Constructs a new AssetLinkBuilder.
+   */
+  private AssetLinkBuilder() {
+    this.assetLink = new AssetLink();
+  }
+
+  /**
+   * Static method to create a new instance of AssetLinkBuilder.
+   *
+   * @return A new instance of AssetLinkBuilder.
+   */
+  public static AssetLinkBuilder create() {
+    return new AssetLinkBuilder();
+  }
+
+  /**
+   * Sets the resource ID for the AssetLink being built.
+   *
+   * @param resourceId The resource ID to set.
+   * @return The AssetLinkBuilder instance for method chaining.
+   */
+  public AssetLinkBuilder withResourceId(String resourceId) {
+    this.assetLink.setResourceId(resourceId);
+    return this;
+  }
+
+  /**
+   * Sets the link type for the AssetLink being built.
+   *
+   * @param linkType The link type to set.
+   * @return The AssetLinkBuilder instance for method chaining.
+   */
+  public AssetLinkBuilder withLinkType(String linkType) {
+    this.assetLink.setLinkType(linkType);
+    return this;
+  }
+
+  /**
+   * Sets the link label for the AssetLink being built.
+   *
+   * @param linkLabel The link label to set.
+   * @return The AssetLinkBuilder instance for method chaining.
+   */
+  public AssetLinkBuilder withLinkLabel(String linkLabel) {
+    this.assetLink.setLinkLabel(linkLabel);
+    return this;
+  }
+
+  /**
+   * Sets the query hint for the AssetLink being built.
+   *
+   * @param queryHint The query hint to set.
+   * @return The AssetLinkBuilder instance for method chaining.
+   */
+  public AssetLinkBuilder withQueryHint(String queryHint) {
+    this.assetLink.setQueryHint(queryHint);
+    return this;
+  }
+
+  /**
+   * Sets whether editing is disabled for the AssetLink being built.
+   *
+   * @param editingDisabled Whether editing is disabled.
+   * @return The AssetLinkBuilder instance for method chaining.
+   */
+  public AssetLinkBuilder withEditingDisabled(boolean editingDisabled) {
+    this.assetLink.setEditingDisabled(editingDisabled);
+    return this;
+  }
+
+  /**
+   * Builds and returns the final instance of AssetLink.
+   *
+   * @return The constructed AssetLink instance.
+   */
+  public AssetLink build() {
+    return this.assetLink;
+  }
+}
\ No newline at end of file
diff --git a/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java b/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java
index 1e7e1a8bbe..30981732f4 100644
--- a/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java
+++ b/streampipes-model/src/main/java/org/apache/streampipes/model/base/NamedStreamPipesEntity.java
@@ -128,16 +128,6 @@ public abstract class NamedStreamPipesEntity implements Serializable {
     this.iconUrl = iconUrl;
   }
 
-  @Deprecated
-  public String getUri() {
-    return elementId;
-  }
-
-  @Deprecated
-  public void setUri(String uri) {
-    this.elementId = uri;
-  }
-
   public String getDom() {
     return dom;
   }
diff --git a/streampipes-rest-extensions/src/main/java/org/apache/streampipes/rest/extensions/connect/AdapterWorkerResource.java b/streampipes-rest-extensions/src/main/java/org/apache/streampipes/rest/extensions/connect/AdapterWorkerResource.java
index 2877fc456e..56475c355d 100644
--- a/streampipes-rest-extensions/src/main/java/org/apache/streampipes/rest/extensions/connect/AdapterWorkerResource.java
+++ b/streampipes-rest-extensions/src/main/java/org/apache/streampipes/rest/extensions/connect/AdapterWorkerResource.java
@@ -76,11 +76,13 @@ public class AdapterWorkerResource extends AbstractSharedRestInterface {
 
     try {
       adapterManagement.invokeAdapter(adapterStreamDescription);
-      String responseMessage = "Stream adapter with id " + adapterStreamDescription.getUri() + " successfully started";
+      String responseMessage = "Stream adapter with id "
+              + adapterStreamDescription.getElementId()
+              + " successfully started";
       logger.info(responseMessage);
       return ok(Notifications.success(responseMessage));
     } catch (AdapterException e) {
-      logger.error("Error while starting adapter with id " + adapterStreamDescription.getUri(), e);
+      logger.error("Error while starting adapter with id " + adapterStreamDescription.getElementId(), e);
       return serverError(SpLogMessage.from(e));
     }
   }
diff --git a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/stream/StreamBuilder.java b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/stream/StreamBuilder.java
index 9462a0daa0..f213f02a21 100644
--- a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/stream/StreamBuilder.java
+++ b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/stream/StreamBuilder.java
@@ -32,25 +32,25 @@ public class StreamBuilder {
   private SpDataStream stream;
   private EventSchema schema;
 
-  private StreamBuilder(String name, String description, String uri) {
+  private StreamBuilder(String name, String description, String elementId) {
     stream = new SpDataStream();
     stream.setName(name);
     stream.setDescription(description);
-    stream.setUri(uri);
+    stream.setElementId(elementId);
   }
 
-  private StreamBuilder(String uri) {
+  private StreamBuilder(String elementId) {
     stream = new SpDataStream();
-    stream.setUri(uri);
+    stream.setElementId(elementId);
     schema = new EventSchema();
   }
 
-  public static StreamBuilder createStream(String name, String description, String uri) {
-    return new StreamBuilder(name, description, uri);
+  public static StreamBuilder createStream(String name, String description, String elementId) {
+    return new StreamBuilder(name, description, elementId);
   }
 
-  public static StreamBuilder createStreamRestriction(String uri) {
-    return new StreamBuilder(uri);
+  public static StreamBuilder createStreamRestriction(String elementId) {
+    return new StreamBuilder(elementId);
   }
 
   public StreamBuilder property(String propertyName, URI propertyType, URI subclassOf) {
diff --git a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Filter.java b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Filter.java
index 64356a145f..57ff1595cb 100644
--- a/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Filter.java
+++ b/streampipes-storage-couchdb/src/main/java/org/apache/streampipes/storage/couchdb/utils/Filter.java
@@ -29,7 +29,7 @@ public class Filter {
     return allElements
         .stream()
         .filter(e -> userElements.stream()
-            .anyMatch(u -> u.equals(e.getUri()))).collect(Collectors.toList());
+            .anyMatch(u -> u.equals(e.getElementId()))).collect(Collectors.toList());
   }
 
 }
diff --git a/ui/angular.json b/ui/angular.json
index 67a727a016..e9ef1b77d8 100644
--- a/ui/angular.json
+++ b/ui/angular.json
@@ -34,7 +34,8 @@
               "node_modules/datatables.net/js/jquery.dataTables.js",
               "node_modules/jquery-ui-dist/jquery-ui.js",
               "node_modules/quill/dist/quill.js"
-            ]
+            ],
+            "outputHashing": "bundles"
           },
           "configurations": {
             "production": {
@@ -51,7 +52,7 @@
                 }
               ],
               "optimization": true,
-              "outputHashing": "all",
+              "outputHashing": "bundles",
               "sourceMap": false,
               "namedChunks": false,
               "aot": true,
diff --git a/ui/cypress/support/utils/datalake/DataLakeUtils.ts b/ui/cypress/support/utils/datalake/DataLakeUtils.ts
index eb4968c394..9b567b31fb 100644
--- a/ui/cypress/support/utils/datalake/DataLakeUtils.ts
+++ b/ui/cypress/support/utils/datalake/DataLakeUtils.ts
@@ -30,6 +30,11 @@ export class DataLakeUtils {
         cy.visit('#/dataexplorer');
     }
 
+    public static initDataLakeTests() {
+        cy.initStreamPipesTest();
+        DataLakeUtils.loadRandomDataSetIntoDataLake();
+    }
+
     public static getDataLakeTestSetAdapter(
         name: string,
         storeInDataLake: boolean = true,
@@ -88,7 +93,7 @@ export class DataLakeUtils {
         DataLakeUtils.createAndEditDataView(dataViewName);
 
         DataLakeUtils.selectTimeRange(
-            new Date(2015, 10, 20, 22, 44),
+            new Date(2020, 10, 20, 22, 44),
             DataLakeUtils.getFutureDate(),
         );
         // DataLakeUtils.addNewWidget();
diff --git a/ui/package-lock.json b/ui/package-lock.json
index 8b5400e51b..7b299a8547 100644
--- a/ui/package-lock.json
+++ b/ui/package-lock.json
@@ -64,7 +64,7 @@
         "shepherd.js": "^11.2.0",
         "showdown": "1.9.1",
         "stream-browserify": "3.0.0",
-        "swagger-ui": "5.9.1",
+        "swagger-ui": "5.10.0",
         "tslib": "^2.6.2",
         "zone.js": "~0.12.0"
       },
@@ -25423,9 +25423,9 @@
       }
     },
     "node_modules/swagger-ui": {
-      "version": "5.9.1",
-      "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.9.1.tgz",
-      "integrity": "sha512-/PP9Xlu9/eImqFydvxbRGAZqSflxMYiQzSx1C+Fa4ZgLugKqPnAB6ZnrFY9Mkl5rTult39XI4uFay927GD8cJw==",
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.10.0.tgz",
+      "integrity": "sha512-eAKTmBjk1dF9JscUjnatughEoAosZvPbwVoVsZbjqHhZhkszCbS3u+fgGVrBa31BqFhXJ1qolx+t7X2Lijkuyw==",
       "hasInstallScript": true,
       "dependencies": {
         "@babel/runtime-corejs3": "^7.23.2",
@@ -25459,7 +25459,7 @@
         "reselect": "^4.1.8",
         "serialize-error": "^8.1.0",
         "sha.js": "^2.4.11",
-        "swagger-client": "^3.23.1",
+        "swagger-client": "^3.24.5",
         "url-parse": "^1.5.10",
         "xml": "=1.0.1",
         "xml-but-prettier": "^1.0.1",
@@ -47957,9 +47957,9 @@
       }
     },
     "swagger-ui": {
-      "version": "5.9.1",
-      "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.9.1.tgz",
-      "integrity": "sha512-/PP9Xlu9/eImqFydvxbRGAZqSflxMYiQzSx1C+Fa4ZgLugKqPnAB6ZnrFY9Mkl5rTult39XI4uFay927GD8cJw==",
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/swagger-ui/-/swagger-ui-5.10.0.tgz",
+      "integrity": "sha512-eAKTmBjk1dF9JscUjnatughEoAosZvPbwVoVsZbjqHhZhkszCbS3u+fgGVrBa31BqFhXJ1qolx+t7X2Lijkuyw==",
       "requires": {
         "@babel/runtime-corejs3": "^7.23.2",
         "@braintree/sanitize-url": "=6.0.4",
@@ -47992,7 +47992,7 @@
         "reselect": "^4.1.8",
         "serialize-error": "^8.1.0",
         "sha.js": "^2.4.11",
-        "swagger-client": "^3.23.1",
+        "swagger-client": "^3.24.5",
         "url-parse": "^1.5.10",
         "xml": "=1.0.1",
         "xml-but-prettier": "^1.0.1",
diff --git a/ui/package.json b/ui/package.json
index e76a60c104..3dfaab6b7d 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -86,7 +86,7 @@
     "shepherd.js": "^11.2.0",
     "showdown": "1.9.1",
     "stream-browserify": "3.0.0",
-    "swagger-ui": "5.9.1",
+    "swagger-ui": "5.10.0",
     "tslib": "^2.6.2",
     "zone.js": "~0.12.0"
   },
diff --git a/ui/src/app/assets/components/asset-overview/asset-overview.component.html b/ui/src/app/assets/components/asset-overview/asset-overview.component.html
index 24d00b12b8..8e73c95bd8 100644
--- a/ui/src/app/assets/components/asset-overview/asset-overview.component.html
+++ b/ui/src/app/assets/components/asset-overview/asset-overview.component.html
@@ -189,7 +189,7 @@
                                             <button
                                                 color="accent"
                                                 mat-icon-button
-                                                matTooltip="Delete adapter"
+                                                matTooltip="Delete asset"
                                                 data-cy="delete"
                                                 matTooltipPosition="above"
                                                 (click)="deleteAsset(asset)"
diff --git a/ui/src/app/data-explorer/components/time-selector/timeRangeSelector.component.html b/ui/src/app/data-explorer/components/time-selector/timeRangeSelector.component.html
index d722812b71..1ce4b2df1f 100644
--- a/ui/src/app/data-explorer/components/time-selector/timeRangeSelector.component.html
+++ b/ui/src/app/data-explorer/components/time-selector/timeRangeSelector.component.html
@@ -87,6 +87,7 @@
             matTooltip="Reload"
             matTooltipPosition="above"
             (click)="reloadData()"
+            data-cy="reload-data-view-button"
         >
             <i class="material-icons mr-0">autorenew</i>
         </button>
diff --git a/ui/src/app/data-explorer/components/widget/data-explorer-dashboard-widget.component.html b/ui/src/app/data-explorer/components/widget/data-explorer-dashboard-widget.component.html
index 82490189ce..69a4463a7f 100644
--- a/ui/src/app/data-explorer/components/widget/data-explorer-dashboard-widget.component.html
+++ b/ui/src/app/data-explorer/components/widget/data-explorer-dashboard-widget.component.html
@@ -70,7 +70,10 @@
                     *ngIf="!editMode"
                     [attr.data-cy]="
                         'more-options-' +
-                        configuredWidget.baseAppearanceConfig.widgetTitle
+                        configuredWidget.baseAppearanceConfig.widgetTitle.replaceAll(
+                            ' ',
+                            ''
+                        )
                     "
                 >
                     <mat-icon>more_vert</mat-icon>
@@ -86,7 +89,10 @@
                         *ngIf="hasDataExplorerWritePrivileges"
                         [attr.data-cy]="
                             'start-edit-' +
-                            configuredWidget.baseAppearanceConfig.widgetTitle
+                            configuredWidget.baseAppearanceConfig.widgetTitle.replaceAll(
+                                ' ',
+                                ''
+                            )
                         "
                     >
                         <mat-icon>edit</mat-icon>
diff --git a/ui/src/app/data-explorer/components/widgets/indicator/config/indicator-chart-widget-config.component.html b/ui/src/app/data-explorer/components/widgets/indicator/config/indicator-chart-widget-config.component.html
index c3c634e956..db188fea02 100644
--- a/ui/src/app/data-explorer/components/widgets/indicator/config/indicator-chart-widget-config.component.html
+++ b/ui/src/app/data-explorer/components/widgets/indicator/config/indicator-chart-widget-config.component.html
@@ -39,6 +39,7 @@
                 currentlyConfiguredWidget.visualizationConfig.deltaField
             "
             (changeSelectedProperty)="updateDelta($event)"
+            data-cy="data-explorer-select-delta-field"
         >
         </sp-select-property>
     </div>
diff --git a/ui/src/app/data-explorer/components/widgets/map/config/map-widget-config.component.html b/ui/src/app/data-explorer/components/widgets/map/config/map-widget-config.component.html
index c6f16fb719..4c8601544a 100644
--- a/ui/src/app/data-explorer/components/widgets/map/config/map-widget-config.component.html
+++ b/ui/src/app/data-explorer/components/widgets/map/config/map-widget-config.component.html
@@ -25,6 +25,7 @@
                 .selectedLatitudeProperty
         "
         (changeSelectedProperty)="setSelectedLatitudeProperty($event)"
+        data-cy="data-view-map-select-latitude"
     >
     </sp-select-property>
 
@@ -36,6 +37,7 @@
                 .selectedLongitudeProperty
         "
         (changeSelectedProperty)="setSelectedLongitudeProperty($event)"
+        data-cy="data-view-map-select-longitude"
     >
     </sp-select-property>
 
@@ -73,6 +75,7 @@
                     .selectedMarkerOrTrace
             "
             (selectionChange)="triggerViewRefresh()"
+            data-cy="data-view-map-select-marker-or-trace"
         >
             <mat-option [value]="'marker'">Marker</mat-option>
             <mat-option [value]="'trace'">Trace</mat-option>
diff --git a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.ts b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.ts
index b8e0478d1a..b409d77d52 100644
--- a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.ts
+++ b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.ts
@@ -131,9 +131,7 @@ export class PipelineElementOptionsComponent implements OnInit, OnDestroy {
             );
         this.pipelineElementCssType = this.pipelineElement.type;
 
-        this.isDataSource =
-            this.pipelineElement.type === 'stream' ||
-            this.pipelineElement.type === 'set';
+        this.isDataSource = this.pipelineElement.type === 'stream';
 
         if (
             this.isDataSource ||
diff --git a/ui/src/app/info/about/about.component.html b/ui/src/app/info/about/about.component.html
index 55d06ce0e6..519957d526 100644
--- a/ui/src/app/info/about/about.component.html
+++ b/ui/src/app/info/about/about.component.html
@@ -126,6 +126,11 @@
                                     <a href="https://twitter.com/streampipes"
                                         >Twitter</a
                                     >
+                                    and
+                                    <a
+                                        href="https://www.linkedin.com/company/apache-streampipes"
+                                        >LinkedIn</a
+                                    >
                                     to get the latest news!
                                 </h5>
                             </div>


Test patch:
diff --git a/streampipes-extensions/streampipes-processors-enricher-jvm/src/test/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/TestSizeMeasureProcessor.java b/streampipes-extensions/streampipes-processors-enricher-jvm/src/test/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/TestSizeMeasureProcessor.java
new file mode 100644
index 0000000000..4702c35af0
--- /dev/null
+++ b/streampipes-extensions/streampipes-processors-enricher-jvm/src/test/java/org/apache/streampipes/processors/enricher/jvm/processor/sizemeasure/TestSizeMeasureProcessor.java
@@ -0,0 +1,150 @@
+/*
+ * 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.processors.enricher.jvm.processor.sizemeasure;
+
+
+
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.graph.DataProcessorDescription;
+import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.model.runtime.Event;
+import org.apache.streampipes.model.runtime.EventFactory;
+import org.apache.streampipes.model.runtime.SchemaInfo;
+import org.apache.streampipes.model.runtime.SourceInfo;
+import org.apache.streampipes.model.staticproperty.OneOfStaticProperty;
+import org.apache.streampipes.test.extensions.api.StoreEventCollector;
+import org.apache.streampipes.test.generator.InvocationGraphGenerator;
+import org.apache.streampipes.test.generator.grounding.EventGroundingGenerator;
+import org.apache.streampipes.wrapper.params.compat.ProcessorParams;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.streampipes.processors.enricher.jvm.processor.sizemeasure.SizeMeasureProcessor.BYTE_SIZE;
+import static org.apache.streampipes.processors.enricher.jvm.processor.sizemeasure.SizeMeasureProcessor.KILOBYTE_SIZE;
+import static org.apache.streampipes.processors.enricher.jvm.processor.sizemeasure.SizeMeasureProcessor.MEGABYTE_SIZE;
+import static org.apache.streampipes.processors.enricher.jvm.processor.sizemeasure.SizeMeasureProcessor.SIZE_UNIT;
+import static org.junit.Assert.assertEquals;
+
+@RunWith(Parameterized.class)
+public class TestSizeMeasureProcessor {
+
+  private static final Logger LOG = LoggerFactory.getLogger(TestSizeMeasureProcessor.class);
+
+  @org.junit.runners.Parameterized.Parameters
+  public static Iterable<Object[]> data() {
+
+    /*
+    249 bytes is the base size of an object when first tested.
+    Allowing up to 250 bytes comparison error in case of inconsistent base sizes across platforms
+     */
+    return Arrays.asList(new Object[][]{
+            { BYTE_SIZE, 10240 - 249, 10240.0, 250.0},
+            { KILOBYTE_SIZE, 10240 - 249, 10.0, 0.025},
+            { MEGABYTE_SIZE, (1024 * 1024) - 249, 1.0, 0.0025}
+    });
+  }
+
+  @Parameterized.Parameter
+  public String sizeUnit;
+
+  @Parameterized.Parameter(1)
+  public int numOfBytes;
+
+  @Parameterized.Parameter(2)
+  public double expectedSize;
+
+  @Parameterized.Parameter(3)
+  public double allowableError;
+
+  @Test
+  public void testSizeMeasureProcessor() {
+    SizeMeasureProcessor processor = new SizeMeasureProcessor();
+    DataProcessorDescription originalGraph = processor.declareModel();
+    originalGraph.setSupportedGrounding(EventGroundingGenerator.makeDummyGrounding());
+
+    DataProcessorInvocation graph =
+            InvocationGraphGenerator.makeEmptyInvocation(originalGraph);
+
+
+    ProcessorParams params = new ProcessorParams(graph);
+    params.extractor().getStaticPropertyByName(SIZE_UNIT, OneOfStaticProperty.class).getOptions()
+            .stream().filter(ot -> ot.getInternalName().equals(sizeUnit)).findFirst()
+            .get().setSelected(true);
+
+
+    SpOutputCollector eventCollector = new StoreEventCollector();
+
+    processor.onInvocation(params, eventCollector, null);
+
+    LOG.info("Sending event with numOfBytes "
+        + numOfBytes + ", sizeUnit: " + sizeUnit);
+    double size = sendEvents(processor, eventCollector);
+
+    LOG.info("Expected size is {}", expectedSize);
+    LOG.info("Actual size is {}", size);
+    LOG.info("Allowable error is {}", allowableError);
+    assertEquals(expectedSize, size, allowableError);
+  }
+
+  private Double sendEvents(SizeMeasureProcessor processor, SpOutputCollector spOut) {
+    double size = 0.0;
+    Event event = makeEvent(numOfBytes);
+
+    processor.onEvent(event, spOut);
+    try {
+      Thread.sleep(100);
+    } catch (InterruptedException e) {
+      e.printStackTrace();
+    }
+    try {
+      size = event.getFieldBySelector(SizeMeasureProcessor.EVENT_SIZE)
+              .getAsPrimitive()
+              .getAsDouble();
+    } catch (IllegalArgumentException e) {
+      e.printStackTrace();
+    }
+    return size;
+  }
+  private Event makeEvent(int numOfBytes) {
+    Map<String, Object> map = new HashMap<>();
+    map.put("Test", new ObjectWithSize(numOfBytes));
+    return EventFactory.fromMap(map,
+            new SourceInfo("test" + "-topic", "s0"),
+            new SchemaInfo(null, new ArrayList<>()));
+  }
+
+  public static class ObjectWithSize implements Serializable {
+    private final byte[] data;
+
+    public ObjectWithSize(int numOfBytes) {
+      this.data = new byte[numOfBytes];
+    }
+  }
+}
\ No newline at end of file
diff --git a/streampipes-model/src/test/java/org/apache/streampipes/model/assets/AssetLinkBuilderTest.java b/streampipes-model/src/test/java/org/apache/streampipes/model/assets/AssetLinkBuilderTest.java
new file mode 100644
index 0000000000..4f237ebdbc
--- /dev/null
+++ b/streampipes-model/src/test/java/org/apache/streampipes/model/assets/AssetLinkBuilderTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.assets;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class AssetLinkBuilderTest {
+
+  @Test
+  public void withoutEditingDisabled() {
+    AssetLink assetLink = AssetLinkBuilder.create()
+            .withResourceId("123")
+            .withLinkType("type")
+            .withLinkLabel("label")
+            .withQueryHint("hint")
+            .withEditingDisabled(false)
+            .build();
+
+    assertEquals("123", assetLink.getResourceId());
+    assertEquals("type", assetLink.getLinkType());
+    assertEquals("label", assetLink.getLinkLabel());
+    assertEquals("hint", assetLink.getQueryHint());
+    assertFalse(assetLink.isEditingDisabled());
+  }
+
+  @Test
+  public void withEditingDisabled() {
+    AssetLink assetLink = AssetLinkBuilder.create()
+            .withResourceId("456")
+            .withLinkType("anotherType")
+            .withLinkLabel("anotherLabel")
+            .withQueryHint("anotherHint")
+            .withEditingDisabled(true)
+            .build();
+
+    assertEquals("456", assetLink.getResourceId());
+    assertEquals("anotherType", assetLink.getLinkType());
+    assertEquals("anotherLabel", assetLink.getLinkLabel());
+    assertEquals("anotherHint", assetLink.getQueryHint());
+    assertTrue(assetLink.isEditingDisabled());
+  }
+}
diff --git a/ui/cypress/tests/datalake/widgets/2d-correlation.spec.ts b/ui/cypress/tests/datalake/widgets/2d-correlation.spec.ts
new file mode 100644
index 0000000000..4e799ef9c5
--- /dev/null
+++ b/ui/cypress/tests/datalake/widgets/2d-correlation.spec.ts
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+
+describe('Test 2d Correlation View in Data Explorer', () => {
+    beforeEach('Setup Test', () => {
+        DataLakeUtils.initDataLakeTests();
+    });
+
+    it('Perform Test', () => {
+        DataLakeUtils.addDataViewAndWidget('view', 'Persist', '2D Correlation');
+
+        // Check if scatter plot is displayed
+        cy.get('g').should('have.class', 'scatterlayer mlayer');
+        cy.get('g.points', { timeout: 10000 })
+            .children()
+            .should('have.length', 10);
+
+        // Change from line plot to scatter plot
+        DataLakeUtils.selectVisualizationConfig();
+        cy.get('div').contains('Scatter').click();
+        cy.get('div').contains('Density').click();
+
+        // Check if scatter plot is displayed
+        cy.get('g').should('have.class', 'contourlayer mlayer');
+    });
+});
diff --git a/ui/cypress/tests/datalake/widgets/table.ts b/ui/cypress/tests/datalake/widgets/distribution.spec.ts
similarity index 54%
rename from ui/cypress/tests/datalake/widgets/table.ts
rename to ui/cypress/tests/datalake/widgets/distribution.spec.ts
index 12ab68dedf..ec49019da9 100644
--- a/ui/cypress/tests/datalake/widgets/table.ts
+++ b/ui/cypress/tests/datalake/widgets/distribution.spec.ts
@@ -18,41 +18,32 @@
 
 import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
 
-describe('Test Table View in Data Explorer', () => {
+describe('Test Distribution View in Data Explorer', () => {
     beforeEach('Setup Test', () => {
-        cy.login();
-        // cy.initStreamPipesTest()
-        // DataLakeUtils.loadRandomDataSetIntoDataLake();
+        DataLakeUtils.initDataLakeTests();
     });
 
     it('Perform Test', () => {
-        DataLakeUtils.goToDatalake();
-
-        // DataLakeUtils.createAndEditDataView();
-        // Click edit button
-        cy.dataCy('edit-data-view').click();
-
-        DataLakeUtils.addNewWidget();
-
-        DataLakeUtils.selectDataSet('Persist');
-
-        DataLakeUtils.dataConfigSelectAllFields();
+        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'Distribution');
 
+        // Change field for histogram
         DataLakeUtils.selectVisualizationConfig();
+        cy.get('div').contains('randomtext (prepared_data #1)').click();
+        cy.get('div').contains('randomnumber (prepared_data #1)').click();
 
-        DataLakeUtils.selectVisualizationType('Table');
-
-        DataLakeUtils.clickCreateButton();
-
-        DataLakeUtils.selectTimeRange(
-            new Date(2020, 10, 20, 22, 44),
-            DataLakeUtils.getFutureDate(),
+        // Check if distribution chart is displayed
+        cy.get('sp-data-explorer-distribution-chart-widget').should(
+            'be.visible',
         );
 
-        cy.dataCy('data-explorer-table-row', { timeout: 10000 }).should(
-            'have.length',
-            10,
+        // Change from histogram to heatmap
+        DataLakeUtils.selectVisualizationConfig();
+        cy.get('div').contains('Histogram').click();
+        cy.get('div').contains('Value Heatmap').click();
+
+        // Check if distribution chart is displayed
+        cy.get('sp-data-explorer-distribution-chart-widget').should(
+            'be.visible',
         );
-        // Validate that X lines are available
     });
 });
diff --git a/ui/cypress/tests/datalake/widgets/heatmap.spec.ts b/ui/cypress/tests/datalake/widgets/heatmap.spec.ts
new file mode 100644
index 0000000000..9fa4ac34ac
--- /dev/null
+++ b/ui/cypress/tests/datalake/widgets/heatmap.spec.ts
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+
+describe('Test Heatmap View in Data Explorer', () => {
+    beforeEach('Setup Test', () => {
+        DataLakeUtils.initDataLakeTests();
+    });
+
+    it('Perform Test', () => {
+        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'Heatmap');
+
+        // Check checkbox
+        DataLakeUtils.selectVisualizationConfig();
+        cy.get('mat-checkbox input').click({ force: true });
+
+        // Check if heatmap chart is visible
+        cy.get('sp-data-explorer-heatmap-widget').should('be.visible');
+    });
+});
diff --git a/ui/cypress/tests/datalake/widgets/indicator.spec.ts b/ui/cypress/tests/datalake/widgets/indicator.spec.ts
new file mode 100644
index 0000000000..a8499710da
--- /dev/null
+++ b/ui/cypress/tests/datalake/widgets/indicator.spec.ts
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+
+describe('Test Indicator View in Data Explorer', () => {
+    beforeEach('Setup Test', () => {
+        DataLakeUtils.initDataLakeTests();
+    });
+
+    it('Perform Test', () => {
+        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'Indicator');
+
+        // Check checkbox
+        DataLakeUtils.selectVisualizationConfig();
+        cy.get('mat-checkbox input').click({ force: true });
+        cy.dataCy('data-explorer-select-delta-field')
+            .click()
+            .get('mat-option')
+            .contains('count')
+            .click();
+
+        // Check if indicator is displayed
+        cy.get('g').should('have.class', 'indicatorlayer');
+        // Check if delta is displayed
+        cy.get('text').should('have.class', 'delta');
+    });
+});
diff --git a/ui/cypress/tests/datalake/widgets/map.spec.ts b/ui/cypress/tests/datalake/widgets/map.spec.ts
new file mode 100644
index 0000000000..72e08da3d3
--- /dev/null
+++ b/ui/cypress/tests/datalake/widgets/map.spec.ts
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+
+describe('Test Map View in Data Explorer', () => {
+    beforeEach('Setup Test', () => {
+        DataLakeUtils.initDataLakeTests();
+    });
+
+    it('Perform Test', () => {
+        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'Map');
+
+        // Change marker positions
+        DataLakeUtils.selectVisualizationConfig();
+        cy.dataCy('data-view-map-select-latitude')
+            .click()
+            .get('mat-option')
+            .contains('randomnumber (prepared_data #1)')
+            .click();
+        cy.dataCy('data-view-map-select-longitude')
+            .click()
+            .get('mat-option')
+            .contains('randomnumber (prepared_data #1)')
+            .click();
+
+        // Check if map with markers is visible
+        cy.get('sp-data-explorer-map-widget').should('be.visible');
+        cy.get('img[alt=Marker]').should(
+            'have.attr',
+            'src',
+            'assets/img/marker-icon.png',
+        );
+
+        // Change from markers to trace
+        DataLakeUtils.selectVisualizationConfig();
+        cy.dataCy('data-view-map-select-marker-or-trace')
+            .click()
+            .get('mat-option')
+            .contains('Trace')
+            .click();
+
+        // Check if trace is visible
+        cy.get('path').should('have.class', 'leaflet-interactive');
+    });
+});
diff --git a/ui/cypress/tests/datalake/widgets/table.spec.ts b/ui/cypress/tests/datalake/widgets/table.spec.ts
new file mode 100644
index 0000000000..4648835e77
--- /dev/null
+++ b/ui/cypress/tests/datalake/widgets/table.spec.ts
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+import { DataLakeUtils } from '../../../support/utils/datalake/DataLakeUtils';
+
+describe('Test Table View in Data Explorer', () => {
+    beforeEach('Setup Test', () => {
+        DataLakeUtils.initDataLakeTests();
+    });
+
+    it('Perform Test', () => {
+        DataLakeUtils.addDataViewAndWidget('view', 'Persist', 'Table');
+
+        // Check if table is displayed correctly
+        cy.dataCy('data-explorer-table-row-timestamp', {
+            timeout: 10000,
+        }).should('have.length', 10);
+    });
+});
diff --git a/ui/cypress/tests/datalake/widgets/timeSeriesSave.ts b/ui/cypress/tests/datalake/widgets/timeSeriesSave.spec.ts
similarity index 78%
rename from ui/cypress/tests/datalake/widgets/timeSeriesSave.ts
rename to ui/cypress/tests/datalake/widgets/timeSeriesSave.spec.ts
index 846a3ec316..7be0a66603 100644
--- a/ui/cypress/tests/datalake/widgets/timeSeriesSave.ts
+++ b/ui/cypress/tests/datalake/widgets/timeSeriesSave.spec.ts
@@ -24,13 +24,11 @@ const dataSet = 'Persist';
 
 describe('Test if widget configuration is updated correctly', () => {
     beforeEach('Setup Test', () => {
-        cy.initStreamPipesTest();
-        DataLakeUtils.loadRandomDataSetIntoDataLake();
+        DataLakeUtils.initDataLakeTests();
 
         // Create first test data view with one time series widget
         DataLakeUtils.addDataViewAndTimeSeriesWidget(testView1, dataSet);
         DataLakeUtils.saveDataExplorerWidgetConfiguration();
-        // DataLakeUtils.clickStartTab();
 
         // Create second test data view with one time series widget
         DataLakeUtils.addDataViewAndTimeSeriesWidget(testView2, dataSet);
@@ -49,25 +47,28 @@ describe('Test if widget configuration is updated correctly', () => {
 });
 
 const runTestCase = (editOption: boolean) => {
-    // Go to test view 1 tab and then back to view 2
-    DataLakeUtils.clickTab(testView1);
-    DataLakeUtils.clickTab(testView2);
-
-    // Change one setting in widget
-    const widgetName = 'datalake_configuration';
+    // Visit settings of widget
+    const widgetName = 'prepared_data-time-series-chart';
 
     if (editOption) {
-        cy.dataCy('more-options-' + widgetName).click();
-        cy.dataCy('start-edit-' + widgetName).click();
+        DataLakeUtils.startEditWidget(widgetName);
     } else {
         cy.dataCy('options-data-explorer').click();
         cy.dataCy('options-edit-dashboard').click();
-        cy.dataCy('edit-' + widgetName).click();
     }
 
+    // Change first field from line plot to scatter plot
     DataLakeUtils.selectVisualizationConfig();
     cy.get('div').contains('Line').click();
     cy.get('div').contains('Scatter').click();
 
-    cy.get('path[class="scatterpts"]');
+    // Check if scatter plot is displayed
+    cy.get('g').should('have.class', 'scatterlayer mlayer');
+
+    // Change second field from line plot to bar plot
+    cy.get('div').contains('Line').click();
+    cy.get('div').contains('Bar').click();
+
+    // Check if bar plot is displayed
+    cy.get('g').should('have.class', 'barlayer mlayer');
 };