diff --git a/myfaces-html5-core/pom.xml b/myfaces-html5-core/pom.xml
index 0963061..7ce764d 100644
--- a/myfaces-html5-core/pom.xml
+++ b/myfaces-html5-core/pom.xml
@@ -52,11 +52,6 @@
             <version>${myfaces-commons20-version}</version>
         </dependency>
         <dependency>
-            <groupId>org.apache.myfaces.commons</groupId>
-            <artifactId>myfaces-components20</artifactId>
-            <version>${myfaces-commons20-version}</version>
-        </dependency>
-        <dependency>
             <groupId>org.apache.myfaces.buildtools</groupId>
             <artifactId>myfaces-builder-annotations</artifactId>
             <version>${myfaces-builder-annotations-version}</version>
@@ -421,7 +416,7 @@
     </profiles>
 
     <properties>
-        <myfaces-commons20-version>1.0.1</myfaces-commons20-version>
+        <myfaces-commons20-version>1.0.2</myfaces-commons20-version>
         <myfaces-builder-plugin-version>1.0.8</myfaces-builder-plugin-version>
         <myfaces-builder-annotations-version>1.0.5</myfaces-builder-annotations-version>
     </properties>
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlide.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlide.java
index 1b3b476..fed3f6d 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlide.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlide.java
@@ -3,7 +3,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFComponent;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
 import org.apache.myfaces.html5.component.properties.*;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import org.apache.myfaces.commons.util.ComponentUtils;
 
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIComponent;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlideView.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlideView.java
index eb2c798..93c9438 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlideView.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/output/AbstractSlideView.java
@@ -23,7 +23,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
 import org.apache.myfaces.html5.component.properties.*;
 import org.apache.myfaces.html5.component.properties.effect.TransitionProperties;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import org.apache.myfaces.commons.util.ComponentUtils;
 
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIComponent;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/util/ComponentUtils.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/util/ComponentUtils.java
deleted file mode 100644
index 47abc82..0000000
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/util/ComponentUtils.java
+++ /dev/null
@@ -1,103 +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.myfaces.html5.component.util;
-
-import javax.faces.component.NamingContainer;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIViewRoot;
-
-public class ComponentUtils {
-
-    public static UIComponent findParentNamingContainer(UIComponent component, boolean returnRootIfNotFound)
-    {
-        UIComponent parent = component.getParent();
-        if (returnRootIfNotFound && parent == null)
-        {
-            return component;
-        }
-        while (parent != null)
-        {
-            if (parent instanceof NamingContainer)
-                return parent;
-            if (returnRootIfNotFound)
-            {
-                UIComponent nextParent = parent.getParent();
-                if (nextParent == null)
-                {
-                    return parent; // Root
-                }
-                parent = nextParent;
-            }
-            else
-            {
-                parent = parent.getParent();
-            }
-        }
-        return null;
-    }
-
-    //copied from org.apache.myfaces.commons.exporter.util.ComponentUtils
-    public static String getPathToComponent(UIComponent component) {
-        StringBuffer buf = new StringBuffer();
-
-        if (component == null)
-        {
-            buf.append("{Component-Path : ");
-            buf.append("[null]}");
-            return buf.toString();
-        }
-
-        getPathToComponent(component, buf);
-
-        buf.insert(0, "{Component-Path : ");
-        buf.append("}");
-
-        return buf.toString();
-    }
-
-    //copied from org.apache.myfaces.commons.exporter.util.ComponentUtils
-    private static void getPathToComponent(UIComponent component,
-            StringBuffer buf) {
-
-        if (component == null)
-            return;
-
-        StringBuffer intBuf = new StringBuffer();
-
-        intBuf.append("[Class: ");
-        intBuf.append(component.getClass().getName());
-        if (component instanceof UIViewRoot)
-        {
-            intBuf.append(",ViewId: ");
-            intBuf.append(((UIViewRoot) component).getViewId());
-        }
-        else
-        {
-            intBuf.append(",Id: ");
-            intBuf.append(component.getId());
-        }
-        intBuf.append("]");
-
-        buf.insert(0, intBuf.toString());
-
-        getPathToComponent(component.getParent(), buf);
-    }
-
-}
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DragSourceBehaviorHandler.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DragSourceBehaviorHandler.java
index 974bf6f..bbb14a0 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DragSourceBehaviorHandler.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DragSourceBehaviorHandler.java
@@ -36,9 +36,9 @@
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.behavior.DragSourceBehavior;
 import org.apache.myfaces.html5.component.api.Draggable;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.event.DropEvent;
 import org.apache.myfaces.html5.renderkit.util.ClientBehaviorEvents;
 
@@ -102,7 +102,7 @@
         if (!ComponentHandler.isNew(parent))
         {
             if (log.isLoggable(Level.FINE))
-                log.fine("Component " + ComponentUtils.getPathToComponent(parent)
+                log.fine("Component " + DebugUtils.getPathToComponent(parent)
                         + " is not new, thus return without any operation.");
 
             return;
@@ -133,7 +133,7 @@
             else
             {
                 if (log.isLoggable(Level.WARNING))
-                    log.warning("Parent " + ComponentUtils.getPathToComponent(parent)
+                    log.warning("Parent " + DebugUtils.getPathToComponent(parent)
                             + " does not implement Draggable interface, thus unable to set the draggable attribute. "
                             + "Renderer of the parent must handle the decision of being draggable manually.");
             }
@@ -202,7 +202,7 @@
         {
             throw new TagException(getTag(),
                     "DragSourceBehavior must be attached to a ClientBehaviorHolder parent. Component "
-                            + ComponentUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder.");
+                            + DebugUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder.");
         }
 
         ClientBehaviorHolder holder = (ClientBehaviorHolder) parent;
@@ -224,7 +224,7 @@
             message.append("ClientBehaviorHolders that support the '");
             message.append(eventName);
             message.append("' event.  The parent ClientBehaviorHolder "
-                    + ComponentUtils.getPathToComponent((UIComponent) holder) + " only ");
+                    + DebugUtils.getPathToComponent((UIComponent) holder) + " only ");
             message.append("supports the following events: ");
 
             for (String supportedEventName : eventNames)
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DropTargetBehaviorHandler.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DropTargetBehaviorHandler.java
index af022ac..855a788 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DropTargetBehaviorHandler.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/DropTargetBehaviorHandler.java
@@ -37,8 +37,8 @@
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.behavior.DropTargetBehavior;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.event.DropEvent;
 import org.apache.myfaces.html5.event.DropListener;
 import org.apache.myfaces.html5.renderkit.behavior.DropTargetBehaviorRenderer;
@@ -166,7 +166,7 @@
         if (!ComponentHandler.isNew(parent))
         {
             if (log.isLoggable(Level.FINE))
-                log.fine("Component" + ComponentUtils.getPathToComponent(parent)
+                log.fine("Component" + DebugUtils.getPathToComponent(parent)
                         + " is not new, thus return without any operation.");
             return;
         }
@@ -275,7 +275,7 @@
         {
             throw new TagException(getTag(),
                     "DropTargetBehavior must be attached to a ClientBehaviorHolder parent. Component "
-                            + ComponentUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder");
+                            + DebugUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder");
         }
 
         ClientBehaviorHolder holder = (ClientBehaviorHolder) parent;
@@ -299,7 +299,7 @@
             message.append("ClientBehaviorHolders that support the '");
             message.append(eventName);
             message.append("' event.  The parent ClientBehaviorHolder "
-                    + ComponentUtils.getPathToComponent((UIComponent) holder) + " only ");
+                    + DebugUtils.getPathToComponent((UIComponent) holder) + " only ");
             message.append("supports the following events: ");
 
             for (String supportedEventName : eventNames)
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourceHandler.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourceHandler.java
index 456788f..750b261 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourceHandler.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourceHandler.java
@@ -30,7 +30,7 @@
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.holder.MediaSourceHolder;
 import org.apache.myfaces.html5.model.MediaInfo;
 
@@ -100,7 +100,7 @@
         if (!(parent instanceof MediaSourceHolder))
         {
             if (log.isLoggable(Level.WARNING))
-                log.warning("parent component " + ComponentUtils.getPathToComponent(parent) + " is not a MediaSourceHolder. handler will not apply anything.");
+                log.warning("parent component " + DebugUtils.getPathToComponent(parent) + " is not a MediaSourceHolder. handler will not apply anything.");
             return;
         }
         else
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourcesHandler.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourcesHandler.java
index b0593aa..b577e0e 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourcesHandler.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/handler/MediaSourcesHandler.java
@@ -32,7 +32,7 @@
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletAttribute;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.holder.MediaSourceHolder;
 import org.apache.myfaces.html5.model.MediaInfo;
 
@@ -95,7 +95,7 @@
         if (!(parent instanceof MediaSourceHolder))
         {
             if (log.isLoggable(Level.WARNING))
-                log.warning("parent component " + ComponentUtils.getPathToComponent(parent) + " is not a MediaSourceHolder. handler will not apply anything.");
+                log.warning("parent component " + DebugUtils.getPathToComponent(parent) + " is not a MediaSourceHolder. handler will not apply anything.");
             return;
         }
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRenderer.java
index c6aa118..aaf41cf 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRenderer.java
@@ -29,9 +29,9 @@
 import javax.faces.convert.ConverterException;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.Html5BaseInputText;
 import org.apache.myfaces.html5.component.input.HtmlInputColor;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlTextInputSuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
@@ -65,7 +65,7 @@
         if (submittedValue != null && !(submittedValue instanceof String))
         {
             throw new IllegalArgumentException("Submitted value of type String for component : "
-                    + ComponentUtils.getPathToComponent(uiComponent) + "expected");
+                    + DebugUtils.getPathToComponent(uiComponent) + "expected");
         }
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputColor.class);
@@ -153,7 +153,7 @@
                     // new Object[] { _MessageUtils.getLabel(facesContext,
                     // uiComponent) }));
                     // XXX: externalize and localize the message later!
-                    throw new ConverterException(new FacesMessage("Provided value for component " + ComponentUtils.getPathToComponent(uiComponent) + " is not a valid simple color: "
+                    throw new ConverterException(new FacesMessage("Provided value for component " + DebugUtils.getPathToComponent(uiComponent) + " is not a valid simple color: "
                             + value));
                 }
             }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRenderer.java
index b1d4890..a67dfc6 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRenderer.java
@@ -36,9 +36,9 @@
 import javax.faces.validator.Validator;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.Html5BaseInputText;
 import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlTextInputSuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.input.util.Html5DateTimeConverter;
@@ -84,7 +84,7 @@
         if (submittedValue != null && !(submittedValue instanceof String))
         {
             throw new IllegalArgumentException("Submitted value of type String for component : "
-                    + ComponentUtils.getPathToComponent(uiComponent) + " expected");
+                    + DebugUtils.getPathToComponent(uiComponent) + " expected");
         }
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputDateTime.class);
@@ -130,7 +130,7 @@
         else if (step < 0)
         {
             throw new FacesException("'step' cannot be negative for component "
-                    + ComponentUtils.getPathToComponent(uiComponent) + ". Provided " + step);
+                    + DebugUtils.getPathToComponent(uiComponent) + ". Provided " + step);
         }
         else
         {
@@ -164,7 +164,7 @@
                 }
                 catch (ParseException e)
                 {
-                    throw new FacesException("Unable to resolve minimum value of component " + ComponentUtils.getPathToComponent(component) + ".", e);
+                    throw new FacesException("Unable to resolve minimum value of component " + DebugUtils.getPathToComponent(component) + ".", e);
                 }
                 if (minimum != null)
                     return Html5DateTimeFormatUtils.formatDateTime(minimum, component.getType());
@@ -193,7 +193,7 @@
                 catch (ParseException e)
                 {
                     throw new FacesException("Unable to resolve maximum value of component "
-                            + ComponentUtils.getPathToComponent(component) + ".", e);
+                            + DebugUtils.getPathToComponent(component) + ".", e);
                 }
                 if (maximum != null)
                     return Html5DateTimeFormatUtils.formatDateTime(maximum, component.getType());
@@ -244,7 +244,7 @@
         {
             if (!(Arrays.asList(ALLOWED_INPUT_TYPES).contains(type)))
                 throw new FacesException("\"type\" attribute of component "
-                        + ComponentUtils.getPathToComponent(uiComponent) + " can be one of "
+                        + DebugUtils.getPathToComponent(uiComponent) + " can be one of "
                         + Arrays.toString(ALLOWED_INPUT_TYPES) + " . Provided: \"" + type + "\"");
         }
     }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRenderer.java
index b00a3cb..1b8af0a 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRenderer.java
@@ -27,9 +27,9 @@
 import javax.faces.convert.ConverterException;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.HtmlInputEmail;
 import org.apache.myfaces.html5.component.input.Html5BaseInputText;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlTextInputSuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.input.util.Html5EmailConverter;
@@ -58,7 +58,7 @@
         if (submittedValue != null && !(submittedValue instanceof String))
         {
             throw new IllegalArgumentException("Submitted value of type String for component : "
-                    + ComponentUtils.getPathToComponent(uiComponent) + " expected");
+                    + DebugUtils.getPathToComponent(uiComponent) + " expected");
         }
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputEmail.class);
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRenderer.java
index fc3c164..4a6befc 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRenderer.java
@@ -30,9 +30,9 @@
 import javax.faces.validator.Validator;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.Html5BaseInputText;
 import org.apache.myfaces.html5.component.input.HtmlInputNumberSlider;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlTextInputSuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
@@ -89,7 +89,7 @@
 
         if (max <= min)
         {
-            throw new FacesException("Maximum must be larger than minimum for component " + ComponentUtils.getPathToComponent(uiComponent) + ". "
+            throw new FacesException("Maximum must be larger than minimum for component " + DebugUtils.getPathToComponent(uiComponent) + ". "
                     + "These values are calculated from the first attached DoubleRangeValidator or LongRangeValidator");
         }
 
@@ -116,14 +116,14 @@
         if (step != Double.MIN_VALUE && segmentCount != Integer.MIN_VALUE)
         { // if both are set
             throw new FacesException(
-                    "Only one of 'step' or 'segmentCount' properties must be defined for component " + ComponentUtils.getPathToComponent(component) + ". Undefined one will be calculated.");
+                    "Only one of 'step' or 'segmentCount' properties must be defined for component " + DebugUtils.getPathToComponent(component) + ". Undefined one will be calculated.");
         }
 
         if (step != Double.MIN_VALUE)
         { // if only step is set
             if (step <= 0)
             { // if it is set but it is negative
-                throw new FacesException("'step' property of component " + ComponentUtils.getPathToComponent(component) + " must be positive");
+                throw new FacesException("'step' property of component " + DebugUtils.getPathToComponent(component) + " must be positive");
             }
             calculatedStep = step;
         }
@@ -131,7 +131,7 @@
         { // if only segmentCount is set
             if (segmentCount <= 0)
             { // if it is set but it is negative
-                throw new FacesException("'segmentCount' property of component " + ComponentUtils.getPathToComponent(
+                throw new FacesException("'segmentCount' property of component " + DebugUtils.getPathToComponent(
                         component) + " must be positive");
             }
             calculatedStep = (max - min) / segmentCount;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRenderer.java
index f74e143..21f08a2 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRenderer.java
@@ -30,8 +30,8 @@
 import javax.faces.render.Renderer;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.HtmlInputText;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlInputTextRendererDelegate;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlTextAreaRendererDelegate;
 import org.apache.myfaces.html5.renderkit.util.JsfProperties;
@@ -111,7 +111,7 @@
         }
         else
         {
-            throw new IllegalStateException("Input type of component " + ComponentUtils.getPathToComponent(component) + " is not one of the expected types: \""
+            throw new IllegalStateException("Input type of component " + DebugUtils.getPathToComponent(component) + " is not one of the expected types: \""
                     + JsfProperties.INPUTTEXT_TYPE_TEXT + "\", \"" + JsfProperties.INPUTTEXT_TYPE_SEARCH + "\", \""
                     + JsfProperties.INPUTTEXT_TYPE_URL + "\" ,\"" + JsfProperties.INPUTTEXT_TYPE_TEL + "\". Provided: \""
                     + type + "\".");
@@ -184,7 +184,7 @@
         else
         {
             if (!(Arrays.asList(ALLOWED_INPUT_TYPES).contains(type)))
-                throw new FacesException("\"type\" attribute of component " + ComponentUtils.getPathToComponent(uiComponent) + " can be one of " + Arrays.toString(ALLOWED_INPUT_TYPES)
+                throw new FacesException("\"type\" attribute of component " + DebugUtils.getPathToComponent(uiComponent) + " can be one of " + Arrays.toString(ALLOWED_INPUT_TYPES)
                         + ". You provided: \"" + type + "\"");
         }
     }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlDataListSuggestionRendererHelper.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlDataListSuggestionRendererHelper.java
index 45f2a4a..922e624 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlDataListSuggestionRendererHelper.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlDataListSuggestionRendererHelper.java
@@ -27,11 +27,10 @@
 import javax.faces.convert.Converter;
 import javax.faces.model.SelectItem;
 
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.HtmlDataList;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.JsfProperties;
-import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Implementation of {@link SuggestionRendererHelper} for usage in {@link org.apache.myfaces.html5.component.input.HtmlDataList}s.
@@ -94,7 +93,7 @@
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of HtmlDataList. HtmlDataListSuggestionRendererHelper is unable to render options of suggestions attr.");
+                    "Component " + DebugUtils.getPathToComponent(uiComponent) + " is not instance of HtmlDataList. HtmlDataListSuggestionRendererHelper is unable to render options of suggestions attr.");
         }
     }
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextInputSuggestionRendererHelper.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextInputSuggestionRendererHelper.java
index 8b5614f..0c1200c 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextInputSuggestionRendererHelper.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextInputSuggestionRendererHelper.java
@@ -34,13 +34,13 @@
 import javax.faces.convert.Converter;
 import javax.faces.model.SelectItem;
 
+import org.apache.myfaces.commons.util.DebugUtils;
+import org.apache.myfaces.commons.util.SelectItemsIterator;
 import org.apache.myfaces.html5.component.input.Html5BaseInputText;
 import org.apache.myfaces.html5.component.input.HtmlInputText;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.JsfProperties;
 import org.apache.myfaces.html5.renderkit.util.RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.SelectItemsIterator;
 
 /**
  * Implementation of {@link SuggestionRendererHelper} for usage in {@link HtmlInputText}s.
@@ -76,13 +76,13 @@
             {
                 // WIKI: put a wiki page about this error
                 throw new FacesException(
-                        "Either \"list\" attribute or \"suggestions\" attribute and children with type SelectItem mechanism can be used for suggestions. Component " + ComponentUtils.getPathToComponent(uiComponent) + "has both!");
+                        "Either \"list\" attribute or \"suggestions\" attribute and children with type SelectItem mechanism can be used for suggestions. Component " + DebugUtils.getPathToComponent(uiComponent) + "has both!");
             }
         }
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to check suggestions.");
+                    "Component " + DebugUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to check suggestions.");
         }
 
     }
@@ -118,7 +118,7 @@
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to determine whether datalist will be generated or not.");
+                    "Component " + DebugUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to determine whether datalist will be generated or not.");
         }
     }
 
@@ -177,7 +177,7 @@
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to render options of suggestions attr.");
+                    "Component " + DebugUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to render options of suggestions attr.");
         }
     }
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5DateTimeConverter.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5DateTimeConverter.java
index a88c4c1..1f93979 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5DateTimeConverter.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5DateTimeConverter.java
@@ -28,8 +28,8 @@
 import javax.faces.convert.Converter;
 import javax.faces.convert.ConverterException;
 
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 
 /**
  * Converter for use in hx:inputDateTime.
@@ -53,12 +53,12 @@
             }
             catch (ParseException e)
             {
-                throw new ConverterException(new FacesMessage("Unable to parse input " + value + " for " + ComponentUtils.getPathToComponent(uiComponent) + " with type " + type), e);
+                throw new ConverterException(new FacesMessage("Unable to parse input " + value + " for " + DebugUtils.getPathToComponent(uiComponent) + " with type " + type), e);
             }
         }
         else
         {
-            throw new FacesException("Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not a HtmlInputDateTime");
+            throw new FacesException("Component " + DebugUtils.getPathToComponent(uiComponent) + " is not a HtmlInputDateTime");
         }
 
     }
@@ -69,7 +69,7 @@
             return null;
 
         if (!(objValue instanceof Date))
-            throw new FacesException("Value is not a java.util.Date for component " + ComponentUtils.getPathToComponent(uiComponent) + ".");
+            throw new FacesException("Value is not a java.util.Date for component " + DebugUtils.getPathToComponent(uiComponent) + ".");
 
         if (uiComponent instanceof HtmlInputDateTime)
         {
@@ -82,7 +82,7 @@
         }
         else
         {
-            throw new FacesException("Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not a HtmlInputDateTime");
+            throw new FacesException("Component " + DebugUtils.getPathToComponent(uiComponent) + " is not a HtmlInputDateTime");
         }
 
     }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5EmailConverter.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5EmailConverter.java
index 247f814..dfaf90e 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5EmailConverter.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/util/Html5EmailConverter.java
@@ -25,7 +25,7 @@
 import javax.faces.convert.ConverterException;
 
 import org.apache.commons.validator.EmailValidator;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import org.apache.myfaces.commons.util.DebugUtils;
 
 /**
  * Converter for use in hx:inputEmail.
@@ -54,7 +54,7 @@
                 if (!EmailValidator.getInstance().isValid(email))
                 {
                     throw new ConverterException(new FacesMessage("Provided value for component "
-                            + ComponentUtils.getPathToComponent(component) + " is not a valid email: " + email));
+                            + DebugUtils.getPathToComponent(component) + " is not a valid email: " + email));
                 }
             }
 
@@ -93,7 +93,7 @@
         else
         {
             throw new ConverterException(new FacesMessage("Provided value for component "
-                    + ComponentUtils.getPathToComponent(component) + " is not String or String[]: " + value.toString()));
+                    + DebugUtils.getPathToComponent(component) + " is not String or String[]: " + value.toString()));
         }
     }
 }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AbstractMediaRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AbstractMediaRenderer.java
index e4e8faf..570ce59 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AbstractMediaRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AbstractMediaRenderer.java
@@ -33,8 +33,8 @@
 import javax.faces.context.ResponseWriter;
 import javax.faces.render.Renderer;
 
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.media.AbstractMedia;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.model.MediaInfo;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
@@ -162,7 +162,7 @@
                 // src is reqired to be present and not empty!
                 if (mediaInfo.getSrc() == null || mediaInfo.getSrc().length() == 0)
                     // WIKI: add a wiki page
-                    throw new FacesException("'src' field of MediaInfo has to be defined and nonempty for component " + ComponentUtils.getPathToComponent(uiComponent) + ".");
+                    throw new FacesException("'src' field of MediaInfo has to be defined and nonempty for component " + DebugUtils.getPathToComponent(uiComponent) + ".");
 
                 writer.writeAttribute(HTML5.SRC_ATTR, mediaInfo.getSrc(), null);
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/Html5RendererUtils.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/Html5RendererUtils.java
index 22dbaeb..abdcdbc 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/Html5RendererUtils.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/Html5RendererUtils.java
@@ -18,9 +18,15 @@
  */
 package org.apache.myfaces.html5.renderkit.util;
 
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Logger;
 
 import javax.faces.component.EditableValueHolder;
 import javax.faces.component.UIComponent;
@@ -31,9 +37,10 @@
 import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
-import java.io.IOException;
-import java.util.*;
-import java.util.logging.Logger;
+
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.myfaces.commons.util.DebugUtils;
 
 /**
  * @author Ali Ok
@@ -725,7 +732,7 @@
         } else {
             log.warning(NON_SUBMITTED_VALUE_WARNING +
                     " Component : " +
-                    ComponentUtils.getPathToComponent(component));
+                    DebugUtils.getPathToComponent(component));
         }
     }
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/RendererUtils.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/RendererUtils.java
index a96fc48..87cab6a 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/RendererUtils.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/RendererUtils.java
@@ -19,7 +19,8 @@
 
 package org.apache.myfaces.html5.renderkit.util;
 
-import org.apache.myfaces.html5.component.util.ComponentUtils;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import javax.el.ValueExpression;
 import javax.faces.FacesException;
@@ -31,8 +32,8 @@
 import javax.faces.convert.Converter;
 import javax.faces.convert.ConverterException;
 import javax.faces.el.PropertyNotFoundException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+
+import org.apache.myfaces.commons.util.DebugUtils;
 
 /**
  * @author Ali Ok
@@ -51,7 +52,7 @@
         // why isAssignableFrom with additional getClass method call if isInstance does the same?
         if (compClass != null && !(compClass.isInstance(uiComponent)))
         {
-            throw new IllegalArgumentException("uiComponent : " + ComponentUtils.getPathToComponent(uiComponent)+
+            throw new IllegalArgumentException("uiComponent : " + DebugUtils.getPathToComponent(uiComponent)+
                     " is not instance of "+compClass.getName()+" as it should be");
         }
     }
@@ -199,7 +200,7 @@
         {
             if (!(component instanceof ValueHolder))
             {
-                throw new IllegalArgumentException("Component : " + ComponentUtils.getPathToComponent(component)+"is not a ValueHolder");
+                throw new IllegalArgumentException("Component : " + DebugUtils.getPathToComponent(component)+"is not a ValueHolder");
             }
 
             if (component instanceof EditableValueHolder)
@@ -263,7 +264,7 @@
         }
         catch(PropertyNotFoundException ex)
         {
-            log.log(Level.SEVERE, "Property not found - called by component : "+ComponentUtils.getPathToComponent(component),ex);
+            log.log(Level.SEVERE, "Property not found - called by component : "+DebugUtils.getPathToComponent(component),ex);
 
             throw ex;
         }
@@ -278,7 +279,7 @@
         catch(Exception ex)
         {
             throw new FacesException("Could not retrieve value of component with path : "+
-                    ComponentUtils.getPathToComponent(component),ex);
+                    DebugUtils.getPathToComponent(component),ex);
         }
         return value;
     }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/SelectItemsIterator.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/SelectItemsIterator.java
deleted file mode 100644
index 60d6655..0000000
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/SelectItemsIterator.java
+++ /dev/null
@@ -1,323 +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.myfaces.html5.renderkit.util;
-
-import org.apache.myfaces.html5.component.util.ComponentUtils;
-
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.el.ValueExpression;
-import javax.faces.application.ProjectStage;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UISelectItem;
-import javax.faces.component.UISelectItems;
-import javax.faces.context.FacesContext;
-import javax.faces.model.SelectItem;
-
-// ATTENTION
-// This class is associated with javax.faces.component._SelectItemsIterator.
-// Changes here should also be applied to this class.
-
-/**
- * @author Mathias Broekelmann (latest modification by $Author$)
- * @author Jakob Korherr (jsf 2.0)
- * @version $Revision$ $Date$
- */
-public class SelectItemsIterator implements Iterator<SelectItem>
-{
-    private static final Logger log = Logger.getLogger(SelectItemsIterator.class.getName());
-
-    private static final String VAR_PROP = JsfProperties.VAR_PROP;
-    private static final String ITEM_VALUE_PROP = JsfProperties.ITEM_VALUE_PROP;
-    private static final String ITEM_LABEL_PROP = JsfProperties.ITEM_LABEL_PROP;
-    private static final String ITEM_DESCRIPTION_PROP = JsfProperties.ITEM_DESCRIPTION_PROP;
-    private static final String ITEM_DISABLED_PROP = JsfProperties.ITEM_DISABLED_PROP;
-    private static final String ITEM_LABEL_ESCAPED_PROP = JsfProperties.ITEM_LABEL_ESCAPED_PROP;
-    private static final String NO_SELECTION_VALUE_PROP = JsfProperties.NO_SELECTION_VALUE_PROP;
-
-    private final Iterator<UIComponent> _children;
-    private Iterator<? extends Object> _nestedItems;
-    private SelectItem _nextItem;
-    private UISelectItems _currentUISelectItems;
-    private FacesContext _facesContext;
-
-    public SelectItemsIterator(UIComponent selectItemsParent, FacesContext facesContext)
-    {
-        _children = selectItemsParent.getChildren().iterator();
-        _facesContext = facesContext;
-    }
-
-    @SuppressWarnings("unchecked")
-    public boolean hasNext()
-    {
-        if (_nextItem != null)
-        {
-            return true;
-        }
-        if (_nestedItems != null)
-        {
-            if (_nestedItems.hasNext())
-            {
-                return true;
-            }
-            _nestedItems = null;
-        }
-        if (_children.hasNext())
-        {
-            UIComponent child = _children.next();
-            // When there is other components nested that does
-            // not extends from UISelectItem or UISelectItems
-            // the behavior for this iterator is just skip this
-            // element(s) until an element that extends from these
-            // classes are found. If there is no more elements
-            // that conform this condition, just return false.
-            while (!(child instanceof UISelectItem) && !(child instanceof UISelectItems))
-            {
-                // Try to skip it
-                if (_children.hasNext())
-                {
-                    // Skip and do the same check
-                    child = _children.next();
-                }
-                else
-                {
-                    // End loop, so the final result is return false,
-                    // since there are no more components to iterate.
-                    return false;
-                }
-            }
-            if (child instanceof UISelectItem)
-            {
-                UISelectItem uiSelectItem = (UISelectItem) child;
-                Object item = uiSelectItem.getValue();
-                if (item == null)
-                {
-                    // no value attribute --> create the SelectItem out of the other attributes
-                    Object itemValue = uiSelectItem.getItemValue();
-                    String label = uiSelectItem.getItemLabel();
-                    String description = uiSelectItem.getItemDescription();
-                    boolean disabled = uiSelectItem.isItemDisabled();
-                    boolean escape = uiSelectItem.isItemEscaped();
-                    boolean noSelectionOption = uiSelectItem.isNoSelectionOption();
-                    if (label == null)
-                    {
-                        label = itemValue.toString();
-                    }
-                    item = new SelectItem(itemValue, label, description, disabled, escape, noSelectionOption);
-                }
-                else if (!(item instanceof SelectItem))
-                {
-                    ValueExpression expression = uiSelectItem.getValueExpression("value");
-                    throw new IllegalArgumentException("ValueExpression '"
-                            + (expression == null ? null : expression.getExpressionString()) + "' of UISelectItem : "
-                            + ComponentUtils.getPathToComponent(child) + " does not reference an Object of type SelectItem");
-                }
-                _nextItem = (SelectItem) item;
-                return true;
-            }
-            else if (child instanceof UISelectItems)
-            {
-                _currentUISelectItems = ((UISelectItems) child);
-                Object value = _currentUISelectItems.getValue();
-
-                if (value instanceof SelectItem)
-                {
-                    _nextItem = (SelectItem) value;
-                    return true;
-                }
-                else if (value != null && value.getClass().isArray())
-                {
-                    // value is any kind of array (primitive or non-primitive)
-                    // --> we have to use class Array to get the values
-                    final int length = Array.getLength(value);
-                    Collection<Object> items = new ArrayList<Object>(length);
-                    for (int i = 0; i < length; i++)
-                    {
-                        items.add(Array.get(value, i));
-                    }
-                    _nestedItems = items.iterator();
-                    return hasNext();
-                }
-                else if (value instanceof Iterable)
-                {
-                    // value is Iterable --> Collection, DataModel,...
-                    _nestedItems = ((Iterable<?>) value).iterator();
-                    return hasNext();
-                }
-                else if (value instanceof Map)
-                {
-                    Map<Object, Object> map = ((Map<Object, Object>) value);
-                    Collection<SelectItem> items = new ArrayList<SelectItem>(map.size());
-                    for (Map.Entry<Object, Object> entry : map.entrySet())
-                    {
-                        items.add(new SelectItem(entry.getValue(), entry.getKey().toString()));
-                    }
-
-                    _nestedItems = items.iterator();
-                    return hasNext();
-                }
-                else
-                {
-                    Level level = Level.FINE;
-                    if (!_facesContext.isProjectStage(ProjectStage.Production))
-                    {
-                        level = Level.WARNING;
-                    }
-
-                    if (log.isLoggable(level))
-                    {
-                        ValueExpression expression = _currentUISelectItems.getValueExpression("value");
-                        log.log(level, "ValueExpression {0} of UISelectItems with component-path {1}"
-                                + " does not reference an Object of type SelectItem,"
-                                + " array, Iterable or Map, but of type: {2}",
-                                new Object[] {
-                                    (expression == null ? null : expression.getExpressionString()),
-                                    ComponentUtils.getPathToComponent(child),
-                                    (value == null ? null : value.getClass().getName())
-                                });
-                    }
-                }
-            }
-        }
-        return false;
-    }
-
-    public SelectItem next()
-    {
-        if (!hasNext())
-        {
-            throw new NoSuchElementException();
-        }
-        if (_nextItem != null)
-        {
-            SelectItem value = _nextItem;
-            _nextItem = null;
-            return value;
-        }
-        if (_nestedItems != null)
-        {
-            Object item = _nestedItems.next();
-
-            if (!(item instanceof SelectItem))
-            {
-                // check new params of SelectItems (since 2.0): itemValue, itemLabel, itemDescription,...
-                // Note that according to the spec UISelectItems does not provide Getter and Setter
-                // methods for this values, so we have to use the attribute map
-                Map<String, Object> attributeMap = _currentUISelectItems.getAttributes();
-
-                // write the current item into the request map under the key listed in var, if available
-                boolean wroteRequestMapVarValue = false;
-                Object oldRequestMapVarValue = null;
-                final String var = (String) attributeMap.get(VAR_PROP);
-                if(var != null && !"".equals(var))
-                {
-                    // save the current value of the key listed in var from the request map
-                    oldRequestMapVarValue = _facesContext.getExternalContext().getRequestMap().put(var, item);
-                    wroteRequestMapVarValue = true;
-                }
-
-                // check the itemValue attribute
-                Object itemValue = attributeMap.get(ITEM_VALUE_PROP);
-                if (itemValue == null)
-                {
-                    // the itemValue attribute was not provided
-                    // --> use the current item as the itemValue
-                    itemValue = item;
-                }
-
-                // Spec: When iterating over the select items, toString()
-                // must be called on the string rendered attribute values
-                Object itemLabel = attributeMap.get(ITEM_LABEL_PROP);
-                if (itemLabel == null)
-                {
-                    itemLabel = itemValue.toString();
-                }
-                else
-                {
-                    itemLabel = itemLabel.toString();
-                }
-                Object itemDescription = attributeMap.get(ITEM_DESCRIPTION_PROP);
-                if (itemDescription != null)
-                {
-                    itemDescription = itemDescription.toString();
-                }
-                Boolean itemDisabled = getBooleanAttribute(_currentUISelectItems, ITEM_DISABLED_PROP, false);
-                Boolean itemLabelEscaped = getBooleanAttribute(_currentUISelectItems, ITEM_LABEL_ESCAPED_PROP, true);
-                Object noSelectionValue = attributeMap.get(NO_SELECTION_VALUE_PROP);
-                item = new SelectItem(itemValue,
-                        (String) itemLabel,
-                        (String) itemDescription,
-                        itemDisabled,
-                        itemLabelEscaped,
-                        itemValue.equals(noSelectionValue));
-
-                // remove the value with the key from var from the request map, if previously written
-                if(wroteRequestMapVarValue)
-                {
-                    // If there was a previous value stored with the key from var in the request map, restore it
-                    if (oldRequestMapVarValue != null)
-                    {
-                        _facesContext.getExternalContext()
-                                .getRequestMap().put(var, oldRequestMapVarValue);
-                    }
-                    else
-                    {
-                        _facesContext.getExternalContext()
-                                .getRequestMap().remove(var);
-                    }
-                }
-            }
-            return (SelectItem) item;
-        }
-        throw new NoSuchElementException();
-    }
-
-    public void remove()
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    private boolean getBooleanAttribute(UIComponent component, String attrName, boolean defaultValue)
-    {
-        Object value = component.getAttributes().get(attrName);
-        if (value == null)
-        {
-            return defaultValue;
-        }
-        else if (value instanceof Boolean)
-        {
-            return (Boolean) value;
-        }
-        else
-        {
-            // If the value is a String, parse the boolean.
-            // This makes the following code work: <tag attribute="true" />,
-            // otherwise you would have to write <tag attribute="#{true}" />.
-            return Boolean.valueOf(value.toString());
-        }
-    }
-
-}
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/validator/DateTimeRangeValidator.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/validator/DateTimeRangeValidator.java
index bd399b7..2a63cee 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/validator/DateTimeRangeValidator.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/validator/DateTimeRangeValidator.java
@@ -34,8 +34,8 @@
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFValidator;
+import org.apache.myfaces.commons.util.DebugUtils;
 import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
-import org.apache.myfaces.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.renderkit.input.util.Html5DateTimeFormatUtils;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 
@@ -89,7 +89,7 @@
                 catch (ParseException e)
                 {
                     throw new ValidatorException(new FacesMessage("Unable to resolve minimum for component "
-                            + ComponentUtils.getPathToComponent(uiComponent) + "."), e);
+                            + DebugUtils.getPathToComponent(uiComponent) + "."), e);
                 }
 
                 Date resolvedMaximum = null;
@@ -100,7 +100,7 @@
                 catch (ParseException e)
                 {
                     throw new ValidatorException(new FacesMessage("Unable to resolve maximum for component "
-                            + ComponentUtils.getPathToComponent(uiComponent) + "."), e);
+                            + DebugUtils.getPathToComponent(uiComponent) + "."), e);
                 }
 
                 if (resolvedMinimum != null && resolvedMaximum != null)
@@ -109,7 +109,7 @@
                     {
                         // not a ValidatorException since state is illegal
                         throw new FacesException("Minimum value is before than maximum for component "
-                                + ComponentUtils.getPathToComponent(uiComponent) + ".");
+                                + DebugUtils.getPathToComponent(uiComponent) + ".");
                     }
                     else
                     {
@@ -120,7 +120,7 @@
                             else
                                 throw new ValidatorException(
                                         new FacesMessage("Submitted value is not in allowed range for component "
-                                                + ComponentUtils.getPathToComponent(uiComponent) + ". Range is "
+                                                + DebugUtils.getPathToComponent(uiComponent) + ". Range is "
                                                 + resolvedMinimum.toString() + " - " + resolvedMaximum.toString() + "."));
                         }
                     }
@@ -132,7 +132,7 @@
                         throw new ValidatorException(new FacesMessage(this.lessThanMinimumMessage));
                     else
                         throw new ValidatorException(new FacesMessage("Value is before minimum for component "
-                                + ComponentUtils.getPathToComponent(uiComponent) + ". Minimum value is "
+                                + DebugUtils.getPathToComponent(uiComponent) + ". Minimum value is "
                                 + resolvedMinimum.toString() + "."));
                 }
 
@@ -142,7 +142,7 @@
                         throw new ValidatorException(new FacesMessage(this.exceedMaximumMessage));
                     else
                         throw new ValidatorException(new FacesMessage("Value is after maximum for component "
-                                + ComponentUtils.getPathToComponent(uiComponent) + ". Maximum value is "
+                                + DebugUtils.getPathToComponent(uiComponent) + ". Maximum value is "
                                 + resolvedMaximum.toString() + "."));
                 }
             }
