diff --git a/pom.xml b/pom.xml
index bef7842..78a9dc1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -25,18 +25,18 @@
     <parent>
         <groupId>org.apache.streampipes</groupId>
         <artifactId>streampipes-parent</artifactId>
-        <version>0.91.0-SNAPSHOT</version>
+        <version>0.93.0-SNAPSHOT</version>
     </parent>
 
     <artifactId>streampipes-pipeline-elements-examples</artifactId>
     <packaging>pom</packaging>
-    <version>0.71.0-SNAPSHOT</version>
+    <version>0.93.0-SNAPSHOT</version>
     <modules>
         <module>streampipes-pipeline-elements-examples-processors-jvm</module>
     </modules>
 
     <properties>
-        <streampipes.version>0.91.0-SNAPSHOT</streampipes.version>
+        <streampipes.version>0.93.0-SNAPSHOT</streampipes.version>
         <lightcouch.version>0.1.8</lightcouch.version>
 
         <maven-shade-plugin.version>3.0.0</maven-shade-plugin.version>
@@ -61,11 +61,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.streampipes</groupId>
-                <artifactId>streampipes-container-standalone</artifactId>
-                <version>${streampipes.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.streampipes</groupId>
                 <artifactId>streampipes-wrapper-standalone</artifactId>
                 <version>${streampipes.version}</version>
             </dependency>
@@ -81,22 +76,7 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.streampipes</groupId>
-                <artifactId>streampipes-config</artifactId>
-                <version>${streampipes.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.streampipes</groupId>
-                <artifactId>streampipes-dataformat-json</artifactId>
-                <version>${streampipes.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.streampipes</groupId>
-                <artifactId>streampipes-messaging-kafka</artifactId>
-                <version>${streampipes.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.streampipes</groupId>
-                <artifactId>streampipes-messaging-jms</artifactId>
+                <artifactId>streampipes-sdk-bundle</artifactId>
                 <version>${streampipes.version}</version>
             </dependency>
             <dependency>
@@ -106,11 +86,6 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.streampipes</groupId>
-                <artifactId>streampipes-measurement-units</artifactId>
-                <version>${streampipes.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.apache.streampipes</groupId>
                 <artifactId>streampipes-pipeline-elements-shared</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/pom.xml b/streampipes-pipeline-elements-examples-processors-jvm/pom.xml
index 0041fd6..b2a69f0 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/pom.xml
+++ b/streampipes-pipeline-elements-examples-processors-jvm/pom.xml
@@ -23,7 +23,7 @@
     <parent>
         <artifactId>streampipes-pipeline-elements-examples</artifactId>
         <groupId>org.apache.streampipes</groupId>
-        <version>0.71.0-SNAPSHOT</version>
+        <version>0.93.0-SNAPSHOT</version>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
@@ -33,7 +33,6 @@
         <dependency>
             <groupId>org.apache.streampipes</groupId>
             <artifactId>streampipes-sdk-bundle</artifactId>
-            <version>0.91.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.streampipes</groupId>
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/Example.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/Example.java
index 46e1bcc..acd1a22 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/Example.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/Example.java
@@ -19,7 +19,7 @@
 
 import org.apache.streampipes.client.StreamPipesClient;
 import org.apache.streampipes.client.StreamPipesCredentials;
-import org.apache.streampipes.client.credentials.CredentialsProvider;
+import org.apache.streampipes.client.api.credentials.CredentialsProvider;
 import org.apache.streampipes.model.pipeline.Pipeline;
 
 import java.util.List;
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/StreamPipesClientExample.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/StreamPipesClientExample.java
index 6fad4d8..fd0c7c5 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/StreamPipesClientExample.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/client/example/StreamPipesClientExample.java
@@ -17,16 +17,10 @@
  */
 package org.apache.streampipes.client.example;
 
-import org.apache.commons.collections.MapUtils;
 import org.apache.streampipes.client.StreamPipesClient;
 import org.apache.streampipes.client.StreamPipesCredentials;
-import org.apache.streampipes.client.credentials.CredentialsProvider;
-import org.apache.streampipes.client.live.KafkaConfig;
+import org.apache.streampipes.client.api.credentials.CredentialsProvider;
 import org.apache.streampipes.model.SpDataStream;
-import org.apache.streampipes.model.graph.DataSinkInvocation;
-import org.apache.streampipes.model.pipeline.Pipeline;
-import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
-import org.apache.streampipes.model.template.PipelineElementTemplate;
 
 import java.util.List;
 
@@ -39,33 +33,34 @@
     
     // Create credentials by providing a user (the email) and the API key
     CredentialsProvider credentials = StreamPipesCredentials
-            .withApiKey(System.getenv("user"), System.getenv("apiKey"));
+            .withApiKey("admin@streampipes.apache.org", "oKv1uyNjAgXfuPcMBX5Sityy");
 
     // Create an instance of the StreamPipes client
     StreamPipesClient client = StreamPipesClient
-            .create("localhost", 80, credentials, true);
+            .create("localhost", 8082, credentials, true);
 
     // Get all pipelines
-    List<Pipeline> pipelines = client.pipelines().all();
-
-    // Start a pipeline
-    PipelineOperationStatus message = client.pipelines().start(pipelines.get(0));
-
-    // Get all pipeline element templates
-    List<PipelineElementTemplate> templates = client.pipelineElementTemplates().all();
-
-    // Get all data sinks
-    List<DataSinkInvocation> dataSinks = client.sinks().all();
+//    List<Pipeline> pipelines = client.pipelines().all();
+//
+//    // Start a pipeline
+//    PipelineOperationStatus message = client.pipelines().start(pipelines.get(0));
+//
+//    // Get all pipeline element templates
+//    List<PipelineElementTemplate> templates = client.pipelineElementTemplates().all();
+//
+//    // Get all data sinks
+//    List<DataSinkInvocation> dataSinks = client.sinks().all();
 
     // Get all data streams
     List<SpDataStream> dataStreams = client.streams().all();
+    System.out.println(dataStreams.size());
 
     // Subscribe to a data stream
-    client.streams().subscribe(dataStreams.get(0), event -> MapUtils.debugPrint(System.out, "event", event.getRaw()));
-
-    // Subscribe to a data stream and provide an additional Kafka config (e.g., for access from outside the StreamPipes network)
-    client.streams().subscribe(dataStreams.get(0), KafkaConfig.create("localhost", 9094), event -> {
-      MapUtils.debugPrint(System.out, "event", event.getRaw());
-    });
+//    client.streams().subscribe(dataStreams.get(0), event -> MapUtils.debugPrint(System.out, "event", event.getRaw()));
+//
+//    // Subscribe to a data stream and provide an additional Kafka config (e.g., for access from outside the StreamPipes network)
+//    client.streams().subscribe(dataStreams.get(0), KafkaConfig.create("localhost", 9094), event -> {
+//      MapUtils.debugPrint(System.out, "event", event.getRaw());
+//    });
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/function/example/FunctionPublishExample.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/function/example/FunctionPublishExample.java
index 1407154..bffbad2 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/function/example/FunctionPublishExample.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/function/example/FunctionPublishExample.java
@@ -18,6 +18,7 @@
 
 package org.apache.streampipes.function.example;
 
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.model.function.FunctionId;
 import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
@@ -27,7 +28,6 @@
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Protocols;
 import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.wrapper.routing.SpOutputCollector;
 import org.apache.streampipes.wrapper.standalone.function.FunctionConfig;
 import org.apache.streampipes.wrapper.standalone.function.FunctionConfigBuilder;
 import org.apache.streampipes.wrapper.standalone.function.FunctionContext;
@@ -49,7 +49,7 @@
 
   @Override
   public List<String> requiredStreamIds() {
-    return List.of("urn:streampipes.apache.org:eventstream:EtMUkN");
+    return List.of("urn:streampipes.apache.org:eventstream:plSEjN");
   }
 
   @Override
@@ -85,7 +85,7 @@
                 SO.TEXT,
                 PropertyScope.MEASUREMENT_PROPERTY))
             .format(Formats.jsonFormat())
-            .protocol(Protocols.kafka("localhost", 9094, STREAM_APP_ID))
+            .protocol(Protocols.kafka("nats", 9094, STREAM_APP_ID))
             .build())
         .build();
   }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/ExamplesInit.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/ExamplesInit.java
index 4561773..071e96a 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/ExamplesInit.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/ExamplesInit.java
@@ -23,7 +23,6 @@
 import org.apache.streampipes.extensions.management.model.SpServiceDefinitionBuilder;
 import org.apache.streampipes.messaging.jms.SpJmsProtocolFactory;
 import org.apache.streampipes.messaging.kafka.SpKafkaProtocolFactory;
-import org.apache.streampipes.pe.examples.jvm.engine.ExampleExternalEngineController;
 import org.apache.streampipes.pe.examples.jvm.outputstrategy.AppendOutputController;
 import org.apache.streampipes.pe.examples.jvm.outputstrategy.CustomOutputController;
 import org.apache.streampipes.pe.examples.jvm.outputstrategy.CustomTransformOutputController;
@@ -96,8 +95,6 @@
         .registerPipelineElement(new KeepOutputController())
         .registerPipelineElement(new CollectionMappingGroupExample())
 
-        .registerPipelineElement(new ExampleExternalEngineController())
-
         .registerPipelineElement(new VehicleStream())
         .build();
 
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyController.java
deleted file mode 100644
index 9dda049..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyController.java
+++ /dev/null
@@ -1,41 +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.pe.examples.jvm.base;
-
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.wrapper.params.binding.EventProcessorBindingParams;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
-
-public class DummyController<B extends EventProcessorBindingParams> extends
-        StandaloneEventProcessingDeclarer<B> {
-
-  @Override
-  public DataProcessorDescription declareModel() {
-    return null;
-  }
-
-  @Override
-  public ConfiguredEventProcessor<B> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-    return null;
-  }
-
-
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyEngine.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyEngine.java
deleted file mode 100644
index cfe579f..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyEngine.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.pe.examples.jvm.base;
-
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
-import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.wrapper.routing.SpOutputCollector;
-import org.apache.streampipes.wrapper.runtime.EventProcessor;
-
-public class DummyEngine implements EventProcessor<DummyParameters> {
-
-  @Override
-  public void onInvocation(DummyParameters parameters, SpOutputCollector spOutputCollector,
-                           EventProcessorRuntimeContext runtimeContext) throws SpRuntimeException {
-
-  }
-
-  @Override
-  public void onEvent(Event event, SpOutputCollector collector) throws SpRuntimeException {
-
-  }
-
-  @Override
-  public void onDetach() throws SpRuntimeException {
-
-  }
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyParameters.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyParameters.java
deleted file mode 100644
index cbba25e..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/base/DummyParameters.java
+++ /dev/null
@@ -1,28 +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.pe.examples.jvm.base;
-
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.wrapper.params.binding.EventProcessorBindingParams;
-
-public class DummyParameters extends EventProcessorBindingParams {
-
-  public DummyParameters(DataProcessorInvocation graph) {
-    super(graph);
-  }
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngine.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngine.java
deleted file mode 100644
index 09fc94f..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngine.java
+++ /dev/null
@@ -1,41 +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.pe.examples.jvm.engine;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
-import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.wrapper.runtime.ExternalEventProcessor;
-
-public class ExampleExternalEngine
-        implements ExternalEventProcessor<ExampleExternalEngineParameters> {
-
-  private static final Logger LOG = LoggerFactory.getLogger(ExampleExternalEngine.class);
-
-  @Override
-  public void onInvocation(ExampleExternalEngineParameters parameters,
-                             EventProcessorRuntimeContext runtimeContext) throws SpRuntimeException {
-    LOG.info("I'm invoked!");
-  }
-
-  @Override
-  public void onDetach() throws SpRuntimeException {
-    LOG.info("I'm detached!");
-  }
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngineController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngineController.java
deleted file mode 100644
index 8acbb8c..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngineController.java
+++ /dev/null
@@ -1,50 +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.pe.examples.jvm.engine;
-
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
-import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.helpers.EpRequirements;
-import org.apache.streampipes.sdk.helpers.OutputStrategies;
-import org.apache.streampipes.wrapper.standalone.ConfiguredExternalEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneExternalEventProcessingDeclarer;
-
-public class ExampleExternalEngineController
-        extends StandaloneExternalEventProcessingDeclarer<ExampleExternalEngineParameters> {
-
-  @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.engine.external", "Example " +
-            "External Engine", "")
-            .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
-            .outputStrategy(OutputStrategies.keep())
-            .build();
-  }
-
-  @Override
-  public ConfiguredExternalEventProcessor<ExampleExternalEngineParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-    return new ConfiguredExternalEventProcessor<>(new ExampleExternalEngineParameters(graph),
-            ExampleExternalEngine::new);
-  }
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngineParameters.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngineParameters.java
deleted file mode 100644
index 6f15a65..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/engine/ExampleExternalEngineParameters.java
+++ /dev/null
@@ -1,28 +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.pe.examples.jvm.engine;
-
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.wrapper.params.binding.EventProcessorBindingParams;
-
-public class ExampleExternalEngineParameters extends EventProcessorBindingParams {
-
-  public ExampleExternalEngineParameters(DataProcessorInvocation graph) {
-    super(graph);
-  }
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/eventmodel/EventModelExamples.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/eventmodel/EventModelExamples.java
index 6e50c02..0b46d40 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/eventmodel/EventModelExamples.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/eventmodel/EventModelExamples.java
@@ -18,15 +18,16 @@
 package org.apache.streampipes.pe.examples.jvm.eventmodel;
 
 import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.model.runtime.Event;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
-import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.wrapper.routing.SpOutputCollector;
-import org.apache.streampipes.wrapper.runtime.EventProcessor;
 
 import java.util.List;
 
-public class EventModelExamples implements EventProcessor<DummyParameters> {
+public class EventModelExamples implements IStreamPipesDataProcessor {
 
   /**
    * Example event:
@@ -41,9 +42,13 @@
   private String lastValueSelector;
 
   @Override
-  public void onInvocation(DummyParameters parameters, SpOutputCollector spOutputCollector, EventProcessorRuntimeContext runtimeContext) throws SpRuntimeException {
+  public IDataProcessorConfiguration declareConfig() {
+    return null;
+  }
 
-    // usually, the fields such as temperatureSelector would be retrieved from the parameter class
+  @Override
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+
   }
 
   @Override
@@ -66,7 +71,9 @@
   }
 
   @Override
-  public void onDetach() throws SpRuntimeException {
+  public void onPipelineStopped() {
 
   }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/AppendOutputController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/AppendOutputController.java
index 8b5f5bb..9209baf 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/AppendOutputController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/AppendOutputController.java
@@ -17,13 +17,15 @@
  */
 package org.apache.streampipes.pe.examples.jvm.outputstrategy;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpProperties;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
@@ -31,32 +33,42 @@
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class AppendOutputController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class AppendOutputController implements IStreamPipesDataProcessor {
+
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
-            ".append", "Append output example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        AppendOutputController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
+                ".append", "Append output example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             .outputStrategy(OutputStrategies.append(EpProperties.integerEp(Labels.from("avg",
-                    "The average value", ""), "avg", SO.NUMBER)))
-
-            .build();
+                "The average value", ""), "avg", SO.NUMBER)))
+            .build());
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
 
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomOutputController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomOutputController.java
index fb0eff9..3b4f061 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomOutputController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomOutputController.java
@@ -17,45 +17,53 @@
  */
 package org.apache.streampipes.pe.examples.jvm.outputstrategy;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import java.util.List;
 
-public class CustomOutputController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class CustomOutputController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
-            ".custom", "Custom output example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CustomOutputController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
+                ".custom", "Custom output example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             .outputStrategy(OutputStrategies.custom())
-
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    List<String> outputSelectors = params.extractor().outputKeySelectors();
+  }
 
-    List<String> outputSelectors = extractor.outputKeySelectors();
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomTransformOutputController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomTransformOutputController.java
index c1fe753..7909d94 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomTransformOutputController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/CustomTransformOutputController.java
@@ -18,15 +18,19 @@
 package org.apache.streampipes.pe.examples.jvm.outputstrategy;
 
 import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.extensions.api.runtime.ResolvesContainerProvidedOutputStrategy;
-import org.apache.streampipes.model.graph.DataProcessorDescription;
 import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.EventSchema;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
 import org.apache.streampipes.sdk.helpers.EpProperties;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
@@ -35,42 +39,58 @@
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-import java.util.Arrays;
+import java.util.List;
 
-public class CustomTransformOutputController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> implements
-    ResolvesContainerProvidedOutputStrategy<DataProcessorInvocation, ProcessingElementParameterExtractor> {
+public class CustomTransformOutputController implements
+    IStreamPipesDataProcessor, ResolvesContainerProvidedOutputStrategy<DataProcessorInvocation, ProcessingElementParameterExtractor> {
+
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
-            ".customtransform", "Custom transform output example example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CustomTransformOutputController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
+                ".customtransform", "Custom transform output example example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredPropertyWithUnaryMapping(EpRequirements.stringReq(), Labels.from
-                            ("str", "The date property as a string", ""), PropertyScope.NONE)
-                    .build())
+                create()
+                .requiredPropertyWithUnaryMapping(EpRequirements.stringReq(), Labels.from
+                    ("str", "The date property as a string", ""), PropertyScope.NONE)
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             .outputStrategy(OutputStrategies.customTransformation())
-
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  public EventSchema resolveOutputStrategy(DataProcessorInvocation processingElement,
+                                           ProcessingElementParameterExtractor parameterExtractor) throws SpRuntimeException {
+    return new EventSchema(List.of(
+        EpProperties
+            .stringEp(Labels.from(
+                "runtime",
+                "I was added at runtime",
+                ""), "runtime", SO.TEXT))
+    );
   }
 
   @Override
-  public EventSchema resolveOutputStrategy(DataProcessorInvocation processingElement, ProcessingElementParameterExtractor parameterExtractor) throws SpRuntimeException {
-    return new EventSchema(Arrays
-            .asList(EpProperties
-                    .stringEp(Labels.from("runtime", "I was added at runtime", ""), "runtime", SO.TEXT)));
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/FixedOutputController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/FixedOutputController.java
index 8b3aa4b..df2ef26 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/FixedOutputController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/FixedOutputController.java
@@ -17,13 +17,15 @@
  */
 package org.apache.streampipes.pe.examples.jvm.outputstrategy;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpProperties;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
@@ -31,31 +33,44 @@
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class FixedOutputController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class FixedOutputController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
-            ".fixed", "Fixed output example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        FixedOutputController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
+                ".fixed", "Fixed output example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             .outputStrategy(OutputStrategies.fixed(EpProperties.timestampProperty("timestamp"),
-                    EpProperties.doubleEp(Labels.from("avg", "Average value", ""), "avg", SO.NUMBER)))
-
-            .build();
+                EpProperties.doubleEp(Labels.from("avg", "Average value", ""), "avg", SO.NUMBER)))
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
+  public void onPipelineStarted(IDataProcessorParameters params,
+                                SpOutputCollector collector,
+                                EventProcessorRuntimeContext runtimeContext) {
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/KeepOutputController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/KeepOutputController.java
index 9506ffc..4064a27 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/KeepOutputController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/KeepOutputController.java
@@ -17,42 +17,57 @@
  */
 package org.apache.streampipes.pe.examples.jvm.outputstrategy;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class KeepOutputController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class KeepOutputController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
-            ".keep", "Keep output example example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        KeepOutputController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
+                ".keep", "Keep output example example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             .outputStrategy(OutputStrategies.keep())
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
+  public void onPipelineStarted(IDataProcessorParameters params,
+                                SpOutputCollector collector,
+                                EventProcessorRuntimeContext runtimeContext) {
 
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/TransformOutputController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/TransformOutputController.java
index 7aff086..75bac00 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/TransformOutputController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/outputstrategy/TransformOutputController.java
@@ -17,14 +17,16 @@
  */
 package org.apache.streampipes.pe.examples.jvm.outputstrategy;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
@@ -32,36 +34,46 @@
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 import org.apache.streampipes.sdk.helpers.TransformOperations;
 import org.apache.streampipes.sdk.utils.Datatypes;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import java.util.List;
 
-public class TransformOutputController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class TransformOutputController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
-            ".transform", "Transform output example example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        TransformOutputController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.outputstrategy" +
+                ".transform", "Transform output example example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredPropertyWithUnaryMapping(EpRequirements.stringReq(), Labels.from
-                            ("str", "The date property as a string", ""), PropertyScope.NONE)
-                    .build())
+                create()
+                .requiredPropertyWithUnaryMapping(EpRequirements.stringReq(), Labels.from
+                    ("str", "The date property as a string", ""), PropertyScope.NONE)
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             .outputStrategy(OutputStrategies.transform(TransformOperations
-                    .staticDatatypeTransformation("str", Datatypes.Long)))
+                .staticDatatypeTransformation("str", Datatypes.Long)))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
-    List<String> outputSelectors = extractor.outputKeySelectors();
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    List<String> outputSelectors = params.extractor().outputKeySelectors();
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/python/PythonGreeterProcessor.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/python/PythonGreeterProcessor.java
deleted file mode 100644
index 8708066..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/python/PythonGreeterProcessor.java
+++ /dev/null
@@ -1,72 +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.pe.examples.jvm.python;
-
-import com.google.gson.JsonObject;
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
-import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.helpers.*;
-import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.wrapper.standalone.ProcessorParams;
-import org.apache.streampipes.wrapper.standalone.StreamPipesExternalDataProcessor;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class PythonGreeterProcessor extends StreamPipesExternalDataProcessor {
-
-    private static final String GREETER_KEY = "greeter-key";
-    public static final String PROCESSOR_ID = "org.apache.streampipes.examples.python.processor.greeter";
-
-    @Override
-    public DataProcessorDescription declareModel() {
-        return ProcessingElementBuilder.create(PROCESSOR_ID, "Python Greeter", "")
-                .requiredStream(StreamRequirementsBuilder.any())
-                // create a simple text parameter
-                .requiredTextParameter(Labels.withId(GREETER_KEY), "greeting")
-                // append greeting to event stream
-                .outputStrategy(OutputStrategies.append(
-                        EpProperties.stringEp(Labels.empty(),"greeting", SO.TEXT)))
-                // NOTE: currently one Kafka transport protocol is supported
-                .supportedProtocols(SupportedProtocols.kafka())
-                .supportedFormats(SupportedFormats.jsonFormat())
-                .build();
-    }
-
-    @Override
-    public void onInvocation(ProcessorParams parameters, EventProcessorRuntimeContext runtimeContext) throws SpRuntimeException {
-
-        // extract static properties and add to map to build minimal invocation graph
-        Map<String, String> staticPropertyMap = new HashMap<>();
-        staticPropertyMap.put("greeting", parameters.extractor().singleValueParameter(GREETER_KEY, String.class));
-
-        JsonObject minimalInvocationGraph = createMinimalInvocationGraph(staticPropertyMap);
-
-        // send invocation request to python
-        invoke(minimalInvocationGraph);
-    }
-
-    @Override
-    public void onDetach() throws SpRuntimeException {
-        // send detach request to python to stop processor with invocationId
-        detach();
-    }
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/python/greeter.py b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/python/greeter.py
deleted file mode 100644
index b76e0eb..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/python/greeter.py
+++ /dev/null
@@ -1,47 +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.
-#
-from streampipes.core import StandaloneSubmitter, EventProcessor
-from streampipes.manager import Declarer
-
-
-class Greeter(EventProcessor):
-    greeting = None
-
-    def on_invocation(self):
-        # extract greeting text from static property
-        self.greeting = self.static_properties.get('greeting')
-
-    def on_event(self, event):
-        event['greeting'] = self.greeting
-        return event
-
-    def on_detach(self):
-        pass
-
-
-def main():
-    # dict with processor id and processor class
-    processors = {
-        'org.apache.streampipes.examples.python.processor.greeter': Greeter,
-    }
-
-    Declarer.add(processors=processors)
-    StandaloneSubmitter.init()
-
-
-if __name__ == '__main__':
-    main()
\ No newline at end of file
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/ListRequirementsController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/ListRequirementsController.java
index 604ac82..9e60c2f 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/ListRequirementsController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/ListRequirementsController.java
@@ -17,44 +17,61 @@
  */
 package org.apache.streampipes.pe.examples.jvm.requirements;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 import org.apache.streampipes.sdk.utils.Datatypes;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class ListRequirementsController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class ListRequirementsController implements IStreamPipesDataProcessor {
+
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.requirements" +
-            ".list", "List requirements specification examples", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        ListRequirementsController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.requirements" +
+                ".list", "List requirements specification examples", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.listRequirement(Datatypes.Integer))
-                    .requiredProperty(EpRequirements.listRequirement(Datatypes.Double))
-                    .requiredProperty(EpRequirements.listRequirement(Datatypes.Boolean))
-                    .requiredProperty(EpRequirements.listRequirement(Datatypes.String))
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.listRequirement(Datatypes.Integer))
+                .requiredProperty(EpRequirements.listRequirement(Datatypes.Double))
+                .requiredProperty(EpRequirements.listRequirement(Datatypes.Boolean))
+                .requiredProperty(EpRequirements.listRequirement(Datatypes.String))
+                .build())
 
 
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
             .outputStrategy(OutputStrategies.keep())
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-    return null;
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedListRequirementsController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedListRequirementsController.java
index 6a32659..5895d05 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedListRequirementsController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedListRequirementsController.java
@@ -17,40 +17,54 @@
  */
 package org.apache.streampipes.pe.examples.jvm.requirements;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class NestedListRequirementsController extends StandaloneEventProcessingDeclarer<DummyParameters> {
-
+public class NestedListRequirementsController implements IStreamPipesDataProcessor {
+  
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.requirements.nestedlist",
-            "Nested list mapping example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        NestedListRequirementsController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.requirements.nestedlist",
+                "Nested list mapping example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredPropertyWithUnaryMapping(EpRequirements.nestedListRequirement(EpRequirements.stringReq()),
-                            Labels.from("key-value", "Key", ""),
-                                    PropertyScope.NONE)
-                    .requiredPropertyWithUnaryMapping(EpRequirements.nestedListRequirement(EpRequirements.integerReq()),
-                            Labels.from("count-value", "Count", ""),
-                            PropertyScope.NONE)
-                    .build())
+                create()
+                .requiredPropertyWithUnaryMapping(EpRequirements.nestedListRequirement(EpRequirements.stringReq()),
+                    Labels.from("key-value", "Key", ""),
+                    PropertyScope.NONE)
+                .requiredPropertyWithUnaryMapping(EpRequirements.nestedListRequirement(EpRequirements.integerReq()),
+                    Labels.from("count-value", "Count", ""),
+                    PropertyScope.NONE)
+                .build())
             .outputStrategy(OutputStrategies.keep())
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-    return null;
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedRequirementsController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedRequirementsController.java
deleted file mode 100644
index 16f9a53..0000000
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/NestedRequirementsController.java
+++ /dev/null
@@ -1,21 +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.pe.examples.jvm.requirements;
-
-public class NestedRequirementsController {
-}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/SimpleStreamRequirementsController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/SimpleStreamRequirementsController.java
index ee62965..13fb0d9 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/SimpleStreamRequirementsController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/requirements/SimpleStreamRequirementsController.java
@@ -17,50 +17,64 @@
  */
 package org.apache.streampipes.pe.examples.jvm.requirements;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 import org.apache.streampipes.vocabulary.SO;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class SimpleStreamRequirementsController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class SimpleStreamRequirementsController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.requirements" +
-            ".simple", "Simple requirements specification examples", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        SimpleStreamRequirementsController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.requirements" +
+                ".simple", "Simple requirements specification examples", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.numberReq()) // any number
-                    .requiredProperty(EpRequirements.doubleReq()) // any field of type double
-                    .requiredProperty(EpRequirements.booleanReq()) // any field of type boolean
-                    .requiredProperty(EpRequirements.integerReq()) // any field of type integer
-                    .requiredProperty(EpRequirements.stringReq()) // any field of type string
-                    .requiredProperty(EpRequirements.anyProperty()) // any field allowed (no restriction)
-                    .requiredProperty(EpRequirements.timestampReq())  // any timestamp field
+                create()
+                .requiredProperty(EpRequirements.numberReq()) // any number
+                .requiredProperty(EpRequirements.doubleReq()) // any field of type double
+                .requiredProperty(EpRequirements.booleanReq()) // any field of type boolean
+                .requiredProperty(EpRequirements.integerReq()) // any field of type integer
+                .requiredProperty(EpRequirements.stringReq()) // any field of type string
+                .requiredProperty(EpRequirements.anyProperty()) // any field allowed (no restriction)
+                .requiredProperty(EpRequirements.timestampReq())  // any timestamp field
 
-                    .requiredProperty(EpRequirements.domainPropertyReq(SO.LATITUDE))
-                    .requiredProperty(EpRequirements.domainPropertyReq(SO.LONGITUDE))
-                    .build())
+                .requiredProperty(EpRequirements.domainPropertyReq(SO.LATITUDE))
+                .requiredProperty(EpRequirements.domainPropertyReq(SO.LONGITUDE))
+                .build())
 
 
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
             .outputStrategy(OutputStrategies.keep())
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-    return null;
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CodeInputExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CodeInputExampleController.java
index a1285ec..2155c11 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CodeInputExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CodeInputExampleController.java
@@ -1,30 +1,37 @@
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.helpers.*;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
+import org.apache.streampipes.sdk.helpers.CodeLanguage;
+import org.apache.streampipes.sdk.helpers.EpRequirements;
+import org.apache.streampipes.sdk.helpers.Labels;
+import org.apache.streampipes.sdk.helpers.OutputStrategies;
+import org.apache.streampipes.sdk.helpers.SupportedFormats;
+import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 
-public class CodeInputExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class CodeInputExampleController implements IStreamPipesDataProcessor {
 
   private static final String CODE_KEY = "code-key";
   private static final String CODE_PYTHON_KEY = "code-python-key";
   private static final String CODE_EMPTY_KEY = "code-empty-key";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".codeinput", "Code Input Example", "")
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CodeInputExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".codeinput", "Code Input Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.userDefined())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -38,18 +45,26 @@
             // no specific language
             .requiredCodeblock(Labels.from(CODE_EMPTY_KEY, "Any Code", ""), CodeLanguage.None)
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the code parameter value
-    String code = extractor.codeblockValue(CODE_KEY);
-
-    // now the text parameter would be added to a parameter class (omitted for this example)
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+    String code = params.extractor().codeblockValue(CODE_KEY);
   }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
 }
 
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionExampleController.java
index eacd294..a071c08 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionExampleController.java
@@ -17,53 +17,62 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.config.IDataProcessorConfiguration;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.StaticProperties;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import java.util.List;
 
-public class CollectionExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class CollectionExampleController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".collection", "Collection Example", "")
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    // Extract the text parameter value
+    List<String> textParameters = params.extractor().singleValueParameterFromCollection("collection", String.class);
+
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+  @Override
+  public IDataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CollectionExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".collection", "Collection Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             // create a collection parameter
             .requiredParameterAsCollection(Labels.from("collection", "Example Name", "Example " +
-                    "Description"), StaticProperties.stringFreeTextProperty(Labels
-                    .from("text-property","Text","")))
-            .build();
-  }
-
-  @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
-    // Extract the text parameter value
-    List<String> textParameters = extractor.singleValueParameterFromCollection("collection", String.class);
-
-    // now the text parameter would be added to a parameter class (omitted for this example)
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+                "Description"), StaticProperties.stringFreeTextProperty(Labels
+                .from("text-property", "Text", "")))
+            .build()
+    );
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingExample.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingExample.java
index 8efbd6c..41bd4b7 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingExample.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingExample.java
@@ -17,49 +17,61 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.StaticProperties;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.helpers.*;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
+import org.apache.streampipes.sdk.helpers.EpRequirements;
+import org.apache.streampipes.sdk.helpers.Labels;
+import org.apache.streampipes.sdk.helpers.OutputStrategies;
+import org.apache.streampipes.sdk.helpers.RequirementsSelector;
 
 import java.util.List;
 
-public class CollectionMappingExample extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class CollectionMappingExample implements IStreamPipesDataProcessor {
 
   private static final String MAPPING_PROPERTY_ID = "mapping-property";
   private static final String FIELDS_KEY = "fields";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.collection.mapping",
-            "Collection with mapping properties", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CollectionMappingExample::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.collection.mapping",
+                "Collection with mapping properties", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.withMappingPropertyId(MAPPING_PROPERTY_ID, EpRequirements.numberReq()))
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.withMappingPropertyId(MAPPING_PROPERTY_ID, EpRequirements.numberReq()))
+                .build())
             .requiredCollection(Labels.from(FIELDS_KEY, "Field Mappings", ""),
-                    StaticProperties.mappingPropertyUnary(Labels.from(MAPPING_PROPERTY_ID, "Field", ""),
-                            RequirementsSelector.FIRST_INPUT_STREAM,
-                            PropertyScope.NONE))
+                StaticProperties.mappingPropertyUnary(Labels.from(MAPPING_PROPERTY_ID, "Field", ""),
+                    RequirementsSelector.FIRST_INPUT_STREAM,
+                    PropertyScope.NONE))
             .outputStrategy(OutputStrategies.keep())
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the mapping property value
-    List<String> selectedMappings = extractor.getUnaryMappingsFromCollection(FIELDS_KEY);
+    List<String> selectedMappings = params.extractor().getUnaryMappingsFromCollection(FIELDS_KEY);
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingGroupExample.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingGroupExample.java
index 670b035..1492c15 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingGroupExample.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CollectionMappingGroupExample.java
@@ -17,82 +17,100 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.model.staticproperty.*;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.model.staticproperty.FreeTextStaticProperty;
+import org.apache.streampipes.model.staticproperty.MappingPropertyUnary;
+import org.apache.streampipes.model.staticproperty.OneOfStaticProperty;
+import org.apache.streampipes.model.staticproperty.Option;
+import org.apache.streampipes.model.staticproperty.StaticPropertyGroup;
 import org.apache.streampipes.sdk.StaticProperties;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.helpers.*;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
+import org.apache.streampipes.sdk.helpers.EpRequirements;
+import org.apache.streampipes.sdk.helpers.Labels;
+import org.apache.streampipes.sdk.helpers.Options;
+import org.apache.streampipes.sdk.helpers.OutputStrategies;
+import org.apache.streampipes.sdk.helpers.RequirementsSelector;
 
 import java.util.List;
 import java.util.stream.Collectors;
 
-public class CollectionMappingGroupExample extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class CollectionMappingGroupExample implements IStreamPipesDataProcessor {
 
   private static final String MAPPING_PROPERTY_ID = "mapping-property";
   private static final String FIELDS_KEY = "fields";
   private static final String COMPARATOR_ID = "comparator";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.collection.mapping.group",
-            "Collection with mapping properties and additional properties", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CollectionMappingGroupExample::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.collection.mapping.group",
+                "Collection with mapping properties and additional properties", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.withMappingPropertyId(MAPPING_PROPERTY_ID, EpRequirements.numberReq()))
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.withMappingPropertyId(MAPPING_PROPERTY_ID, EpRequirements.numberReq()))
+                .build())
             .requiredCollection(Labels.from(FIELDS_KEY, "Field Mappings", ""),
-                    StaticProperties.group(Labels.from("group", "Group", ""), false,
-                            StaticProperties.singleValueSelection(Labels.from(COMPARATOR_ID, "Comparator", ""),
-                                    Options.from("<", "<=", ">", ">=", "==", "*")),
-                            StaticProperties.mappingPropertyUnary(Labels.from(MAPPING_PROPERTY_ID, "Field", ""),
-                                    RequirementsSelector.FIRST_INPUT_STREAM,
-                                    PropertyScope.NONE),
-                            StaticProperties.doubleFreeTextProperty(Labels.from("weight", "Weight", ""))))
+                StaticProperties.group(Labels.from("group", "Group", ""), false,
+                    StaticProperties.singleValueSelection(Labels.from(COMPARATOR_ID, "Comparator", ""),
+                        Options.from("<", "<=", ">", ">=", "==", "*")),
+                    StaticProperties.mappingPropertyUnary(Labels.from(MAPPING_PROPERTY_ID, "Field", ""),
+                        RequirementsSelector.FIRST_INPUT_STREAM,
+                        PropertyScope.NONE),
+                    StaticProperties.doubleFreeTextProperty(Labels.from("weight", "Weight", ""))))
             .outputStrategy(OutputStrategies.keep())
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    var extractor = params.extractor();
     List<StaticPropertyGroup> groupItems = extractor.collectionMembersAsGroup(FIELDS_KEY);
 
     List<String> fields = groupItems
-            .stream()
-            .map(group -> (extractor
-                    .extractGroupMember(MAPPING_PROPERTY_ID, group)
-                    .as(MappingPropertyUnary.class))
-                    .getSelectedProperty())
-            .collect(Collectors.toList());
+        .stream()
+        .map(group -> (extractor
+            .extractGroupMember(MAPPING_PROPERTY_ID, group)
+            .as(MappingPropertyUnary.class))
+            .getSelectedProperty())
+        .collect(Collectors.toList());
 
     List<Double> weights = groupItems
-            .stream()
-            .map(group -> (extractor
-                    .extractGroupMember("weight", group)
-                    .as(FreeTextStaticProperty.class))
-                    .getValue())
-            .map(Double::parseDouble)
-            .collect(Collectors.toList());
+        .stream()
+        .map(group -> (extractor
+            .extractGroupMember("weight", group)
+            .as(FreeTextStaticProperty.class))
+            .getValue())
+        .map(Double::parseDouble)
+        .collect(Collectors.toList());
 
     List<String> comparators = groupItems
+        .stream()
+        .map(group -> (extractor
+            .extractGroupMember(COMPARATOR_ID, group)
+            .as(OneOfStaticProperty.class))
+            .getOptions()
             .stream()
-            .map(group -> (extractor
-                    .extractGroupMember(COMPARATOR_ID, group)
-                    .as(OneOfStaticProperty.class))
-                    .getOptions()
-                    .stream()
-                    .filter(Option::isSelected).findFirst().get().getName())
-            .collect(Collectors.toList());
+            .filter(Option::isSelected).findFirst().get().getName())
+        .collect(Collectors.toList());
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ColorPickerExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ColorPickerExampleController.java
index 68c150a..dbf1384 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ColorPickerExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ColorPickerExampleController.java
@@ -17,29 +17,34 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.helpers.*;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
+import org.apache.streampipes.sdk.helpers.EpRequirements;
+import org.apache.streampipes.sdk.helpers.Labels;
+import org.apache.streampipes.sdk.helpers.OutputStrategies;
+import org.apache.streampipes.sdk.helpers.SupportedFormats;
+import org.apache.streampipes.sdk.helpers.SupportedProtocols;
 
-public class ColorPickerExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class ColorPickerExampleController implements IStreamPipesDataProcessor {
 
   private static final String COLOR_PICKER_KEY = "color-key";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".colorpicker", "Color Picker Example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        ColorPickerExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".colorpicker", "Color Picker Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.userDefined())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -47,17 +52,24 @@
             // create a required code block
             .requiredColorParameter(Labels.from(COLOR_PICKER_KEY, "Color", "Select color"))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the code parameter value
-    String color = extractor.selectedColor(COLOR_PICKER_KEY);
+    String color = params.extractor().selectedColor(COLOR_PICKER_KEY);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CompactRuntimeResolvableSingleValueProcessor.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CompactRuntimeResolvableSingleValueProcessor.java
index 49a0db0..dd43cf9 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CompactRuntimeResolvableSingleValueProcessor.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CompactRuntimeResolvableSingleValueProcessor.java
@@ -17,24 +17,24 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.commons.exceptions.SpConfigurationException;
+import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.extensions.api.runtime.ResolvesContainerProvidedOptions;
-import org.apache.streampipes.model.graph.DataProcessorDescription;
 import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.staticproperty.Option;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.StaticPropertyExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Options;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.context.EventProcessorRuntimeContext;
-import org.apache.streampipes.wrapper.routing.SpOutputCollector;
-import org.apache.streampipes.wrapper.standalone.ProcessorParams;
-import org.apache.streampipes.wrapper.standalone.StreamPipesDataProcessor;
 
 import org.apache.commons.collections.MapUtils;
 import org.slf4j.Logger;
@@ -43,7 +43,7 @@
 import java.util.Arrays;
 import java.util.List;
 
-public class CompactRuntimeResolvableSingleValueProcessor extends StreamPipesDataProcessor implements ResolvesContainerProvidedOptions {
+public class CompactRuntimeResolvableSingleValueProcessor implements IStreamPipesDataProcessor, ResolvesContainerProvidedOptions {
 
   private static final String KafkaHost = "kafka-host";
   private static final String KafkaPort = "kafka-port";
@@ -51,13 +51,15 @@
   private static final Logger LOG = LoggerFactory.getLogger(CompactRuntimeResolvableSingleValueProcessor.class);
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-                    ".compactruntimeresolvable", "Compact Runtime-resolvable single value example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        CompactRuntimeResolvableSingleValueProcessor::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".compactruntimeresolvable", "Compact Runtime-resolvable single value example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -66,31 +68,33 @@
 
             // create a single value selection parameter that is resolved at runtime
             .requiredSingleValueSelectionFromContainer(Labels.from("id", "Example Name", "Example " +
-                    "Description"), Arrays.asList(KafkaHost, KafkaPort))
+                "Description"), Arrays.asList(KafkaHost, KafkaPort))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public void onInvocation(ProcessorParams parameters, SpOutputCollector spOutputCollector, EventProcessorRuntimeContext runtimeContext) throws SpRuntimeException {
-    String selectedSingleValue = parameters.extractor().selectedSingleValue("id", String.class);
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    String selectedSingleValue = params.extractor().selectedSingleValue("id", String.class);
     LOG.info(selectedSingleValue);
+
   }
 
   @Override
-  public void onEvent(Event event,
-                      SpOutputCollector collector) throws SpRuntimeException {
+  public void onEvent(Event event, SpOutputCollector collector) {
     MapUtils.debugPrint(System.out, "event", event.getRaw());
     collector.collect(event);
   }
 
   @Override
-  public void onDetach() throws SpRuntimeException {
+  public void onPipelineStopped() {
 
   }
 
   @Override
-  public List<Option> resolveOptions(String requestId, StaticPropertyExtractor parameterExtractor) {
+  public List<Option> resolveOptions(String staticPropertyInternalName,
+                                     IStaticPropertyExtractor parameterExtractor) throws SpConfigurationException {
     return Options.from("A", "B");
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ExampleDataProcessor.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ExampleDataProcessor.java
new file mode 100644
index 0000000..73e4b5a
--- /dev/null
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/ExampleDataProcessor.java
@@ -0,0 +1,65 @@
+/*
+ * 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.pe.examples.jvm.staticproperty;
+
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
+import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
+import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
+import org.apache.streampipes.sdk.helpers.EpRequirements;
+import org.apache.streampipes.sdk.helpers.Labels;
+import org.apache.streampipes.sdk.helpers.OutputStrategies;
+
+
+public class ExampleDataProcessor implements IStreamPipesDataProcessor {
+  @Override
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        ExampleDataProcessor::new,
+        ProcessingElementBuilder.create("my-example-processor", "Number Parameter With Range", "")
+            .requiredStream(StreamRequirementsBuilder.
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
+            .outputStrategy(OutputStrategies.keep())
+            .requiredIntegerParameter(Labels.from("key", "Integer Parameter", ""), 0, 100, 1)
+            .build()
+    );
+  }
+
+  @Override
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    // called when pipeline is started
+
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+}
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/MultiValueSelectionExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/MultiValueSelectionExampleController.java
index dfbb362..46752fa 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/MultiValueSelectionExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/MultiValueSelectionExampleController.java
@@ -17,53 +17,61 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Options;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import java.util.List;
 
-public class MultiValueSelectionExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class MultiValueSelectionExampleController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".multivalue", "Multi value selection example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        MultiValueSelectionExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".multivalue", "Multi value selection example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             // create a simple text parameter
             .requiredMultiValueSelection(Labels.from("id", "Example Name", "Example " +
-                    "Description"), Options.from("Value A", "Value B", "Value C"))
+                "Description"), Options.from("Value A", "Value B", "Value C"))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the text parameter value
-    List<String> selectedSingleValue = extractor.selectedMultiValues("id", String.class);
+    List<String> selectedSingleValue = params.extractor().selectedMultiValues("id", String.class);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NaryMappingPropertyExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NaryMappingPropertyExampleController.java
index 14354ee..0e768d4 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NaryMappingPropertyExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NaryMappingPropertyExampleController.java
@@ -17,50 +17,59 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import java.util.List;
 
-public class NaryMappingPropertyExampleController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class NaryMappingPropertyExampleController implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".mappingnary", "Nary Mapping Property Example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        NaryMappingPropertyExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".mappingnary", "Nary Mapping Property Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredPropertyWithNaryMapping(EpRequirements.numberReq(),
-                            Labels.from("mp-key", "My Mapping", ""),
-                            PropertyScope.NONE)
-                    .build())
+                create()
+                .requiredPropertyWithNaryMapping(EpRequirements.numberReq(),
+                    Labels.from("mp-key", "My Mapping", ""),
+                    PropertyScope.NONE)
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the mapping property value
-    List<String> mappingPropertySelectors = extractor.mappingPropertyValues("mp-key");
+    List<String> mappingPropertySelectors = params.extractor().mappingPropertyValues("mp-key");
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterExampleController.java
index 595fdae..84db1e6 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterExampleController.java
@@ -17,33 +17,34 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class NumberParameterExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class NumberParameterExampleController  implements IStreamPipesDataProcessor {
 
   private static final String SP_KEY = "my-example-key";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".numberparameter", "Number Parameter Example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+    NumberParameterExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".numberparameter", "Number Parameter Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -55,20 +56,27 @@
             .requiredFloatParameter(Labels.from("float-key", "Float Parameter", "Example Description"))
 
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the integer parameter value
-    Integer integerParameter = extractor.singleValueParameter(SP_KEY, Integer.class);
+    Integer integerParameter = params.extractor().singleValueParameter(SP_KEY, Integer.class);
 
     // Extract the float parameter value
-    Float floatParameter = extractor.singleValueParameter("float-key", Float.class);
+    Float floatParameter = params.extractor().singleValueParameter("float-key", Float.class);
 
-    // now the parameters would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterWithRangeExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterWithRangeExampleController.java
index d1b57e2..7a2519d 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterWithRangeExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/NumberParameterWithRangeExampleController.java
@@ -17,53 +17,60 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class NumberParameterWithRangeExampleController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class NumberParameterWithRangeExampleController implements IStreamPipesDataProcessor {
 
   private static final String SP_KEY = "my-example-key";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".numberparameterrange", "Number Parameter With Range", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        NumberParameterWithRangeExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".numberparameterrange", "Number Parameter With Range", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             // create an integer parameter
             .requiredIntegerParameter(Labels.from(SP_KEY, "Integer Parameter", "Example " +
-                    "Description"), 0, 100, 1)
+                "Description"), 0, 100, 1)
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the integer parameter value
-    Integer integerParameter = extractor.singleValueParameter(SP_KEY, Integer.class);
+    Integer integerParameter = params.extractor().singleValueParameter(SP_KEY, Integer.class);
 
-    // now the parameter would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableAnyStaticPropertyController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableAnyStaticPropertyController.java
index caadbfb..9bb5bdd 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableAnyStaticPropertyController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableAnyStaticPropertyController.java
@@ -17,23 +17,22 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
+import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.extensions.api.runtime.ResolvesContainerProvidedOptions;
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.staticproperty.Option;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.extractor.StaticPropertyExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import org.apache.kafka.clients.consumer.KafkaConsumer;
 
@@ -43,20 +42,21 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-public class RuntimeResolvableAnyStaticPropertyController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> implements ResolvesContainerProvidedOptions {
+public class RuntimeResolvableAnyStaticPropertyController implements IStreamPipesDataProcessor, ResolvesContainerProvidedOptions {
 
   private static final String KafkaHost = "kafka-host";
   private static final String KafkaPort = "kafka-port";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".runtimeresolvablemulti", "Runtime-resolvable multi value example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        RuntimeResolvableAnyStaticPropertyController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".runtimeresolvablemulti", "Runtime-resolvable multi value example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -65,24 +65,33 @@
 
             // create a single value selection parameter that is resolved at runtime
             .requiredMultiValueSelectionFromContainer(Labels.from("id", "Example Name", "Example " +
-                    "Description"), Arrays.asList(KafkaHost, KafkaPort))
+                "Description"), Arrays.asList(KafkaHost, KafkaPort))
 
-            .build();
+            .build()
+
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the text parameter value
-    List<String> selectedSingleValue = extractor.selectedMultiValues("id", String.class);
+    List<String> selectedSingleValue = params.extractor().selectedMultiValues("id", String.class);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
   }
 
   @Override
-  public List<Option> resolveOptions(String requestId, StaticPropertyExtractor extractor) {
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+
+  @Override
+  public List<Option> resolveOptions(String requestId, IStaticPropertyExtractor extractor) {
     String host = extractor.singleValueParameter(KafkaHost, String.class);
     Integer port = extractor.singleValueParameter(KafkaPort, Integer.class);
 
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableSingleValue.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableSingleValue.java
index 5d57c73..a1e4158 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableSingleValue.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/RuntimeResolvableSingleValue.java
@@ -17,23 +17,22 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
+import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.extensions.api.runtime.ResolvesContainerProvidedOptions;
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.staticproperty.Option;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
-import org.apache.streampipes.sdk.extractor.StaticPropertyExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import org.apache.kafka.clients.consumer.KafkaConsumer;
 
@@ -43,20 +42,21 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-public class RuntimeResolvableSingleValue extends
-        StandaloneEventProcessingDeclarer<DummyParameters> implements ResolvesContainerProvidedOptions {
+public class RuntimeResolvableSingleValue implements IStreamPipesDataProcessor, ResolvesContainerProvidedOptions {
 
   private static final String KafkaHost = "kafka-host";
   private static final String KafkaPort = "kafka-port";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".runtimeresolvablesingle", "Runtime-resolvable single value example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        RuntimeResolvableSingleValue::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".runtimeresolvablesingle", "Runtime-resolvable single value example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -65,24 +65,32 @@
 
             // create a single value selection parameter that is resolved at runtime
             .requiredSingleValueSelectionFromContainer(Labels.from("id", "Example Name", "Example " +
-                    "Description"), Arrays.asList(KafkaHost, KafkaPort))
+                "Description"), Arrays.asList(KafkaHost, KafkaPort))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
 
     // Extract the text parameter value
-    String selectedSingleValue = extractor.selectedSingleValue("id", String.class);
+    String selectedSingleValue = params.extractor().selectedSingleValue("id", String.class);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
-
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
   }
 
   @Override
-  public List<Option> resolveOptions(String requestId, StaticPropertyExtractor extractor) {
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
+  }
+
+  @Override
+  public List<Option> resolveOptions(String requestId, IStaticPropertyExtractor extractor) {
     String host = extractor.singleValueParameter(KafkaHost, String.class);
     Integer port = extractor.singleValueParameter(KafkaPort, Integer.class);
 
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SecretStaticPropertyExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SecretStaticPropertyExampleController.java
index 3435c6e..a66a553 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SecretStaticPropertyExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SecretStaticPropertyExampleController.java
@@ -17,33 +17,34 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class SecretStaticPropertyExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class SecretStaticPropertyExampleController implements IStreamPipesDataProcessor {
 
   private static final String SP_KEY = "my-secret-key";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".secret", "Secret Parameter Example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        SecretStaticPropertyExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".secret", "Secret Parameter Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -51,18 +52,25 @@
             // create a simple text parameter
             .requiredSecret(Labels.from(SP_KEY, "Secret Password", "Secret Password Example"))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the text parameter value
-    String textParameter = extractor.secretValue(SP_KEY);
+    String textParameter = params.extractor().secretValue(SP_KEY);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
 
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SingleValueSelectionExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SingleValueSelectionExampleController.java
index e461a79..beaae0f 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SingleValueSelectionExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/SingleValueSelectionExampleController.java
@@ -17,52 +17,59 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.Options;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class SingleValueSelectionExampleController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class SingleValueSelectionExampleController  implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".singlevalue", "Single value selection example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+      SingleValueSelectionExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".singlevalue", "Single value selection example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             // create a single value selection parameter
             .requiredSingleValueSelection(Labels.from("id", "Example Name", "Example " +
-                    "Description"), Options.from("Option A", "Option B", "Option C"))
+                "Description"), Options.from("Option A", "Option B", "Option C"))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the text parameter value
-    String selectedSingleValue = extractor.selectedSingleValue("id", String.class);
+    String selectedSingleValue = params.extractor().selectedSingleValue("id", String.class);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/StaticPropertyAlternativesController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/StaticPropertyAlternativesController.java
index 9a51b6e..4cfdc47 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/StaticPropertyAlternativesController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/StaticPropertyAlternativesController.java
@@ -17,14 +17,15 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.StaticProperties;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.Alternatives;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
@@ -32,51 +33,60 @@
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class StaticPropertyAlternativesController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class StaticPropertyAlternativesController implements IStreamPipesDataProcessor {
 
   private static final String KafkaHost = "kafka-host";
   private static final String KafkaPort = "kafka-port";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".alternatives", "Static property alternatives example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        StaticPropertyAlternativesController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".alternatives", "Static property alternatives example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
             .requiredTextParameter(Labels.from(KafkaHost, "Kafka Host", ""))
 
             .requiredAlternatives(Labels.from("window", "Window", ""),
-                    Alternatives.from(Labels.from("count", "Count Window", ""),
-                            StaticProperties.integerFreeTextProperty(Labels.from("count-window-size",
-                                    "Count Window Size", ""))),
-                    Alternatives.from(Labels.from("time", "Time Window", ""),
-                            StaticProperties.group(Labels.from("group", "", ""),
-                                    StaticProperties.integerFreeTextProperty(Labels.from("time" +
-                                            "-window-size", "Time Window Size", "")),
-                                    StaticProperties.singleValueSelection(Labels.from("time" +
-                                            "-window-unit", "Time Unit", ""),
-                                            Options.from("Seconds", "Minutes", "Hours")))))
-            .build();
+                Alternatives.from(Labels.from("count", "Count Window", ""),
+                    StaticProperties.integerFreeTextProperty(Labels.from("count-window-size",
+                        "Count Window Size", ""))),
+                Alternatives.from(Labels.from("time", "Time Window", ""),
+                    StaticProperties.group(Labels.from("group", "", ""),
+                        StaticProperties.integerFreeTextProperty(Labels.from("time" +
+                            "-window-size", "Time Window Size", "")),
+                        StaticProperties.singleValueSelection(Labels.from("time" +
+                                "-window-unit", "Time Unit", ""),
+                            Options.from("Seconds", "Minutes", "Hours")))))
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    var extractor = params.extractor();
     String selectedAlternative = extractor.selectedAlternativeInternalId("window");
     if (selectedAlternative.equals("time")) {
       Integer timeWindowSize = extractor.singleValueParameter("time-window-size", Integer.class);
     }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TextParameterExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TextParameterExampleController.java
index d610806..f8789ab 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TextParameterExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TextParameterExampleController.java
@@ -17,33 +17,34 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class TextParameterExampleController extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class TextParameterExampleController  implements IStreamPipesDataProcessor {
 
   private static final String SP_KEY = "my-example-key";
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".textparameter", "Text Parameter Example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        TextParameterExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".textparameter", "Text Parameter Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
@@ -51,17 +52,24 @@
             // create a simple text parameter
             .requiredTextParameter(Labels.from(SP_KEY, "Example Name", "Example Description"))
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the text parameter value
-    String textParameter = extractor.singleValueParameter(SP_KEY, String.class);
+    String textParameter = params.extractor().singleValueParameter(SP_KEY, String.class);
 
-    // now the text parameter would be added to a parameter class (omitted for this example)
+  }
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TreeInputSink.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TreeInputSink.java
index 409c5ff..300454c 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TreeInputSink.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TreeInputSink.java
@@ -1,73 +1,77 @@
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.extensions.api.extractor.IStaticPropertyExtractor;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataSink;
+import org.apache.streampipes.extensions.api.pe.context.EventSinkRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataSinkParameters;
 import org.apache.streampipes.extensions.api.runtime.SupportsRuntimeConfig;
-import org.apache.streampipes.model.graph.DataSinkDescription;
 import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.staticproperty.RuntimeResolvableTreeInputStaticProperty;
 import org.apache.streampipes.model.staticproperty.StaticProperty;
 import org.apache.streampipes.model.staticproperty.TreeInputNode;
 import org.apache.streampipes.sdk.builder.DataSinkBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.StaticPropertyExtractor;
+import org.apache.streampipes.sdk.builder.sink.DataSinkConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.context.EventSinkRuntimeContext;
-import org.apache.streampipes.wrapper.standalone.SinkParams;
-import org.apache.streampipes.wrapper.standalone.StreamPipesDataSink;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-public class TreeInputSink extends StreamPipesDataSink implements SupportsRuntimeConfig {
+public class TreeInputSink implements IStreamPipesDataSink, SupportsRuntimeConfig {
 
   private static final String SP_KEY = "example-key";
   private static final String TREE_KEY = "tree-key";
 
   @Override
-  public DataSinkDescription declareModel() {
-    return DataSinkBuilder.create("org.apache.streampipes.examples.treeinput", "Tree Input Example", "")
+  public DataSinkConfiguration declareConfig() {
+    return DataSinkConfiguration.create(
+        TreeInputSink::new,
+        DataSinkBuilder.create("org.apache.streampipes.examples.treeinput", "Tree Input Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredProperty(EpRequirements.anyProperty())
-                    .build())
+                create()
+                .requiredProperty(EpRequirements.anyProperty())
+                .build())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
             // create a simple text parameter
             .requiredTextParameter(Labels.from(SP_KEY, "Example Key", "required by tree input"))
             .requiredRuntimeResolvableTreeInput(
-                    Labels.from(TREE_KEY, "Tree", "The tree input"),
-                    Collections.singletonList(SP_KEY))
+                Labels.from(TREE_KEY, "Tree", "The tree input"),
+                Collections.singletonList(SP_KEY),
+                true)
 
-            .build();
+            .build()
+    );
   }
 
+
   @Override
-  public void onInvocation(SinkParams parameters, EventSinkRuntimeContext runtimeContext) throws SpRuntimeException {
+  public void onPipelineStarted(IDataSinkParameters params, EventSinkRuntimeContext runtimeContext) {
 
   }
 
   @Override
-  public void onEvent(Event event) throws SpRuntimeException {
+  public void onEvent(Event event) {
 
   }
 
   @Override
-  public void onDetach() throws SpRuntimeException {
+  public void onPipelineStopped() {
 
   }
 
   @Override
   public StaticProperty resolveConfiguration(String staticPropertyInternalName,
-                                             StaticPropertyExtractor extractor) {
+                                             IStaticPropertyExtractor extractor) {
     RuntimeResolvableTreeInputStaticProperty treeInput = extractor
-            .getStaticPropertyByName(
-                    staticPropertyInternalName,
-                    RuntimeResolvableTreeInputStaticProperty.class);
+        .getStaticPropertyByName(
+            staticPropertyInternalName,
+            RuntimeResolvableTreeInputStaticProperty.class);
 
     List<TreeInputNode> nodes = buildSampleNodes();
     treeInput.setNodes(nodes);
@@ -89,18 +93,18 @@
 
   private List<TreeInputNode> buildFruitNodes() {
     return Arrays.asList(
-            buildNode("Apple"),
-            buildNode("Banana"),
-            buildNode("Orange"),
-            buildExpandableNode("Sour", Arrays.asList(buildNode("Lemon"), buildNode("Guava"), buildNode("Cranberry")))
+        buildNode("Apple"),
+        buildNode("Banana"),
+        buildNode("Orange"),
+        buildExpandableNode("Sour", Arrays.asList(buildNode("Lemon"), buildNode("Guava"), buildNode("Cranberry")))
     );
   }
 
   private List<TreeInputNode> buildVegetableNodes() {
     return Arrays.asList(
-            buildNode("Tomato"),
-            buildNode("Pepper"),
-            buildNode("Carrot")
+        buildNode("Tomato"),
+        buildNode("Pepper"),
+        buildNode("Carrot")
     );
   }
 
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TwoStreamsMappingExample.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TwoStreamsMappingExample.java
index ec56c57..d1f924d 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TwoStreamsMappingExample.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/TwoStreamsMappingExample.java
@@ -17,25 +17,24 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
 import org.apache.streampipes.model.DataProcessorType;
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.utils.Assets;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
 import java.util.List;
 
-public class TwoStreamsMappingExample extends StandaloneEventProcessingDeclarer<DummyParameters> {
+public class TwoStreamsMappingExample  implements IStreamPipesDataProcessor {
 
   private static final String KEY_STREAM_1 = "stream-1-key";
   private static final String PROPERTIES_STREAM_1 = "stream-1-properties";
@@ -44,43 +43,54 @@
 
   private static final String ID = "org.apache.streampipes.examples.staticproperty.twostreamsmapping";
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create(ID, "Two Streams", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+        TwoStreamsMappingExample::new,
+        ProcessingElementBuilder.create(ID, "Two Streams", "")
             .withAssets(Assets.DOCUMENTATION, Assets.ICON)
             .category(DataProcessorType.ALGORITHM)
             .requiredStream(StreamRequirementsBuilder
-                    .create()
-                    .requiredPropertyWithNaryMapping(
-                            EpRequirements.numberReq(),
-                            Labels.from(PROPERTIES_STREAM_1, "S1 Properties", ""),
-                            PropertyScope.NONE)
-                    .requiredPropertyWithUnaryMapping(EpRequirements.numberReq(),
-                            Labels.from(KEY_STREAM_1, "S1 Key", ""), PropertyScope.NONE)
-                    .build())
+                .create()
+                .requiredPropertyWithNaryMapping(
+                    EpRequirements.numberReq(),
+                    Labels.from(PROPERTIES_STREAM_1, "S1 Properties", ""),
+                    PropertyScope.NONE)
+                .requiredPropertyWithUnaryMapping(EpRequirements.numberReq(),
+                    Labels.from(KEY_STREAM_1, "S1 Key", ""), PropertyScope.NONE)
+                .build())
             .requiredStream(StreamRequirementsBuilder
-                    .create()
-                    .requiredPropertyWithNaryMapping(EpRequirements.numberReq(),
-                            Labels.from(PROPERTIES_STREAM_2, "S2 Properties", ""),
-                            PropertyScope.NONE)
-                    .requiredPropertyWithUnaryMapping(EpRequirements.numberReq(),
-                            Labels.from(KEY_STREAM_2, "S2 Key", ""),
-                            PropertyScope.NONE)
-                    .build())
+                .create()
+                .requiredPropertyWithNaryMapping(EpRequirements.numberReq(),
+                    Labels.from(PROPERTIES_STREAM_2, "S2 Properties", ""),
+                    PropertyScope.NONE)
+                .requiredPropertyWithUnaryMapping(EpRequirements.numberReq(),
+                    Labels.from(KEY_STREAM_2, "S2 Key", ""),
+                    PropertyScope.NONE)
+                .build())
             .outputStrategy(OutputStrategies.keep())
-            .build();
+            .build()
+    );
+  }
+
+  @Override
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
+    var extractor = params.extractor();
+    List<String> selProps1 = extractor.mappingPropertyValues(PROPERTIES_STREAM_1);
+    List<String> selProps = extractor.mappingPropertyValues(PROPERTIES_STREAM_2);
+
+    String selKey1 = extractor.mappingPropertyValue(KEY_STREAM_1);
+    String selKey2 = extractor.mappingPropertyValue(KEY_STREAM_2);
 
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
+  public void onEvent(Event event, SpOutputCollector collector) {
 
-      List<String> selProps1 = extractor.mappingPropertyValues(PROPERTIES_STREAM_1);
-      List<String> selProps = extractor.mappingPropertyValues(PROPERTIES_STREAM_2);
+  }
 
-      String selKey1 = extractor.mappingPropertyValue(KEY_STREAM_1);
-      String selKey2 = extractor.mappingPropertyValue(KEY_STREAM_2);
+  @Override
+  public void onPipelineStopped() {
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
   }
 
 }
diff --git a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/UnaryMappingPropertyExampleController.java b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/UnaryMappingPropertyExampleController.java
index 0ddeec6..b5149c7 100644
--- a/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/UnaryMappingPropertyExampleController.java
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/UnaryMappingPropertyExampleController.java
@@ -17,48 +17,57 @@
  */
 package org.apache.streampipes.pe.examples.jvm.staticproperty;
 
-import org.apache.streampipes.model.graph.DataProcessorDescription;
-import org.apache.streampipes.model.graph.DataProcessorInvocation;
+import org.apache.streampipes.extensions.api.pe.IStreamPipesDataProcessor;
+import org.apache.streampipes.extensions.api.pe.context.EventProcessorRuntimeContext;
+import org.apache.streampipes.extensions.api.pe.param.IDataProcessorParameters;
+import org.apache.streampipes.extensions.api.pe.routing.SpOutputCollector;
+import org.apache.streampipes.model.runtime.Event;
 import org.apache.streampipes.model.schema.PropertyScope;
-import org.apache.streampipes.pe.examples.jvm.base.DummyEngine;
-import org.apache.streampipes.pe.examples.jvm.base.DummyParameters;
 import org.apache.streampipes.sdk.builder.ProcessingElementBuilder;
 import org.apache.streampipes.sdk.builder.StreamRequirementsBuilder;
-import org.apache.streampipes.sdk.extractor.ProcessingElementParameterExtractor;
+import org.apache.streampipes.sdk.builder.processor.DataProcessorConfiguration;
 import org.apache.streampipes.sdk.helpers.EpRequirements;
 import org.apache.streampipes.sdk.helpers.Labels;
 import org.apache.streampipes.sdk.helpers.OutputStrategies;
 import org.apache.streampipes.sdk.helpers.SupportedFormats;
 import org.apache.streampipes.sdk.helpers.SupportedProtocols;
-import org.apache.streampipes.wrapper.standalone.ConfiguredEventProcessor;
-import org.apache.streampipes.wrapper.standalone.declarer.StandaloneEventProcessingDeclarer;
 
-public class UnaryMappingPropertyExampleController extends
-        StandaloneEventProcessingDeclarer<DummyParameters> {
+public class UnaryMappingPropertyExampleController  implements IStreamPipesDataProcessor {
 
   @Override
-  public DataProcessorDescription declareModel() {
-    return ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
-            ".mappingunary", "Unary Mapping Property Example", "")
+  public DataProcessorConfiguration declareConfig() {
+    return DataProcessorConfiguration.create(
+      UnaryMappingPropertyExampleController::new,
+        ProcessingElementBuilder.create("org.apache.streampipes.examples.staticproperty" +
+                ".mappingunary", "Unary Mapping Property Example", "")
             .requiredStream(StreamRequirementsBuilder.
-                    create()
-                    .requiredPropertyWithUnaryMapping(EpRequirements.numberReq(),
-                            Labels.from("mp-key", "My Mapping", ""),
-                            PropertyScope.NONE)
-                    .build())
+                create()
+                .requiredPropertyWithUnaryMapping(EpRequirements.numberReq(),
+                    Labels.from("mp-key", "My Mapping", ""),
+                    PropertyScope.NONE)
+                .build())
             .outputStrategy(OutputStrategies.keep())
             .supportedProtocols(SupportedProtocols.kafka())
             .supportedFormats(SupportedFormats.jsonFormat())
 
-            .build();
+            .build()
+    );
   }
 
   @Override
-  public ConfiguredEventProcessor<DummyParameters> onInvocation(DataProcessorInvocation graph, ProcessingElementParameterExtractor extractor) {
-
+  public void onPipelineStarted(IDataProcessorParameters params, SpOutputCollector collector, EventProcessorRuntimeContext runtimeContext) {
     // Extract the mapping property value
-    String mappingPropertySelector = extractor.mappingPropertyValue("mp-key");
+    String mappingPropertySelector = params.extractor().mappingPropertyValue("mp-key");
 
-    return new ConfiguredEventProcessor<>(new DummyParameters(graph), DummyEngine::new);
+  }
+
+  @Override
+  public void onEvent(Event event, SpOutputCollector collector) {
+
+  }
+
+  @Override
+  public void onPipelineStopped() {
+
   }
 }
