diff --git a/src/main/java/org/apache/sling/pipes/PipeBuilder.java b/src/main/java/org/apache/sling/pipes/PipeBuilder.java
index 16a696f..f73e0c1 100644
--- a/src/main/java/org/apache/sling/pipes/PipeBuilder.java
+++ b/src/main/java/org/apache/sling/pipes/PipeBuilder.java
@@ -381,6 +381,7 @@
      * @param numThreads number of threads to use for running the contained pipes
      * @param bindings additional bindings for the execution (can be null)
      * @return set of resource path, merged output of pipes execution (order is arbitrary)
+     * @throws Exception in case something went wrong in run execution
      */
     ExecutionResult runParallel(int numThreads, Map bindings) throws Exception;
 }
diff --git a/src/main/java/org/apache/sling/pipes/internal/GogoCommands.java b/src/main/java/org/apache/sling/pipes/internal/GogoCommands.java
index b03c7d9..7875619 100644
--- a/src/main/java/org/apache/sling/pipes/internal/GogoCommands.java
+++ b/src/main/java/org/apache/sling/pipes/internal/GogoCommands.java
@@ -31,7 +31,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.StringReader;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -116,11 +115,11 @@
 
     /**
      * internal execution command handler
-     * @param resolver
-     * @param path
-     * @param optionTokens
+     * @param resolver resolver with which pipe will be executed
+     * @param path pipe path to execute, {@code INPUT} for getting last token's output as path for things like build some / pipe | execute -
+     * @param optionTokens different options tokens
      * @return Execution results
-     * @throws Exception
+     * @throws Exception exception in case something goes wrong
      */
     protected ExecutionResult executeInternal(ResourceResolver resolver, String path, String... optionTokens) throws Exception {
         Resource resource = resolver.getResource(path);
@@ -129,9 +128,9 @@
         }
         Options options = getOptions(optionTokens);
         Map bMap = null;
-        if (options.bindings != null) {
+        if (options.with != null) {
             bMap = new HashMap();
-            writeToMap(bMap, options.bindings);
+            writeToMap(bMap, options.with);
         }
         OutputWriter writer = new NopWriter();
         if (options.writer != null){
@@ -155,11 +154,11 @@
                                                     "\n\t'name pipeName' (used in bindings), " +
                                                     "\n\t'expr pipeExpression' (when not directly as <args>)" +
                                                     "\n\t'path pipePath' (when not directly as <args>)" +
-                                                    "\n\t'bindings key=value ...'" +
+                                                    "\n\t'with key=value ...'" +
                                                     "\n\t'outputs key=value ...'" +
                                                     "\n and <pipe> is one of the following :\n");
         for (Map.Entry<String, PipeExecutor> entry : getExecutorMap().entrySet()){
-            System.out.format("\t%s : %s\n", entry.getKey(), entry.getValue().description() );
+            System.out.format("\t%s\t\t:\t%s\n", entry.getKey(), entry.getValue().description() );
         }
     }
 
@@ -286,8 +285,10 @@
                         returnValue.add(currentToken);
                         break;
                     case GogoCommands.PARAMS:
-                        currentToken.args = currentList;
-                        currentList = new ArrayList();
+                        if (currentToken.args == null){
+                            currentToken.args = currentList;
+                            currentList = new ArrayList();
+                        }
                         currentList.add(PARAMS);
                         break;
                     default:
@@ -355,7 +356,7 @@
         String name;
         String path;
         String expr;
-        String[] bindings;
+        String[] with;
         OutputWriter writer;
 
         @Override
@@ -364,7 +365,7 @@
                     "name='" + name + '\'' +
                     ", path='" + path + '\'' +
                     ", expr='" + expr + '\'' +
-                    ", bindings=" + Arrays.toString(bindings) +
+                    ", with=" + Arrays.toString(with) +
                     ", writer=" + writer +
                     '}';
         }
@@ -404,7 +405,7 @@
                         break;
                     }
                     case "with" : {
-                        this.bindings = keyValuesToArray((List<String>)entry.getValue());
+                        this.with = keyValuesToArray((List<String>)entry.getValue());
                         break;
                     }
                     case "outputs" : {
@@ -454,8 +455,8 @@
             if (StringUtils.isNotBlank(expr)){
                 builder.expr(expr);
             }
-            if (bindings != null){
-                builder.with(bindings);
+            if (with != null){
+                builder.with(with);
             }
         }
     }
diff --git a/src/main/java/org/apache/sling/pipes/internal/WritePipe.java b/src/main/java/org/apache/sling/pipes/internal/WritePipe.java
index 5e2293b..9793930 100644
--- a/src/main/java/org/apache/sling/pipes/internal/WritePipe.java
+++ b/src/main/java/org/apache/sling/pipes/internal/WritePipe.java
@@ -114,6 +114,7 @@
      * @param key property to which value will be written
      * @param expression configured value to write
      * @return actual value to write to the resource
+     * @throws ScriptException in case value computation went wrong
      */
     protected Object computeValue(Resource resource, String key, Object expression) throws ScriptException {
         if (expression instanceof String) {
diff --git a/src/test/java/org/apache/sling/pipes/internal/GogoCommandsTest.java b/src/test/java/org/apache/sling/pipes/internal/GogoCommandsTest.java
index ef838af..350c400 100644
--- a/src/test/java/org/apache/sling/pipes/internal/GogoCommandsTest.java
+++ b/src/test/java/org/apache/sling/pipes/internal/GogoCommandsTest.java
@@ -81,9 +81,9 @@
         assertEquals("check expr", expected, options.expr);
         assertEquals("check path", expected, options.path);
         Map bindings = new HashMap();
-        CommandUtil.writeToMap(bindings, options.bindings);
-        assertEquals("check bindings first", expected, bindings.get("one"));
-        assertEquals("check bindings second", expected, bindings.get("two"));
+        CommandUtil.writeToMap(bindings, options.with);
+        assertEquals("check with first", expected, bindings.get("one"));
+        assertEquals("check with second", expected, bindings.get("two"));
         assertNotNull("a writer should have been created", options.writer);
         Map outputs = options.writer.getCustomOutputs();
         assertEquals("check writer first", expected, outputs.get("one"));
@@ -96,8 +96,8 @@
         String optionString = "@ with one=works @ outputs one=works";
         GogoCommands.Options options = commands.getOptions(optionString.split("\\s"));
         Map bindings = new HashMap();
-        CommandUtil.writeToMap(bindings, options.bindings);
-        assertEquals("check bindings first", expected, bindings.get("one"));
+        CommandUtil.writeToMap(bindings, options.with);
+        assertEquals("check with first", expected, bindings.get("one"));
         assertNotNull("a writer should have been created", options.writer);
         Map outputs = options.writer.getCustomOutputs();
         assertEquals("check writer first", expected, outputs.get("one"));
@@ -114,6 +114,16 @@
     }
 
     @Test
+    public void adaptToDemoTest() throws Exception {
+        String url = "'http://99-bottles-of-beer.net/lyrics.html'";
+        String cmd = "egrep " + url + " @ name bottles @ with 'pattern=(?<number>\\d(\\d)?)' / mkdir '/var/bottles/${bottles.number}'";
+        PipeBuilder builder = commands.parse(context.resourceResolver(), cmd.split("\\s"));
+        ContainerPipe pipe = (ContainerPipe)builder.build();
+        ValueMap regexp = pipe.getResource().getChild("conf/bottles").getValueMap();
+        assertEquals("we expect expr to be the url", url, regexp.get("expr"));
+    }
+
+    @Test
     public void testExecuteWithWriter() throws Exception {
         PipeBuilder builder = plumber.newPipe(context.resourceResolver()).echo("/content/${node}").$("nt:base");
         String path = builder.build().getResource().getPath();
