diff --git a/README.md b/README.md
index 1ee028e..3afdc96 100644
--- a/README.md
+++ b/README.md
@@ -18,10 +18,10 @@
 
 # StreamPipes
 
-Apache StreamPipes (incubating) A self-service (Industrial) IoT toolbox to enable non-technical users to connect
+Apache StreamPipes (incubating) A self-service (Industrial) IoT toolbox to enable non-technical userAccounts to connect
 , analyze and explore IoT data streams.
 
-It leverages non-technical users to quickly define and execute processing pipelines based on an easily extensible 
+It leverages non-technical userAccounts to quickly define and execute processing pipelines based on an easily extensible 
 toolbox of data sources, data processors and data sinks.
 
 Learn more about StreamPipes at [https://streampipes.apache.org/](https://streampipes.apache.org/)
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 dccd087..46e1bcc 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
@@ -17,35 +17,36 @@
  */
 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.model.SpDataStream;
+import org.apache.streampipes.client.credentials.CredentialsProvider;
 import org.apache.streampipes.model.pipeline.Pipeline;
-import org.apache.streampipes.model.pipeline.PipelineOperationStatus;
 
 import java.util.List;
 
 public class Example {
 
   public static void main(String[] args) {
-    StreamPipesCredentials credentials = StreamPipesCredentials
-            .from(System.getenv("user"), System.getenv("apiKey"));
+//    CredentialsProvider credentials = StreamPipesCredentials
+//            .withApiKey(System.getenv("user"), System.getenv("apiKey"));
+
+    CredentialsProvider credentials = StreamPipesCredentials.withServiceToken("sp-service-client", "my-apache-streampipes-secret-key-change-me");
 
     // 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();
+    System.out.println(pipelines.size());
 
-    // Start a pipeline
-    PipelineOperationStatus message = client.pipelines().start(pipelines.get(0));
-
-    // Get all data streams
-    List<SpDataStream> dataStreams = client.streams().all();
-
-    // Subscribe to a data stream
-    client.streams().subscribe(dataStreams.get(0), event -> MapUtils.debugPrint(System.out, "event", event.getRaw()));
+//    // Start a pipeline
+//    PipelineOperationStatus message = client.pipelines().start(pipelines.get(0));
+//
+//    // Get all data streams
+//    List<SpDataStream> dataStreams = client.streams().all();
+//
+//    // Subscribe to a data stream
+//    client.streams().subscribe(dataStreams.get(0), event -> MapUtils.debugPrint(System.out, "event", event.getRaw()));
   }
 }
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 2e4d9a1..6fad4d8 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
@@ -20,6 +20,7 @@
 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.model.SpDataStream;
 import org.apache.streampipes.model.graph.DataSinkInvocation;
@@ -37,8 +38,8 @@
     // First, go to the StreamPipes UI and create an API key (user -> profile in the upper right corner)
     
     // Create credentials by providing a user (the email) and the API key
-    StreamPipesCredentials credentials = StreamPipesCredentials
-            .from(System.getenv("user"), System.getenv("apiKey"));
+    CredentialsProvider credentials = StreamPipesCredentials
+            .withApiKey(System.getenv("user"), System.getenv("apiKey"));
 
     // Create an instance of the StreamPipes client
     StreamPipesClient client = StreamPipesClient
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 634de79..f3d8d75 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
@@ -59,6 +59,7 @@
             .registerPipelineElement(new CollectionMappingExample())
             .registerPipelineElement(new NestedListRequirementsController())
             .registerPipelineElement(new TwoStreamsMappingExample())
+            .registerPipelineElement(new CompactRuntimeResolvableSingleValueProcessor())
 
             .registerPipelineElement(new AppendOutputController())
             .registerPipelineElement(new CustomOutputController())
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
new file mode 100644
index 0000000..783a5d6
--- /dev/null
+++ b/streampipes-pipeline-elements-examples-processors-jvm/src/main/java/org/apache/streampipes/pe/examples/jvm/staticproperty/CompactRuntimeResolvableSingleValueProcessor.java
@@ -0,0 +1,90 @@
+/*
+ * 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.commons.collections.MapUtils;
+import org.apache.streampipes.commons.exceptions.SpRuntimeException;
+import org.apache.streampipes.container.api.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.helpers.*;
+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.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class CompactRuntimeResolvableSingleValueProcessor extends StreamPipesDataProcessor implements ResolvesContainerProvidedOptions {
+
+  private static final String KafkaHost = "kafka-host";
+  private static final String KafkaPort = "kafka-port";
+
+  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", "")
+            .requiredStream(StreamRequirementsBuilder.
+                    create()
+                    .requiredProperty(EpRequirements.anyProperty())
+                    .build())
+            .outputStrategy(OutputStrategies.keep())
+            .supportedProtocols(SupportedProtocols.kafka())
+            .supportedFormats(SupportedFormats.jsonFormat())
+            .requiredTextParameter(Labels.from(KafkaHost, "Kafka Host", ""))
+            .requiredIntegerParameter(Labels.from(KafkaPort, "Kafka Port", ""))
+
+            // create a single value selection parameter that is resolved at runtime
+            .requiredSingleValueSelectionFromContainer(Labels.from("id", "Example Name", "Example " +
+                    "Description"), Arrays.asList(KafkaHost, KafkaPort))
+
+            .build();
+  }
+
+  @Override
+  public void onInvocation(ProcessorParams parameters, SpOutputCollector spOutputCollector, EventProcessorRuntimeContext runtimeContext) throws SpRuntimeException {
+    String selectedSingleValue = parameters.extractor().selectedSingleValue("id", String.class);
+    LOG.info(selectedSingleValue);
+  }
+
+  @Override
+  public void onEvent(Event event,
+                      SpOutputCollector collector) throws SpRuntimeException {
+    MapUtils.debugPrint(System.out, "event", event.getRaw());
+    collector.collect(event);
+  }
+
+  @Override
+  public void onDetach() throws SpRuntimeException {
+
+  }
+
+  @Override
+  public List<Option> resolveOptions(String requestId, StaticPropertyExtractor parameterExtractor) {
+    return Options.from("A", "B");
+  }
+}
