diff --git a/pom.xml b/pom.xml
index 4785624..878c49b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -484,7 +484,7 @@
       <dependency>
         <groupId>commons-fileupload</groupId>
         <artifactId>commons-fileupload</artifactId>
-        <version>1.2</version>
+        <version>1.2.2</version>
       </dependency>
       <dependency>
         <groupId>commons-codec</groupId>
diff --git a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/webapp/TobagoMultipartFormdataRequest.java b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/webapp/TobagoMultipartFormdataRequest.java
index 4928473..ee64169 100644
--- a/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/webapp/TobagoMultipartFormdataRequest.java
+++ b/tobago-core/src/main/java/org/apache/myfaces/tobago/internal/webapp/TobagoMultipartFormdataRequest.java
@@ -30,6 +30,7 @@
 import javax.servlet.http.HttpServletRequestWrapper;
 import java.io.File;
 import java.io.UnsupportedEncodingException;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
@@ -39,17 +40,15 @@
 
 public class TobagoMultipartFormdataRequest extends HttpServletRequestWrapper {
 
-  private static final Logger LOG
-      = LoggerFactory.getLogger(TobagoMultipartFormdataRequest.class);
+  private static final Logger LOG = LoggerFactory.getLogger(TobagoMultipartFormdataRequest.class);
 
   public static final long ONE_KB = 1024;
   public static final long ONE_MB = ONE_KB * ONE_KB;
   public static final long ONE_GB = ONE_KB * ONE_MB;
 
-  private Map parameters;
+  private Map<String, String[]> parameters;
 
-  private Map fileItems;
-
+  private Map<String, FileItem> fileItems;
 
   public TobagoMultipartFormdataRequest(HttpServletRequest request) {
     this(request, System.getProperty("java.io.tmpdir"), ONE_MB);
@@ -62,13 +61,12 @@
 
   private void init(HttpServletRequest request, String repositoryPath, long maxSize) {
     if (!ServletFileUpload.isMultipartContent(request)) {
-      String errorText = "contentType is not multipart/form-data but '"
-          + request.getContentType() + "'";
+      String errorText = "contentType is not multipart/form-data but '" + request.getContentType() + "'";
       LOG.error(errorText);
       throw new FacesException(errorText);
     } else {
-      parameters = new HashMap();
-      fileItems = new HashMap();
+      parameters = new HashMap<String, String[]>();
+      fileItems = new HashMap<String, FileItem>();
       DiskFileItemFactory factory = new DiskFileItemFactory();
 
       factory.setRepository(new File(repositoryPath));
@@ -89,7 +87,7 @@
         throw new FacesException(e);
       }
       if (LOG.isDebugEnabled()) {
-        LOG.debug("parametercount = " + itemList.size());
+        LOG.debug("parametercount = " + itemList.size() + " + " + request.getParameterMap().size());
       }
       for (FileItem item : itemList) {
         String key = item.getFieldName();
@@ -98,50 +96,56 @@
           if (value.length() > 100) {
             value = value.substring(0, 100) + " [...]";
           }
-          LOG.debug(
-              "Parameter : '" + key + "'='" + value + "' isFormField="
-                  + item.isFormField() + " contentType='" + item.getContentType() + "'");
-
+          LOG.debug("Parameter: '" + key + "'='" + value + "' isFormField=" + item.isFormField()
+              + " contentType='" + item.getContentType() + "'");
         }
         if (item.isFormField()) {
-          Object inStock = parameters.get(key);
-          if (inStock == null) {
-            String[] values;
-            try {
-              // TODO: enable configuration of  'accept-charset'
-              values = new String[]{item.getString(AbstractUIPage.FORM_ACCEPT_CHARSET)};
-            } catch (UnsupportedEncodingException e) {
-              LOG.error("Caught: " + e.getMessage(), e);
-              values = new String[]{item.getString()};
-            }
-            parameters.put(key, values);
-          } else if (inStock instanceof String[]) { // double (or more) parameter
-            String[] oldValues = (String[]) inStock;
-            String[] values = new String[oldValues.length + 1];
-            System.arraycopy(oldValues, 0, values, 0, oldValues.length);
-            try {
-              // TODO: enable configuration of  'accept-charset'
-              values[oldValues.length] = item.getString(AbstractUIPage.FORM_ACCEPT_CHARSET);
-            } catch (UnsupportedEncodingException e) {
-              LOG.error("Caught: " + e.getMessage(), e);
-              values[oldValues.length] = item.getString();
-            }
-            parameters.put(key, values);
-          } else {
-            LOG.error(
-                "Program error. Unsupported class: "
-                    + inStock.getClass().getName());
+          String newValue;
+          try {
+            // TODO: enable configuration of 'accept-charset'
+            newValue = item.getString(AbstractUIPage.FORM_ACCEPT_CHARSET);
+          } catch (UnsupportedEncodingException e) {
+            LOG.error("Caught: " + e.getMessage(), e);
+            newValue = item.getString();
           }
+
+          addParameter(key, newValue);
         } else {
           fileItems.put(key, item);
         }
       }
+
+      // merging the GET parameters:
+      Enumeration e = request.getParameterNames();
+      while(e.hasMoreElements()) {
+        final String name = (String) e.nextElement();
+        final String[] newValues = request.getParameterValues(name);
+        if (LOG.isDebugEnabled()) {
+          LOG.debug("Parameter: '" + name + "'='" + Arrays.toString(newValues) + "' (GET)");
+        }
+        for (String newValue : newValues) {
+          addParameter(name, newValue);
+        }
+      }
     }
   }
 
+  private void addParameter(String key, String newValue) {
+    final String[] inStock = parameters.get(key);
+    final String[] values;
+    if (inStock == null) {
+      values = new String[]{newValue};
+    } else {
+      values = new String[inStock.length + 1];
+      System.arraycopy(inStock, 0, values, 0, inStock.length);
+      values[inStock.length] = newValue;
+    }
+    parameters.put(key, values);
+  }
+
   public FileItem getFileItem(String key) {
     if (fileItems != null) {
-      return (FileItem) fileItems.get(key);
+      return fileItems.get(key);
     }
     return null;
   }
diff --git a/tobago-example/tobago-example-demo/pom.xml b/tobago-example/tobago-example-demo/pom.xml
index 5df7e62..0236596 100644
--- a/tobago-example/tobago-example-demo/pom.xml
+++ b/tobago-example/tobago-example-demo/pom.xml
@@ -28,8 +28,8 @@
   <description>Demonstration and documentation application.</description>
 
   <properties>
-    <openwebbeans.version>1.1.2</openwebbeans.version>
-    <myfaces-extcdi.version>1.0.1</myfaces-extcdi.version>
+    <openwebbeans.version>1.1.3</openwebbeans.version>
+    <myfaces-extcdi.version>1.0.2</myfaces-extcdi.version>
   </properties>
   <build>
     <finalName>tobago-example-demo</finalName>
diff --git a/tobago-extension/tobago-facelets/src/main/java/org/apache/myfaces/tobago/facelets/extension/DateExtensionHandler.java b/tobago-extension/tobago-facelets/src/main/java/org/apache/myfaces/tobago/facelets/extension/DateExtensionHandler.java
index 10feb08..fbca5d2 100644
--- a/tobago-extension/tobago-facelets/src/main/java/org/apache/myfaces/tobago/facelets/extension/DateExtensionHandler.java
+++ b/tobago-extension/tobago-facelets/src/main/java/org/apache/myfaces/tobago/facelets/extension/DateExtensionHandler.java
@@ -55,6 +55,7 @@
       UIViewRoot root = ComponentSupport.getViewRoot(faceletContext, parent);
 
       UIForm form = (UIForm) application.createComponent(UIForm.COMPONENT_TYPE);
+      form.setRendererType(RendererTypes.FORM);
       form.setId(root.createUniqueId());
       panel.getChildren().add(form);
 
