Repository: apache/streampipes
Pull request #2949 (2024-06-20 02:25:44)

chore(deps): bump org.apache.maven.plugins:maven-shade-plugin from 3.5.1 to 3.6.0
Bumps [org.apache.maven.plugins:maven-shade-plugin](https://github.com/apache/maven-shade-plugin) from 3.5.1 to 3.6.0.
<details>
<summary>Commits</summary>
<ul>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/9a572e232d652a12a2404fe3cbe57fb588a87318"><code>9a572e2</code></a> [maven-release-plugin] prepare release maven-shade-plugin-3.6.0</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/ade2e359214c4094876b0100c97b9a55aecc4c2e"><code>ade2e35</code></a> [MSHADE-428] Prevent null value in array of transformers (<a href="https://redirect.github.com/apache/maven-shade-plugin/issues/229">#229</a>)</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/b573b8c498ea12cd2b84edb45be3036d9853d03e"><code>b573b8c</code></a> [MSHADE-478] Extra JARs feature (<a href="https://redirect.github.com/apache/maven-shade-plugin/issues/228">#228</a>)</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/199ffaecd26a912527173ed4edae366e48a00998"><code>199ffae</code></a> Drop the cruft (<a href="https://redirect.github.com/apache/maven-shade-plugin/issues/225">#225</a>)</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/912a81d95da870e2384359b2836caca4f2d1299f"><code>912a81d</code></a> Bump maven-gh-actions-shared to v4</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/80e44203f4ed2169b6186a29a7112aa8ed01c7a3"><code>80e4420</code></a> [maven-release-plugin] prepare for next development iteration</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/19618cde0df300251dfd49bb5a043e31b8dfe8c0"><code>19618cd</code></a> [maven-release-plugin] prepare release maven-shade-plugin-3.5.3</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/faf233e315c7d8876a9714e15f3427429de0f9dd"><code>faf233e</code></a> [MSHADE-472] upgrade parent POM</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/7de9ae718876c5b1a9808726c8ad1e101aa5db0d"><code>7de9ae7</code></a> [MSHADE-471] deal with DST</li>
<li><a href="https://github.com/apache/maven-shade-plugin/commit/58d8cfe097f995a944c922552afcc14e68eec51b"><code>58d8cfe</code></a> [MSHADE-470] Bump asmVersion from 9.6 to 9.7 (<a href="https://redirect.github.com/apache/maven-shade-plugin/issues/218">#218</a>)</li>
<li>Additional commits viewable in <a href="https://github.com/apache/maven-shade-plugin/compare/maven-shade-plugin-3.5.1...maven-shade-plugin-3.6.0">compare view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.apache.maven.plugins:maven-shade-plugin&package-manager=maven&previous-version=3.5.1&new-version=3.6.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)


</details>


Patch:
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 48fdf4a6c5..52ffa7f9a8 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -15,16 +15,16 @@
   ~ 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://streampipes.apache.org/community/get-involved/
     - 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. 
+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`.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 6d7d95f95a..fe34d5a5cc 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -18,7 +18,7 @@
 
 ## Contributing to StreamPipes
 
-*Before opening a pull request*, review the [Get Involved](https://streampipes.apache.org/getinvolved.html) page.
+*Before opening a pull request*, review the [Get Involved](https://streampipes.apache.org/community/get-involved/) page.
 It lists information that is required for contributing to StreamPipes.
 
 When you contribute code, you affirm that the contribution is your original work and that you
diff --git a/README.md b/README.md
index 66fa337b79..6e86241c41 100644
--- a/README.md
+++ b/README.md
@@ -32,14 +32,14 @@
 
 <h1 align="center">
   <br>
-   <img src="https://streampipes.apache.org/img/sp-logo-color.png" 
+   <img src="https://streampipes.apache.org/img/sp-logo-color.png"
    alt="StreamPipes Logo" title="Apache StreamPipes Logo" width="50%"/>
   <br>
 </h1>
 <h3 align="center">Self-Service Data Analytics for the (Industrial) IoT</h3>
 <h4 align="center">StreamPipes is a self-service (Industrial) IoT toolbox to enable non-technical users to connect
 , analyze and explore IoT data streams. </h4>
-<p align="center">  
+<p align="center">
     <img src="https://raw.githubusercontent.com/apache/streampipes/dev/images/streampipes-overview.png" alt="StreamPipes Overview"/>
 </p>
 
@@ -53,7 +53,7 @@
   * [Installation](#installation)
   * [Documentation](#documentation)
   * [Building StreamPipes](#building-streampipes)
-  * [Pipeline Elements](#pipeline-elements)  
+  * [Pipeline Elements](#pipeline-elements)
   * [Extending StreamPipes](#extending-streampipes)
   * [Bugs and Feature Requests](#bugs-and-feature-requests)
   * [Get help](#get-help)
@@ -67,7 +67,7 @@
 
 Apache StreamPipes makes industrial data analytics easy!
 
-StreamPipes is an end-to-end toolbox for the industrial IoT. 
+StreamPipes is an end-to-end toolbox for the industrial IoT.
 It comes with a rich graphical user interface targeted at non-technical users and provides the following features:
 
 
@@ -77,8 +77,8 @@ It comes with a rich graphical user interface targeted at non-technical users an
 * A live dashboard to display real-time data from data sources and pipelines, e.g., for shopfloor monitoring.
 
 
-StreamPipes is highly extensible and includes a Java SDK to create new 
-pipeline elements and adapters. Python support is available in an early development stage - stay tuned!  
+StreamPipes is highly extensible and includes a Java SDK to create new
+pipeline elements and adapters. Python support is available in an early development stage - stay tuned!
 Pipeline elements are standalone microservices that can run anywhere -
 centrally on your server or close at the edge.
 You want to employ your own machine learning model on live data?
@@ -108,13 +108,13 @@ Besides that, StreamPipes includes features for production deployments:
 
 ## Installation
 
-The quickest way to run StreamPipes including the latest extensions (adapters, pipeline elements) is by using our Docker-based [installation & operation options](installer), namely: 
+The quickest way to run StreamPipes including the latest extensions (adapters, pipeline elements) is by using our Docker-based [installation & operation options](installer), namely:
 
 * **[StreamPipes Compose](installer/compose)** - The User's Choice
 * **[StreamPipes CLI](installer/cli)** - The Developer's Favorite
 * **[StreamPipes k8s](installer/k8s)** - The Operator's Dream
 
-> [!IMPORTANT] 
+> [!IMPORTANT]
 > StreamPipes CLI & k8s are highly recommended for developers or operators. Standard users should stick to StreamPipes Compose.
 
 Please follow the instructions provided in the corresponding `README.md` to get started.
@@ -168,14 +168,14 @@ You can also use the installer or CLI as described in the ``Installation`` secti
 
 ## Pipeline Elements
 StreamPipes includes a repository of extensions for adapters and pipeline elements:
-* **Connect adapters** for a variety of IoT data sources as well as 
-* **Data Processors** and **Data Sinks** as ready-to-use pipeline elements. 
+* **Connect adapters** for a variety of IoT data sources as well as
+* **Data Processors** and **Data Sinks** as ready-to-use pipeline elements.
 
 The source code of all included pipeline elements and adapters can be found [here](https://github.com/apache/streampipes/tree/dev/streampipes-extensions).
 
 ## Extending StreamPipes
 
-You can easily add your own data streams, processors or sinks. A [Java-based SDK](https://streampipes.apache.org/docs/extend-tutorial-data-processors.html) can be used to integrate your existing processing logic into StreamPipes. 
+You can easily add your own data streams, processors or sinks. A [Java-based SDK](https://streampipes.apache.org/docs/extend-tutorial-data-processors.html) can be used to integrate your existing processing logic into StreamPipes.
 Pipeline elements are packaged as Docker images and can be installed at runtime, whenever your requirements change.
 
 👉 Check our [developer guide](https://streampipes.apache.org/docs/extend-setup.html).
@@ -189,10 +189,10 @@ If you've found a bug or have a feature that you'd love to see in StreamPipes, f
 
 ## Get help
 
-If you have any problems during the installation or questions around StreamPipes, you'll get help through one of our 
+If you have any problems during the installation or questions around StreamPipes, you'll get help through one of our
 community channels:
 
-👉 [Mailing Lists](https://streampipes.apache.org/mailinglists.html)
+👉 [Mailing Lists](https://streampipes.apache.org/community/mailing-lists/)
 
 Or directly subscribe to [users-subscribe@streampipes.apache.org](mailto:users-subscribe@streampipes.apache.org)!
 
diff --git a/installer/cli/README.md b/installer/cli/README.md
index 504b9882db..ebbd8edfac 100644
--- a/installer/cli/README.md
+++ b/installer/cli/README.md
@@ -107,7 +107,7 @@ streampipes up -d
 ```
 Now you're good to go to write your new pipeline element :tada: :tada: :tada:
 
-> **HINT for extensions**: Use our [Maven archetypes](https://streampipes.apache.org/docs/docs/dev-guide-archetype/) to setup a project skeleton and use your IDE of choice for development. However, we do recommend using IntelliJ.
+> **HINT for extensions**: Use our [Maven archetypes](https://streampipes.apache.org/docs/extend-archetypes/) to setup a project skeleton and use your IDE of choice for development. However, we do recommend using IntelliJ.
 
 > **HINT for core**: To work on `backend` or `ui` features you need to set the template to `backend` and clone the core repository [streampipes](https://github.com/apache/streampipes) - check the prerequisites there for more information.
 
@@ -163,7 +163,7 @@ streampipes start extensions-all-jvm
 **Restart** existing services
 ```bash
 # restart backend couchdb container
-streampipes restart backend couchdb 
+streampipes restart backend couchdb
 # restart existing services by removing and recreating container instance
 streampipes restart --force-create extensions-all-jvm
 ```
@@ -263,7 +263,7 @@ If you've found a bug or have a feature that you'd love to see in StreamPipes, f
 If you have any problems during the installation or questions around StreamPipes, you'll get help through one of our community channels:
 
 - [Slack](https://slack.streampipes.org)
-- [Mailing Lists](https://streampipes.apache.org/mailinglists.html)
+- [Mailing Lists](https://streampipes.apache.org/community/mailing-lists/)
 
 And don't forget to follow us on [Twitter](https://twitter.com/streampipes)!
 
diff --git a/installer/compose/README.md b/installer/compose/README.md
index 7c11ec22f9..7d04ebd46d 100644
--- a/installer/compose/README.md
+++ b/installer/compose/README.md
@@ -29,7 +29,7 @@ StreamPipes Compose is a simple collection of user-friendly `docker-compose` fil
 ```bash
 docker-compose up -d
 ```
-Go to http://localhost to finish the installation in the browser. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/docs/user-guide-tour/) to learn how to create your first pipeline!
+Go to http://localhost to finish the installation in the browser. Once finished, switch to the pipeline editor and start the interactive tour or check the [online tour](https://streampipes.apache.org/docs/user-guide-tour/) to learn how to create your first pipeline!
 
 ## Prerequisite
 * Docker >= 17.06.0
@@ -50,7 +50,7 @@ We provide three options to get you going:
 - **full**:  contains experimental Flink wrappers
 - **quickstart**:  contains pre-configured sample assets, including pipelines, dashboards, and data views. We recommend first-time StreamPipes users to use the Quickstart mode to experience the convenience of StreamPipes in IIoT! （Recommended for first-time users)
 
-The ``nats`` version will become the default version in a later release. You can already try it for new installations, 
+The ``nats`` version will become the default version in a later release. You can already try it for new installations,
 but there's not yet an automatic migration from current Kafka-based installations to Nats.
 
 **Starting** the **default** option is as easy as simply running:
@@ -60,7 +60,7 @@ but there's not yet an automatic migration from current Kafka-based installation
 docker-compose up -d
 # go to `http://localhost` after all services are started
 ```
-After all containers are successfully started just got to your browser and visit http://localhost to finish the installation. Once finished, switch to the pipeline editor and start the interactive tour or check the [documentation](https://streampipes.apache.org/docs/docs/user-guide-introduction.html) to learn more about StreamPipes!
+After all containers are successfully started just got to your browser and visit http://localhost to finish the installation. Once finished, switch to the pipeline editor and start the interactive tour or check the [documentation](https://streampipes.apache.org/docs/user-guide-introduction/) to learn more about StreamPipes!
 
 **Stopping** the **default** option is similarly easy:
 ```bash
@@ -123,7 +123,7 @@ Since we purely levarage Docker Compose, please see their [documentation](https:
 If you have any problems during the installation or questions around StreamPipes, you'll get help through one of our community channels:
 
 - [Slack](https://slack.streampipes.org)
-- [Mailing Lists](https://streampipes.apache.org/mailinglists.html)
+- [Mailing Lists](https://streampipes.apache.org/community/mailing-lists/)
 
 And don't forget to follow us on [Twitter](https://twitter.com/streampipes)!
 
diff --git a/installer/k8s/README.md b/installer/k8s/README.md
index 3d1c0563d0..598e034ce9 100644
--- a/installer/k8s/README.md
+++ b/installer/k8s/README.md
@@ -314,7 +314,7 @@ If you have any problems during the installation or questions around StreamPipes
 community channels:
 
 - [Slack](https://slack.streampipes.org)
-- [Mailing Lists](https://streampipes.apache.org/mailinglists.html)
+- [Mailing Lists](https://streampipes.apache.org/community/mailing-lists/)
 
 And don't forget to follow us on [Twitter](https://twitter.com/streampipes)!
 
diff --git a/pom.xml b/pom.xml
index c3c2ff395d..97ec31e734 100644
--- a/pom.xml
+++ b/pom.xml
@@ -139,7 +139,7 @@
         <maven.compiler.source>17</maven.compiler.source>
         <maven.compiler.target>17</maven.compiler.target>
         <maven-checkstyle-plugin.version>3.3.1</maven-checkstyle-plugin.version>
-        <maven-shade-plugin.version>3.5.1</maven-shade-plugin.version>
+        <maven-shade-plugin.version>3.6.0</maven-shade-plugin.version>
         <maven.version>3.8.7</maven.version>
         <typescript-generator-maven-plugin.version>3.2.1263</typescript-generator-maven-plugin.version>
 
diff --git a/streampipes-client-python/docs/getting-started/developing.md b/streampipes-client-python/docs/getting-started/developing.md
index 10708dda96..59e96cf568 100644
--- a/streampipes-client-python/docs/getting-started/developing.md
+++ b/streampipes-client-python/docs/getting-started/developing.md
@@ -24,7 +24,7 @@ This document describes how to easily set up your local dev environment to work
 
 1) **Set up your Python environment**
 
-Create a virtual Python environment using a tool of your choice. 
+Create a virtual Python environment using a tool of your choice.
 To manage dependencies, we use [Poetry](https://python-poetry.org/), so please install poetry in your local environment, e.g. via
 ```bash
 pip install poetry
@@ -44,7 +44,7 @@ poetry install --with dev,stubs,docs  # install all optional dependencies relate
 
 The pre-commit hook is run before every commit and takes care about code style,
 linting, type hints, import sorting, etc. It will stop your commit in case the changes do not apply the expected format.
-Always check to have the recent version of the pre-commit hook installed otherwise the CI build might fail. 
+Always check to have the recent version of the pre-commit hook installed otherwise the CI build might fail.
 If you are interested, you can have a deeper look on the underlying library: [pre-commit](https://pre-commit.com/).
 
 ```bash
@@ -67,7 +67,7 @@ Please stick to the `numpy` [style](https://numpydoc.readthedocs.io/en/latest/fo
 2) **Provide tests** ✅ <br>
 We are aiming for broad test coverage for the Python package and
 have therefore set a requirement of at least 90% unit test coverage.
-Therefore, please remember to write (unit) tests already during development. 
+Therefore, please remember to write (unit) tests already during development.
 If you have problems with writing tests, don't hesitate to ask us for help directly in the PR or
 even before that via our mailing list (see above).
 
@@ -127,7 +127,7 @@ Stay tuned!
 
 ---
 ## 👨‍💻 Contributing
-*Before opening a pull request*, review the [Get Involved](https://streampipes.apache.org/getinvolved.html) page.
+*Before opening a pull request*, review the [Get Involved](https://streampipes.apache.org/community/get-involved/) page.
 It lists information that is required for contributing to StreamPipes.
 
 When you contribute code, you affirm that the contribution is your original work and that you
@@ -136,4 +136,4 @@ state this explicitly, by submitting any copyrighted material via pull request,
 other means you agree to license the material under the project's open source license and
 warrant that you have the legal authority to do so.
 
----
\ No newline at end of file
+---
diff --git a/streampipes-client-python/docs/getting-started/first-steps.md b/streampipes-client-python/docs/getting-started/first-steps.md
index a8f0288b42..81df71eeac 100644
--- a/streampipes-client-python/docs/getting-started/first-steps.md
+++ b/streampipes-client-python/docs/getting-started/first-steps.md
@@ -48,11 +48,11 @@ CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
 ...            ...       ...       ...       ...       ...       ...
 ```
 Otherwise, you need to start docker first.
-Please read the full guide on how to start StreamPipes with `docker compose` [here](https://streampipes.apache.org/docs/docs/deploy-docker.html).
+Please read the full guide on how to start StreamPipes with `docker compose` [here](https://streampipes.apache.org/docs/deploy-docker/).
 
 #### Setup StreamPipes with NATS as message broker
 The following shows how you can set up a StreamPipes instance that uses [NATS](https://docs.nats.io/) as messaging layer.
-So in this scenario, we will go with `docker-compose.nats.yml`. 
+So in this scenario, we will go with `docker-compose.nats.yml`.
 Thereby, when running locally, we need to add the following port mapping entry to `services.nats.ports`:
 ```yaml
 - 4222:4222
@@ -85,6 +85,6 @@ docker-compose -f docker-compose.yml up -d
 Once all services are started, you can access StreamPipes via `http://localhost`.
 
 In case you want to have more control over your StreamPipes setup,
-you might take a look at our [deployment CLI](https://streampipes.apache.org/docs/docs/extend-cli.html).
+you might take a look at our [deployment CLI](https://streampipes.apache.org/docs/extend-cli/).
 
 Have fun discovering StreamPipes and our Python library 🚀
diff --git a/streampipes-client-python/poetry.lock b/streampipes-client-python/poetry.lock
index d40d43d6b9..62c217f9af 100644
--- a/streampipes-client-python/poetry.lock
+++ b/streampipes-client-python/poetry.lock
@@ -3703,13 +3703,13 @@ files = [
 
 [[package]]
 name = "urllib3"
-version = "2.2.1"
+version = "2.2.2"
 description = "HTTP library with thread-safe connection pooling, file post, and more."
 optional = false
 python-versions = ">=3.8"
 files = [
-    {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"},
-    {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"},
+    {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"},
+    {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"},
 ]
 
 [package.extras]
diff --git a/streampipes-client-python/streampipes/endpoint/api/data_lake_measure.py b/streampipes-client-python/streampipes/endpoint/api/data_lake_measure.py
index 7751334052..5d61e50417 100644
--- a/streampipes-client-python/streampipes/endpoint/api/data_lake_measure.py
+++ b/streampipes-client-python/streampipes/endpoint/api/data_lake_measure.py
@@ -316,12 +316,21 @@ class DataLakeMeasureEndpoint(APIEndpoint):
         that the resource class of the resource container is
         the return type of the get endpoint.
         Therefore, this is only a temporary implementation and will be removed soon.
+
+        Returns
+        -------
+        [QueryResult][streampipes.model.resource.QueryResult]
         """
         return QueryResult
 
     @property
     def _container_cls(self) -> Type[ResourceContainer]:
-        """Defines the model container class the endpoint refers to."""
+        """Defines the model container class the endpoint refers to.
+        
+        Returns
+        -------
+        [DataLakeMeasures][streampipes.model.container.DataLakeMeasures]
+        """
         return DataLakeMeasures
 
     @property
@@ -350,7 +359,7 @@ class DataLakeMeasureEndpoint(APIEndpoint):
 
         Returns
         -------
-        measurement: DataLakeMeasures
+        measurement: QueryResult
             The specified data lake measure
 
         Examples
diff --git a/streampipes-client-python/streampipes/model/resource/query_result.py b/streampipes-client-python/streampipes/model/resource/query_result.py
index 0f05a72747..fbd613e9ce 100644
--- a/streampipes-client-python/streampipes/model/resource/query_result.py
+++ b/streampipes-client-python/streampipes/model/resource/query_result.py
@@ -16,7 +16,7 @@
 #
 
 from itertools import chain
-from typing import Any, Dict, List, Literal, Union
+from typing import Any, Dict, List, Literal, Optional, Union
 
 import pandas as pd
 from pydantic.v1 import Field, StrictInt, StrictStr
@@ -73,6 +73,9 @@ class QueryResult(Resource):
     headers: List[StrictStr]
     all_data_series: List[DataSeries]
     query_status: Literal["OK", "TOO_MUCH_DATA"] = Field(alias="spQueryStatus")
+    source_index: StrictInt
+    for_id: Optional[str]
+    last_timestamp: StrictInt
 
     def to_pandas(self) -> pd.DataFrame:
         """Returns the data lake series in representation of a Pandas Dataframe.
diff --git a/streampipes-extensions/streampipes-connectors-plc/pom.xml b/streampipes-extensions/streampipes-connectors-plc/pom.xml
index a1d3857ff9..90039ce19d 100644
--- a/streampipes-extensions/streampipes-connectors-plc/pom.xml
+++ b/streampipes-extensions/streampipes-connectors-plc/pom.xml
@@ -55,7 +55,7 @@
         <dependency>
             <groupId>org.apache.plc4x</groupId>
             <artifactId>plc4j-driver-all</artifactId>
-            <version>0.12.0</version>
+            <version>${plc4x.version}</version>
             <type>pom</type>
             <exclusions>
                 <exclusion>
@@ -72,6 +72,11 @@
                 </exclusion>
             </exclusions>
         </dependency>
+        <dependency>
+            <groupId>org.apache.plc4x</groupId>
+            <artifactId>plc4j-connection-cache</artifactId>
+            <version>${plc4x.version}</version>
+        </dependency>
 
 
         <!-- Test dependencies -->
@@ -86,5 +91,4 @@
             <scope>test</scope>
         </dependency>
     </dependencies>
-
 </project>
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/PlcConnectorsModuleExport.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/PlcConnectorsModuleExport.java
index e5ecfe14b4..a62d2a84c5 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/PlcConnectorsModuleExport.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/PlcConnectorsModuleExport.java
@@ -28,18 +28,26 @@ import org.apache.streampipes.extensions.connectors.plc.adapter.migration.Plc4xS
 import org.apache.streampipes.extensions.connectors.plc.adapter.modbus.Plc4xModbusAdapter;
 import org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter;
 
+import org.apache.plc4x.java.api.PlcDriverManager;
+import org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 public class PlcConnectorsModuleExport implements IExtensionModuleExport {
+
   @Override
   public List<StreamPipesAdapter> adapters() {
-    var adapters = new ArrayList<StreamPipesAdapter>(List.of(
-        new Plc4xModbusAdapter(),
-        new Plc4xS7Adapter()
+    var driverManager = PlcDriverManager.getDefault();
+    var cachedConnectionManager =  CachedPlcConnectionManager
+        .getBuilder(driverManager.getConnectionManager())
+        .build();
+    var adapters = new ArrayList<>(List.of(
+        new Plc4xModbusAdapter(cachedConnectionManager),
+        new Plc4xS7Adapter(cachedConnectionManager)
     ));
-    adapters.addAll(new GenericAdapterGenerator().makeAvailableAdapters());
+    adapters.addAll(new GenericAdapterGenerator().makeAvailableAdapters(driverManager, cachedConnectionManager));
     return adapters;
   }
 
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/GenericAdapterGenerator.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/GenericAdapterGenerator.java
index 56f3d83095..e8a0ad2150 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/GenericAdapterGenerator.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/GenericAdapterGenerator.java
@@ -21,6 +21,7 @@ package org.apache.streampipes.extensions.connectors.plc.adapter;
 import org.apache.streampipes.extensions.api.connect.StreamPipesAdapter;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.GenericPlc4xAdapter;
 
+import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.PlcDriverManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.slf4j.Logger;
@@ -41,11 +42,10 @@ public class GenericAdapterGenerator {
   );
 
 
-  public List<StreamPipesAdapter> makeAvailableAdapters() {
+  public List<StreamPipesAdapter> makeAvailableAdapters(PlcDriverManager driverManager,
+                                                        PlcConnectionManager connectionManager) {
     var adapters = new ArrayList<StreamPipesAdapter>();
-    var protocolCodes = getDrivers();
-    var driverManager = PlcDriverManager.getDefault();
-    var connectionManager = driverManager.getConnectionManager();
+    var protocolCodes = getDrivers(driverManager);
     protocolCodes
         .stream()
         .filter(pc -> !excludedDrivers.contains(pc))
@@ -60,9 +60,8 @@ public class GenericAdapterGenerator {
     return adapters;
   }
 
-  private Set<String> getDrivers() {
-    return PlcDriverManager
-        .getDefault()
+  private Set<String> getDrivers(PlcDriverManager driverManager) {
+    return driverManager
         .getProtocolCodes();
   }
 }
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/GenericPlc4xAdapter.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/GenericPlc4xAdapter.java
index 9f8857c713..56340f903f 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/GenericPlc4xAdapter.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/GenericPlc4xAdapter.java
@@ -28,12 +28,12 @@ import org.apache.streampipes.extensions.api.connect.context.IAdapterRuntimeCont
 import org.apache.streampipes.extensions.api.extractor.IAdapterParameterExtractor;
 import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
 import org.apache.streampipes.extensions.api.runtime.SupportsRuntimeConfig;
+import org.apache.streampipes.extensions.connectors.plc.adapter.generic.config.AdapterConfigurationProvider;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.config.EventSchemaProvider;
+import org.apache.streampipes.extensions.connectors.plc.adapter.generic.config.MetadataOptionGenerator;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.ContinuousPlcRequestReader;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.OneTimePlcRequestReader;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.PlcRequestProvider;
-import org.apache.streampipes.extensions.connectors.plc.adapter.generic.config.AdapterConfigurationProvider;
-import org.apache.streampipes.extensions.connectors.plc.adapter.generic.config.MetadataOptionGenerator;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.model.Plc4xConnectionExtractor;
 import org.apache.streampipes.extensions.management.connect.PullAdapterScheduler;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
@@ -45,8 +45,7 @@ import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.metadata.Option;
 import org.apache.plc4x.java.api.metadata.OptionMetadata;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager;
 
 import java.util.List;
 import java.util.function.Function;
@@ -57,13 +56,9 @@ import static org.apache.streampipes.extensions.connectors.plc.adapter.generic.m
 
 public class GenericPlc4xAdapter implements StreamPipesAdapter, SupportsRuntimeConfig {
 
-  private static final Logger LOG = LoggerFactory.getLogger(GenericPlc4xAdapter.class);
-
-
   private PullAdapterScheduler pullAdapterScheduler;
   private final PlcRequestProvider requestProvider;
   private final EventSchemaProvider schemaProvider;
-  private ContinuousPlcRequestReader plcRequestReader;
 
   private final PlcDriver driver;
   private final PlcConnectionManager connectionManager;
@@ -88,7 +83,7 @@ public class GenericPlc4xAdapter implements StreamPipesAdapter, SupportsRuntimeC
     var settings = new Plc4xConnectionExtractor(
         extractor.getStaticPropertyExtractor(), driver.getProtocolCode()
     ).makeSettings();
-    this.plcRequestReader = new ContinuousPlcRequestReader(connectionManager, settings, requestProvider, collector);
+    var plcRequestReader = new ContinuousPlcRequestReader(connectionManager, settings, requestProvider, collector);
     this.pullAdapterScheduler = new PullAdapterScheduler();
     this.pullAdapterScheduler.schedule(plcRequestReader, extractor.getAdapterDescription().getElementId());
   }
@@ -96,11 +91,6 @@ public class GenericPlc4xAdapter implements StreamPipesAdapter, SupportsRuntimeC
   @Override
   public void onAdapterStopped(IAdapterParameterExtractor extractor,
                                IAdapterRuntimeContext adapterRuntimeContext) {
-    try {
-      this.plcRequestReader.closeConnection();
-    } catch (Exception e) {
-      LOG.error("Error when closing connection", e);
-    }
     this.pullAdapterScheduler.shutdown();
   }
 
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/config/AdapterConfigurationProvider.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/config/AdapterConfigurationProvider.java
index c8e8f5354b..1877ce3922 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/config/AdapterConfigurationProvider.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/config/AdapterConfigurationProvider.java
@@ -19,15 +19,15 @@
 package org.apache.streampipes.extensions.connectors.plc.adapter.generic.config;
 
 import org.apache.streampipes.extensions.api.connect.IAdapterConfiguration;
-import org.apache.streampipes.extensions.connectors.plc.adapter.generic.assets.PlcAdapterAssetResolver;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.GenericPlc4xAdapter;
+import org.apache.streampipes.extensions.connectors.plc.adapter.generic.assets.PlcAdapterAssetResolver;
 import org.apache.streampipes.model.AdapterType;
+import org.apache.streampipes.model.extensions.ExtensionAssetType;
 import org.apache.streampipes.model.staticproperty.Option;
 import org.apache.streampipes.sdk.builder.adapter.AdapterConfigurationBuilder;
 import org.apache.streampipes.sdk.helpers.CodeLanguage;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Locales;
-import org.apache.streampipes.sdk.utils.Assets;
 
 import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.PlcDriver;
@@ -55,7 +55,7 @@ public class AdapterConfigurationProvider {
             () -> new GenericPlc4xAdapter(driver, connectionManager)
         )
         .withLocales(Locales.EN)
-        .withAssets(Assets.DOCUMENTATION, Assets.ICON)
+        .withAssets(ExtensionAssetType.DOCUMENTATION, ExtensionAssetType.ICON)
         .withAssetResolver(
             new PlcAdapterAssetResolver("org.apache.streampipes.connect.iiot.adapters.plc4x.generic", appId, driver)
         )
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
index bb23816a16..befc54a234 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/ContinuousPlcRequestReader.java
@@ -22,26 +22,22 @@ import org.apache.streampipes.extensions.api.connect.IEventCollector;
 import org.apache.streampipes.extensions.api.connect.IPollingSettings;
 import org.apache.streampipes.extensions.api.connect.IPullAdapter;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.model.Plc4xConnectionSettings;
-import org.apache.streampipes.extensions.connectors.plc.adapter.s7.PlcReadResponseHandler;
 import org.apache.streampipes.extensions.management.connect.adapter.util.PollingSettings;
 
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.PlcConnectionManager;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.utils.cache.CachedPlcConnectionManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
 public class ContinuousPlcRequestReader
-    extends OneTimePlcRequestReader implements IPullAdapter, PlcReadResponseHandler {
+    extends OneTimePlcRequestReader implements IPullAdapter {
 
   private static final Logger LOG = LoggerFactory.getLogger(ContinuousPlcRequestReader.class);
 
   private final IEventCollector collector;
-  private PlcConnection plcConnection;
 
   public ContinuousPlcRequestReader(PlcConnectionManager connectionManager,
                                     Plc4xConnectionSettings settings,
@@ -53,45 +49,18 @@ public class ContinuousPlcRequestReader
 
   @Override
   public void pullData() throws RuntimeException {
-    try {
-      var connection = getConnection();
-      readPlcData(connection, this);
+    try (PlcConnection plcConnection = connectionManager.getConnection(settings.connectionString())) {
+      var readRequest = requestProvider.makeReadRequest(plcConnection, settings.nodes());
+      var readResponse = readRequest.execute().get(5000, TimeUnit.MILLISECONDS);
+      var event = eventGenerator.makeEvent(readResponse);
+      collector.collect(event);
     } catch (Exception e) {
       LOG.error("Error while reading from PLC with connection string {} ", settings.connectionString(), e);
     }
   }
 
-  private PlcConnection getConnection() throws PlcConnectionException {
-    if (plcConnection == null || !plcConnection.isConnected()) {
-      this.plcConnection = connectionManager.getConnection(settings.connectionString());
-    }
-    return this.plcConnection;
-  }
-
-  private void readPlcData(PlcConnection plcConnection, PlcReadResponseHandler handler) {
-    var readRequest = requestProvider.makeReadRequest(plcConnection, settings.nodes());
-    CompletableFuture<? extends PlcReadResponse> asyncResponse = readRequest.execute();
-    asyncResponse.whenComplete(handler::onReadResult);
-  }
-
   @Override
   public IPollingSettings getPollingInterval() {
     return PollingSettings.from(TimeUnit.MILLISECONDS, settings.pollingInterval());
   }
-
-  @Override
-  public void onReadResult(PlcReadResponse response, Throwable throwable) {
-    if (throwable != null) {
-      LOG.error(throwable.getMessage());
-    } else {
-      var event = eventGenerator.makeEvent(response);
-      collector.collect(event);
-    }
-  }
-
-  public void closeConnection() throws Exception {
-    if (this.plcConnection != null && this.plcConnection.isConnected()) {
-      this.plcConnection.close();
-    }
-  }
 }
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/OneTimePlcRequestReader.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/OneTimePlcRequestReader.java
index e03566d99f..cab3a53ad6 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/OneTimePlcRequestReader.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/generic/connection/OneTimePlcRequestReader.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection;
 
+import org.apache.streampipes.commons.exceptions.connect.AdapterException;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.model.Plc4xConnectionSettings;
 
 import org.apache.plc4x.java.api.PlcConnection;
@@ -46,6 +47,9 @@ public class OneTimePlcRequestReader {
   public Map<String, Object> readPlcDataSynchronized() throws Exception {
     var connectionString = settings.connectionString();
     try (PlcConnection plcConnection = connectionManager.getConnection(connectionString)) {
+      if (!plcConnection.getMetadata().isReadSupported()) {
+        throw new AdapterException("This PLC does not support reading data");
+      }
       var readRequest = requestProvider.makeReadRequest(plcConnection, settings.nodes());
       var readResponse = readRequest.execute().get(5000, TimeUnit.MILLISECONDS);
       return eventGenerator.makeEvent(readResponse);
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 97af4a211b..6c0673797c 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
@@ -32,6 +32,7 @@ import org.apache.streampipes.extensions.management.connect.PullAdapterScheduler
 import org.apache.streampipes.extensions.management.connect.adapter.util.PollingSettings;
 import org.apache.streampipes.model.AdapterType;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
+import org.apache.streampipes.model.extensions.ExtensionAssetType;
 import org.apache.streampipes.model.schema.EventProperty;
 import org.apache.streampipes.model.schema.EventSchema;
 import org.apache.streampipes.model.staticproperty.CollectionStaticProperty;
@@ -44,11 +45,10 @@ import org.apache.streampipes.sdk.extractor.StaticPropertyExtractor;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Locales;
 import org.apache.streampipes.sdk.helpers.Options;
-import org.apache.streampipes.sdk.utils.Assets;
 import org.apache.streampipes.sdk.utils.Datatypes;
 
 import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.PlcDriverManager;
+import org.apache.plc4x.java.api.PlcConnectionManager;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -101,11 +101,9 @@ public class Plc4xModbusAdapter implements StreamPipesAdapter, IPullAdapter {
    * Connection to the PLC
    */
   private PlcConnection plcConnection;
+  private PlcConnectionManager connectionManager;
 
-  /**
-   * Empty constructor and a constructor with SpecificAdapterStreamDescription are mandatory
-   */
-  public Plc4xModbusAdapter() {
+  public Plc4xModbusAdapter(PlcConnectionManager connectionManager) {
   }
 
   /**
@@ -179,7 +177,7 @@ public class Plc4xModbusAdapter implements StreamPipesAdapter, IPullAdapter {
     getConfigurations(extractor);
 
     try {
-      this.plcConnection = PlcDriverManager.getDefault().getConnectionManager().getConnection(
+      this.plcConnection = connectionManager.getConnection(
           "modbus-tcp:tcp://" + this.ip + ":" + this.port + "?unit-identifier=" + this.slaveID);
 
       if (!this.plcConnection.getMetadata().isReadSupported()) {
@@ -213,16 +211,13 @@ public class Plc4xModbusAdapter implements StreamPipesAdapter, IPullAdapter {
     }
     PlcReadRequest readRequest = builder.build();
 
-
     // Execute the request
     PlcReadResponse response = null;
 
     try {
       response = readRequest.execute().get();
-    } catch (InterruptedException ie) {
+    } catch (InterruptedException | ExecutionException ie) {
       ie.printStackTrace();
-    } catch (ExecutionException ee) {
-      ee.printStackTrace();
     }
 
     // Create an event containing the value of the PLC
@@ -273,9 +268,9 @@ public class Plc4xModbusAdapter implements StreamPipesAdapter, IPullAdapter {
    */
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, 1, Plc4xModbusAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 1, () -> new Plc4xModbusAdapter(connectionManager))
         .withLocales(Locales.EN)
-        .withAssets(Assets.DOCUMENTATION, Assets.ICON)
+        .withAssets(ExtensionAssetType.DOCUMENTATION, ExtensionAssetType.ICON)
         .withCategory(AdapterType.Manufacturing)
         .requiredTextParameter(Labels.withId(PLC_IP)).requiredIntegerParameter(Labels.withId(PLC_PORT))
         .requiredTextParameter(Labels.withId(PLC_NODE_ID)).requiredCollection(Labels.withId(PLC_NODES),
@@ -298,8 +293,7 @@ public class Plc4xModbusAdapter implements StreamPipesAdapter, IPullAdapter {
   }
 
   @Override
-  public void onAdapterStopped(IAdapterParameterExtractor extractor, IAdapterRuntimeContext adapterRuntimeContext)
-      throws AdapterException {
+  public void onAdapterStopped(IAdapterParameterExtractor extractor, IAdapterRuntimeContext adapterRuntimeContext) {
     this.pullAdapterScheduler.shutdown();
   }
 
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java
index 1e98d4e224..1c7657a79a 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java
@@ -22,20 +22,21 @@ package org.apache.streampipes.extensions.connectors.plc.adapter.s7;
 import org.apache.streampipes.commons.exceptions.connect.AdapterException;
 import org.apache.streampipes.extensions.api.connect.IAdapterConfiguration;
 import org.apache.streampipes.extensions.api.connect.IEventCollector;
-import org.apache.streampipes.extensions.api.connect.IPullAdapter;
 import org.apache.streampipes.extensions.api.connect.StreamPipesAdapter;
 import org.apache.streampipes.extensions.api.connect.context.IAdapterGuessSchemaContext;
 import org.apache.streampipes.extensions.api.connect.context.IAdapterRuntimeContext;
 import org.apache.streampipes.extensions.api.extractor.IAdapterParameterExtractor;
 import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.config.EventSchemaProvider;
-import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.PlcEventGenerator;
+import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.ContinuousPlcRequestReader;
+import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.OneTimePlcRequestReader;
 import org.apache.streampipes.extensions.connectors.plc.adapter.generic.connection.PlcRequestProvider;
+import org.apache.streampipes.extensions.connectors.plc.adapter.generic.model.Plc4xConnectionSettings;
 import org.apache.streampipes.extensions.connectors.plc.adapter.s7.config.ConfigurationParser;
 import org.apache.streampipes.extensions.management.connect.PullAdapterScheduler;
-import org.apache.streampipes.extensions.management.connect.adapter.util.PollingSettings;
 import org.apache.streampipes.model.AdapterType;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
+import org.apache.streampipes.model.extensions.ExtensionAssetType;
 import org.apache.streampipes.model.schema.EventProperty;
 import org.apache.streampipes.model.staticproperty.CollectionStaticProperty;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
@@ -49,31 +50,21 @@ import org.apache.streampipes.sdk.helpers.CodeLanguage;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Locales;
 import org.apache.streampipes.sdk.helpers.Options;
-import org.apache.streampipes.sdk.utils.Assets;
 
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.PlcDriverManager;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.apache.plc4x.java.api.PlcConnectionManager;
 
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
 
-public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcReadResponseHandler {
+public class Plc4xS7Adapter implements StreamPipesAdapter {
 
   /**
    * A unique id to identify the Plc4xS7Adapter
    */
   public static final String ID = "org.apache.streampipes.connect.iiot.adapters.plc4x.s7";
 
-  private static final Logger LOG = LoggerFactory.getLogger(Plc4xS7Adapter.class);
-
   private static final String S7_URL = "s7://";
 
   /**
@@ -102,124 +93,14 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
       // [1] https://plc4x.apache.org/users/protocols/s7.html
       """;
 
-  /**
-   * Values of user configuration parameters
-   */
-  private String ip;
-  private int pollingInterval;
-  private Map<String, String> nodes;
-
-  private PlcDriverManager driverManager;
+  private final PlcConnectionManager connectionManager;
+  private final PlcRequestProvider requestProvider;
 
   private PullAdapterScheduler pullAdapterScheduler;
 
-  private IEventCollector collector;
-
-  private PlcEventGenerator eventGenerator;
-
-  private final PlcRequestProvider requestProvider;
-
-  public Plc4xS7Adapter() {
+  public Plc4xS7Adapter(PlcConnectionManager connectionManager) {
     this.requestProvider = new PlcRequestProvider();
-  }
-
-  /**
-   * This method is executed when the adapter is started. A connection to the PLC is initialized
-   */
-  private void before(IStaticPropertyExtractor extractor) {
-    // Extract user input
-    getConfigurations(extractor);
-
-    this.driverManager = PlcDriverManager.getDefault();
-    try (PlcConnection plcConnection = this.driverManager.getConnectionManager().getConnection(S7_URL + this.ip)) {
-      if (!plcConnection.getMetadata().isReadSupported()) {
-        LOG.error("The S7 on IP: " + this.ip + " does not support reading data");
-      }
-    } catch (PlcConnectionException e) {
-      LOG.error("Could not establish connection to S7 with ip " + this.ip, e);
-    } catch (Exception e) {
-      LOG.error("Could not close connection to S7 with ip " + this.ip, e);
-    }
-  }
-
-
-  /**
-   * pullData is called iteratively according to the polling interval defined in getPollInterval.
-   */
-  @Override
-  public void pullData() {
-    // Create PLC read request
-    try (PlcConnection plcConnection = this.driverManager.getConnectionManager().getConnection(S7_URL + this.ip)) {
-      readPlcData(plcConnection, this);
-    } catch (Exception e) {
-      LOG.error("Error while reading from PLC with IP {} ", this.ip, e);
-    }
-  }
-
-  private void readPlcData(PlcConnection plcConnection, PlcReadResponseHandler handler) {
-    var readRequest = requestProvider.makeReadRequest(plcConnection, this.nodes);
-    // Execute the request
-    CompletableFuture<? extends PlcReadResponse> asyncResponse = readRequest.execute();
-    asyncResponse.whenComplete(handler::onReadResult);
-  }
-
-  private Map<String, Object> readPlcDataSynchronized() throws Exception {
-    try (PlcConnection plcConnection = this.driverManager.getConnectionManager().getConnection(S7_URL + this.ip)) {
-      var readRequest = requestProvider.makeReadRequest(plcConnection, this.nodes);
-      // Execute the request
-      var readResponse = readRequest.execute().get(5000, TimeUnit.MILLISECONDS);
-      return eventGenerator.makeEvent(readResponse);
-    }
-  }
-
-  /**
-   * Define the polling interval of this adapter. Default is to poll every second
-   *
-   * @return PollingSettings
-   */
-  @Override
-  public PollingSettings getPollingInterval() {
-    return PollingSettings.from(TimeUnit.MILLISECONDS, this.pollingInterval);
-  }
-
-  /**
-   * Extracts the user configuration from the SpecificAdapterStreamDescription and sets the local variales
-   *
-   * @param extractor StaticPropertyExtractor
-   */
-  private void getConfigurations(IStaticPropertyExtractor extractor) {
-
-    this.ip = extractor.singleValueParameter(PLC_IP, String.class);
-    this.pollingInterval = extractor.singleValueParameter(PLC_POLLING_INTERVAL, Integer.class);
-
-    this.nodes = new HashMap<>();
-
-    var selectedAlternative = extractor.selectedAlternativeInternalId(PLC_NODE_INPUT_ALTERNATIVES);
-
-    if (selectedAlternative.equals(PLC_NODE_INPUT_COLLECTION_ALTERNATIVE)) {
-      // Alternative Simple
-      var csp = (CollectionStaticProperty) extractor.getStaticPropertyByName(PLC_NODES);
-      this.nodes = getNodeInformationFromCollectionStaticProperty(csp);
-
-    } else {
-      // Alternative Advanced
-      var codePropertyInput = extractor.codeblockValue(PLC_CODE_BLOCK);
-      this.nodes = new ConfigurationParser().getNodeInformationFromCodeProperty(codePropertyInput);
-    }
-    this.eventGenerator = new PlcEventGenerator(this.nodes);
-  }
-
-
-  @Override
-  public void onReadResult(PlcReadResponse response, Throwable throwable) {
-    if (throwable != null) {
-      throwable.printStackTrace();
-      LOG.error(throwable.getMessage());
-    } else {
-      var event = eventGenerator.makeEvent(response);
-      // publish the final event
-      collector.collect(event);
-    }
+    this.connectionManager = connectionManager;
   }
 
   /**
@@ -230,9 +111,9 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
    */
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, 1, Plc4xS7Adapter::new)
+    return AdapterConfigurationBuilder.create(ID, 1, () -> new Plc4xS7Adapter(connectionManager))
         .withLocales(Locales.EN)
-        .withAssets(Assets.DOCUMENTATION, Assets.ICON)
+        .withAssets(ExtensionAssetType.DOCUMENTATION, ExtensionAssetType.ICON)
         .withCategory(AdapterType.Manufacturing)
         .requiredTextParameter(Labels.withId(PLC_IP))
         .requiredIntegerParameter(Labels.withId(PLC_POLLING_INTERVAL), 1000)
@@ -255,10 +136,10 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
   public void onAdapterStarted(IAdapterParameterExtractor extractor,
                                IEventCollector collector,
                                IAdapterRuntimeContext adapterRuntimeContext) {
-    this.before(extractor.getStaticPropertyExtractor());
-    this.collector = collector;
+    var settings = getConfigurations(extractor.getStaticPropertyExtractor());
+    var plcRequestReader = new ContinuousPlcRequestReader(connectionManager, settings, requestProvider, collector);
     this.pullAdapterScheduler = new PullAdapterScheduler();
-    this.pullAdapterScheduler.schedule(this, extractor.getAdapterDescription().getElementId());
+    this.pullAdapterScheduler.schedule(plcRequestReader, extractor.getAdapterDescription().getElementId());
   }
 
   @Override
@@ -270,19 +151,18 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
   @Override
   public GuessSchema onSchemaRequested(IAdapterParameterExtractor extractor,
                                        IAdapterGuessSchemaContext adapterGuessSchemaContext) throws AdapterException {
-    // Extract user input
     try {
-      getConfigurations(extractor.getStaticPropertyExtractor());
+      var settings = getConfigurations(extractor.getStaticPropertyExtractor());
 
-      if (this.pollingInterval < 10) {
-        throw new AdapterException("Polling interval must be higher than 10. Current value: " + this.pollingInterval);
+      if (settings.pollingInterval() < 10) {
+        throw new AdapterException(
+            String.format("Polling interval must be higher than 10. Current value: %s", settings.pollingInterval())
+        );
       }
 
       GuessSchemaBuilder builder = GuessSchemaBuilder.create();
-      List<EventProperty> allProperties = new EventSchemaProvider().makeSchema(this.nodes);
-
-      this.before(extractor.getStaticPropertyExtractor());
-      var event = readPlcDataSynchronized();
+      List<EventProperty> allProperties = new EventSchemaProvider().makeSchema(settings.nodes());
+      var event = new OneTimePlcRequestReader(connectionManager, settings, requestProvider).readPlcDataSynchronized();
 
       builder.properties(allProperties);
       builder.preview(event);
@@ -293,6 +173,34 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
     }
   }
 
+  /**
+   * Extracts the user configuration from the SpecificAdapterStreamDescription and sets the local variales
+   *
+   * @param extractor StaticPropertyExtractor
+   */
+  private Plc4xConnectionSettings getConfigurations(IStaticPropertyExtractor extractor) {
+
+    var ip = extractor.singleValueParameter(PLC_IP, String.class);
+    var pollingInterval = extractor.singleValueParameter(PLC_POLLING_INTERVAL, Integer.class);
+
+    Map<String, String> nodes;
+
+    var selectedAlternative = extractor.selectedAlternativeInternalId(PLC_NODE_INPUT_ALTERNATIVES);
+
+    if (selectedAlternative.equals(PLC_NODE_INPUT_COLLECTION_ALTERNATIVE)) {
+      // Alternative Simple
+      var csp = (CollectionStaticProperty) extractor.getStaticPropertyByName(PLC_NODES);
+      nodes = getNodeInformationFromCollectionStaticProperty(csp);
+
+    } else {
+      // Alternative Advanced
+      var codePropertyInput = extractor.codeblockValue(PLC_CODE_BLOCK);
+      nodes = new ConfigurationParser().getNodeInformationFromCodeProperty(codePropertyInput);
+    }
+
+    return new Plc4xConnectionSettings(S7_URL + ip, pollingInterval, nodes);
+  }
+
 
   private Map<String, String> getNodeInformationFromCollectionStaticProperty(CollectionStaticProperty csp) {
     var result = new HashMap<String, String>();
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/PlcReadResponseHandler.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/PlcReadResponseHandler.java
deleted file mode 100644
index 2a4a44c762..0000000000
--- a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/PlcReadResponseHandler.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.extensions.connectors.plc.adapter.s7;
-
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-
-public interface PlcReadResponseHandler {
-
-  void onReadResult(PlcReadResponse response,
-                    Throwable throwable);
-}
diff --git a/ui/src/app/pipeline-details/components/edit/quickedit.component.html b/ui/src/app/pipeline-details/components/edit/quickedit.component.html
deleted file mode 100644
index b26dfcfb04..0000000000
--- a/ui/src/app/pipeline-details/components/edit/quickedit.component.html
+++ /dev/null
@@ -1,93 +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.
-  ~
-  -->
-
-<sp-basic-nav-tabs
-    [spNavigationItems]="tabs"
-    [activeLink]="'quick-edit'"
-    [showBackLink]="true"
-    [backLinkTarget]="['pipelines']"
->
-    <div fxLayout="column" class="page-container-padding" *ngIf="pipeline">
-        <sp-pipeline-preview
-            [jspcanvas]="'assembly-preview'"
-            [pipeline]="pipeline"
-            (selectedElementEmitter)="selectElement($event)"
-            style="margin-bottom: 15px"
-            class="md-padding"
-            *ngIf="pipelineAvailable"
-        ></sp-pipeline-preview>
-
-        <sp-basic-inner-panel panelTitle="Edit Configuration">
-            <div header fxLayoutAlign="end center" fxFlex="100" fxLayout="row">
-                <button
-                    color="accent"
-                    mat-button
-                    mat-raised-button
-                    matTooltip="Save Pipeline"
-                    matTooltipPosition="above"
-                    style="display: flex; align-items: center"
-                    class="settings-bar-icon-button"
-                    [disabled]="!formValid || pipelineUpdating"
-                    (click)="updatePipeline()"
-                >
-                    <mat-icon>save</mat-icon>
-                    <span>&nbsp;Update pipeline</span>
-                </button>
-            </div>
-            <div fxFlex="100" fxLayout="column">
-                <div *ngIf="selectedElement">
-                    <div
-                        fxLayout="column"
-                        style="padding: 5px; padding-left: 10px"
-                    >
-                        <sp-pipeline-elements-row
-                            [pipeline]="pipeline"
-                            [element]="selectedElement"
-                        ></sp-pipeline-elements-row>
-
-                        <div fxFlex="100" fxLayout="column" *ngIf="isInvocable">
-                            <form [formGroup]="parentForm" fxFlex="100">
-                                <sp-app-static-property
-                                    *ngFor="
-                                        let config of _selectedElement.staticProperties
-                                    "
-                                    [staticProperty]="config"
-                                    [displayRecommended]="true"
-                                    [staticProperties]="
-                                        _selectedElement.staticProperties
-                                    "
-                                    [eventSchemas]="eventSchemas"
-                                    [parentForm]="parentForm"
-                                    [fieldName]="config.internalName"
-                                >
-                                </sp-app-static-property>
-                            </form>
-                        </div>
-                    </div>
-                </div>
-                <div
-                    fxLayout="column"
-                    fxLayoutAlign="center center"
-                    *ngIf="!selectedElement"
-                >
-                    (select an element in the preview window to modify it)
-                </div>
-            </div>
-        </sp-basic-inner-panel>
-    </div>
-</sp-basic-nav-tabs>
diff --git a/ui/src/app/pipeline-details/components/edit/quickedit.component.ts b/ui/src/app/pipeline-details/components/edit/quickedit.component.ts
deleted file mode 100644
index df4cf5642d..0000000000
--- a/ui/src/app/pipeline-details/components/edit/quickedit.component.ts
+++ /dev/null
@@ -1,181 +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.
- *
- */
-
-import {
-    AfterViewInit,
-    ChangeDetectorRef,
-    Component,
-    Input,
-    OnInit,
-} from '@angular/core';
-import {
-    DataProcessorInvocation,
-    DataSinkInvocation,
-    EventSchema,
-    PipelineService,
-} from '@streampipes/platform-services';
-import { PipelineElementUnion } from '../../../editor/model/editor.model';
-import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
-import { SpPipelineDetailsDirective } from '../sp-pipeline-details.directive';
-import { ActivatedRoute } from '@angular/router';
-import { AuthService } from '../../../services/auth.service';
-import {
-    CurrentUserService,
-    SpBreadcrumbService,
-} from '@streampipes/shared-ui';
-import { SpPipelineRoutes } from '../../../pipelines/pipelines.routes';
-
-@Component({
-    selector: 'sp-quick-edit',
-    templateUrl: './quickedit.component.html',
-})
-export class QuickEditComponent
-    extends SpPipelineDetailsDirective
-    implements OnInit, AfterViewInit
-{
-    _selectedElement: PipelineElementUnion;
-
-    eventSchemas: EventSchema[];
-
-    parentForm: UntypedFormGroup;
-    formValid: boolean;
-    viewInitialized = false;
-
-    isInvocable = false;
-    isDataProcessor = false;
-
-    pipelineUpdating = false;
-
-    constructor(
-        activatedRoute: ActivatedRoute,
-        pipelineService: PipelineService,
-        authService: AuthService,
-        currentUserService: CurrentUserService,
-        private fb: UntypedFormBuilder,
-        private changeDetectorRef: ChangeDetectorRef,
-        breadcrumbService: SpBreadcrumbService,
-    ) {
-        super(
-            activatedRoute,
-            pipelineService,
-            authService,
-            currentUserService,
-            breadcrumbService,
-        );
-    }
-
-    ngOnInit() {
-        super.onInit();
-        this.parentForm = this.fb.group({});
-
-        this.parentForm.statusChanges.subscribe(status => {
-            this.formValid = this.viewInitialized && this.parentForm.valid;
-        });
-    }
-
-    ngAfterViewInit(): void {
-        this.viewInitialized = true;
-        this.formValid = this.viewInitialized && this.parentForm.valid;
-        this.changeDetectorRef.detectChanges();
-    }
-
-    updatePipeline() {
-        this.pipelineUpdating = true;
-        this.updatePipelineElement();
-        this.pipelineService.updatePipeline(this.pipeline).subscribe(data => {
-            this.loadPipeline();
-            this.pipelineUpdating = false;
-        });
-    }
-
-    updatePipelineElement() {
-        if (this._selectedElement instanceof DataProcessorInvocation) {
-            this.updateDataProcessor();
-        } else if (this._selectedElement instanceof DataSinkInvocation) {
-            this.updateDataSink();
-        }
-    }
-
-    updateDataProcessor() {
-        const dataProcessors: DataProcessorInvocation[] = [];
-        this.pipeline.sepas.forEach(p => {
-            if (p.dom === this._selectedElement.dom) {
-                dataProcessors.push(
-                    this._selectedElement as DataProcessorInvocation,
-                );
-            } else {
-                dataProcessors.push(p);
-            }
-        });
-        this.pipeline.sepas = dataProcessors;
-    }
-
-    updateDataSink() {
-        const dataSinks: DataSinkInvocation[] = [];
-        this.pipeline.actions.forEach(p => {
-            if (p.dom === this._selectedElement.dom) {
-                dataSinks.push(this._selectedElement as DataSinkInvocation);
-            } else {
-                dataSinks.push(p);
-            }
-        });
-        this.pipeline.actions = dataSinks;
-    }
-
-    get selectedElement() {
-        return this._selectedElement;
-    }
-
-    @Input()
-    set selectedElement(selectedElement: PipelineElementUnion) {
-        if (this._selectedElement) {
-            this.updatePipelineElement();
-        }
-        this._selectedElement = selectedElement;
-        this.eventSchemas = [];
-        if (
-            this._selectedElement instanceof DataProcessorInvocation ||
-            this._selectedElement instanceof DataSinkInvocation
-        ) {
-            (this._selectedElement as any).inputStreams.forEach(is => {
-                this.eventSchemas = this.eventSchemas.concat(is.eventSchema);
-            });
-        }
-        this.updateTypeInfo();
-    }
-
-    updateTypeInfo() {
-        this.isDataProcessor =
-            this._selectedElement instanceof DataProcessorInvocation;
-        this.isInvocable =
-            this._selectedElement instanceof DataProcessorInvocation ||
-            this._selectedElement instanceof DataSinkInvocation;
-    }
-
-    selectElement(element: PipelineElementUnion) {
-        this.selectedElement = element;
-    }
-
-    onPipelineAvailable(): void {
-        this.breadcrumbService.updateBreadcrumb([
-            SpPipelineRoutes.BASE,
-            { label: this.pipeline.name },
-            { label: 'Quick Edit' },
-        ]);
-    }
-}
diff --git a/ui/src/app/pipeline-details/pipeline-details-tabs.ts b/ui/src/app/pipeline-details/pipeline-details-tabs.ts
index 42fc0362d7..8cde55cbec 100644
--- a/ui/src/app/pipeline-details/pipeline-details-tabs.ts
+++ b/ui/src/app/pipeline-details/pipeline-details-tabs.ts
@@ -36,11 +36,6 @@ export class SpPipelineDetailsTabs {
                 itemTitle: 'Logs',
                 itemLink: ['pipelines', 'details', pipelineId, 'logs'],
             },
-            {
-                itemId: 'quick-edit',
-                itemTitle: 'Quick Edit',
-                itemLink: ['pipelines', 'details', pipelineId, 'quick-edit'],
-            },
         ];
     }
 }
diff --git a/ui/src/app/pipeline-details/pipeline-details.module.ts b/ui/src/app/pipeline-details/pipeline-details.module.ts
index 0da4e9843f..5fde41afec 100644
--- a/ui/src/app/pipeline-details/pipeline-details.module.ts
+++ b/ui/src/app/pipeline-details/pipeline-details.module.ts
@@ -29,7 +29,6 @@ import { PipelineActionsComponent } from './components/actions/pipeline-actions.
 import { PipelineStatusComponent } from './components/status/pipeline-status.component';
 import { PipelineElementsComponent } from './components/elements/pipeline-elements.component';
 import { PipelineElementsRowComponent } from './components/elements/pipeline-elements-row.component';
-import { QuickEditComponent } from './components/edit/quickedit.component';
 import { CoreUiModule } from '../core-ui/core-ui.module';
 import { PipelineMonitoringComponent } from './components/monitoring/pipeline-monitoring.component';
 import { PipelineElementStatisticsComponent } from './components/monitoring/statistics/pipeline-element-statistics.component';
@@ -67,7 +66,6 @@ import { MatIconModule } from '@angular/material/icon';
         PipelineMonitoringComponent,
         PipelineStatusComponent,
         PipelinePreviewComponent,
-        QuickEditComponent,
         BarchartWidgetComponent,
         SpPipelineDetailsOverviewComponent,
     ],
diff --git a/ui/src/app/pipelines/pipelines.module.ts b/ui/src/app/pipelines/pipelines.module.ts
index 6d969cd1c7..74f209e7e8 100644
--- a/ui/src/app/pipelines/pipelines.module.ts
+++ b/ui/src/app/pipelines/pipelines.module.ts
@@ -40,7 +40,6 @@ import { RouterModule } from '@angular/router';
 import { EditorComponent } from '../editor/editor.component';
 import { SpPipelineDetailsOverviewComponent } from '../pipeline-details/components/overview/pipeline-details-overview.component';
 import { PipelineMonitoringComponent } from '../pipeline-details/components/monitoring/pipeline-monitoring.component';
-import { QuickEditComponent } from '../pipeline-details/components/edit/quickedit.component';
 import { PipelineLogsComponent } from '../pipeline-details/components/pipeline-logs/pipeline-logs.component';
 import { FunctionsOverviewComponent } from './components/functions-overview/functions-overview.component';
 import { SpFunctionsMetricsComponent } from './components/functions-overview/functions-metrics/functions-metrics.component';
@@ -105,10 +104,6 @@ import { MatIconModule } from '@angular/material/icon';
                                 path: 'logs',
                                 component: PipelineLogsComponent,
                             },
-                            {
-                                path: 'quick-edit',
-                                component: QuickEditComponent,
-                            },
                         ],
                     },
                     {


Test patch:
diff --git a/streampipes-client-python/tests/client/test_data_lake_series.py b/streampipes-client-python/tests/client/test_data_lake_series.py
index df0349a2f3..b83e71f13c 100644
--- a/streampipes-client-python/tests/client/test_data_lake_series.py
+++ b/streampipes-client-python/tests/client/test_data_lake_series.py
@@ -103,6 +103,9 @@ class TestDataLakeSeries(TestCase):
             "headers": self.headers,
             "spQueryStatus": "OK",
             "allDataSeries": [self.data_series],
+            "sourceIndex": 0,
+            "forId": None,
+            "lastTimestamp": 1717936808802,
         }
 
         result_pd = self.get_result_as_panda(http_session, query_result)
@@ -125,6 +128,9 @@ class TestDataLakeSeries(TestCase):
             "headers": self.headers,
             "spQueryStatus": "OK",
             "allDataSeries": [self.data_series, self.data_series],
+            "sourceIndex": 0,
+            "forId": None,
+            "lastTimestamp": 1717936808802,
         }
 
         result_pd = self.get_result_as_panda(http_session, query_result)
@@ -147,6 +153,9 @@ class TestDataLakeSeries(TestCase):
             "headers": ["one"],
             "spQueryStatus": "OK",
             "allDataSeries": [self.data_series],
+            "sourceIndex": 0,
+            "forId": None,
+            "lastTimestamp": 1717936808802,
         }
 
         with self.assertRaises(StreamPipesUnsupportedDataSeries):
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/config/Plc4xModbusAdapterVersionedConfig.java b/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/config/Plc4xModbusAdapterVersionedConfig.java
index 11509f5d5d..d88fbbb923 100644
--- a/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/config/Plc4xModbusAdapterVersionedConfig.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/config/Plc4xModbusAdapterVersionedConfig.java
@@ -21,12 +21,12 @@ package org.apache.streampipes.extensions.connectors.plc.adapter.migration.confi
 import org.apache.streampipes.extensions.connectors.plc.adapter.modbus.Plc4xModbusAdapter;
 import org.apache.streampipes.model.AdapterType;
 import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+import org.apache.streampipes.model.extensions.ExtensionAssetType;
 import org.apache.streampipes.sdk.StaticProperties;
 import org.apache.streampipes.sdk.builder.adapter.AdapterConfigurationBuilder;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Locales;
 import org.apache.streampipes.sdk.helpers.Options;
-import org.apache.streampipes.sdk.utils.Assets;
 
 import static org.apache.streampipes.extensions.connectors.plc.adapter.modbus.Plc4xModbusAdapter.ID;
 import static org.apache.streampipes.extensions.connectors.plc.adapter.modbus.Plc4xModbusAdapter.PLC_IP;
@@ -40,9 +40,9 @@ import static org.apache.streampipes.extensions.connectors.plc.adapter.modbus.Pl
 public class Plc4xModbusAdapterVersionedConfig {
 
   public static AdapterDescription getPlc4xModbusAdapterDescriptionV0() {
-    return AdapterConfigurationBuilder.create(ID, 0, Plc4xModbusAdapter::new)
+    return AdapterConfigurationBuilder.create(ID, 0, () -> new Plc4xModbusAdapter(null))
                                       .withLocales(Locales.EN)
-                                      .withAssets(Assets.DOCUMENTATION, Assets.ICON)
+                                      .withAssets(ExtensionAssetType.DOCUMENTATION, ExtensionAssetType.ICON)
                                       .withCategory(AdapterType.Manufacturing)
                                       .requiredTextParameter(Labels.withId(PLC_IP))
                                       .requiredTextParameter(Labels.withId(PLC_PORT))