Repository: apache/streampipes
Pull request #2121 (2023-11-02 12:58:50)

1980 arrays are not supported for s7 plcs
<!--
  ~ 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.
-->

See #1980 

### 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



Patch:
diff --git a/streampipes-extensions-management/pom.xml b/streampipes-extensions-management/pom.xml
index a63d88a2f1..7ce180de6c 100644
--- a/streampipes-extensions-management/pom.xml
+++ b/streampipes-extensions-management/pom.xml
@@ -63,31 +63,6 @@
             <artifactId>streampipes-measurement-units</artifactId>
             <version>0.93.0-SNAPSHOT</version>
         </dependency>
-        <dependency>
-            <groupId>org.apache.streampipes</groupId>
-            <artifactId>streampipes-messaging-kafka</artifactId>
-            <version>0.93.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.streampipes</groupId>
-            <artifactId>streampipes-messaging-jms</artifactId>
-            <version>0.93.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.streampipes</groupId>
-            <artifactId>streampipes-messaging-mqtt</artifactId>
-            <version>0.93.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.streampipes</groupId>
-            <artifactId>streampipes-messaging-nats</artifactId>
-            <version>0.93.0-SNAPSHOT</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.streampipes</groupId>
-            <artifactId>streampipes-messaging-pulsar</artifactId>
-            <version>0.93.0-SNAPSHOT</version>
-        </dependency>
         <dependency>
             <groupId>org.apache.streampipes</groupId>
             <artifactId>streampipes-sdk</artifactId>
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/AdapterPipelineGenerator.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/AdapterPipelineGenerator.java
index 3fe2452559..2e20e276c9 100644
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/AdapterPipelineGenerator.java
+++ b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/AdapterPipelineGenerator.java
@@ -19,21 +19,9 @@
 package org.apache.streampipes.extensions.management.connect.adapter;
 
 import org.apache.streampipes.connect.shared.AdapterPipelineGeneratorBase;
-import org.apache.streampipes.extensions.management.client.StreamPipesClientResolver;
 import org.apache.streampipes.extensions.management.connect.adapter.model.pipeline.AdapterPipeline;
 import org.apache.streampipes.extensions.management.connect.adapter.preprocessing.elements.SendToBrokerAdapterSink;
-import org.apache.streampipes.extensions.management.connect.adapter.preprocessing.elements.SendToJmsAdapterSink;
-import org.apache.streampipes.extensions.management.connect.adapter.preprocessing.elements.SendToKafkaAdapterSink;
-import org.apache.streampipes.extensions.management.connect.adapter.preprocessing.elements.SendToMqttAdapterSink;
-import org.apache.streampipes.extensions.management.connect.adapter.preprocessing.elements.SendToNatsAdapterSink;
-import org.apache.streampipes.extensions.management.connect.adapter.preprocessing.elements.SendToPulsarAdapterSink;
-import org.apache.streampipes.model.configuration.MessagingSettings;
-import org.apache.streampipes.model.configuration.SpProtocol;
 import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.grounding.JmsTransportProtocol;
-import org.apache.streampipes.model.grounding.KafkaTransportProtocol;
-import org.apache.streampipes.model.grounding.MqttTransportProtocol;
-import org.apache.streampipes.model.grounding.PulsarTransportProtocol;
 
 public class AdapterPipelineGenerator extends AdapterPipelineGeneratorBase {
 
@@ -51,31 +39,8 @@ public class AdapterPipelineGenerator extends AdapterPipelineGeneratorBase {
     }
   }
 
-  private SendToBrokerAdapterSink<?> getAdapterSink(AdapterDescription adapterDescription) {
-    var prioritizedProtocol =
-        getMessagingSettings().getPrioritizedProtocols().get(0);
-
-    if (isPrioritized(prioritizedProtocol, JmsTransportProtocol.class)) {
-      return new SendToJmsAdapterSink(adapterDescription);
-    } else if (isPrioritized(prioritizedProtocol, KafkaTransportProtocol.class)) {
-      return new SendToKafkaAdapterSink(adapterDescription);
-    } else if (isPrioritized(prioritizedProtocol, MqttTransportProtocol.class)) {
-      return new SendToMqttAdapterSink(adapterDescription);
-    } else if (isPrioritized(prioritizedProtocol, PulsarTransportProtocol.class)) {
-      return new SendToPulsarAdapterSink(adapterDescription);
-    } else {
-      return new SendToNatsAdapterSink(adapterDescription);
-    }
-  }
-
-  private boolean isPrioritized(SpProtocol prioritizedProtocol,
-                                Class<?> protocolClass) {
-    return prioritizedProtocol.getProtocolClass().equals(protocolClass.getCanonicalName());
-  }
-
-  private MessagingSettings getMessagingSettings() {
-    var client = new StreamPipesClientResolver().makeStreamPipesClientInstance();
-    return client.adminApi().getMessagingSettings();
+  private SendToBrokerAdapterSink getAdapterSink(AdapterDescription adapterDescription) {
+    return new SendToBrokerAdapterSink(adapterDescription);
   }
 
   private boolean hasValidGrounding(AdapterDescription adapterDescription) {
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToBrokerAdapterSink.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToBrokerAdapterSink.java
index b9cebe2581..66983df357 100644
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToBrokerAdapterSink.java
+++ b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToBrokerAdapterSink.java
@@ -19,51 +19,52 @@ package org.apache.streampipes.extensions.management.connect.adapter.preprocessi
 
 import org.apache.streampipes.commons.environment.Environment;
 import org.apache.streampipes.commons.environment.Environments;
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
 import org.apache.streampipes.dataformat.SpDataFormatDefinition;
 import org.apache.streampipes.extensions.api.connect.IAdapterPipelineElement;
 import org.apache.streampipes.extensions.api.monitoring.SpMonitoringManager;
 import org.apache.streampipes.extensions.management.connect.adapter.util.TransportFormatSelector;
 import org.apache.streampipes.extensions.management.monitoring.ExtensionsLogger;
 import org.apache.streampipes.messaging.EventProducer;
+import org.apache.streampipes.messaging.SpProtocolManager;
 import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+import org.apache.streampipes.model.grounding.KafkaTransportProtocol;
 import org.apache.streampipes.model.grounding.TransportFormat;
 import org.apache.streampipes.model.grounding.TransportProtocol;
 
 import java.util.Map;
 
-public abstract class SendToBrokerAdapterSink<T extends TransportProtocol> implements IAdapterPipelineElement {
+public class SendToBrokerAdapterSink implements IAdapterPipelineElement {
 
   protected AdapterDescription adapterDescription;
   protected SpDataFormatDefinition dataFormatDefinition;
-  protected T protocol;
+  protected TransportProtocol protocol;
   private final EventProducer producer;
 
-  public SendToBrokerAdapterSink(AdapterDescription adapterDescription,
-                                 Class<T> protocolClass) {
+  public SendToBrokerAdapterSink(AdapterDescription adapterDescription) {
     this.adapterDescription = adapterDescription;
-    this.protocol = protocolClass.cast(adapterDescription
+    this.protocol = adapterDescription
         .getEventGrounding()
-        .getTransportProtocol());
+        .getTransportProtocol();
 
     if (getEnvironment().getSpDebug().getValueOrDefault()) {
       modifyProtocolForDebugging(this.protocol);
     }
 
-    this.producer = makeProducer(this.protocol);
+    var producerOpt = SpProtocolManager.INSTANCE.findDefinition(this.protocol);
+    if (producerOpt.isPresent()) {
+      this.producer = producerOpt.get().getProducer(this.protocol);
 
-    TransportFormat transportFormat = adapterDescription
-        .getEventGrounding()
-        .getTransportFormats()
-        .get(0);
+      TransportFormat transportFormat = adapterDescription
+          .getEventGrounding()
+          .getTransportFormats()
+          .get(0);
 
-    this.dataFormatDefinition =
-        new TransportFormatSelector(transportFormat).getDataFormatDefinition();
+      this.dataFormatDefinition =
+          new TransportFormatSelector(transportFormat).getDataFormatDefinition();
 
-    try {
       producer.connect();
-    } catch (SpRuntimeException e) {
-      e.printStackTrace();
+    } else {
+      throw new RuntimeException("Could not find protocol");
     }
   }
 
@@ -86,9 +87,12 @@ public abstract class SendToBrokerAdapterSink<T extends TransportProtocol> imple
     producer.publish(event);
   }
 
-  protected abstract EventProducer makeProducer(T protocol);
-
-  public abstract void modifyProtocolForDebugging(T protocol);
+  public void modifyProtocolForDebugging(TransportProtocol protocol) {
+    protocol.setBrokerHostname("localhost");
+    if (protocol instanceof KafkaTransportProtocol) {
+      ((KafkaTransportProtocol) protocol).setKafkaPort(9094);
+    }
+  }
 
   private Environment getEnvironment() {
     return Environments.getEnvironment();
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToJmsAdapterSink.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToJmsAdapterSink.java
deleted file mode 100644
index 98af0b42c2..0000000000
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToJmsAdapterSink.java
+++ /dev/null
@@ -1,42 +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.management.connect.adapter.preprocessing.elements;
-
-import org.apache.streampipes.extensions.api.connect.IAdapterPipelineElement;
-import org.apache.streampipes.messaging.EventProducer;
-import org.apache.streampipes.messaging.jms.ActiveMQPublisher;
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.grounding.JmsTransportProtocol;
-
-public class SendToJmsAdapterSink extends SendToBrokerAdapterSink<JmsTransportProtocol>
-    implements IAdapterPipelineElement {
-
-  public SendToJmsAdapterSink(AdapterDescription adapterDescription) {
-    super(adapterDescription, JmsTransportProtocol.class);
-  }
-
-  @Override
-  protected EventProducer makeProducer(JmsTransportProtocol protocol) {
-    return new ActiveMQPublisher(protocol);
-  }
-
-  @Override
-  public void modifyProtocolForDebugging(JmsTransportProtocol protocol) {
-    protocol.setBrokerHostname("localhost");
-  }
-}
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToKafkaAdapterSink.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToKafkaAdapterSink.java
deleted file mode 100644
index 5db6d32b2b..0000000000
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToKafkaAdapterSink.java
+++ /dev/null
@@ -1,43 +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.management.connect.adapter.preprocessing.elements;
-
-import org.apache.streampipes.extensions.api.connect.IAdapterPipelineElement;
-import org.apache.streampipes.messaging.EventProducer;
-import org.apache.streampipes.messaging.kafka.SpKafkaProducer;
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.grounding.KafkaTransportProtocol;
-
-public class SendToKafkaAdapterSink extends SendToBrokerAdapterSink<KafkaTransportProtocol>
-    implements IAdapterPipelineElement {
-
-  public SendToKafkaAdapterSink(AdapterDescription adapterDescription) {
-    super(adapterDescription, KafkaTransportProtocol.class);
-  }
-
-  @Override
-  protected EventProducer makeProducer(KafkaTransportProtocol protocol) {
-    return new SpKafkaProducer(protocol);
-  }
-
-  @Override
-  public void modifyProtocolForDebugging(KafkaTransportProtocol protocol) {
-    protocol.setBrokerHostname("localhost");
-    protocol.setKafkaPort(9094);
-  }
-}
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToMqttAdapterSink.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToMqttAdapterSink.java
deleted file mode 100644
index d2823c1c5b..0000000000
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToMqttAdapterSink.java
+++ /dev/null
@@ -1,42 +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.management.connect.adapter.preprocessing.elements;
-
-import org.apache.streampipes.extensions.api.connect.IAdapterPipelineElement;
-import org.apache.streampipes.messaging.EventProducer;
-import org.apache.streampipes.messaging.mqtt.MqttPublisher;
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.grounding.MqttTransportProtocol;
-
-public class SendToMqttAdapterSink extends SendToBrokerAdapterSink<MqttTransportProtocol>
-    implements IAdapterPipelineElement {
-
-  public SendToMqttAdapterSink(AdapterDescription adapterDescription) {
-    super(adapterDescription, MqttTransportProtocol.class);
-  }
-
-  @Override
-  protected EventProducer makeProducer(MqttTransportProtocol protocol) {
-    return new MqttPublisher(protocol);
-  }
-
-  @Override
-  public void modifyProtocolForDebugging(MqttTransportProtocol transportProtocol) {
-    protocol.setBrokerHostname("localhost");
-  }
-}
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToNatsAdapterSink.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToNatsAdapterSink.java
deleted file mode 100644
index 5216ee0b04..0000000000
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToNatsAdapterSink.java
+++ /dev/null
@@ -1,43 +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.management.connect.adapter.preprocessing.elements;
-
-import org.apache.streampipes.extensions.api.connect.IAdapterPipelineElement;
-import org.apache.streampipes.messaging.EventProducer;
-import org.apache.streampipes.messaging.nats.NatsPublisher;
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.grounding.NatsTransportProtocol;
-
-public class SendToNatsAdapterSink extends SendToBrokerAdapterSink<NatsTransportProtocol>
-    implements IAdapterPipelineElement {
-
-  public SendToNatsAdapterSink(AdapterDescription adapterDescription) {
-    super(adapterDescription, NatsTransportProtocol.class);
-  }
-
-  @Override
-  protected EventProducer makeProducer(NatsTransportProtocol protocol) {
-    return new NatsPublisher(protocol);
-  }
-
-  @Override
-  public void modifyProtocolForDebugging(NatsTransportProtocol protocol) {
-    protocol.setBrokerHostname("localhost");
-  }
-}
diff --git a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToPulsarAdapterSink.java b/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToPulsarAdapterSink.java
deleted file mode 100644
index b9f3ba56d3..0000000000
--- a/streampipes-extensions-management/src/main/java/org/apache/streampipes/extensions/management/connect/adapter/preprocessing/elements/SendToPulsarAdapterSink.java
+++ /dev/null
@@ -1,43 +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.management.connect.adapter.preprocessing.elements;
-
-import org.apache.streampipes.extensions.api.connect.IAdapterPipelineElement;
-import org.apache.streampipes.messaging.EventProducer;
-import org.apache.streampipes.messaging.pulsar.PulsarProducer;
-import org.apache.streampipes.model.connect.adapter.AdapterDescription;
-import org.apache.streampipes.model.grounding.PulsarTransportProtocol;
-
-public class SendToPulsarAdapterSink extends SendToBrokerAdapterSink<PulsarTransportProtocol>
-    implements IAdapterPipelineElement {
-
-  public SendToPulsarAdapterSink(AdapterDescription adapterDescription) {
-    super(adapterDescription, PulsarTransportProtocol.class);
-  }
-
-  @Override
-  protected EventProducer makeProducer(PulsarTransportProtocol protocol) {
-    return new PulsarProducer(protocol);
-  }
-
-  @Override
-  public void modifyProtocolForDebugging(PulsarTransportProtocol protocol) {
-    protocol.setBrokerHostname("pulsar://localhost:6650");
-  }
-}
diff --git a/streampipes-extensions/pom.xml b/streampipes-extensions/pom.xml
index b14c2471b2..0e89e64f6c 100644
--- a/streampipes-extensions/pom.xml
+++ b/streampipes-extensions/pom.xml
@@ -63,6 +63,7 @@
         <module>streampipes-sinks-databases-jvm</module>
         <module>streampipes-sinks-internal-jvm</module>
         <module>streampipes-sinks-notifications-jvm</module>
+        <module>streampipes-connectors-plc</module>
     </modules>
 
     <properties>
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/pom.xml b/streampipes-extensions/streampipes-connect-adapters-iiot/pom.xml
index 39d51cf868..8d5bff6371 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/pom.xml
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/pom.xml
@@ -59,6 +59,11 @@
             <artifactId>streampipes-connectors-opcua</artifactId>
             <version>0.93.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-connectors-plc</artifactId>
+            <version>0.93.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.streampipes</groupId>
             <artifactId>streampipes-connectors-rocketmq</artifactId>
@@ -138,30 +143,6 @@
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-text</artifactId>
         </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x</groupId>
-            <artifactId>plc4j-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x</groupId>
-            <artifactId>plc4j-connection-pool</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x</groupId>
-            <artifactId>plc4j-driver-s7</artifactId>
-            <scope>runtime</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.fasterxml.woodstox</groupId>
-                    <artifactId>woodstox-core</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.plc4x</groupId>
-            <artifactId>plc4j-driver-modbus</artifactId>
-            <scope>runtime</scope>
-        </dependency>
         <dependency>
             <groupId>org.bouncycastle</groupId>
             <artifactId>bcprov-jdk15on</artifactId>
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/ConnectAdapterIiotInit.java b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/ConnectAdapterIiotInit.java
index fa651ea92d..dd48df49be 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/ConnectAdapterIiotInit.java
+++ b/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/ConnectAdapterIiotInit.java
@@ -19,8 +19,6 @@
 package org.apache.streampipes.connect.iiot;
 
 import org.apache.streampipes.connect.iiot.adapters.iolink.IfmAlMqttAdapter;
-import org.apache.streampipes.connect.iiot.adapters.plc4x.modbus.Plc4xModbusAdapter;
-import org.apache.streampipes.connect.iiot.adapters.plc4x.s7.Plc4xS7Adapter;
 import org.apache.streampipes.connect.iiot.adapters.ros.RosBridgeAdapter;
 import org.apache.streampipes.connect.iiot.adapters.simulator.machine.MachineDataSimulatorAdapter;
 import org.apache.streampipes.connect.iiot.protocol.stream.FileReplayAdapter;
@@ -31,6 +29,9 @@ import org.apache.streampipes.extensions.connectors.mqtt.adapter.MqttProtocol;
 import org.apache.streampipes.extensions.connectors.nats.adapter.NatsProtocol;
 import org.apache.streampipes.extensions.connectors.opcua.adapter.OpcUaAdapter;
 import org.apache.streampipes.extensions.connectors.opcua.migration.OpcUaAdapterMigrationV1;
+import org.apache.streampipes.extensions.connectors.plc.adapter.migration.Plc4xS7AdapterMigrationV1;
+import org.apache.streampipes.extensions.connectors.plc.adapter.modbus.Plc4xModbusAdapter;
+import org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter;
 import org.apache.streampipes.extensions.connectors.pulsar.adapter.PulsarProtocol;
 import org.apache.streampipes.extensions.connectors.rocketmq.adapter.RocketMQProtocol;
 import org.apache.streampipes.extensions.connectors.tubemq.adapter.TubeMQProtocol;
@@ -65,7 +66,10 @@ public class ConnectAdapterIiotInit extends ExtensionsModelSubmitter {
         .registerAdapter(new HttpServerProtocol())
         .registerAdapter(new TubeMQProtocol())
 
-        .registerMigrators(new OpcUaAdapterMigrationV1())
+        .registerMigrators(
+            new OpcUaAdapterMigrationV1(),
+            new Plc4xS7AdapterMigrationV1()
+        )
         .build();
   }
 }
diff --git a/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/config/SpOpcUaConfigExtractor.java b/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/config/SpOpcUaConfigExtractor.java
index 2c3e3b1383..612b3e4905 100644
--- a/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/config/SpOpcUaConfigExtractor.java
+++ b/streampipes-extensions/streampipes-connectors-opcua/src/main/java/org/apache/streampipes/extensions/connectors/opcua/config/SpOpcUaConfigExtractor.java
@@ -24,7 +24,6 @@ import org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaUtil;
 
 import java.util.List;
 
-import static org.apache.kafka.common.config.ConfigDef.Type.PASSWORD;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.ACCESS_MODE;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.ADAPTER_TYPE;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.AVAILABLE_NODES;
@@ -33,6 +32,7 @@ import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabe
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.OPC_SERVER_PORT;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.OPC_SERVER_URL;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.OPC_URL;
+import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.PASSWORD;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.PULLING_INTERVAL;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.PULL_MODE;
 import static org.apache.streampipes.extensions.connectors.opcua.utils.OpcUaLabels.UNAUTHENTICATED;
diff --git a/streampipes-extensions/streampipes-connectors-plc/pom.xml b/streampipes-extensions/streampipes-connectors-plc/pom.xml
new file mode 100644
index 0000000000..e41573b065
--- /dev/null
+++ b/streampipes-extensions/streampipes-connectors-plc/pom.xml
@@ -0,0 +1,81 @@
+<?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
+  ~ 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.
+  ~
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.streampipes</groupId>
+        <artifactId>streampipes-extensions</artifactId>
+        <version>0.93.0-SNAPSHOT</version>
+    </parent>
+
+    <artifactId>streampipes-connectors-plc</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-extensions-api</artifactId>
+            <version>0.93.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-extensions-management</artifactId>
+            <version>0.93.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-sdk</artifactId>
+            <version>0.93.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.plc4x</groupId>
+            <artifactId>plc4j-api</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.plc4x</groupId>
+            <artifactId>plc4j-connection-pool</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.plc4x</groupId>
+            <artifactId>plc4j-driver-s7</artifactId>
+            <scope>runtime</scope>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.fasterxml.woodstox</groupId>
+                    <artifactId>woodstox-core</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.plc4x</groupId>
+            <artifactId>plc4j-driver-modbus</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+</project>
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/Plc4xS7AdapterMigrationV1.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/Plc4xS7AdapterMigrationV1.java
new file mode 100644
index 0000000000..c88d3f9a5b
--- /dev/null
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/migration/Plc4xS7AdapterMigrationV1.java
@@ -0,0 +1,87 @@
+/*
+ * 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.migration;
+
+import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
+import org.apache.streampipes.extensions.api.migration.IAdapterMigrator;
+import org.apache.streampipes.model.connect.adapter.AdapterDescription;
+import org.apache.streampipes.model.extensions.svcdiscovery.SpServiceTagPrefix;
+import org.apache.streampipes.model.migration.MigrationResult;
+import org.apache.streampipes.model.migration.ModelMigratorConfig;
+import org.apache.streampipes.model.staticproperty.CollectionStaticProperty;
+import org.apache.streampipes.model.staticproperty.StaticProperty;
+import org.apache.streampipes.sdk.StaticProperties;
+import org.apache.streampipes.sdk.helpers.Alternatives;
+import org.apache.streampipes.sdk.helpers.CodeLanguage;
+import org.apache.streampipes.sdk.helpers.Labels;
+
+import java.util.List;
+
+import static org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter.CODE_TEMPLATE;
+import static org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter.PLC_CODE_BLOCK;
+import static org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter.PLC_NODES;
+import static org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter.PLC_NODE_INPUT_ALTERNATIVES;
+import static org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter.PLC_NODE_INPUT_CODE_BLOCK_ALTIVE;
+import static org.apache.streampipes.extensions.connectors.plc.adapter.s7.Plc4xS7Adapter.PLC_NODE_INPUT_COLLECTION_ALTERNATIVE;
+
+public class Plc4xS7AdapterMigrationV1 implements IAdapterMigrator {
+  @Override
+  public ModelMigratorConfig config() {
+    return new ModelMigratorConfig(
+        "org.apache.streampipes.connect.iiot.adapters.plc4x.s7",
+        SpServiceTagPrefix.ADAPTER,
+        0,
+        1
+    );
+  }
+
+  @Override
+  public MigrationResult<AdapterDescription> migrate(AdapterDescription element,
+                                                     IStaticPropertyExtractor extractor) throws RuntimeException {
+    var newConfigs = new java.util.ArrayList<>(element.getConfig().stream().map(config -> {
+      if (isCollectionConfig(config)) {
+        return modifyCollection((CollectionStaticProperty) config);
+      } else {
+        return config;
+      }
+    }).toList());
+
+    newConfigs.removeIf(c -> c.getInternalName().equals(PLC_NODES));
+    element.setConfig(newConfigs);
+
+    return MigrationResult.success(element);
+  }
+
+  private StaticProperty modifyCollection(CollectionStaticProperty collectionConfig) {
+
+    var alternatives = List.of(
+        Alternatives.from(Labels.withId(PLC_NODE_INPUT_COLLECTION_ALTERNATIVE),
+            collectionConfig,
+            true),
+        Alternatives.from(Labels.withId(PLC_NODE_INPUT_CODE_BLOCK_ALTIVE),
+            StaticProperties.codeStaticProperty(Labels.withId(PLC_CODE_BLOCK), CodeLanguage.None, CODE_TEMPLATE))
+    );
+
+    return StaticProperties.alternatives(Labels.withId(PLC_NODE_INPUT_ALTERNATIVES), alternatives);
+  }
+
+  private boolean isCollectionConfig(StaticProperty config) {
+    return config.getInternalName().equals(PLC_NODES);
+  }
+}
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/modbus/ModbusConfigFile.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/ModbusConfigFile.java
similarity index 95%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/modbus/ModbusConfigFile.java
rename to streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/ModbusConfigFile.java
index fbda391ecc..f6e3961126 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/modbus/ModbusConfigFile.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/ModbusConfigFile.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.connect.iiot.adapters.plc4x.modbus;
+package org.apache.streampipes.extensions.connectors.plc.adapter.modbus;
 
 public class ModbusConfigFile {
 
@@ -58,4 +58,4 @@ public class ModbusConfigFile {
   public void setLogicalAddress(String logicalAddress) {
     this.logicalAddress = logicalAddress;
   }
-}
\ No newline at end of file
+}
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/modbus/Plc4xModbusAdapter.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java
similarity index 99%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/modbus/Plc4xModbusAdapter.java
rename to streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java
index c755901d58..6938ead546 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/modbus/Plc4xModbusAdapter.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/modbus/Plc4xModbusAdapter.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.connect.iiot.adapters.plc4x.modbus;
+package org.apache.streampipes.extensions.connectors.plc.adapter.modbus;
 
 
 import org.apache.streampipes.commons.exceptions.connect.AdapterException;
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/s7/Plc4xS7Adapter.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java
similarity index 64%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/s7/Plc4xS7Adapter.java
rename to streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java
index 5913480d80..103e428cb1 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/s7/Plc4xS7Adapter.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/Plc4xS7Adapter.java
@@ -16,10 +16,11 @@
  *
  */
 
-package org.apache.streampipes.connect.iiot.adapters.plc4x.s7;
+package org.apache.streampipes.extensions.connectors.plc.adapter.s7;
 
 
 import org.apache.streampipes.commons.exceptions.connect.AdapterException;
+import org.apache.streampipes.extensions.connectors.plc.adapter.s7.config.ConfigurationParser;
 import org.apache.streampipes.extensions.api.connect.IAdapterConfiguration;
 import org.apache.streampipes.extensions.api.connect.IEventCollector;
 import org.apache.streampipes.extensions.api.connect.IPullAdapter;
@@ -33,6 +34,7 @@ import org.apache.streampipes.extensions.management.connect.adapter.util.Polling
 import org.apache.streampipes.model.AdapterType;
 import org.apache.streampipes.model.connect.guess.GuessSchema;
 import org.apache.streampipes.model.schema.EventProperty;
+import org.apache.streampipes.model.schema.EventPropertyList;
 import org.apache.streampipes.model.staticproperty.CollectionStaticProperty;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.staticproperty.StaticPropertyGroup;
@@ -41,11 +43,12 @@ import org.apache.streampipes.sdk.builder.PrimitivePropertyBuilder;
 import org.apache.streampipes.sdk.builder.adapter.AdapterConfigurationBuilder;
 import org.apache.streampipes.sdk.builder.adapter.GuessSchemaBuilder;
 import org.apache.streampipes.sdk.extractor.StaticPropertyExtractor;
+import org.apache.streampipes.sdk.helpers.Alternatives;
+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.streampipes.sdk.utils.Datatypes;
 
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
@@ -53,6 +56,7 @@ import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.api.value.PlcValue;
 import org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -78,17 +82,33 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
    */
   private static final String PLC_IP = "plc_ip";
   private static final String PLC_POLLING_INTERVAL = "plc_polling_interval";
-  private static final String PLC_NODES = "plc_nodes";
+  public static final String PLC_NODES = "plc_nodes";
   private static final String PLC_NODE_NAME = "plc_node_name";
   private static final String PLC_NODE_RUNTIME_NAME = "plc_node_runtime_name";
   private static final String PLC_NODE_TYPE = "plc_node_type";
 
+  public static final String PLC_NODE_INPUT_CODE_BLOCK_ALTIVE = "plc_node_input_code_block_altive";
+  public static final String PLC_CODE_BLOCK = "plc_code_block";
+  public static final String PLC_NODE_INPUT_ALTERNATIVES = "plc_node_input_alternatives";
+  public static final String PLC_NODE_INPUT_COLLECTION_ALTERNATIVE = "plc_node_input_collection_alternative";
+
+  public static final String CODE_TEMPLATE = """
+      // This code block can be used to manually specify the addresses of the PLC registers.
+      // The syntax is based on the PLC4X syntax, see [1].
+      // Address Pattern:
+      // propertyName=%{Memory-Area}{start-address}:{Data-Type}[{array-size}]
+
+      temperature=%I0.0:INT
+
+      // [1] https://plc4x.apache.org/users/protocols/s7.html
+      """;
+
   /**
    * Values of user configuration parameters
    */
   private String ip;
   private int pollingInterval;
-  private List<Map<String, String>> nodes;
+  private Map<String, String> nodes;
 
   private PlcDriverManager driverManager;
 
@@ -101,10 +121,8 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
 
   /**
    * This method is executed when the adapter is started. A connection to the PLC is initialized
-   *
-   * @throws AdapterException
    */
-  private void before(IStaticPropertyExtractor extractor) throws AdapterException {
+  private void before(IStaticPropertyExtractor extractor) {
     // Extract user input
     getConfigurations(extractor);
 
@@ -134,17 +152,18 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
     }
   }
 
-  private PlcReadRequest makeReadRequest(PlcConnection plcConnection) throws PlcConnectionException {
+  private PlcReadRequest makeReadRequest(PlcConnection plcConnection) {
     PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
-    for (Map<String, String> node : this.nodes) {
-      builder.addItem(node.get(PLC_NODE_NAME),
-          node.get(PLC_NODE_NAME) + ":" + node.get(PLC_NODE_TYPE).toUpperCase().replaceAll(" ", "_"));
+
+    for (Map.Entry<String, String> entry : this.nodes.entrySet()) {
+      builder.addItem(entry.getKey(), entry.getValue());
     }
+
     return builder.build();
   }
 
   private void readPlcData(
-      PlcConnection plcConnection, PlcReadResponseHandler handler) throws PlcConnectionException {
+      PlcConnection plcConnection, PlcReadResponseHandler handler) {
     var readRequest = makeReadRequest(plcConnection);
     // Execute the request
     CompletableFuture<? extends PlcReadResponse> asyncResponse = readRequest.execute();
@@ -175,44 +194,28 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
    *
    * @param extractor StaticPropertyExtractor
    */
-  private void getConfigurations(IStaticPropertyExtractor extractor) throws AdapterException {
+  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 ArrayList<>();
-    CollectionStaticProperty sp = (CollectionStaticProperty) extractor.getStaticPropertyByName(PLC_NODES);
-
-    for (StaticProperty member : sp.getMembers()) {
-      StaticPropertyExtractor memberExtractor =
-          StaticPropertyExtractor.from(((StaticPropertyGroup) member).getStaticProperties(), new ArrayList<>());
-      Map<String, String> map = new HashMap<>();
-      map.put(PLC_NODE_RUNTIME_NAME, memberExtractor.textParameter(PLC_NODE_RUNTIME_NAME));
-      map.put(PLC_NODE_NAME, memberExtractor.textParameter(PLC_NODE_NAME));
-      map.put(PLC_NODE_TYPE, memberExtractor.selectedSingleValue(PLC_NODE_TYPE, String.class));
-      this.nodes.add(map);
-    }
-  }
+    this.nodes = new HashMap<>();
 
-  /**
-   * Transforms PLC4X data types to datatypes supported in StreamPipes
-   *
-   * @param plcType String
-   * @return Datatypes
-   */
-  private Datatypes getStreamPipesDataType(String plcType) throws AdapterException {
+    var selectedAlternative = extractor.selectedAlternativeInternalId(PLC_NODE_INPUT_ALTERNATIVES);
 
-    String type = plcType.substring(plcType.lastIndexOf(":") + 1);
+    if (selectedAlternative.equals(PLC_NODE_INPUT_COLLECTION_ALTERNATIVE)) {
+      // Alternative Simple
+      var csp = (CollectionStaticProperty) extractor.getStaticPropertyByName(PLC_NODES);
+      this.nodes = getNodeInformationFromCollectionStaticProperty(csp);
 
-    return switch (type) {
-      case "BOOL" -> Datatypes.Boolean;
-      case "BYTE", "REAL" -> Datatypes.Float;
-      case "INT" -> Datatypes.Integer;
-      case "WORD", "TIME_OF_DAY", "DATE", "DATE_AND_TIME", "STRING", "CHAR" -> Datatypes.String;
-      default -> throw new AdapterException("Datatype " + plcType + " is not supported");
-    };
+    } else {
+      // Alternative Advanced
+      var codePropertyInput = extractor.codeblockValue(PLC_CODE_BLOCK);
+      this.nodes = new ConfigurationParser().getNodeInformationFromCodeProperty(codePropertyInput);
+    }
   }
 
+
   @Override
   public void onReadResult(PlcReadResponse response, Throwable throwable) {
     if (throwable != null) {
@@ -226,13 +229,26 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
   }
 
   private Map<String, Object> makeEvent(PlcReadResponse response) {
-    Map<String, Object> event = new HashMap<>();
-    for (Map<String, String> node : this.nodes) {
-      if (response.getResponseCode(node.get(PLC_NODE_NAME)) == PlcResponseCode.OK) {
-        event.put(node.get(PLC_NODE_RUNTIME_NAME), response.getObject(node.get(PLC_NODE_NAME)));
+    var event = new HashMap<String, Object>();
+
+    for (String key : this.nodes.keySet()) {
+      if (response.getResponseCode(key) == PlcResponseCode.OK) {
+
+        // if the response is a list, add each element to the result
+        if (response.getObject(key) instanceof List) {
+          event.put(key,
+              response.getAsPlcValue()
+                  .getValue(key)
+                  .getList().stream()
+                  .map(PlcValue::getObject)
+                  .toList()
+                  .toArray());
+        } else {
+          event.put(key, response.getObject(key));
+        }
       } else {
-        LOG.error("Error[" + node.get(PLC_NODE_NAME) + "]: "
-            + response.getResponseCode(node.get(PLC_NODE_NAME)).name());
+        LOG.error("Error[" + key + "]: "
+                  + response.getResponseCode(key).name());
       }
     }
     return event;
@@ -246,18 +262,24 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
    */
   @Override
   public IAdapterConfiguration declareConfig() {
-    return AdapterConfigurationBuilder.create(ID, Plc4xS7Adapter::new)
+    return AdapterConfigurationBuilder.create(ID, 1, Plc4xS7Adapter::new)
         .withLocales(Locales.EN)
         .withAssets(Assets.DOCUMENTATION, Assets.ICON)
         .withCategory(AdapterType.Manufacturing)
         .requiredTextParameter(Labels.withId(PLC_IP))
         .requiredIntegerParameter(Labels.withId(PLC_POLLING_INTERVAL), 1000)
-        .requiredCollection(Labels.withId(PLC_NODES),
-            StaticProperties.stringFreeTextProperty(Labels.withId(PLC_NODE_RUNTIME_NAME)),
-            StaticProperties.stringFreeTextProperty(Labels.withId(PLC_NODE_NAME)),
-            StaticProperties.singleValueSelection(Labels.withId(PLC_NODE_TYPE),
-                Options.from("Bool", "Byte", "Int", "Word", "Real", "Char", "String", "Date", "Time of day",
-                    "Date and Time")))
+        .requiredAlternatives(
+            Labels.withId(PLC_NODE_INPUT_ALTERNATIVES),
+            Alternatives.from(Labels.withId(PLC_NODE_INPUT_COLLECTION_ALTERNATIVE),
+                StaticProperties.collection(Labels.withId(PLC_NODES),
+                    StaticProperties.stringFreeTextProperty(Labels.withId(PLC_NODE_RUNTIME_NAME)),
+                    StaticProperties.stringFreeTextProperty(Labels.withId(PLC_NODE_NAME)),
+                    StaticProperties.singleValueSelection(Labels.withId(PLC_NODE_TYPE),
+                        Options.from("Bool", "Byte", "Int", "Word", "Real", "Char", "String", "Date", "Time of day",
+                            "Date and Time"))),
+                true),
+            Alternatives.from(Labels.withId(PLC_NODE_INPUT_CODE_BLOCK_ALTIVE),
+                StaticProperties.codeStaticProperty(Labels.withId(PLC_CODE_BLOCK), CodeLanguage.None, CODE_TEMPLATE)))
         .buildConfiguration();
   }
 
@@ -291,17 +313,27 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
       GuessSchemaBuilder builder = GuessSchemaBuilder.create();
       List<EventProperty> allProperties = new ArrayList<>();
 
-      for (Map<String, String> node : this.nodes) {
-        Datatypes datatype = getStreamPipesDataType(node.get(PLC_NODE_TYPE)
-            .toUpperCase()
-            .replaceAll(" ", "_"));
-
-        allProperties.add(
-            PrimitivePropertyBuilder
-                .create(datatype, node.get(PLC_NODE_RUNTIME_NAME))
-                .label(node.get(PLC_NODE_RUNTIME_NAME))
-                .description("")
-                .build());
+      for (Map.Entry<String, String> entry : this.nodes.entrySet()) {
+        var datatype = new ConfigurationParser().getStreamPipesDataType(entry.getValue());
+
+        var primitiveProperty = PrimitivePropertyBuilder
+            .create(datatype, entry.getKey())
+            .label(entry.getKey())
+            .description("")
+            .build();
+
+        // Check if the address configuration is an array
+        var isArray = new ConfigurationParser().isPLCArray(entry.getValue());
+
+        if (isArray) {
+          var propertyList = new EventPropertyList();
+          propertyList.setRuntimeName(entry.getKey());
+          propertyList.setLabel(entry.getKey());
+          propertyList.setEventProperty(primitiveProperty);
+          allProperties.add(propertyList);
+        } else {
+          allProperties.add(primitiveProperty);
+        }
       }
 
       this.before(extractor.getStaticPropertyExtractor());
@@ -315,4 +347,36 @@ public class Plc4xS7Adapter implements StreamPipesAdapter, IPullAdapter, PlcRead
       throw new AdapterException(e.getMessage(), e);
     }
   }
+
+
+  private Map<String, String> getNodeInformationFromCollectionStaticProperty(CollectionStaticProperty csp) {
+    var result = new HashMap<String, String>();
+
+    for (StaticProperty member : csp.getMembers()) {
+      StaticPropertyExtractor memberExtractor =
+          StaticPropertyExtractor.from(((StaticPropertyGroup) member).getStaticProperties(), new ArrayList<>());
+
+      result.put(
+          memberExtractor.textParameter(PLC_NODE_RUNTIME_NAME),
+          getNodeAddress(memberExtractor));
+
+    }
+
+    return result;
+  }
+
+  /**
+   * Takes the members of the static property collection from the UI and creates the PLC4X node address
+   *
+   * @param memberExtractor member of the static property node collection
+   * @return string in the format of PLC4X node address
+   */
+  private String getNodeAddress(StaticPropertyExtractor memberExtractor) {
+    return "%s:%s".formatted(
+        memberExtractor.textParameter(PLC_NODE_NAME),
+        memberExtractor.selectedSingleValue(PLC_NODE_TYPE, String.class)
+            .toUpperCase()
+            .replaceAll(" ", "_"));
+  }
+
 }
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/s7/PlcReadResponseHandler.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/PlcReadResponseHandler.java
similarity index 93%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/s7/PlcReadResponseHandler.java
rename to streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/PlcReadResponseHandler.java
index b9b8f1bfc2..2a4a44c762 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/java/org/apache/streampipes/connect/iiot/adapters/plc4x/s7/PlcReadResponseHandler.java
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/PlcReadResponseHandler.java
@@ -16,7 +16,7 @@
  *
  */
 
-package org.apache.streampipes.connect.iiot.adapters.plc4x.s7;
+package org.apache.streampipes.extensions.connectors.plc.adapter.s7;
 
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/config/ConfigurationParser.java b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/config/ConfigurationParser.java
new file mode 100644
index 0000000000..f45b4dbc40
--- /dev/null
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/config/ConfigurationParser.java
@@ -0,0 +1,101 @@
+/*
+ * 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.config;
+
+import org.apache.streampipes.commons.exceptions.connect.AdapterException;
+import org.apache.streampipes.sdk.utils.Datatypes;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+/**
+ * This is a helper class to parse the user input for the PLC4X S7 adapter
+ */
+public class ConfigurationParser {
+
+  /**
+   * This method takes a string with the PLC configuration and parses the configuration accorting to this pattern:
+   * variableName=value
+   *
+   * @param codePropertyValue code block with the PLC configuration
+   * @return returns a list of Maps, with the variable name as the Key and value as value
+   */
+  public Map<String, String> getNodeInformationFromCodeProperty(String codePropertyValue) {
+    var result = new HashMap<String, String>();
+
+    var lines = codePropertyValue.split("\n");
+
+    // pattern to match "variableName=value"
+    var pattern = Pattern.compile("(\\w+)=(.+)");
+
+    for (String line : lines) {
+      // Remove leading and trailing whitespace
+      line = line.trim();
+
+      // Skip comments
+      if (line.startsWith("//")) {
+        continue;
+      }
+
+      // Check if macher matches and add to results list
+      var matcher = pattern.matcher(line);
+      if (matcher.find()) {
+        result.put(matcher.group(1), matcher.group(2));
+      }
+    }
+
+    return result;
+  }
+
+
+  /**
+   * Transforms PLC4X data types to datatypes supported in StreamPipes
+   *
+   * @param plcType String
+   * @return Datatypes
+   */
+  public Datatypes getStreamPipesDataType(String plcType) throws AdapterException {
+
+    String type = plcType.substring(plcType.lastIndexOf(":") + 1);
+
+    // replace array information from type
+    type = type.replaceAll("\\[.*?\\]", "");
+
+    return switch (type) {
+      case "BOOL" -> Datatypes.Boolean;
+      case "BYTE", "REAL" -> Datatypes.Float;
+      case "INT" -> Datatypes.Integer;
+      case "WORD", "TIME_OF_DAY", "DATE", "DATE_AND_TIME", "STRING", "CHAR" -> Datatypes.String;
+      default -> throw new AdapterException("Datatype " + plcType + " is not supported");
+    };
+  }
+
+  /**
+   * Takes the PLC4X address description and validates if it describes an array
+   *
+   * @param plcType address of the register that should be read
+   * @return whether the address describes an array or not
+   */
+  public boolean isPLCArray(String plcType) {
+    return plcType.matches(".*\\[.*\\].*");
+  }
+
+
+}
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/documentation.md b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/documentation.md
similarity index 100%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/documentation.md
rename to streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/documentation.md
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/icon.png b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/icon.png
similarity index 100%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/icon.png
rename to streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/icon.png
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/strings.en b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/strings.en
similarity index 100%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/strings.en
rename to streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.modbus/strings.en
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/documentation.md b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/documentation.md
similarity index 100%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/documentation.md
rename to streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/documentation.md
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/icon.png b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/icon.png
similarity index 100%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/icon.png
rename to streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/icon.png
diff --git a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/strings.en b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/strings.en
similarity index 74%
rename from streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/strings.en
rename to streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/strings.en
index 705c36e030..5aebb1485d 100644
--- a/streampipes-extensions/streampipes-connect-adapters-iiot/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/strings.en
+++ b/streampipes-extensions/streampipes-connectors-plc/src/main/resources/org.apache.streampipes.connect.iiot.adapters.plc4x.s7/strings.en
@@ -41,4 +41,16 @@ plc_node_name.title=Node Name
 plc_node_name.description=example: %Q0.4
 
 plc_node_type.title=Data Type
-plc_node_type.description=example: bool
\ No newline at end of file
+plc_node_type.description=example: bool
+
+plc_node_input_code_block_altive.title=Advanced
+plc_node_input_code_block_altive.description=
+
+plc_code_block.title=Advanced
+plc_code_block.description=Enter the nodes in the code block below, acording to the described format
+
+plc_node_input_alternatives.title=Register Input
+plc_node_input_alternatives.description=The information about the registers can be entered in simple or advanced mode
+
+plc_node_input_collection_alternative.title=Simple
+plc_node_input_collection_alternative.description=
diff --git a/streampipes-extensions/streampipes-extensions-all-iiot/pom.xml b/streampipes-extensions/streampipes-extensions-all-iiot/pom.xml
index e47a0ab0ae..b1caa7a5bf 100644
--- a/streampipes-extensions/streampipes-extensions-all-iiot/pom.xml
+++ b/streampipes-extensions/streampipes-extensions-all-iiot/pom.xml
@@ -61,6 +61,11 @@
             <artifactId>streampipes-connectors-influx</artifactId>
             <version>0.93.0-SNAPSHOT</version>
         </dependency>
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-messaging-pulsar</artifactId>
+            <version>0.93.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.streampipes</groupId>
             <artifactId>streampipes-processors-filters-siddhi</artifactId>
diff --git a/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml b/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml
index 3b03c5940b..bfaa6dc034 100644
--- a/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml
+++ b/streampipes-extensions/streampipes-extensions-all-jvm/pom.xml
@@ -64,6 +64,11 @@
             <classifier>embed</classifier>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.streampipes</groupId>
+            <artifactId>streampipes-messaging-pulsar</artifactId>
+            <version>0.93.0-SNAPSHOT</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.streampipes</groupId>
             <artifactId>streampipes-messaging-nats</artifactId>
diff --git a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/StaticProperties.java b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/StaticProperties.java
index 6707617e84..bd9c595cf4 100644
--- a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/StaticProperties.java
+++ b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/StaticProperties.java
@@ -19,6 +19,7 @@
 package org.apache.streampipes.sdk;
 
 import org.apache.streampipes.model.schema.PropertyScope;
+import org.apache.streampipes.model.staticproperty.CodeInputStaticProperty;
 import org.apache.streampipes.model.staticproperty.CollectionStaticProperty;
 import org.apache.streampipes.model.staticproperty.FileStaticProperty;
 import org.apache.streampipes.model.staticproperty.FreeTextStaticProperty;
@@ -32,9 +33,11 @@ import org.apache.streampipes.model.staticproperty.RuntimeResolvableTreeInputSta
 import org.apache.streampipes.model.staticproperty.SecretStaticProperty;
 import org.apache.streampipes.model.staticproperty.SelectionStaticProperty;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
+import org.apache.streampipes.model.staticproperty.StaticPropertyAlternative;
 import org.apache.streampipes.model.staticproperty.StaticPropertyAlternatives;
 import org.apache.streampipes.model.staticproperty.StaticPropertyGroup;
 import org.apache.streampipes.model.staticproperty.SupportedProperty;
+import org.apache.streampipes.sdk.helpers.CodeLanguage;
 import org.apache.streampipes.sdk.helpers.Filetypes;
 import org.apache.streampipes.sdk.helpers.Label;
 import org.apache.streampipes.sdk.helpers.RequirementsSelector;
@@ -47,6 +50,23 @@ import java.util.List;
 
 public class StaticProperties {
 
+  public static StaticPropertyAlternatives alternatives(Label label, StaticPropertyAlternative... alternatives) {
+    return alternatives(label, Arrays.asList(alternatives));
+  }
+
+  public static StaticPropertyAlternatives alternatives(Label label, List<StaticPropertyAlternative> alternatives) {
+    StaticPropertyAlternatives alternativesContainer =
+        new StaticPropertyAlternatives(label.getInternalId(), label.getLabel(), label.getDescription());
+
+    for (int i = 0; i < alternatives.size(); i++) {
+      alternatives.get(i).setIndex(i);
+    }
+
+    alternativesContainer.setAlternatives(alternatives);
+
+    return alternativesContainer;
+  }
+
   public static MappingPropertyUnary mappingPropertyUnary(Label label, RequirementsSelector requirementsSelector,
                                                           PropertyScope propertyScope) {
     MappingPropertyUnary mp = new MappingPropertyUnary(label.getInternalId(), label
@@ -134,7 +154,6 @@ public class StaticProperties {
   }
 
 
-
   public static RuntimeResolvableTreeInputStaticProperty runtimeResolvableTreeInput(Label label,
                                                                                     List<String> dependsOn,
                                                                                     boolean resolveDynamically,
@@ -209,6 +228,16 @@ public class StaticProperties {
     }
   }
 
+  public static CodeInputStaticProperty codeStaticProperty(Label label,
+                                                           CodeLanguage codeLanguage,
+                                                           String defaultSkeleton) {
+    var codeInputStaticProperty = new CodeInputStaticProperty(label.getInternalId(),
+        label.getLabel(), label.getDescription());
+    codeInputStaticProperty.setLanguage(codeLanguage.name());
+    codeInputStaticProperty.setCodeTemplate(defaultSkeleton);
+    return codeInputStaticProperty;
+  }
+
   private static StaticProperty setHorizontalRendering(StaticProperty sp) {
     if (sp instanceof StaticPropertyGroup) {
       ((StaticPropertyGroup) sp).setHorizontalRendering(true);
diff --git a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/builder/AbstractConfigurablePipelineElementBuilder.java b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/builder/AbstractConfigurablePipelineElementBuilder.java
index 64d7a05ae4..f0979282f5 100644
--- a/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/builder/AbstractConfigurablePipelineElementBuilder.java
+++ b/streampipes-sdk/src/main/java/org/apache/streampipes/sdk/builder/AbstractConfigurablePipelineElementBuilder.java
@@ -977,13 +977,7 @@ public abstract class AbstractConfigurablePipelineElementBuilder<K extends
 
   public K requiredAlternatives(Label label, StaticPropertyAlternative... alternatives) {
     StaticPropertyAlternatives alternativesContainer =
-        new StaticPropertyAlternatives(label.getInternalId(), label.getLabel(), label.getDescription());
-
-    for (int i = 0; i < alternatives.length; i++) {
-      alternatives[i].setIndex(i);
-    }
-
-    alternativesContainer.setAlternatives(Arrays.asList(alternatives));
+        StaticProperties.alternatives(label, alternatives);
     this.staticProperties.add(alternativesContainer);
 
     return me();
diff --git a/ui/cypress/support/builder/PipelineElementBuilder.ts b/ui/cypress/support/builder/PipelineElementBuilder.ts
index 9464317f26..fa56292ce0 100644
--- a/ui/cypress/support/builder/PipelineElementBuilder.ts
+++ b/ui/cypress/support/builder/PipelineElementBuilder.ts
@@ -18,6 +18,7 @@
 
 import { UserInput } from '../model/UserInput';
 import { PipelineElementInput } from '../model/PipelineElementInput';
+import { UserInputType } from '../model/UserInputType';
 
 export class PipelineElementBuilder {
     pipelineElementInput: PipelineElementInput;
@@ -32,7 +33,7 @@ export class PipelineElementBuilder {
         return new PipelineElementBuilder(name);
     }
 
-    public addInput(type: string, selector: string, value: string) {
+    public addInput(type: UserInputType, selector: string, value: string) {
         const userInput = new UserInput();
         userInput.type = type;
         userInput.selector = selector;
diff --git a/ui/src/app/connect/dialog/adapter-started/adapter-started-update-migration/adapter-started-update-migration.component.html b/ui/src/app/connect/dialog/adapter-started/adapter-started-update-migration/adapter-started-update-migration.component.html
index 85da7bdb47..eee4c83479 100644
--- a/ui/src/app/connect/dialog/adapter-started/adapter-started-update-migration/adapter-started-update-migration.component.html
+++ b/ui/src/app/connect/dialog/adapter-started/adapter-started-update-migration/adapter-started-update-migration.component.html
@@ -33,7 +33,11 @@
                 *ngIf="!updateInfo.canAutoMigrate"
                 fxLayoutAlign="start center"
             >
-                <i class="material-icons">warning</i>
+                <i
+                    class="material-icons"
+                    data-cy="sp-connect-adapter-edit-warning"
+                    >warning</i
+                >
                 &nbsp;Pipeline&nbsp;<b>{{ updateInfo.pipelineName }}</b
                 >&nbsp;will be stopped and needs manual review.
             </div>
@@ -50,6 +54,7 @@
             mat-raised-button
             color="accent"
             (click)="startUpdateEmitter.emit()"
+            data-cy="btn-update-adapter-migrate-pipelines"
         >
             Update adapter and migrate pipelines
         </button>
diff --git a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
index 17ea0eb25f..a879e6b374 100644
--- a/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
+++ b/ui/src/app/editor/components/pipeline-element-options/pipeline-element-options.component.html
@@ -35,6 +35,7 @@
                 matTooltip="Configure Element"
                 [matTooltipPosition]="'above'"
                 (click)="customizeElement(pipelineElement)"
+                data-cy="settings-pipeline-element-button"
             >
                 <i class="material-icons options-icon-size">settings</i>
             </button>
diff --git a/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html b/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html
index a428276dd5..6e3805e1bb 100644
--- a/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html
+++ b/ui/src/app/pipelines/components/pipeline-overview/pipeline-overview.component.html
@@ -82,13 +82,17 @@
                                         ? 's'
                                         : ''
                                 }}"
+                                data-cy="pipeline-warning-icon"
                             >
                                 <i class="material-icons pipeline-notification"
                                     >warning</i
                                 >
                             </button>
                         </div>
-                        <div class="ml-10 notification-icon">
+                        <div
+                            class="ml-10 notification-icon"
+                            data-cy="pipeline-sync-problem-icon"
+                        >
                             <mat-icon
                                 color="warn"
                                 matTooltip="Invalid pipeline: Modify to fix problems"
@@ -108,6 +112,7 @@
                     mat-icon-button
                     matTooltip="Start pipeline"
                     matTooltipPosition="above"
+                    data-cy="start-pipeline-button"
                     (click)="
                         pipelineOperationsService.startPipeline(
                             pipeline._id,
@@ -205,6 +210,7 @@
                                     pipeline._id
                                 )
                             "
+                            data-cy="modify-pipeline-btn"
                         >
                             <i class="material-icons">mode_edit</i>
                         </button>


Test patch:
diff --git a/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/config/ConfigurationParserTest.java b/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/config/ConfigurationParserTest.java
new file mode 100644
index 0000000000..20a31073e7
--- /dev/null
+++ b/streampipes-extensions/streampipes-connectors-plc/src/test/java/org/apache/streampipes/extensions/connectors/plc/adapter/s7/config/ConfigurationParserTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.config;
+
+import org.apache.streampipes.commons.exceptions.connect.AdapterException;
+import org.apache.streampipes.sdk.utils.Datatypes;
+
+import org.junit.Test;
+
+import java.util.Set;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class ConfigurationParserTest {
+
+  @Test
+  public void testGetNodeInformationFromCodePropertyWithComments() {
+    var configBlock = """
+        // This code block can be used to manually specify the addresses of the PLC registers.
+        // The syntax is based on the PLC4X syntax, see [1].
+        // Address Pattern:
+        // propertyName=%{Memory-Area}{start-address}:{Data-Type}[{array-size}]
+        //
+        // Sample:
+        temperature=%I0.0:INT
+
+
+        // [1] https://plc4x.apache.org/users/protocols/s7.html
+        """;
+    var result = new ConfigurationParser().getNodeInformationFromCodeProperty(configBlock);
+
+    assertEquals(1, result.size());
+    assertEquals(Set.of("temperature"), result.keySet());
+    assertEquals("%I0.0:INT", result.get("temperature"));
+  }
+
+  @Test
+  public void testGetNodeInformationFromCodePropertyMultipleEntries() {
+    var configBlock = """
+        v1=%I0.0:INT
+        v2=%I0.0:BOOL
+        """;
+    var result = new ConfigurationParser().getNodeInformationFromCodeProperty(configBlock);
+
+    assertEquals(2, result.size());
+    assertEquals(Set.of("v1", "v2"), result.keySet());
+    assertEquals("%I0.0:INT", result.get("v1"));
+    assertEquals("%I0.0:BOOL", result.get("v2"));
+  }
+
+  @Test
+  public void testGetStreamPipesDataTypeArray() throws AdapterException {
+    var plcType = "INT[100]";
+    var result = new ConfigurationParser().getStreamPipesDataType(plcType);
+
+    assertEquals(Datatypes.Integer, result);
+  }
+
+  @Test
+  public void testGetStreamPipesDataTypeBasic() throws AdapterException {
+    var plcType = "INT";
+    var result = new ConfigurationParser().getStreamPipesDataType(plcType);
+
+    assertEquals(Datatypes.Integer, result);
+  }
+
+
+  @Test
+  public void testGetNodeInformationFromCodePropertyNoEntries() {
+    var configBlock = "";
+    var result = new ConfigurationParser().getNodeInformationFromCodeProperty(configBlock);
+
+    assertEquals(0, result.size());
+  }
+
+  @Test
+  public void testIsPLCArray() {
+    var result = new ConfigurationParser().isPLCArray("%DB3.DB0:BOOL[100]");
+    assertTrue(result);
+  }
+
+
+  @Test
+  public void testIsNoPLCArray() {
+    var result = new ConfigurationParser().isPLCArray("%DB3.DB0:BOOL");
+    assertFalse(result);
+  }
+}
diff --git a/streampipes-sdk/src/test/java/org/apache/streampipes/sdk/StaticPropertiesTest.java b/streampipes-sdk/src/test/java/org/apache/streampipes/sdk/StaticPropertiesTest.java
new file mode 100644
index 0000000000..532ed187ee
--- /dev/null
+++ b/streampipes-sdk/src/test/java/org/apache/streampipes/sdk/StaticPropertiesTest.java
@@ -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.
+ *
+ */
+
+package org.apache.streampipes.sdk;
+
+import org.apache.streampipes.sdk.helpers.CodeLanguage;
+import org.apache.streampipes.sdk.helpers.Label;
+import org.apache.streampipes.sdk.helpers.Labels;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class StaticPropertiesTest {
+
+  private static final String TEST_PROPERTY_LABEL = "test-property-id";
+  private static final Label defaultLabel = Labels.from("", TEST_PROPERTY_LABEL, "");
+
+  @Test
+  public void codeStaticProperty() {
+    String codeTemplate = "// This is a test";
+    var result = StaticProperties.codeStaticProperty(defaultLabel, CodeLanguage.Javascript, codeTemplate);
+
+    assertEquals(TEST_PROPERTY_LABEL, result.getLabel());
+    assertEquals(CodeLanguage.Javascript.name(), result.getLanguage());
+    assertEquals(codeTemplate, result.getCodeTemplate());
+  }
+}
\ No newline at end of file
diff --git a/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts b/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts
index 28e4fe04a2..ba8a1f54e0 100644
--- a/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts
+++ b/ui/cypress/tests/adapter/editAdapter.smoke.spec.ts
@@ -42,7 +42,6 @@ describe('Test Edit Adapter', () => {
         const newUserConfiguration = AdapterBuilder.create(
             'Machine_Data_Simulator',
         )
-            // .setName(name)
             .addInput('input', 'wait-time-ms', '2000')
             .addInput('radio', 'selected', 'simulator-option-pressure')
             .build();
diff --git a/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts b/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts
new file mode 100644
index 0000000000..ca0eb4f88d
--- /dev/null
+++ b/ui/cypress/tests/adapter/editAdapterSettingsAndPipeline.spec.ts
@@ -0,0 +1,113 @@
+/*
+ *  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 { ConnectUtils } from '../../support/utils/connect/ConnectUtils';
+import { ConnectBtns } from '../../support/utils/connect/ConnectBtns';
+import { PipelineUtils } from '../../support/utils/PipelineUtils';
+import { PipelineElementBuilder } from '../../support/builder/PipelineElementBuilder';
+import { PipelineBuilder } from '../../support/builder/PipelineBuilder';
+import { AdapterBuilder } from '../../support/builder/AdapterBuilder';
+import { DashboardUtils } from '../../support/utils/DashboardUtils';
+
+describe('Test Edit Adapter and Pipeline', () => {
+    beforeEach('Setup Test', () => {
+        // To set up test add a stream adapter that can be configured
+        cy.initStreamPipesTest();
+        ConnectUtils.addMachineDataSimulator('simulator');
+
+        const adapterName = 'simulator';
+        const pipelineInput = PipelineBuilder.create('Pipeline Test')
+            .addSource(adapterName)
+            .addProcessingElement(
+                PipelineElementBuilder.create('numerical_filter')
+                    .addInput('input', 'value', '10')
+                    .build(),
+            )
+            .addSink(
+                PipelineElementBuilder.create('data_lake')
+                    .addInput('input', 'db_measurement', 'demo')
+                    .build(),
+            )
+            .build();
+
+        PipelineUtils.addPipeline(pipelineInput);
+    });
+
+    it('Edit adapter and test Pipeline behaviour', () => {
+        // Edit Apater and select pressure
+        ConnectUtils.goToConnect();
+        ConnectBtns.editAdapter().should('not.be.disabled');
+        ConnectBtns.editAdapter().click();
+        const newUserConfiguration = AdapterBuilder.create(
+            'Machine_Data_Simulator',
+        )
+            .addInput('input', 'wait-time-ms', '2000')
+            .addInput('radio', 'selected', 'simulator-option-pressure')
+            .build();
+
+        ConnectUtils.configureAdapter(newUserConfiguration);
+
+        // Update event schema
+        ConnectUtils.finishEventSchemaConfiguration();
+        ConnectBtns.storeEditAdapter().click();
+
+        // Check for warning message
+        cy.dataCy('sp-connect-adapter-edit-warning', {
+            timeout: 60000,
+        }).should('be.visible');
+        cy.dataCy('btn-update-adapter-migrate-pipelines').click();
+        ConnectUtils.closeAdapterPreview();
+
+        // Go to pipelines, check for warning icon and edit pipeline
+        cy.visit('#/pipelines').wait(1000);
+
+        cy.dataCy('pipeline-warning-icon', {
+            timeout: 60000,
+        }).should('be.visible');
+
+        cy.dataCy('pipeline-sync-problem-icon', {
+            timeout: 60000,
+        }).should('be.visible');
+
+        cy.dataCy('modify-pipeline-btn').click();
+        cy.dataCy('settings-pipeline-element-button').eq(0).click();
+        cy.dataCy('number-mapping').contains('pressure').click({ force: true });
+        cy.dataCy('sp-element-configuration-save').click({ force: true });
+        cy.dataCy('sp-editor-save-pipeline').click();
+        cy.dataCy('sp-editor-save').click();
+        cy.dataCy('start-pipeline-button').click();
+        cy.dataCy('sp-pipeline-dialog-close').click();
+
+        // Visit dashboard
+        cy.wait(1000);
+        DashboardUtils.goToDashboard();
+
+        // Add new dashboard widget and check if edited adapter appears
+        const dashboardName = 'testDashboard';
+        DashboardUtils.addAndEditDashboard(dashboardName);
+        cy.dataCy('dashboard-add-widget').click();
+        cy.dataCy('dashboard-visualize-pipeline-Pipeline_Test').click();
+        cy.dataCy('dashboard-select-widget-table').click();
+        cy.get('[type="checkbox"]').check();
+        cy.dataCy('dashboard-new-widget-next-btn').click();
+        cy.dataCy('dashboard-save-edit-mode').click();
+        cy.get('.main-panel').should('include.text', 'pressure');
+        cy.get('.main-panel').should('include.text', 'sensorId');
+        cy.get('.main-panel').should('include.text', 'time');
+    });
+});
diff --git a/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts b/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts
new file mode 100644
index 0000000000..60ce694b21
--- /dev/null
+++ b/ui/cypress/tests/adapter/editAdapterValuesAndFields.spec.ts
@@ -0,0 +1,133 @@
+/*
+ *  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 { ConnectUtils } from '../../support/utils/connect/ConnectUtils';
+import { ConnectBtns } from '../../support/utils/connect/ConnectBtns';
+import { AdapterBuilder } from '../../support/builder/AdapterBuilder';
+
+describe('Test Edit Adapter', () => {
+    beforeEach('Setup Test', () => {
+        cy.initStreamPipesTest();
+    });
+
+    it('Test configuration of adapter fields ', () => {
+        // Set up new adapter
+        const builder = AdapterBuilder.create('Machine_Data_Simulator')
+            .setName('Machine_Data_Simulator')
+            .addInput('input', 'wait-time-ms', '1000');
+        const configuration = builder.build();
+        ConnectUtils.goToConnect();
+        ConnectUtils.goToNewAdapterPage();
+        ConnectUtils.selectAdapter(configuration.adapterType);
+        cy.contains('Next').click();
+
+        // Add new property and edit field
+        cy.dataCy('connect-add-static-property').click();
+        cy.dataCy('connect-add-field-name').type('test-property-1');
+        cy.dataCy('connect-add-field-name-button').click();
+        cy.dataCy('edit-density').click();
+        // Change runtime name
+        cy.dataCy('connect-edit-field-runtime-name')
+            .clear()
+            .type('test-density');
+        // Change field semantic type
+        cy.get('[id="domainproperty"]')
+            .clear()
+            .type('http://schema.org/Numbers');
+        // Change field data type
+        cy.dataCy('connect-change-runtime-type')
+            .click()
+            .get('mat-option')
+            .contains('Double')
+            .click();
+        // Provide correction value and operator
+        cy.dataCy('connect-schema-correction-value').type('2');
+        cy.dataCy('connect-schema-correction-operator')
+            .click()
+            .get('mat-option')
+            .contains('Multiply')
+            .click();
+        cy.dataCy('sp-save-edit-property').click();
+        cy.dataCy('sp-event-schema-next-button').click();
+
+        // Fill in adapter name and close view
+        cy.dataCy('sp-adapter-name').type('Test Adapter');
+        cy.dataCy('adapter-settings-start-adapter-btn').click();
+        ConnectUtils.closeAdapterPreview();
+
+        // Edit adapter and check if given values and added property still provided
+        ConnectBtns.editAdapter().should('not.be.disabled');
+        ConnectBtns.editAdapter().click();
+        cy.contains('Next').click();
+        cy.dataCy('edit-density').click();
+        cy.dataCy('connect-edit-field-runtime-name').should(
+            'have.value',
+            'test-density',
+        );
+        cy.get('[id="domainproperty"]').should(
+            'have.value',
+            'http://schema.org/Numbers',
+        );
+        cy.dataCy('connect-change-runtime-type').should(
+            'include.text',
+            'Double',
+        );
+        cy.dataCy('connect-schema-correction-value').should('have.value', '2');
+        cy.dataCy('connect-schema-correction-operator').should(
+            'include.text',
+            'Multiply',
+        );
+
+        // Delete inserted values in edit field
+        cy.dataCy('connect-edit-field-runtime-name').clear();
+        cy.get('[id="domainproperty"]').clear();
+        cy.dataCy('connect-change-runtime-type')
+            .click()
+            .get('mat-option')
+            .contains('Float')
+            .click();
+        cy.dataCy('connect-schema-correction-value').clear();
+        cy.dataCy('sp-save-edit-property').click();
+        cy.get('[class="general-panel"]').should(
+            'include.text',
+            'test-property-1',
+        );
+        cy.dataCy('sp-event-schema-next-button').click();
+        cy.dataCy('store-edit-adapter').click();
+        ConnectUtils.closeAdapterPreview();
+
+        // Configure adapter with pressure instead of flowrate
+        ConnectBtns.editAdapter().click();
+        const newUserConfiguration = AdapterBuilder.create(
+            'Machine_Data_Simulator',
+        )
+            .addInput('input', 'wait-time-ms', '2000')
+            .addInput('radio', 'selected', 'simulator-option-pressure')
+            .build();
+        ConnectUtils.configureAdapter(newUserConfiguration);
+
+        // Check if given property still exists and close view afterwards
+        cy.get('[class="general-panel"]').should(
+            'include.text',
+            'test-property-1',
+        );
+        cy.dataCy('sp-event-schema-next-button').click();
+        cy.dataCy('store-edit-adapter').click();
+        ConnectUtils.closeAdapterPreview();
+    });
+});