diff --git a/myfaces-html5-core/pom.xml b/myfaces-html5-core/pom.xml
index f578419..56317ac 100644
--- a/myfaces-html5-core/pom.xml
+++ b/myfaces-html5-core/pom.xml
@@ -33,9 +33,14 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.myfaces.shared</groupId>
-            <artifactId>myfaces-shared-html5</artifactId>
-            <version>${myfaces-shared-html5-version}</version>
+            <groupId>org.apache.myfaces.commons</groupId>
+            <artifactId>myfaces-commons-utils20</artifactId>
+            <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>
@@ -378,6 +383,7 @@
     </profiles>
 
     <properties>
+        <myfaces-commons20-version>1.0.1</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/input/AbstractHtmlInputText.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/input/AbstractHtmlInputText.java
index 2e05c38..f380441 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/input/AbstractHtmlInputText.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/component/input/AbstractHtmlInputText.java
@@ -47,7 +47,7 @@
     /**
      * HTML type of the input.
      * <br/>
-     * Possible values are "text"(default), "search", "url", "tel", "textarea" and "password". 
+     * Possible values are "text"(default), "search", "url", "tel" and "textarea".
      * If this is set to "textarea", pattern is ignored.
      * @see AbstractHtmlInputText#getSuggestions()
      * @see AbstractHtmlInputText#getList()
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
index 5d517c8..47abc82 100644
--- 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
@@ -21,6 +21,7 @@
 
 import javax.faces.component.NamingContainer;
 import javax.faces.component.UIComponent;
+import javax.faces.component.UIViewRoot;
 
 public class ComponentUtils {
 
@@ -52,4 +53,51 @@
         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 8ff9408..e956efe 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
@@ -38,9 +38,9 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFFaceletTag;
 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;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Tag handler for {@link DragSourceBehavior}. Sets the "draggable" attribute of the parent and attaches the behavior to
@@ -102,7 +102,7 @@
         if (!ComponentHandler.isNew(parent))
         {
             if (log.isLoggable(Level.FINE))
-                log.fine("Component " + RendererUtils.getPathToComponent(parent)
+                log.fine("Component " + ComponentUtils.getPathToComponent(parent)
                         + " is not new, thus return without any operation.");
 
             return;
@@ -133,7 +133,7 @@
             else
             {
                 if (log.isLoggable(Level.WARNING))
-                    log.warning("Parent " + RendererUtils.getPathToComponent(parent)
+                    log.warning("Parent " + ComponentUtils.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 "
-                            + RendererUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder.");
+                            + ComponentUtils.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 "
-                    + RendererUtils.getPathToComponent((UIComponent) holder) + " only ");
+                    + ComponentUtils.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 44f5518..ecba7e6 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
@@ -38,11 +38,11 @@
 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.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;
 import org.apache.myfaces.html5.renderkit.util.ClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /* 
  * Facelets tag handler for DropTargetBehavior.
@@ -164,7 +164,7 @@
         if (!ComponentHandler.isNew(parent))
         {
             if (log.isLoggable(Level.FINE))
-                log.fine("Component" + RendererUtils.getPathToComponent(parent)
+                log.fine("Component" + ComponentUtils.getPathToComponent(parent)
                         + " is not new, thus return without any operation.");
             return;
         }
@@ -273,7 +273,7 @@
         {
             throw new TagException(getTag(),
                     "DropTargetBehavior must be attached to a ClientBehaviorHolder parent. Component "
-                            + RendererUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder");
+                            + ComponentUtils.getPathToComponent(parent) + "is not a ClientBehaviorHolder");
         }
 
         ClientBehaviorHolder holder = (ClientBehaviorHolder) parent;
@@ -297,7 +297,7 @@
             message.append("ClientBehaviorHolders that support the '");
             message.append(eventName);
             message.append("' event.  The parent ClientBehaviorHolder "
-                    + RendererUtils.getPathToComponent((UIComponent) holder) + " only ");
+                    + ComponentUtils.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 a260e7d..456788f 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,9 +30,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.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.holder.MediaSourceHolder;
 import org.apache.myfaces.html5.model.MediaInfo;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Provides media sources for media components. This should be nested inside of an instance of {@link MediaSourceHolder}
@@ -100,7 +100,7 @@
         if (!(parent instanceof MediaSourceHolder))
         {
             if (log.isLoggable(Level.WARNING))
-                log.warning("parent component " + RendererUtils.getPathToComponent(parent) + " is not a MediaSourceHolder. handler will not apply anything.");
+                log.warning("parent component " + ComponentUtils.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 7a9fcca..b0593aa 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,9 +32,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.html5.component.util.ComponentUtils;
 import org.apache.myfaces.html5.holder.MediaSourceHolder;
 import org.apache.myfaces.html5.model.MediaInfo;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Provides media sources for media components. This should be nested inside of an instance of {@link MediaSourceHolder}
@@ -95,7 +95,7 @@
         if (!(parent instanceof MediaSourceHolder))
         {
             if (log.isLoggable(Level.WARNING))
-                log.warning("parent component " + RendererUtils.getPathToComponent(parent) + " is not a MediaSourceHolder. handler will not apply anything.");
+                log.warning("parent component " + ComponentUtils.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/animation/AnimationPulseRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationPulseRenderer.java
index b036cba..b0e8b06 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationPulseRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationPulseRenderer.java
@@ -22,7 +22,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.animation.AbstractAnimationPulse;
 import org.apache.myfaces.html5.component.animation.AbstractBaseAnimation;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.context.FacesContext;
 import java.text.NumberFormat;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationRenderer.java
index ba78d9f..4801e11 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationRenderer.java
@@ -25,15 +25,14 @@
 import org.apache.myfaces.html5.renderkit.util.CSS;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HTML;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.event.*;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 
 @ListenersFor({
@@ -41,7 +40,7 @@
         @ListenerFor(systemEventClass = PostBuildComponentTreeOnRestoreViewEvent.class)
 })
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.Animation", type = "org.apache.myfaces.html5.Animation")
-public class AnimationRenderer extends HtmlRenderer implements ComponentSystemEventListener {
+public class AnimationRenderer extends Renderer implements ComponentSystemEventListener {
 
     @Override
     public boolean getRendersChildren() {
@@ -58,7 +57,7 @@
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.startElement(HTML.STYLE_ELEM, component);
+        writer.startElement(HTML5.STYLE_ELEM, component);
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, AbstractAnimation.class);
 
@@ -78,7 +77,7 @@
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.endElement(HTML.STYLE_ELEM);
+        writer.endElement(HTML5.STYLE_ELEM);
     }
 
     protected String getAnimationDefinition(FacesContext facesContext, AbstractAnimation component){
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationScaleRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationScaleRenderer.java
index 8fc9b5c..45dda52 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationScaleRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationScaleRenderer.java
@@ -22,7 +22,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.animation.AbstractAnimationScale;
 import org.apache.myfaces.html5.component.animation.AbstractBaseAnimation;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.context.FacesContext;
 import java.text.NumberFormat;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationShakeRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationShakeRenderer.java
index 81e0a9e..0c763a3 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationShakeRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationShakeRenderer.java
@@ -22,7 +22,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.animation.AbstractAnimationShake;
 import org.apache.myfaces.html5.component.animation.AbstractBaseAnimation;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.context.FacesContext;
 import java.text.NumberFormat;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationsRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationsRenderer.java
index cb23ba9..3bbea84 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationsRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/AnimationsRenderer.java
@@ -25,15 +25,14 @@
 import org.apache.myfaces.html5.renderkit.util.CSS;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HTML;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.event.*;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 
 @ListenersFor({
@@ -41,7 +40,7 @@
         @ListenerFor(systemEventClass = PostBuildComponentTreeOnRestoreViewEvent.class)
 })
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.Animations", type = "org.apache.myfaces.html5.Animations")
-public class AnimationsRenderer extends HtmlRenderer implements ComponentSystemEventListener {
+public class AnimationsRenderer extends Renderer implements ComponentSystemEventListener {
 
     @Override
     public boolean getRendersChildren() {
@@ -58,7 +57,7 @@
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.startElement(HTML.STYLE_ELEM, component);
+        writer.startElement(HTML5.STYLE_ELEM, component);
     }
 
     @Override
@@ -92,7 +91,7 @@
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.endElement(HTML.STYLE_ELEM);
+        writer.endElement(HTML5.STYLE_ELEM);
     }
 
     protected String getAnimationDefinition(FacesContext facesContext, AbstractAnimations component){
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/BaseAnimationRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/BaseAnimationRenderer.java
index a90cfb5..93453b7 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/BaseAnimationRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/animation/BaseAnimationRenderer.java
@@ -20,15 +20,15 @@
 package org.apache.myfaces.html5.renderkit.animation;
 
 import org.apache.myfaces.html5.component.animation.AbstractBaseAnimation;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 
-public abstract class BaseAnimationRenderer extends HtmlRenderer {
+public abstract class BaseAnimationRenderer extends Renderer {
 
     @Override
     public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/BaseEffectRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/BaseEffectRenderer.java
index 0908a3a..7da3567 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/BaseEffectRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/BaseEffectRenderer.java
@@ -20,15 +20,15 @@
 package org.apache.myfaces.html5.renderkit.effect;
 
 import org.apache.myfaces.html5.component.effect.AbstractBaseEffect;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 
-public abstract class BaseEffectRenderer extends HtmlRenderer {
+public abstract class BaseEffectRenderer extends Renderer {
 
     @Override
     public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectOutputRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectOutputRenderer.java
index 410c136..208df82 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectOutputRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectOutputRenderer.java
@@ -26,15 +26,14 @@
 import org.apache.myfaces.html5.renderkit.util.CSS;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HTML;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
 
 import javax.faces.component.UIComponent;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.event.*;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 
 @ListenersFor({
@@ -42,7 +41,7 @@
         @ListenerFor(systemEventClass = PostBuildComponentTreeOnRestoreViewEvent.class)
 })
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.EffectOutput", type = "org.apache.myfaces.html5.EffectOutput")
-public class EffectOutputRenderer extends HtmlRenderer implements ComponentSystemEventListener {
+public class EffectOutputRenderer extends Renderer implements ComponentSystemEventListener {
 
     @Override
     public boolean getRendersChildren() {
@@ -59,7 +58,7 @@
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.startElement(HTML.STYLE_ELEM, component);
+        writer.startElement(HTML5.STYLE_ELEM, component);
     }
 
     @Override
@@ -90,7 +89,7 @@
 
         ResponseWriter writer = facesContext.getResponseWriter();
 
-        writer.endElement(HTML.STYLE_ELEM);
+        writer.endElement(HTML5.STYLE_ELEM);
     }
 
     public void processEvent(ComponentSystemEvent event) {
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectRenderer.java
index b7c31dd..670ef67 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectRenderer.java
@@ -22,7 +22,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.effect.AbstractBaseEffect;
 import org.apache.myfaces.html5.component.effect.AbstractEffect;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.context.FacesContext;
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectTransformRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectTransformRenderer.java
index 73057c5..7dce946 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectTransformRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectTransformRenderer.java
@@ -24,7 +24,7 @@
 import org.apache.myfaces.html5.component.effect.AbstractBaseEffect;
 import org.apache.myfaces.html5.component.effect.AbstractEffectTransform;
 import org.apache.myfaces.html5.renderkit.util.CSS;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 import javax.faces.context.FacesContext;
 import java.text.NumberFormat;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectsRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectsRenderer.java
index 6d74009..3e83a5c 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectsRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/effect/EffectsRenderer.java
@@ -23,15 +23,11 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.effect.AbstractEffects;
 import org.apache.myfaces.html5.renderkit.util.CSS;
-import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HTML;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 import org.apache.myfaces.view.facelets.PostBuildComponentTreeOnRestoreViewEvent;
 
 import javax.faces.component.UIComponent;
-import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.event.*;
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/Html5BaseInputTextRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/Html5BaseInputTextRenderer.java
index 7cabd57..0559d68 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/Html5BaseInputTextRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/Html5BaseInputTextRenderer.java
@@ -18,25 +18,21 @@
  */
 package org.apache.myfaces.html5.renderkit.input;
 
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.logging.Level;
-import java.util.logging.Logger;
+import org.apache.myfaces.html5.component.input.Html5BaseInputText;
+import org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper;
+import org.apache.myfaces.html5.renderkit.util.*;
 
 import javax.faces.component.UIComponent;
 import javax.faces.component.behavior.ClientBehavior;
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
-
-import org.apache.myfaces.html5.component.input.Html5BaseInputText;
-import org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper;
-import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.JsfProperties;
-import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlTextRendererBase;
-import org.apache.myfaces.shared_html5.renderkit.html.util.ResourceUtils;
+import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
+import java.io.IOException;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 /**
  * An extensible base of the Html5 input renderers.
@@ -44,7 +40,7 @@
  * @author Ali Ok
  * 
  */
-public abstract class Html5BaseInputTextRenderer extends HtmlTextRendererBase
+public abstract class Html5BaseInputTextRenderer extends Renderer
 {
 
     private static final Logger log = Logger.getLogger(Html5BaseInputTextRenderer.class.getName());
@@ -57,13 +53,9 @@
         Html5BaseInputText component = (Html5BaseInputText) uiComponent;
 
         // first, check whether we have behaviors, and render jsf.js if necessary
-        Map<String, List<ClientBehavior>> behaviors = null;
-        behaviors = ((ClientBehaviorHolder) component).getClientBehaviors();
+        Map<String, List<ClientBehavior>> behaviors = component.getClientBehaviors();
         if (!behaviors.isEmpty())
         {
-            if (log.isLoggable(Level.FINE))
-                log.fine("component " + RendererUtils.getPathToComponent(uiComponent) + " has behaviors, rendering jsf.js");
-
             ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, facesContext.getResponseWriter());
         }
 
@@ -99,19 +91,47 @@
                 log.fine("will render generated datalist");
             suggestionRendererHelper.renderDataList(facesContext, component);
         }
+
     }
 
-    @Override
+    protected void renderInput(FacesContext facesContext, UIComponent component)
+        throws IOException
+    {
+        //allow subclasses to render custom attributes by separating rendering begin and end
+        renderInputBegin(facesContext, component);
+        renderInputEnd(facesContext, component);
+    }
+
     protected void renderInputBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException
     {
         RendererUtils.checkParamValidity(facesContext, uiComponent, getComponentClass());
 
-        // let parent render standard attributes
-        super.renderInputBegin(facesContext, uiComponent);
+        ResponseWriter writer = facesContext.getResponseWriter();
 
-        if (log.isLoggable(Level.FINE))
-            log.fine("parent rendered standart stuff. rendering additional pass thru attrs");
-        
+        Html5BaseInputText component = (Html5BaseInputText) uiComponent;
+
+        String clientId = component.getClientId(facesContext);
+        String value = RendererUtils.getStringValue(facesContext, component);
+
+        writer.startElement(HTML5.INPUT_ELEM, component);
+        writer.writeAttribute(HTML5.ID_ATTR, clientId, null);
+        writer.writeAttribute(HTML5.NAME_ATTR, clientId, null);
+
+        //allow extending classes to modify html input element's type
+        String inputHtmlType = getInputHtmlType(component);
+        writer.writeAttribute(HTML5.TYPE_ATTR, inputHtmlType, null);
+
+        if (value != null)
+        {
+            writer.writeAttribute(HTML5.VALUE_ATTR, value, JsfProperties.VALUE_PROP);
+        }
+
+        Map<String, List<ClientBehavior>> behaviors = component.getClientBehaviors();
+
+        Html5RendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, component, behaviors);
+        Html5RendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
+        Html5RendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(facesContext, writer, component, behaviors);
+
         renderPassThruAttrsAndEvents(facesContext, uiComponent);
     }
 
@@ -120,20 +140,26 @@
             throws IOException
     {
         Map<String, List<ClientBehavior>> clientBehaviors = ((ClientBehaviorHolder)uiComponent).getClientBehaviors();
-        
+
+        Html5RendererUtils.renderPassThroughAttributes(facesContext.getResponseWriter(), uiComponent, PassThroughAttributes.BASE_INPUT);
         Html5RendererUtils.renderPassThroughClientBehaviorEventHandlers(facesContext, uiComponent, PassThroughClientBehaviorEvents.BASE_INPUT, clientBehaviors);
-        
+
         Html5RendererUtils.renderPassThroughAttributes(facesContext.getResponseWriter(), uiComponent, getExtraPassThroughAttributes());
     }
 
-    @Override
     protected void renderInputEnd(FacesContext facesContext, UIComponent component) throws IOException
     {
-        // do nothing special. override for improving readability.
-        super.renderInputEnd(facesContext, component);
+        ResponseWriter writer = facesContext.getResponseWriter();
+
+        writer.endElement(HTML5.INPUT_ELEM);
     }
 
     /**
+     * Returns the HTML type attribute of HTML input element, which is being rendered.
+     */
+    protected abstract String getInputHtmlType(Html5BaseInputText component);
+
+    /**
      * Returns pass through attributes that are not present in {@link javax.faces.component.html.HtmlInputText} Child
      * component classes can override this method to modify pass through attributes, which are rendered at
      * {@link Html5BaseInputTextRenderer#renderInputBegin(FacesContext, UIComponent)}
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 6a4a458..9ea6a99 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
@@ -31,11 +31,12 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 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;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Renderer for < hx:inputColor > component.
@@ -64,7 +65,7 @@
         if (submittedValue != null && !(submittedValue instanceof String))
         {
             throw new IllegalArgumentException("Submitted value of type String for component : "
-                    + RendererUtils.getPathToComponent(uiComponent) + "expected");
+                    + ComponentUtils.getPathToComponent(uiComponent) + "expected");
         }
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputColor.class);
@@ -93,7 +94,7 @@
     }
 
     @Override
-    protected String getInputHtmlType(UIComponent component)
+    protected String getInputHtmlType(Html5BaseInputText component)
     {
         return HTML5.INPUT_TYPE_COLOR;
     }
@@ -152,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 " + RendererUtils.getPathToComponent(uiComponent) + " is not a valid simple color: "
+                    throw new ConverterException(new FacesMessage("Provided value for component " + ComponentUtils.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 07bd56d..74ba40f 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
@@ -38,6 +38,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 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;
@@ -45,8 +46,8 @@
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.JsfProperties;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 import org.apache.myfaces.html5.validator.DateTimeRangeValidator;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Renderer of hx:inputDateTime. <br/>
@@ -83,7 +84,7 @@
         if (submittedValue != null && !(submittedValue instanceof String))
         {
             throw new IllegalArgumentException("Submitted value of type String for component : "
-                    + RendererUtils.getPathToComponent(uiComponent) + " expected");
+                    + ComponentUtils.getPathToComponent(uiComponent) + " expected");
         }
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputDateTime.class);
@@ -129,7 +130,7 @@
         else if (step < 0)
         {
             throw new FacesException("'step' cannot be negative for component "
-                    + RendererUtils.getPathToComponent(uiComponent) + ". Provided " + step);
+                    + ComponentUtils.getPathToComponent(uiComponent) + ". Provided " + step);
         }
         else
         {
@@ -163,7 +164,7 @@
                 }
                 catch (ParseException e)
                 {
-                    throw new FacesException("Unable to resolve minimum value of component " + RendererUtils.getPathToComponent(component) + ".", e);
+                    throw new FacesException("Unable to resolve minimum value of component " + ComponentUtils.getPathToComponent(component) + ".", e);
                 }
                 if (minimum != null)
                     return Html5DateTimeFormatUtils.formatDateTime(minimum, component.getType());
@@ -192,7 +193,7 @@
                 catch (ParseException e)
                 {
                     throw new FacesException("Unable to resolve maximum value of component "
-                            + RendererUtils.getPathToComponent(component) + ".", e);
+                            + ComponentUtils.getPathToComponent(component) + ".", e);
                 }
                 if (maximum != null)
                     return Html5DateTimeFormatUtils.formatDateTime(maximum, component.getType());
@@ -243,13 +244,13 @@
         {
             if (!(Arrays.asList(ALLOWED_INPUT_TYPES).contains(type)))
                 throw new FacesException("\"type\" attribute of component "
-                        + RendererUtils.getPathToComponent(uiComponent) + " can be one of "
+                        + ComponentUtils.getPathToComponent(uiComponent) + " can be one of "
                         + Arrays.toString(ALLOWED_INPUT_TYPES) + " . Provided: \"" + type + "\"");
         }
     }
 
     @Override
-    protected String getInputHtmlType(UIComponent component)
+    protected String getInputHtmlType(Html5BaseInputText component)
     {
         // obj type check for component is done in #encodeEnd, no need to check it again
         return ((HtmlInputDateTime) component).getType();
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 bdae833..b00a3cb 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
@@ -29,13 +29,14 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 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;
 import org.apache.myfaces.html5.renderkit.input.util.InputPatternRendererUtil;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Renderer for < hx:inputEmail > component.
@@ -57,7 +58,7 @@
         if (submittedValue != null && !(submittedValue instanceof String))
         {
             throw new IllegalArgumentException("Submitted value of type String for component : "
-                    + RendererUtils.getPathToComponent(uiComponent) + " expected");
+                    + ComponentUtils.getPathToComponent(uiComponent) + " expected");
         }
 
         RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputEmail.class);
@@ -100,7 +101,7 @@
     }
 
     @Override
-    protected String getInputHtmlType(UIComponent component)
+    protected String getInputHtmlType(Html5BaseInputText component)
     {
         return HTML5.INPUT_TYPE_EMAIL;
     }
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 9f6c4f4..fc3c164 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
@@ -32,11 +32,11 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 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;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Renderer for hx:inputNumberSlider.
@@ -89,7 +89,7 @@
 
         if (max <= min)
         {
-            throw new FacesException("Maximum must be larger than minimum for component " + RendererUtils.getPathToComponent(uiComponent) + ". "
+            throw new FacesException("Maximum must be larger than minimum for component " + ComponentUtils.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 " + RendererUtils.getPathToComponent(component) + ". Undefined one will be calculated.");
+                    "Only one of 'step' or 'segmentCount' properties must be defined for component " + ComponentUtils.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 " + RendererUtils.getPathToComponent(component) + " must be positive");
+                throw new FacesException("'step' property of component " + ComponentUtils.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 " + RendererUtils.getPathToComponent(
+                throw new FacesException("'segmentCount' property of component " + ComponentUtils.getPathToComponent(
                         component) + " must be positive");
             }
             calculatedStep = (max - min) / segmentCount;
@@ -167,7 +167,7 @@
     }
 
     @Override
-    protected String getInputHtmlType(UIComponent component)
+    protected String getInputHtmlType(Html5BaseInputText component)
     {
         return HTML5.INPUT_TYPE_RANGE;
     }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRenderer.java
index 64e09ae..1b76d1f 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRenderer.java
@@ -26,6 +26,7 @@
 import javax.faces.context.FacesContext;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
+import org.apache.myfaces.html5.component.input.Html5BaseInputText;
 import org.apache.myfaces.html5.component.input.HtmlInputNumberSpinner;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
@@ -60,7 +61,7 @@
     }
 
     @Override
-    protected String getInputHtmlType(UIComponent component)
+    protected String getInputHtmlType(Html5BaseInputText component)
     {
         return HTML5.INPUT_TYPE_NUMBER;
     }
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 f297f70..de057cf 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
@@ -31,11 +31,10 @@
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 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.HtmlSecretRendererDelegate;
 import org.apache.myfaces.html5.renderkit.input.delegate.HtmlTextAreaRendererDelegate;
 import org.apache.myfaces.html5.renderkit.util.JsfProperties;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Renderer for < hx:inputText > component.
@@ -58,16 +57,14 @@
     private static final Logger log = Logger.getLogger(HtmlInputTextRendererDelegate.class.getName());
 
     protected Renderer _textTypeRendererDelegate = null;
-    protected Renderer _passwordTypeRendererDelegate = null;
     protected Renderer _textareaTypeRendererDelegate = null;
 
     public HtmlInputTextRenderer()
     {
         super();
 
-        // let's create all three delegates since renderers are created once in application lifecycle
+        // let's create the delegates since renderers are created once in application lifecycle
         _textTypeRendererDelegate = new HtmlInputTextRendererDelegate();
-        _passwordTypeRendererDelegate = new HtmlSecretRendererDelegate();
         _textareaTypeRendererDelegate = new HtmlTextAreaRendererDelegate();
     }
 
@@ -108,17 +105,13 @@
         {
             return _textTypeRendererDelegate;
         }
-        else if (type.equals(JsfProperties.INPUTTEXT_TYPE_PASSWORD))
-        {
-            return _passwordTypeRendererDelegate;
-        }
         else if (type.equals(JsfProperties.INPUTTEXT_TYPE_TEXTAREA))
         {
             return _textareaTypeRendererDelegate;
         }
         else
         {
-            throw new IllegalStateException("Input type of component " + RendererUtils.getPathToComponent(component) + " is not one of the expected types: \""
+            throw new IllegalStateException("Input type of component " + ComponentUtils.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 + "\".");
@@ -191,7 +184,7 @@
         else
         {
             if (!(Arrays.asList(ALLOWED_INPUT_TYPES).contains(type)))
-                throw new FacesException("\"type\" attribute of component " + RendererUtils.getPathToComponent(uiComponent) + " can be one of " + Arrays.toString(ALLOWED_INPUT_TYPES)
+                throw new FacesException("\"type\" attribute of component " + ComponentUtils.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 a18ec73..45f2a4a 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
@@ -28,9 +28,10 @@
 import javax.faces.model.SelectItem;
 
 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.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Implementation of {@link SuggestionRendererHelper} for usage in {@link org.apache.myfaces.html5.component.input.HtmlDataList}s.
@@ -54,7 +55,11 @@
     @Override
     public void renderDataList(FacesContext facesContext, UIComponent component) throws IOException
     {
-        super.renderDataList(facesContext, component);
+        renderDataListBegin(facesContext, component);
+
+        renderDataListOptions(facesContext, component, null);
+
+        renderDataListEnd(facesContext, component);
     }
 
     protected void renderDataListBegin(FacesContext facesContext, UIComponent component) throws IOException
@@ -89,7 +94,7 @@
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + RendererUtils.getPathToComponent(uiComponent) + " is not instance of HtmlDataList. HtmlDataListSuggestionRendererHelper is unable to render options of suggestions attr.");
+                    "Component " + ComponentUtils.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/HtmlInputTextRendererDelegate.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlInputTextRendererDelegate.java
index f390033..5958e8f 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlInputTextRendererDelegate.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlInputTextRendererDelegate.java
@@ -34,7 +34,7 @@
 import org.apache.myfaces.html5.renderkit.input.util.InputPatternRendererUtil;
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Delegate renderer that is used when the type of < hx:input > is one of "text", "search", "url" or "tel".
@@ -111,7 +111,7 @@
     }
 
     @Override
-    protected String getInputHtmlType(UIComponent component)
+    protected String getInputHtmlType(Html5BaseInputText component)
     {
         // obj type check for component is done in #encodeEnd, no need to check it again
         return ((HtmlInputText) component).getType();
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlSecretRendererDelegate.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlSecretRendererDelegate.java
deleted file mode 100644
index 5a89a20..0000000
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlSecretRendererDelegate.java
+++ /dev/null
@@ -1,78 +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.input.delegate;
-
-import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-
-import javax.faces.component.UIComponent;
-import javax.faces.component.behavior.ClientBehavior;
-import javax.faces.component.behavior.ClientBehaviorHolder;
-import javax.faces.context.FacesContext;
-
-import org.apache.myfaces.html5.component.input.HtmlInputText;
-import org.apache.myfaces.html5.renderkit.input.util.InputPatternRendererUtil;
-import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlSecretRendererBase;
-
-/**
- * Delegate renderer that is used when the type of < hx:input > is one of "password".
- * 
- * @author Ali Ok
- * 
- */
-public class HtmlSecretRendererDelegate extends HtmlSecretRendererBase
-{
-
-    @Override
-    protected void renderInputBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException
-    {
-        RendererUtils.checkParamValidity(facesContext, uiComponent, HtmlInputText.class);
-
-        HtmlInputText component = (HtmlInputText) uiComponent;
-
-        // pass cols -> size to make super render size correctly!
-        component.setSize(component.getCols());
-
-        super.renderInputBegin(facesContext, uiComponent);
-
-        // render pattern here
-        InputPatternRendererUtil.renderPattern(facesContext, component);
-
-        renderPassThruAttrsAndEvents(facesContext, uiComponent);
-
-    }
-
-    // to make this extendible
-    protected void renderPassThruAttrsAndEvents(FacesContext facesContext, UIComponent uiComponent) throws IOException
-    {
-        Map<String, List<ClientBehavior>> clientBehaviors = ((ClientBehaviorHolder) uiComponent).getClientBehaviors();
-
-        Html5RendererUtils.renderPassThroughClientBehaviorEventHandlers(facesContext, uiComponent,
-                PassThroughClientBehaviorEvents.BASE_INPUT, clientBehaviors);
-
-        Html5RendererUtils.renderPassThroughAttributes(facesContext.getResponseWriter(), uiComponent,
-                PassThroughAttributes.INPUT_SECRET);
-    }
-
-}
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextAreaRendererDelegate.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextAreaRendererDelegate.java
index 3edb142..48d4237 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextAreaRendererDelegate.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/input/delegate/HtmlTextAreaRendererDelegate.java
@@ -18,56 +18,110 @@
  */
 package org.apache.myfaces.html5.renderkit.input.delegate;
 
+import org.apache.commons.collections.MapUtils;
+import org.apache.myfaces.html5.component.input.Html5BaseInputText;
+import org.apache.myfaces.html5.renderkit.util.*;
+
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIInput;
+import javax.faces.component.UIOutput;
+import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import javax.faces.convert.ConverterException;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 
-import javax.faces.component.UIComponent;
-import javax.faces.component.behavior.ClientBehavior;
-import javax.faces.component.behavior.ClientBehaviorHolder;
-import javax.faces.context.FacesContext;
-import javax.faces.context.ResponseWriter;
-
-import org.apache.myfaces.html5.component.input.HtmlInputText;
-import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.html.HTML;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.util.JavascriptUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlTextareaRendererBase;
-
 /**
  * Delegate renderer that is used when the type of < hx:input > is one of "textarea".
  * 
  * @author Ali Ok
  * 
  */
-public class HtmlTextAreaRendererDelegate extends HtmlTextareaRendererBase
+public class HtmlTextAreaRendererDelegate extends Renderer
 {
-    @Override
-    protected void renderTextAreaBegin(FacesContext facesContext,
-            UIComponent uiComponent) throws IOException
+
+     public void encodeEnd(FacesContext facesContext, UIComponent uiComponent)
+            throws IOException
     {
-        renderPassThruAttrsAndEvents(facesContext, uiComponent);
+        RendererUtils.checkParamValidity(facesContext, uiComponent, UIInput.class);
+
+        Html5BaseInputText component = (Html5BaseInputText) uiComponent;
+
+        Map<String, List<ClientBehavior>> behaviors = component.getClientBehaviors();
+        if (MapUtils.isNotEmpty(behaviors))
+        {
+            ResourceUtils.renderDefaultJsfJsInlineIfNecessary(facesContext, facesContext.getResponseWriter());
+        }
+
+        encodeTextArea(facesContext, component);
+
     }
 
-    // to make this extendible
-    protected void renderPassThruAttrsAndEvents(FacesContext facesContext, UIComponent uiComponent) throws IOException
+     protected void encodeTextArea(FacesContext facesContext, Html5BaseInputText component) throws IOException {
+       //allow subclasses to render custom attributes by separating rendering begin and end
+        renderTextAreaBegin(facesContext, component);
+        renderTextAreaValue(facesContext, component);
+        renderTextAreaEnd(facesContext, component);
+
+    }
+
+    //Subclasses can set the value of an attribute before, or can render a custom attribute after calling this method
+    protected void renderTextAreaBegin(FacesContext facesContext, Html5BaseInputText component) throws IOException
     {
-        Map<String, List<ClientBehavior>> clientBehaviors = ((ClientBehaviorHolder) uiComponent).getClientBehaviors();
+        ResponseWriter writer = facesContext.getResponseWriter();
+        writer.startElement(HTML5.TEXTAREA_ELEM, component);
 
-        Html5RendererUtils.renderPassThroughClientBehaviorEventHandlers(facesContext, uiComponent,
-                PassThroughClientBehaviorEvents.BASE_INPUT, clientBehaviors);
+        writer.writeAttribute(HTML5.ID_ATTR, component.getClientId(facesContext), null);
+        writer.writeAttribute(HTML5.NAME_ATTR, component.getClientId(facesContext), null);
 
-        Html5RendererUtils.renderPassThroughAttributes(facesContext.getResponseWriter(), uiComponent,
+        Map<String, List<ClientBehavior>> behaviors  = component.getClientBehaviors();
+        Html5RendererUtils.renderBehaviorizedOnchangeEventHandler(facesContext, writer, component, behaviors);
+        Html5RendererUtils.renderBehaviorizedEventHandlers(facesContext, writer, component, behaviors);
+        Html5RendererUtils.renderBehaviorizedFieldEventHandlersWithoutOnchange(facesContext, writer, component, behaviors);
+
+        Html5RendererUtils.renderPassThroughClientBehaviorEventHandlers(facesContext, component,
+                PassThroughClientBehaviorEvents.BASE_INPUT, behaviors);
+
+        Html5RendererUtils.renderPassThroughAttributes(facesContext.getResponseWriter(), component,
+                PassThroughAttributes.BASE_INPUT);
+
+        Html5RendererUtils.renderPassThroughAttributes(facesContext.getResponseWriter(), component,
                 PassThroughAttributes.INPUT_TEXTAREA);
     }
 
-    @Override
-    protected boolean isDisabled(FacesContext facesContext, UIComponent uiComponent)
+    //Subclasses can override the writing of the "text" value of the textarea
+    protected void renderTextAreaValue(FacesContext facesContext, UIComponent uiComponent) throws IOException
     {
-        return ((HtmlInputText) uiComponent).isDisabled();
+        ResponseWriter writer = facesContext.getResponseWriter();
+        String strValue = RendererUtils.getStringValue(facesContext, uiComponent);
+        writer.writeText(strValue, JsfProperties.VALUE_PROP);
+    }
+
+    protected void renderTextAreaEnd(FacesContext facesContext,
+            Html5BaseInputText component) throws IOException
+    {
+        facesContext.getResponseWriter().endElement(HTML5.TEXTAREA_ELEM);
+    }
+
+    public void decode(FacesContext facesContext, UIComponent component)
+    {
+        RendererUtils.checkParamValidity(facesContext, component, Html5BaseInputText.class);
+        Html5RendererUtils.decodeUIInput(facesContext, component);
+        if (!((Html5BaseInputText)component).isDisabled())
+        {
+            Html5RendererUtils.decodeClientBehaviors(facesContext, component);
+        }
+    }
+
+    public Object getConvertedValue(FacesContext facesContext, UIComponent uiComponent, Object submittedValue) throws ConverterException
+    {
+        RendererUtils.checkParamValidity(facesContext, uiComponent, UIOutput.class);
+        return RendererUtils.getConvertedUIOutputValue(facesContext,
+                                                       (UIOutput)uiComponent,
+                                                       submittedValue);
     }
 
 }
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 c260ed5..48e1380 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
@@ -36,12 +36,11 @@
 
 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.Html5RendererUtils;
 import org.apache.myfaces.html5.renderkit.util.JsfProperties;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HTML;
-import org.apache.myfaces.shared_html5.util.SelectItemsIterator;
+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.
@@ -77,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 " + RendererUtils.getPathToComponent(uiComponent) + "has both!");
+                        "Either \"list\" attribute or \"suggestions\" attribute and children with type SelectItem mechanism can be used for suggestions. Component " + ComponentUtils.getPathToComponent(uiComponent) + "has both!");
             }
         }
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + RendererUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to check suggestions.");
+                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to check suggestions.");
         }
 
     }
@@ -119,23 +118,21 @@
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + RendererUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to determine whether datalist will be generated or not.");
+                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to determine whether datalist will be generated or not.");
         }
     }
 
     /*
      * (non-Javadoc)
      * 
-     * @see
-     * org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper#renderDataList(javax.faces.context
-     * .FacesContext, org.apache.myfaces.html5.component.input.Html5BaseInputText)
+     * @see org.apache.myfaces.html5.renderkit.input.delegate.SuggestionRendererHelper#renderDataList(javax.faces.context.FacesContext, org.apache.myfaces.html5.component.input.Html5BaseInputText)
      */
     public void renderDataList(FacesContext facesContext, UIComponent component) throws IOException
     {
         renderDataListBegin(facesContext, component);
 
         // create converter and pass it to methods here to prevent duplicate creation of the converter
-        Converter converter = Html5RendererUtils.findUIOutputConverterFailSafe(facesContext, component);
+        Converter converter = RendererUtils.findUIOutputConverterFailSafe(facesContext, component);
 
         renderDataListOptions(facesContext, component, converter);
 
@@ -180,7 +177,7 @@
         else
         {
             throw new IllegalArgumentException(
-                    "Component " + RendererUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to render options of suggestions attr.");
+                    "Component " + ComponentUtils.getPathToComponent(uiComponent) + " is not instance of Html5BaseInputText. HtmlTextInputSuggestionRendererHelper is unable to render options of suggestions attr.");
         }
     }
 
@@ -246,7 +243,7 @@
 
             writer.write(TABULATOR);
 
-            writer.startElement(HTML.OPTION_ELEM, null);
+            writer.startElement(HTML5.OPTION_ELEM, null);
 
             /*
              * we're writing an attribute, not text here: using <option value="value" label="Label" /> notation, not
@@ -254,14 +251,14 @@
              */
             String itemLabel = selectItem.getLabel();
             // writeAttribute method escapes the label anyway. so ignore SelectItem#isEscape()...
-            writer.writeAttribute(HTML.LABEL_ATTR, itemLabel, null);
+            writer.writeAttribute(HTML5.LABEL_ATTR, itemLabel, null);
 
-            String itemStrValue = RendererUtils.getConvertedStringValue(facesContext, component, converter, selectItem);
+            String itemStrValue = RendererUtils.getConvertedStringValue(facesContext, component, converter, selectItem.getValue());
             writer.writeAttribute(HTML5.VALUE_ATTR, itemStrValue, null);
 
-            writer.writeAttribute(HTML.DISABLED_ATTR, selectItem.isDisabled(), null);
+            writer.writeAttribute(HTML5.DISABLED_ATTR, selectItem.isDisabled(), null);
 
-            writer.endElement(HTML.OPTION_ELEM);
+            writer.endElement(HTML5.OPTION_ELEM);
 
         }
     }
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 3cce84e..a88c4c1 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
@@ -29,7 +29,7 @@
 import javax.faces.convert.ConverterException;
 
 import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+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 " + RendererUtils.getPathToComponent(uiComponent) + " with type " + type), e);
+                throw new ConverterException(new FacesMessage("Unable to parse input " + value + " for " + ComponentUtils.getPathToComponent(uiComponent) + " with type " + type), e);
             }
         }
         else
         {
-            throw new FacesException("Component " + RendererUtils.getPathToComponent(uiComponent) + " is not a HtmlInputDateTime");
+            throw new FacesException("Component " + ComponentUtils.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 " + RendererUtils.getPathToComponent(uiComponent) + ".");
+            throw new FacesException("Value is not a java.util.Date for component " + ComponentUtils.getPathToComponent(uiComponent) + ".");
 
         if (uiComponent instanceof HtmlInputDateTime)
         {
@@ -82,7 +82,7 @@
         }
         else
         {
-            throw new FacesException("Component " + RendererUtils.getPathToComponent(uiComponent) + " is not a HtmlInputDateTime");
+            throw new FacesException("Component " + ComponentUtils.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 4c3b8c2..364cf1d 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.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.component.util.ComponentUtils;
 
 /**
  * Converter for use in hx:inputEmail.
@@ -54,7 +54,7 @@
                 if (!EmailValidator.getInstance().isValid(email))
                 {
                     throw new ConverterException(new FacesMessage("Provided value for component "
-                            + RendererUtils.getPathToComponent(component) + " is not a valid email: " + email));
+                            + ComponentUtils.getPathToComponent(component) + " is not a valid email: " + email));
                 }
             }
 
@@ -93,7 +93,7 @@
         else
         {
             throw new ConverterException(new FacesMessage("Provided value for component "
-                    + RendererUtils.getPathToComponent(component) + " is not String or String[]: " + value.toString()));
+                    + ComponentUtils.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 0206c64..baf0791 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
@@ -31,14 +31,14 @@
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 
 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;
-import org.apache.myfaces.shared_html5.renderkit.JSFAttr;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Abstract base for media renderers.
@@ -46,7 +46,7 @@
  * @author Ali Ok
  * 
  */
-public abstract class AbstractMediaRenderer extends HtmlRenderer
+public abstract class AbstractMediaRenderer extends Renderer
 {
     private static final Logger log = Logger.getLogger(AbstractMediaRenderer.class.getName());
 
@@ -72,11 +72,11 @@
         writer.writeAttribute(HTML5.ID_ATTR, component.getClientId(facesContext), null);
 
         // get the value and render the src attr
-        String src = org.apache.myfaces.shared_html5.renderkit.RendererUtils.getStringValue(facesContext, component);
+        String src = RendererUtils.getStringValue(facesContext, component);
         if (log.isLoggable(Level.FINE))
             log.fine("writing src '" + src + "'");
         if (src != null && !src.isEmpty())
-            writer.writeAttribute(HTML5.SRC_ATTR, src, JSFAttr.VALUE_ATTR);
+            writer.writeAttribute(HTML5.SRC_ATTR, src, "value");
 
         // no need to check the value of preload, it is bypassed anyway.
         // _checkPreload(component);
@@ -162,7 +162,7 @@
                 // src is reqired to be present and not empty!
                 if (mediaInfo.getSrc() == null || mediaInfo.getSrc().isEmpty())
                     // WIKI: add a wiki page
-                    throw new FacesException("'src' field of MediaInfo has to be defined and nonempty for component " + RendererUtils.getPathToComponent(uiComponent) + ".");
+                    throw new FacesException("'src' field of MediaInfo has to be defined and nonempty for component " + ComponentUtils.getPathToComponent(uiComponent) + ".");
 
                 writer.writeAttribute(HTML5.SRC_ATTR, mediaInfo.getSrc(), null);
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AudioRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AudioRenderer.java
index 9383e9b..5bb7363 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AudioRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/AudioRenderer.java
@@ -29,7 +29,7 @@
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
 import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Renderer for < hx:audio > component.
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/VideoRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/VideoRenderer.java
index c826164..7223a78 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/VideoRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/media/VideoRenderer.java
@@ -29,7 +29,7 @@
 import org.apache.myfaces.html5.renderkit.util.HTML5;
 import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
 import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
+import org.apache.myfaces.html5.renderkit.util.RendererUtils;
 
 /**
  * Renderer for < hx:video > component.
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/MeterRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/MeterRenderer.java
index 03bb65c..af561e7 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/MeterRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/MeterRenderer.java
@@ -22,12 +22,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.output.AbstractMeter;
 import org.apache.myfaces.html5.renderkit.panel.DivRenderer;
-import org.apache.myfaces.html5.renderkit.util.HTML5;
-import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.*;
 
 import javax.faces.FacesException;
 import javax.faces.component.UIComponent;
@@ -35,6 +30,7 @@
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -42,7 +38,7 @@
 import java.util.logging.Logger;
 
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.Meter", type = "org.apache.myfaces.html5.Meter")
-public class MeterRenderer extends HtmlRenderer
+public class MeterRenderer extends Renderer
 {
     private static final Logger log = Logger.getLogger(DivRenderer.class.getName());
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/ProgressRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/ProgressRenderer.java
index 27d5e74..48e4330 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/ProgressRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/ProgressRenderer.java
@@ -3,12 +3,7 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.output.AbstractProgress;
 import org.apache.myfaces.html5.renderkit.panel.DivRenderer;
-import org.apache.myfaces.html5.renderkit.util.HTML5;
-import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
+import org.apache.myfaces.html5.renderkit.util.*;
 
 import javax.faces.FacesException;
 import javax.faces.component.UIComponent;
@@ -16,6 +11,7 @@
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -29,7 +25,7 @@
  *
  */
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.Progress", type = "org.apache.myfaces.html5.Progress")
-public class ProgressRenderer extends HtmlRenderer
+public class ProgressRenderer extends Renderer
 {
     private static final Logger log = Logger.getLogger(DivRenderer.class.getName());
 
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideRenderer.java
index a21cfbb..893afac 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideRenderer.java
@@ -22,10 +22,7 @@
 import org.apache.commons.lang.StringUtils;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.output.AbstractSlide;
-import org.apache.myfaces.html5.component.output.AbstractSlideView;
 import org.apache.myfaces.html5.renderkit.util.*;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
 
 import javax.faces.application.ResourceDependencies;
 import javax.faces.application.ResourceDependency;
@@ -34,6 +31,7 @@
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -47,7 +45,7 @@
         @ResourceDependency(name = "html5.css", library = "org.apache.myfaces.html5", target = "head")
 })
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.Slide", type = "org.apache.myfaces.html5.Slide")
-public class SlideRenderer extends HtmlRenderer
+public class SlideRenderer extends Renderer
 {
     @Override
     public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideViewRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideViewRenderer.java
index fe15dd6..51cd344 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideViewRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/output/SlideViewRenderer.java
@@ -23,8 +23,6 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.output.AbstractSlideView;
 import org.apache.myfaces.html5.renderkit.util.*;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
 
 import javax.faces.application.ResourceDependencies;
 import javax.faces.application.ResourceDependency;
@@ -33,6 +31,7 @@
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 import java.io.IOException;
 import java.text.MessageFormat;
 import java.util.List;
@@ -49,7 +48,7 @@
         @ResourceDependency(name = "html5.css", library = "org.apache.myfaces.html5", target = "head")
 })
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.SlideView", type = "org.apache.myfaces.html5.SlideView")
-public class SlideViewRenderer extends HtmlRenderer
+public class SlideViewRenderer extends Renderer
 {
     @Override
     public void encodeBegin(FacesContext facesContext, UIComponent uiComponent) throws IOException {
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/panel/DivRenderer.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/panel/DivRenderer.java
index c2c2721..769e53f 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/panel/DivRenderer.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/panel/DivRenderer.java
@@ -29,16 +29,11 @@
 import javax.faces.component.behavior.ClientBehaviorHolder;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
+import javax.faces.render.Renderer;
 
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFRenderer;
 import org.apache.myfaces.html5.component.panel.AbstractDiv;
-import org.apache.myfaces.html5.renderkit.util.HTML5;
-import org.apache.myfaces.html5.renderkit.util.Html5RendererUtils;
-import org.apache.myfaces.html5.renderkit.util.PassThroughAttributes;
-import org.apache.myfaces.html5.renderkit.util.PassThroughClientBehaviorEvents;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRenderer;
-import org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils;
+import org.apache.myfaces.html5.renderkit.util.*;
 
 /**
  * Div renderer.
@@ -47,7 +42,7 @@
  * 
  */
 @JSFRenderer(renderKitId = "HTML_BASIC", family = "org.apache.myfaces.Div", type = "org.apache.myfaces.html5.Div")
-public class DivRenderer extends HtmlRenderer
+public class DivRenderer extends Renderer
 {
 
     private static final Logger log = Logger.getLogger(DivRenderer.class.getName());
@@ -112,7 +107,7 @@
         // Check for npe
         super.decode(context, component);
 
-        HtmlRendererUtils.decodeClientBehaviors(context, component);
+        Html5RendererUtils.decodeClientBehaviors(context, component);
     }
 
 }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ClientBehaviorEvents.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ClientBehaviorEvents.java
index d77d593..780e888 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ClientBehaviorEvents.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ClientBehaviorEvents.java
@@ -73,6 +73,9 @@
     String MOUSEOUT_EVENT = "mouseout";
     String MOUSEOVER_EVENT = "mouseover";
     String MOUSEUP_EVENT = "mouseup";
+    String CHANGE_EVENT = "change";
+    String SELECT_EVENT = "select";
+    String VALUECHANGE_EVENT= "valueChange";
 
     //Effect events
     String ANIMATIONEND_EVENT = "webkitAnimationEnd";
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/HTML5.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/HTML5.java
index e81386f..45c0510 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/HTML5.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/HTML5.java
@@ -19,15 +19,13 @@
 package org.apache.myfaces.html5.renderkit.util;
 
 /**
- * Html constants for using in renderers. Does not extend {@link org.apache.myfaces.shared_html5.renderkit.html.HTML} on
- * purpose, since there are ugly constants like
- * "COMMON_FIELD_PASSTROUGH_ATTRIBUTES_WITHOUT_DISABLED_AND_ONFOCUS_AND_ONCLICK" in there. <br/>
- * Note that, this interface does not contain all of the element names and attribute names specified in Html5 spec. It
+ * Html constants for using in renderers. <br/>
+ * Note that, this interface does not contain all of the element names and attribute names specified in Html spec. It
  * only contains used ones in MyFaces Html5 components, and may not contain the attributes which have the same name with
  * the Jsf component property.
  * 
  * @author Ali Ok
- * @see org.apache.myfaces.shared_html5.renderkit.html.HTML
+ * @see org.apache.myfaces.commons.util.renderkit.HTML
  */
 public interface HTML5
 {
@@ -39,10 +37,12 @@
     String DATALIST_ELEM = "datalist";
 
     // html elements
+    String INPUT_ELEM = "input";
     String TEXTAREA_ELEM = "textarea";
     String DIV_ELEM = "div";
     String STYLE_ELEM = "style";
     String SCRIPT_ELEM = "script";
+    String OPTION_ELEM = "option";
 
     // general attrs
     String ID_ATTR = "id";
@@ -51,7 +51,13 @@
     String SRC_ATTR = "src";
     String TYPE_ATTR = "type";
     String CLASS_ATTR = "class";
+    String STYLE_ATTR = "style";
     String VALUE_ATTR = "value";
+    String DISABLED_ATTR = "disabled";
+    String LABEL_ATTR = "label";
+    String SCRIPT_TYPE_ATTR = "type";
+    String SCRIPT_TYPE_TEXT_JAVASCRIPT = "text/javascript";
+    String NAME_ATTR = "name";
 
     // media attrs
     String CONTROLS_ATTR = "controls"; // not pass thru
@@ -86,6 +92,7 @@
     String MIN_ATTR = "min";
     String MAX_ATTR = "max";
     String STEP_ATTR = "step";
+    String AUTOCOMPLETE_ATTR = "autocomplete";
 
     // new Html5 attributes which is boolean but not Html5 boolean
     // @see Html5RendererUtils#renderHTMLAttribute(javax.faces.context.ResponseWriter, String, String, Object)
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 a5927ca..80e9c0a 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,35 +18,25 @@
  */
 package org.apache.myfaces.html5.renderkit.util;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.myfaces.html5.component.util.ComponentUtils;
 
+import javax.faces.component.EditableValueHolder;
 import javax.faces.component.UIComponent;
-import javax.faces.component.UIOutput;
 import javax.faces.component.behavior.ClientBehavior;
+import javax.faces.component.behavior.ClientBehaviorContext;
+import javax.faces.component.behavior.ClientBehaviorHint;
+import javax.faces.component.behavior.ClientBehaviorHolder;
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
-import javax.faces.convert.Converter;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.myfaces.html5.component.input.Html5BaseInputText;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
-import org.apache.myfaces.shared_html5.renderkit.html.HtmlRendererUtils;
+import java.io.IOException;
+import java.util.*;
+import java.util.logging.Logger;
 
 /**
- * Renderer utils for common stuff.
- * <p>
- * Does not extend org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils on purpose, since this class should not
- * expose methods like
- * {@link org.apache.myfaces.shared_html5.renderkit.html.HtmlRendererUtils#renderBehaviorizedFieldEventHandlersWithoutOnchangeAndOnselect(javax.faces.context.FacesContext, javax.faces.context.ResponseWriter, javax.faces.component.UIComponent, java.util.Map)}
- * 
  * @author Ali Ok
- * 
  */
 public class Html5RendererUtils
 {
@@ -58,6 +48,18 @@
 
     private static final String DEFAULT_WIDGET_PREFIX = "widget_";
 
+    private static final String LINE_SEPARATOR = System.getProperty("line.separator", "\r\n");
+    private static final char TABULATOR = '\t';
+
+    public static final String NON_SUBMITTED_VALUE_WARNING
+            = "There should always be a submitted value for an input if it is rendered,"
+            + " its form is submitted, and it was not originally rendered disabled or read-only."
+            + "  You cannot submit a form after disabling an input element via javascript."
+            + "  Consider setting read-only to true instead"
+            + " or resetting the disabled value back to false prior to form submission.";
+
+    private static final Logger log = Logger.getLogger(Html5RendererUtils.class.getName());
+
     /**
      * Renders the pass through attributes of the component. Value of the JSF properties will be written with the
      * matching Html attribute name.
@@ -149,12 +151,80 @@
             String eventName = passThroughClientBehaviors.get(property);
             String htmlAttrName = HTML_EVENT_ATTR_PREFIX + eventName;
 
-            org.apache.myfaces.shared_html5.renderkit.html.HtmlRendererUtils.renderBehaviorizedAttribute(facesContext,
+            renderBehaviorizedAttribute(facesContext,
                     facesContext.getResponseWriter(), property, uiComponent, eventName, clientBehaviors, htmlAttrName);
         }
 
     }
 
+    public static boolean renderBehaviorizedOnchangeEventHandler(
+            FacesContext facesContext, ResponseWriter writer, UIComponent uiComponent,
+            Map<String, List<ClientBehavior>> clientBehaviors) throws IOException {
+        boolean hasChange = Html5RendererUtils.hasClientBehavior(ClientBehaviorEvents.CHANGE_EVENT, clientBehaviors, facesContext);
+        boolean hasValueChange = Html5RendererUtils.hasClientBehavior(ClientBehaviorEvents.VALUECHANGE_EVENT, clientBehaviors, facesContext);
+
+        if (hasChange && hasValueChange) {
+            String chain = Html5RendererUtils.buildBehaviorChain(facesContext,
+                    uiComponent, ClientBehaviorEvents.CHANGE_EVENT, null, ClientBehaviorEvents.VALUECHANGE_EVENT, null, clientBehaviors,
+                    (String) uiComponent.getAttributes().get(JsfProperties.ONCHANGE_PROP), null);
+
+            return Html5RendererUtils.renderHTMLAttribute(writer, JsfProperties.ONCHANGE_PROP, JsfProperties.ONCHANGE_PROP, chain);
+        } else if (hasChange) {
+            return Html5RendererUtils.renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONCHANGE_PROP, uiComponent,
+                    ClientBehaviorEvents.CHANGE_EVENT, clientBehaviors, JsfProperties.ONCHANGE_PROP);
+        } else if (hasValueChange) {
+            return Html5RendererUtils.renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONCHANGE_PROP, uiComponent,
+                    ClientBehaviorEvents.VALUECHANGE_EVENT, clientBehaviors, JsfProperties.ONCHANGE_PROP);
+        } else {
+            return Html5RendererUtils.renderHTMLAttribute(writer, JsfProperties.ONCHANGE_PROP, JsfProperties.ONCHANGE_PROP, uiComponent.getAttributes().get(JsfProperties.ONCHANGE_PROP));
+        }
+    }
+
+    public static void renderBehaviorizedEventHandlers(
+            FacesContext facesContext, ResponseWriter writer, UIComponent uiComponent,
+            Map<String, List<ClientBehavior>> clientBehaviors) throws IOException {
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONCLICK_PROP, uiComponent,
+                ClientBehaviorEvents.CLICK_EVENT, clientBehaviors, JsfProperties.ONCLICK_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONDBLCLICK_PROP, uiComponent,
+                ClientBehaviorEvents.DBLCLICK_EVENT, clientBehaviors, JsfProperties.ONDBLCLICK_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONMOUSEDOWN_PROP, uiComponent,
+                ClientBehaviorEvents.MOUSEDOWN_EVENT, clientBehaviors, JsfProperties.ONMOUSEDOWN_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONMOUSEUP_PROP, uiComponent,
+                ClientBehaviorEvents.MOUSEUP_EVENT, clientBehaviors, JsfProperties.ONMOUSEUP_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONMOUSEOVER_PROP, uiComponent,
+                ClientBehaviorEvents.MOUSEOVER_EVENT, clientBehaviors, JsfProperties.ONMOUSEOVER_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONMOUSEMOVE_PROP, uiComponent,
+                ClientBehaviorEvents.MOUSEMOVE_EVENT, clientBehaviors, JsfProperties.ONMOUSEMOVE_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONMOUSEOUT_PROP, uiComponent,
+                ClientBehaviorEvents.MOUSEOUT_EVENT, clientBehaviors, JsfProperties.ONMOUSEOUT_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONKEYPRESS_PROP, uiComponent,
+                ClientBehaviorEvents.KEYPRESS_EVENT, clientBehaviors, JsfProperties.ONKEYPRESS_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONKEYDOWN_PROP, uiComponent,
+                ClientBehaviorEvents.KEYDOWN_EVENT, clientBehaviors, JsfProperties.ONKEYDOWN_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONKEYUP_PROP, uiComponent,
+                ClientBehaviorEvents.KEYUP_EVENT, clientBehaviors, JsfProperties.ONKEYUP_PROP);
+    }
+
+    public static void renderBehaviorizedFieldEventHandlersWithoutOnchange(
+            FacesContext facesContext, ResponseWriter writer, UIComponent uiComponent,
+            Map<String, List<ClientBehavior>> clientBehaviors) throws IOException {
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONFOCUS_PROP, uiComponent,
+                ClientBehaviorEvents.FOCUS_EVENT, clientBehaviors, JsfProperties.ONFOCUS_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONBLUR_PROP, uiComponent,
+                ClientBehaviorEvents.BLUR_EVENT, clientBehaviors, JsfProperties.ONBLUR_PROP);
+        renderBehaviorizedAttribute(facesContext, writer, JsfProperties.ONSELECT_PROP, uiComponent,
+                ClientBehaviorEvents.SELECT_EVENT, clientBehaviors, JsfProperties.ONSELECT_PROP);
+    }
+
+    public static boolean hasClientBehavior(String eventName,
+                                            Map<String, List<ClientBehavior>> behaviors,
+                                            FacesContext facesContext) {
+        if (behaviors == null) {
+            return false;
+        }
+        return (behaviors.get(eventName) != null);
+    }
+
     /**
      * Resolves string values from comma separated strings, string arrays or string collections.
      * 
@@ -239,19 +309,6 @@
     }
 
     /**
-     * Finds the converter of the component in a safe way.
-     * 
-     * @return null if no converter found or an exception occured inside
-     */
-    public static Converter findUIOutputConverterFailSafe(FacesContext facesContext, UIComponent component)
-    {
-        if(!(component instanceof UIOutput))
-            return null;
-        
-        return HtmlRendererUtils.findUIOutputConverterFailSafe(facesContext, component);
-    }
-
-    /**
      * Escapes the given string for use as a CSS selector.
      * @return Escaped selector
      */
@@ -281,4 +338,532 @@
 
         return str.replace(":", "_");
     }
+
+    /**
+     * @since 4.0.0
+     * @param facesContext
+     * @param component
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static void decodeClientBehaviors(FacesContext facesContext,
+            UIComponent component)
+    {
+        if (component instanceof ClientBehaviorHolder)
+        {
+            ClientBehaviorHolder clientBehaviorHolder = (ClientBehaviorHolder) component;
+
+            Map<String,List<ClientBehavior>> clientBehaviors =
+                clientBehaviorHolder.getClientBehaviors();
+
+            if (clientBehaviors != null && !clientBehaviors.isEmpty())
+            {
+                Map<String,String> paramMap = facesContext.getExternalContext().
+                    getRequestParameterMap();
+
+                String behaviorEventName = paramMap.get("javax.faces.behavior.event");
+
+                if (behaviorEventName != null)
+                {
+                    List<ClientBehavior> clientBehaviorList = clientBehaviors.get(behaviorEventName);
+
+                    if (clientBehaviorList != null && !clientBehaviorList.isEmpty())
+                    {
+                        String clientId = paramMap.get("javax.faces.source");
+
+                        if (component.getClientId().equals(clientId))
+                        {
+                            for (ClientBehavior clientBehavior : clientBehaviorList)
+                            {
+                                clientBehavior.decode(facesContext, component);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * Render an attribute taking into account the passed event and
+     * the component property. The event will be rendered on the selected
+     * htmlAttrName
+     *
+     * @param facesContext
+     * @param writer
+     * @param component
+     * @param clientBehaviors
+     * @param eventName
+     * @param componentProperty
+     * @param htmlAttrName
+     * @return
+     * @throws IOException
+     * @since 4.0.1
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static boolean renderBehaviorizedAttribute(
+            FacesContext facesContext, ResponseWriter writer,
+            String componentProperty, UIComponent component,
+            String eventName, Map<String, List<ClientBehavior>> clientBehaviors,
+            String htmlAttrName) throws IOException {
+        return renderBehaviorizedAttribute(facesContext, writer,
+                componentProperty, component,
+                eventName, null, clientBehaviors,
+                htmlAttrName, (String) component.getAttributes().get(componentProperty));
+    }
+
+    /**
+     * Render an attribute taking into account the passed event,
+     * the component property and the passed attribute value for the component
+     * property. The event will be rendered on the selected htmlAttrName.
+     *
+     * @param facesContext
+     * @param writer
+     * @param componentProperty
+     * @param component
+     * @param eventName
+     * @param clientBehaviors
+     * @param htmlAttrName
+     * @param attributeValue
+     * @return
+     * @throws IOException
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static boolean renderBehaviorizedAttribute(
+            FacesContext facesContext, ResponseWriter writer,
+            String componentProperty, UIComponent component,
+            String eventName, Collection<ClientBehaviorContext.Parameter> eventParameters, Map<String, List<ClientBehavior>> clientBehaviors,
+            String htmlAttrName, String attributeValue) throws IOException {
+        List<ClientBehavior> cbl = (clientBehaviors != null) ? clientBehaviors.get(eventName) : null;
+
+        if (cbl == null || cbl.size() == 0) {
+            return renderHTMLAttribute(writer, componentProperty, htmlAttrName, attributeValue);
+        }
+
+        if (cbl.size() > 1 || (cbl.size() == 1 && attributeValue != null)) {
+            return renderHTMLAttribute(writer, componentProperty, htmlAttrName,
+                    buildBehaviorChain(facesContext,
+                            component, eventName, eventParameters, clientBehaviors,
+                            attributeValue, StringUtils.EMPTY));
+        } else {
+            //Only 1 behavior and attrValue == null, so just render it directly
+            return renderHTMLAttribute(writer, componentProperty, htmlAttrName,
+                    cbl.get(0).getScript(
+                            ClientBehaviorContext
+                                    .createClientBehaviorContext(facesContext, component,
+                                            eventName, component.getClientId(facesContext),
+                                            eventParameters)));
+        }
+    }
+
+    /**
+     * @param facesContext
+     * @param uiComponent
+     * @param clientBehaviors
+     * @param eventName
+     * @param userEventCode
+     * @param serverEventCode
+     * @param params
+     * @return
+     * @since 4.0.0
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    //modified
+    public static String buildBehaviorChain(FacesContext facesContext,
+                                            UIComponent uiComponent,
+                                            String eventName, Collection<ClientBehaviorContext.Parameter> params,
+                                            Map<String, List<ClientBehavior>> clientBehaviors,
+                                            String userEventCode, String serverEventCode) {
+        ExternalContext externalContext = facesContext.getExternalContext();
+        List<String> finalParams = new ArrayList<String>(3);
+        if(StringUtils.isNotBlank(userEventCode)){
+            // escape every ' in the user event code since it will
+            // be a string attribute of jsf.util.chain
+            finalParams.add('\'' + escapeJavaScriptForChain(userEventCode) + '\'');
+        }
+
+        ScriptContext behaviorCode = new ScriptContext();
+        ScriptContext retVal = new ScriptContext();
+
+        getClientBehaviorScript(facesContext, uiComponent, eventName, clientBehaviors,
+                behaviorCode, params);
+        if (behaviorCode!=null && StringUtils.isNotBlank(behaviorCode.toString())) {
+            finalParams.add(behaviorCode.toString());
+        }
+        if (StringUtils.isNotBlank(serverEventCode)) {
+            finalParams.add('\'' + escapeJavaScriptForChain(serverEventCode) + '\'');
+        }
+        Iterator<String> it = finalParams.iterator();
+
+        // It's possible that there are no behaviors to render.  For example, if we have
+        // <f:ajax disabled="true" /> as the only behavior.
+
+        if (it.hasNext()) {
+            //according to the spec jsf.util.chain has to be used to build up the behavior and scripts
+            retVal.append("jsf.util.chain(document.getElementById('"
+                    + uiComponent.getClientId(facesContext) + "'), event,");
+            while (it.hasNext()) {
+                retVal.append(it.next());
+                if (it.hasNext()) {
+                    retVal.append(", ");
+                }
+            }
+            retVal.append(");");
+        }
+
+        return retVal.toString();
+    }
+
+    public static String buildBehaviorChain(FacesContext facesContext,
+                                            UIComponent uiComponent,
+                                            String eventName1, Collection<ClientBehaviorContext.Parameter> params,
+                                            String eventName2, Collection<ClientBehaviorContext.Parameter> params2,
+                                            Map<String, List<ClientBehavior>> clientBehaviors,
+                                            String userEventCode,
+                                            String serverEventCode) {
+
+        List<String> finalParams = new ArrayList<String>(3);
+        if (StringUtils.isNotBlank(userEventCode)) {
+            finalParams.add('\'' + escapeJavaScriptForChain(userEventCode) + '\'');
+        }
+
+        ScriptContext behaviorCode = new ScriptContext();
+        ScriptContext retVal = new ScriptContext();
+
+        boolean submitting1 = getClientBehaviorScript(facesContext, uiComponent, eventName1, clientBehaviors,
+                behaviorCode, params);
+        boolean submitting2 = getClientBehaviorScript(facesContext, uiComponent, eventName2, clientBehaviors,
+                behaviorCode, params2);
+
+        // ClientBehaviors for both events have to be checked for the Submitting hint
+        boolean submitting = submitting1 || submitting2;
+
+        if (StringUtils.isNotBlank(behaviorCode.toString())) {
+            finalParams.add(behaviorCode.toString());
+        }
+        if (StringUtils.isNotBlank(serverEventCode)) {
+            finalParams.add('\'' + escapeJavaScriptForChain(serverEventCode) + '\'');
+        }
+        Iterator<String> it = finalParams.iterator();
+
+        // It's possible that there are no behaviors to render.  For example, if we have
+        // <f:ajax disabled="true" /> as the only behavior.
+
+        if (it.hasNext()) {
+            if (!submitting) {
+                retVal.append("return ");
+            }
+            //according to the spec jsf.util.chain has to be used to build up the behavior and scripts
+            retVal.append("jsf.util.chain(document.getElementById('"
+                    + uiComponent.getClientId(facesContext) + "'), event,");
+            while (it.hasNext()) {
+                retVal.append(it.next());
+                if (it.hasNext()) {
+                    retVal.append(", ");
+                }
+            }
+            retVal.append(");");
+            if (submitting) {
+                retVal.append(" return false;");
+            }
+        }
+
+        return retVal.toString();
+
+    }
+
+    /**
+     * builds the chained behavior script which then can be reused
+     * in following order by the other script building parts
+     * <p/>
+     * user defined event handling script
+     * behavior script
+     * renderer default script
+     *
+     * @param eventName    event name ("onclick" etc...)
+     * @param uiComponent  the component which has the attachement (or should have)
+     * @param facesContext the facesContext
+     * @param params       params map of params which have to be dragged into the request
+     * @return a string representation of the javascripts for the attached event behavior, an empty string if none is present
+     * @since 4.0.0
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    //modified
+    private static boolean getClientBehaviorScript(FacesContext facesContext,
+                                                   UIComponent uiComponent, String eventName,
+                                                   Map<String, List<ClientBehavior>> clientBehaviors,
+                                                   ScriptContext target, Collection<ClientBehaviorContext.Parameter> params) {
+        if (!(uiComponent instanceof ClientBehaviorHolder)) {
+            target.append(StringUtils.EMPTY);
+            return false;
+        }
+
+        ExternalContext externalContext = facesContext.getExternalContext();
+
+        boolean renderClientBehavior = MapUtils.isNotEmpty(clientBehaviors);
+        if (!renderClientBehavior) {
+            target.append(StringUtils.EMPTY);
+            return false;
+        }
+
+        List<ClientBehavior> attachedEventBehaviors = clientBehaviors
+                .get(eventName);
+        if (attachedEventBehaviors == null
+                || attachedEventBehaviors.size() == 0) {
+            target.append(StringUtils.EMPTY);
+            return false;
+        }
+
+        ClientBehaviorContext context = ClientBehaviorContext
+                .createClientBehaviorContext(facesContext, uiComponent,
+                        eventName, uiComponent.getClientId(facesContext),
+                        params);
+
+
+        boolean submitting = false;
+        Iterator<ClientBehavior> clientIterator = attachedEventBehaviors
+                .iterator();
+        while (clientIterator.hasNext()) {
+            ClientBehavior clientBehavior = clientIterator.next();
+            String script = clientBehavior.getScript(context);
+
+            // The script _can_ be null, and in fact is for <f:ajax disabled="true" />
+
+            if (script != null) {
+                //either strings or functions, but I assume string is more appropriate since it allows access to the
+                //origin as this!
+                target.append("'" + escapeJavaScriptForChain(script) + "'");
+                if (clientIterator.hasNext()) {
+                    target.append(", ");
+                }
+            }
+            if (!submitting) {
+                submitting = clientBehavior.getHints().contains(ClientBehaviorHint.SUBMITTING);
+            }
+        }
+        return submitting;
+    }
+
+    /**
+     * This function correctly escapes the given JavaScript code
+     * for the use in the jsf.util.chain() JavaScript function.
+     * It also handles double-escaping correclty.
+     *
+     * @param javaScript
+     * @return
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static String escapeJavaScriptForChain(String javaScript)
+    {
+        // first replace \' with \\'
+        //String escaped = StringUtils.replace(javaScript, "\\'", "\\\\'");
+
+        // then replace ' with \'
+        // (this will replace every \' in the original to \\\')
+        //escaped = StringUtils.replace(escaped, '\'', "\\'");
+
+        //return escaped;
+
+        StringBuffer out = null;
+        for (int pos = 0; pos < javaScript.length(); pos++)
+        {
+            char c = javaScript.charAt(pos);
+
+            if (c == '\\' || c == '\'')
+            {
+                if (out == null)
+                {
+                    out = new StringBuffer(javaScript.length() + 8);
+                    if (pos > 0)
+                    {
+                        out.append(javaScript, 0, pos);
+                    }
+                }
+                out.append('\\');
+            }
+            if (out != null)
+            {
+                out.append(c);
+            }
+        }
+
+        if (out == null)
+        {
+            return javaScript;
+        }
+        else
+        {
+            return out.toString();
+        }
+    }
+
+    /**
+     * Utility to set the submitted value of the provided component from the
+     * data in the current request object.
+     * <p/>
+     * Param component is required to be an EditableValueHolder. On return
+     * from this method, the component's submittedValue property will be
+     * set if the submitted form contained that component.
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static void decodeUIInput(FacesContext facesContext,
+                                     UIComponent component) {
+        if (!(component instanceof EditableValueHolder)) {
+            throw new IllegalArgumentException("Component "
+                    + component.getClientId(facesContext)
+                    + " is not an EditableValueHolder");
+        }
+        Map paramMap = facesContext.getExternalContext()
+                .getRequestParameterMap();
+        String clientId = component.getClientId(facesContext);
+
+        if (isDisabledOrReadOnly(component))
+            return;
+
+        if (paramMap.containsKey(clientId)) {
+            ((EditableValueHolder) component).setSubmittedValue(paramMap
+                    .get(clientId));
+        } else {
+            log.warning(NON_SUBMITTED_VALUE_WARNING +
+                    " Component : " +
+                    ComponentUtils.getPathToComponent(component));
+        }
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static boolean isDisabled(UIComponent component) {
+        return isTrue(component.getAttributes().get("disabled"));
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static boolean isReadOnly(UIComponent component) {
+        return isTrue(component.getAttributes().get("readonly"));
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    private static boolean isTrue(Object obj) {
+        if (obj instanceof String) {
+            return new Boolean((String) obj);
+        }
+
+        if (!(obj instanceof Boolean))
+            return false;
+
+        return ((Boolean) obj).booleanValue();
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    //modified
+    public static boolean isDisabledOrReadOnly(UIComponent component) {
+        return  isDisabled(component) ||
+                isReadOnly(component);
+    }
+
+    /**
+     * The ScriptContext offers methods and fields
+     * to help with rendering out a script and keeping a
+     * proper formatting.
+     */
+    //copied from org.apache.myfaces.shared.renderkit.html.HtmlRendererUtils
+    public static class ScriptContext {
+        private long currentIndentationLevel;
+        private StringBuffer buffer = new StringBuffer();
+        private boolean prettyPrint = false;
+        /**
+         * automatic formatting will render
+         * new-lines and indents if blocks are opened
+         * and closed - attention: you need to append
+         * opening and closing brackets of blocks separately in this case!
+         */
+        private boolean automaticFormatting = true;
+
+        public ScriptContext() {
+
+        }
+
+        public ScriptContext(boolean prettyPrint) {
+            this.prettyPrint = prettyPrint;
+        }
+
+        public ScriptContext(StringBuffer buf, boolean prettyPrint) {
+            this.prettyPrint = prettyPrint;
+            this.buffer = buf;
+        }
+
+        public void increaseIndent() {
+            currentIndentationLevel++;
+        }
+
+        public void decreaseIndent() {
+            currentIndentationLevel--;
+
+            if (currentIndentationLevel < 0)
+                currentIndentationLevel = 0;
+        }
+
+        public void prettyLine() {
+            if (prettyPrint) {
+                append(LINE_SEPARATOR);
+
+                for (int i = 0; i < getCurrentIndentationLevel(); i++)
+                    append(TABULATOR);
+            }
+        }
+
+        public void prettyLineIncreaseIndent() {
+            increaseIndent();
+            prettyLine();
+        }
+
+        public void prettyLineDecreaseIndent() {
+            decreaseIndent();
+            prettyLine();
+        }
+
+        public long getCurrentIndentationLevel() {
+            return currentIndentationLevel;
+        }
+
+        public void setCurrentIndentationLevel(long currentIndentationLevel) {
+            this.currentIndentationLevel = currentIndentationLevel;
+        }
+
+        public ScriptContext append(String str) {
+
+            if (automaticFormatting && str.length() == 1) {
+                boolean openBlock = str.equals("{");
+                boolean closeBlock = str.equals("}");
+
+                if (openBlock) {
+                    prettyLine();
+                } else if (closeBlock) {
+                    prettyLineDecreaseIndent();
+                }
+
+                buffer.append(str);
+
+                if (openBlock) {
+                    prettyLineIncreaseIndent();
+                } else if (closeBlock) {
+                    prettyLine();
+                }
+            } else {
+                buffer.append(str);
+            }
+            return this;
+        }
+
+        public ScriptContext append(char c) {
+            buffer.append(c);
+            return this;
+        }
+
+        public ScriptContext append(int i) {
+            buffer.append(i);
+            return this;
+        }
+
+        public String toString() {
+            return buffer.toString();
+        }
+    }
 }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/JsfProperties.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/JsfProperties.java
index 40194b8..ab26e87 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/JsfProperties.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/JsfProperties.java
@@ -40,8 +40,12 @@
     String SRC_PROP = "src";
     String WIDTH_PROP = "width";
     String HEIGHT_PROP = "height";
+    String ALIGN_PROP = "align";
+    String ALT_PROP = "alt";
+    String SIZE_PROP = "size";
 
     String VALUE_PROP = "value";
+    String VAR_PROP = "var";
 
     // new Html5 common props
     String HIDDEN_PROP = "hidden";
@@ -111,10 +115,20 @@
     String MAXLENGTH_PROP = "maxlength";
     String READONLY_PROP = "readonly";
     String STEP_PROP = "step";
+    String ONCHANGE_PROP = "onchange";
+    String ONSELECT_PROP = "onselect";
 
     // input email props
     String MULTIPLE_PROP = "multiple";
 
+    //textarea props
+    String COLS_PROP = "cols";
+    String ROWS_PROP = "rows";
+    String WRAP_PROP = "wrap";
+
+    // Input_Secret Attributes
+    String REDISPLAY_PROP = "redisplay";
+
     // possible types for hx:inputText
     String INPUTTEXT_TYPE_PASSWORD = "password";
     String INPUTTEXT_TYPE_TEXTAREA = "textarea";
@@ -139,4 +153,14 @@
     String HIGH_PROP = "high";
 
     String ONANIMATIONEND_PROP = "onanimationEnd";
+
+
+    // UISelectItem(s) attributes
+    String ITEM_DISABLED_PROP          = "itemDisabled";
+    String ITEM_DESCRIPTION_PROP       = "itemDescription";
+    String ITEM_LABEL_PROP             = "itemLabel";
+    String ITEM_VALUE_PROP             = "itemValue";
+    String ITEM_LABEL_ESCAPED_PROP     = "itemLabelEscaped";
+    String NO_SELECTION_VALUE_PROP     = "noSelectionValue";
+
 }
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributeGroups.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributeGroups.java
index f1e4b0d..364e0bc 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributeGroups.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributeGroups.java
@@ -42,11 +42,27 @@
         .attr(ACCESSKEY_PROP)
         .attr(TABINDEX_PROP)
         .unmodifiable();
-    
+
     Map<String, String> DND_PROPS = map(1)
         .attr(DRAGGABLE_PROP)
         .unmodifiable();
-    
+
+    Map<String, String> COMMON_INPUT_PROPS = map(13)
+        .attr(ALIGN_PROP)
+        .attr(ALT_PROP)
+        .attr(MAXLENGTH_PROP)
+        .attr(READONLY_PROP)
+        .attr(SIZE_PROP)
+        .attr(STYLE_PROP, STYLE_ATTR)
+        .attr(STYLECLASS_PROP, CLASS_ATTR)
+        .attr(DIR_PROP)
+        .attr(LANG_PROP)
+        .attr(TITLE_PROP)
+        .attr(ACCESSKEY_PROP)
+        .attr(TABINDEX_PROP)
+        .attr(DISABLED_ATTR)
+        .unmodifiable();
+
     Map<String, String> HTML5_INPUT_PROPS = map(2)
         .attr(DATALIST_PROP, LIST_ATTR)
         .attr(AUTOFOCUS_PROP)
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java
index 3eab5c5..a859531 100644
--- a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/PassThroughAttributes.java
@@ -21,7 +21,6 @@
 import static org.apache.myfaces.html5.renderkit.util.AttributeMap.map;
 import static org.apache.myfaces.html5.renderkit.util.HTML5.*;
 import static org.apache.myfaces.html5.renderkit.util.JsfProperties.*;
-import org.apache.myfaces.html5.renderkit.util.PassThroughAttributeGroups;
 
 import java.util.Map;
 
@@ -49,6 +48,10 @@
         .attr(HEIGHT_PROP)
         .unmodifiable();
 
+    Map<String, String> BASE_INPUT = map(13)
+        .attrs(PassThroughAttributeGroups.COMMON_INPUT_PROPS)
+        .unmodifiable();
+
     Map<String, String> INPUT_COLOR = map(4)
         .attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
         .attrs(PassThroughAttributeGroups.HTML5_INPUT_PROPS)
@@ -72,7 +75,9 @@
         .attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
         .attr(AUTOFOCUS_PROP)
         .attr(REQUIRED_PROP)
-        .attr(MAXLENGTH_PROP)
+        .attr(COLS_PROP)
+        .attr(ROWS_PROP)
+        .attr(WRAP_PROP)
         .unmodifiable();
 
     Map<String, String> INPUT_EMAIL = map(7)
@@ -134,5 +139,5 @@
         .attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
         .attrs(PassThroughAttributeGroups.HTML_GLOBAL_PROPS)
         .unmodifiable();
-    
+
 }
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
new file mode 100644
index 0000000..a96fc48
--- /dev/null
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/RendererUtils.java
@@ -0,0 +1,308 @@
+/*
+ * 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 javax.el.ValueExpression;
+import javax.faces.FacesException;
+import javax.faces.component.EditableValueHolder;
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIOutput;
+import javax.faces.component.ValueHolder;
+import javax.faces.context.FacesContext;
+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;
+
+/**
+ * @author Ali Ok
+ */
+public class RendererUtils {
+
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static void checkParamValidity(FacesContext facesContext, UIComponent uiComponent, Class compClass)
+    {
+        if(facesContext == null)
+            throw new NullPointerException("facesContext may not be null");
+        if(uiComponent == null)
+            throw new NullPointerException("uiComponent may not be null");
+
+        //if (compClass != null && !(compClass.isAssignableFrom(uiComponent.getClass())))
+        // 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)+
+                    " is not instance of "+compClass.getName()+" as it should be");
+        }
+    }
+
+    /**
+     * Convenient utility method that returns the currently given value as String,
+     * using the given converter.
+     * Especially usefull for dealing with primitive types.
+     */
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static String getConvertedStringValue(FacesContext context,
+            UIComponent component, Converter converter, Object value) {
+        if (converter == null) {
+            if (value == null) {
+                return "";
+            } else if (value instanceof String) {
+                return (String) value;
+            } else {
+                return value.toString();
+            }
+        }
+
+        return converter.getAsString(context, component, value);
+    }
+
+    /**
+     * Find the proper Converter for the given UIOutput component.
+     * @return the Converter or null if no Converter specified or needed
+     * @throws javax.faces.FacesException if the Converter could not be created
+     */
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static Converter findUIOutputConverter(FacesContext facesContext,
+                                                  UIOutput component)
+            throws FacesException
+    {
+        // Attention!
+        // This code is duplicated in jsfapi component package.
+        // If you change something here please do the same in the other class!
+
+        Converter converter = component.getConverter();
+        if (converter != null)
+            return converter;
+
+        //Try to find out by value expression
+        ValueExpression expression = component.getValueExpression("value");
+        if (expression == null)
+            return null;
+
+        Class valueType = expression.getType(facesContext.getELContext());
+        if (valueType == null)
+            return null;
+
+        if (Object.class.equals(valueType))
+            return null; //There is no converter for Object class
+
+        try
+        {
+            return facesContext.getApplication().createConverter(valueType);
+        }
+        catch (FacesException e)
+        {
+            log(facesContext, "No Converter for type " + valueType.getName()
+                    + " found", e);
+            return null;
+        }
+    }
+
+    /**
+     * Finds the converter of the component in a safe way.
+     *
+     * @return null if no converter found or an exception occured inside
+     */
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static Converter findUIOutputConverterFailSafe(FacesContext facesContext, UIComponent uiComponent) {
+        Converter converter;
+        try {
+            converter = RendererUtils.findUIOutputConverter(facesContext,
+                    (UIOutput) uiComponent);
+        } catch (FacesException e) {
+            log.log(Level.SEVERE, "Error finding Converter for component with id "
+                    + uiComponent.getClientId(facesContext), e);
+            converter = null;
+        }
+        return converter;
+    }
+
+    /**
+     * See JSF Spec. 8.5 Table 8-1
+     * @param value
+     * @return boolean
+     */
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static boolean isDefaultAttributeValue(Object value)
+    {
+        if (value == null)
+        {
+            return true;
+        }
+        else if (value instanceof Boolean)
+        {
+            return !((Boolean) value).booleanValue();
+        }
+        else if (value instanceof Number)
+        {
+            if (value instanceof Integer)
+            {
+                return ((Number)value).intValue() == Integer.MIN_VALUE;
+            }
+            else if (value instanceof Double)
+            {
+                return ((Number)value).doubleValue() == Double.MIN_VALUE;
+            }
+            else if (value instanceof Long)
+            {
+                return ((Number)value).longValue() == Long.MIN_VALUE;
+            }
+            else if (value instanceof Byte)
+            {
+                return ((Number)value).byteValue() == Byte.MIN_VALUE;
+            }
+            else if (value instanceof Float)
+            {
+                return ((Number)value).floatValue() == Float.MIN_VALUE;
+            }
+            else if (value instanceof Short)
+            {
+                return ((Number)value).shortValue() == Short.MIN_VALUE;
+            }
+        }
+        return false;
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit._SharedRendererUtils
+    private static final Logger log = Logger.getLogger(RendererUtils.class.getName());
+    private static void log(FacesContext context, String msg, Exception e)
+    {
+        log.log(Level.SEVERE, msg, e);
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static String getStringValue(FacesContext facesContext,
+                                        UIComponent component)
+    {
+        try
+        {
+            if (!(component instanceof ValueHolder))
+            {
+                throw new IllegalArgumentException("Component : " + ComponentUtils.getPathToComponent(component)+"is not a ValueHolder");
+            }
+
+            if (component instanceof EditableValueHolder)
+            {
+                Object submittedValue = ((EditableValueHolder)component).getSubmittedValue();
+                if (submittedValue != null)
+                {
+                        if (log.isLoggable(Level.FINE)) log.fine("returning 1 '" + submittedValue + "'");
+                        return submittedValue.toString();
+                }
+            }
+
+            Object value;
+
+            if(component instanceof EditableValueHolder) {
+
+                EditableValueHolder holder = (EditableValueHolder) component;
+
+                if(holder.isLocalValueSet()) {
+                    value = holder.getLocalValue();
+                } else {
+                    value = getValue(component);
+                }
+            }
+            else {
+                value = getValue(component);
+            }
+
+            Converter converter = ((ValueHolder)component).getConverter();
+            if (converter == null  && value != null)
+            {
+
+                try
+                {
+                    converter = facesContext.getApplication().createConverter(value.getClass());
+                    if (log.isLoggable(Level.FINE)) log.fine("the created converter is " + converter);
+                }
+                catch (FacesException e)
+                {
+                    log.log(Level.SEVERE, "No converter for class " + value.getClass().getName() + " found (component id=" + component.getId() + ").", e);
+                    // converter stays null
+                }
+            }
+
+            if (converter == null)
+            {
+                if (value == null)
+                {
+                    if (log.isLoggable(Level.FINE)) log.fine("returning an empty string");
+                    return "";
+                }
+
+                if (log.isLoggable(Level.FINE)) log.fine("returning an .toString");
+                return value.toString();
+
+            }
+
+            if (log.isLoggable(Level.FINE)) log.fine("returning converter get as string " + converter);
+            return converter.getAsString(facesContext, component, value);
+
+        }
+        catch(PropertyNotFoundException ex)
+        {
+            log.log(Level.SEVERE, "Property not found - called by component : "+ComponentUtils.getPathToComponent(component),ex);
+
+            throw ex;
+        }
+    }
+
+    private static Object getValue(UIComponent component) {
+        Object value;
+        try
+        {
+            value = ((ValueHolder) component).getValue();
+        }
+        catch(Exception ex)
+        {
+            throw new FacesException("Could not retrieve value of component with path : "+
+                    ComponentUtils.getPathToComponent(component),ex);
+        }
+        return value;
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.RendererUtils
+    public static Object getConvertedUIOutputValue(FacesContext facesContext, UIOutput output, Object submittedValue)
+            throws ConverterException
+    {
+        if (submittedValue != null && !(submittedValue instanceof String))
+        {
+            submittedValue = submittedValue.toString();
+        }
+
+        Converter converter;
+        try
+        {
+            converter = findUIOutputConverter(facesContext, output);
+        }
+        catch (FacesException e)
+        {
+            throw new ConverterException(e);
+        }
+
+        return converter == null ? submittedValue : converter
+                .getAsObject(facesContext, output, (String) submittedValue);
+    }
+}
diff --git a/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ResourceUtils.java b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ResourceUtils.java
new file mode 100644
index 0000000..2fc817f
--- /dev/null
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/ResourceUtils.java
@@ -0,0 +1,106 @@
+/*
+ * 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 javax.faces.application.Resource;
+import javax.faces.context.FacesContext;
+import javax.faces.context.ResponseWriter;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+public class ResourceUtils {
+
+    private final static String RENDERED_JSF_JS = "org.apache.myfaces.RENDERED_JSF_JS";
+
+    public final static String JAVAX_FACES_LIBRARY_NAME = "javax.faces";
+    public final static String JSF_JS_RESOURCE_NAME = "jsf.js";
+
+    private final static String RENDERED_SCRIPT_RESOURCES_SET = "org.apache.myfaces.RENDERED_SCRIPT_RESOURCES_SET";
+
+    //copied from org.apache.myfaces.shared.renderkit.html.util.ResourceUtils
+    //modified
+    public static void renderDefaultJsfJsInlineIfNecessary(FacesContext facesContext, ResponseWriter writer) throws IOException
+    {
+        if (facesContext.getAttributes().containsKey(RENDERED_JSF_JS))
+        {
+            return;
+        }
+
+        // Check first if we have lucky, we are using myfaces and the script has
+        // been previously rendered
+        if (isRenderedScript(facesContext, JAVAX_FACES_LIBRARY_NAME, JSF_JS_RESOURCE_NAME))
+        {
+            facesContext.getAttributes().put(RENDERED_JSF_JS, Boolean.TRUE);
+            return;
+        }
+
+        // Check if this is an ajax request. If so, we don't need to include it, because that was
+        // already done and in the worst case, jsf script was already loaded on the page.
+        if (facesContext.getPartialViewContext() != null && facesContext.getPartialViewContext().isAjaxRequest())
+        {
+            return;
+        }
+
+        //Fast shortcut, don't create component instance and do what HtmlScriptRenderer do.
+        Resource resource = facesContext.getApplication().getResourceHandler().createResource(JSF_JS_RESOURCE_NAME, JAVAX_FACES_LIBRARY_NAME);
+        markScriptAsRendered(facesContext, JAVAX_FACES_LIBRARY_NAME, JSF_JS_RESOURCE_NAME);
+        writer.startElement(HTML5.SCRIPT_ELEM, null);
+        writer.writeAttribute(HTML5.SCRIPT_TYPE_ATTR, HTML5.SCRIPT_TYPE_TEXT_JAVASCRIPT, null);
+        writer.writeURIAttribute(HTML5.SRC_ATTR, resource.getRequestPath(), null);
+        writer.endElement(HTML5.SCRIPT_ELEM);
+
+        //mark as rendered
+        facesContext.getAttributes().put(RENDERED_JSF_JS, Boolean.TRUE);
+        return;
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.html.util.ResourceUtils
+    public static boolean isRenderedScript(FacesContext facesContext, String libraryName, String resourceName)
+    {
+        return getRenderedScriptResources(facesContext).containsKey(libraryName != null ? libraryName+'/'+resourceName : resourceName);
+    }
+
+    /**
+     * Return a set of already rendered resources by this renderer on the current
+     * request.
+     *
+     * @param facesContext
+     * @return
+     */
+    @SuppressWarnings("unchecked")
+    //copied from org.apache.myfaces.shared.renderkit.html.util.ResourceUtils
+    private static Map<String, Boolean> getRenderedScriptResources(FacesContext facesContext)
+    {
+        Map<String, Boolean> map = (Map<String, Boolean>) facesContext.getAttributes().get(RENDERED_SCRIPT_RESOURCES_SET);
+        if (map == null)
+        {
+            map = new HashMap<String, Boolean>();
+            facesContext.getAttributes().put(RENDERED_SCRIPT_RESOURCES_SET,map);
+        }
+        return map;
+    }
+
+    //copied from org.apache.myfaces.shared.renderkit.html.util.ResourceUtils
+    public static void markScriptAsRendered(FacesContext facesContext, String libraryName, String resourceName)
+    {
+        getRenderedScriptResources(facesContext).put(libraryName != null ? libraryName+'/'+resourceName : resourceName, Boolean.TRUE);
+    }
+}
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
new file mode 100644
index 0000000..60d6655
--- /dev/null
+++ b/myfaces-html5-core/src/main/java/org/apache/myfaces/html5/renderkit/util/SelectItemsIterator.java
@@ -0,0 +1,323 @@
+/*
+ *  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 68406a9..788772f 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
@@ -35,9 +35,9 @@
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFProperty;
 import org.apache.myfaces.buildtools.maven2.plugin.builder.annotation.JSFValidator;
 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;
-import org.apache.myfaces.shared_html5.renderkit.RendererUtils;
 
 /**
  * Validate that the date entered is within a given range. Rendered min/max attributes of hx:inputDateTime is driven by
@@ -89,7 +89,7 @@
                 catch (ParseException e)
                 {
                     throw new ValidatorException(new FacesMessage("Unable to resolve minimum for component "
-                            + RendererUtils.getPathToComponent(uiComponent) + "."), e);
+                            + ComponentUtils.getPathToComponent(uiComponent) + "."), e);
                 }
 
                 Date resolvedMaximum = null;
@@ -100,7 +100,7 @@
                 catch (ParseException e)
                 {
                     throw new ValidatorException(new FacesMessage("Unable to resolve maximum for component "
-                            + RendererUtils.getPathToComponent(uiComponent) + "."), e);
+                            + ComponentUtils.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 "
-                                + RendererUtils.getPathToComponent(uiComponent) + ".");
+                                + ComponentUtils.getPathToComponent(uiComponent) + ".");
                     }
                     else
                     {
@@ -120,7 +120,7 @@
                             else
                                 throw new ValidatorException(
                                         new FacesMessage("Submitted value is not in allowed range for component "
-                                                + RendererUtils.getPathToComponent(uiComponent) + ". Range is "
+                                                + ComponentUtils.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 "
-                                + RendererUtils.getPathToComponent(uiComponent) + ". Minimum value is "
+                                + ComponentUtils.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 "
-                                + RendererUtils.getPathToComponent(uiComponent) + ". Maximum value is "
+                                + ComponentUtils.getPathToComponent(uiComponent) + ". Maximum value is "
                                 + resolvedMaximum.toString() + "."));
                 }
             }
diff --git a/pom.xml b/pom.xml
index 062e714..3d298a7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -137,7 +137,6 @@
 
     <properties>
         <myfaces-core-version>2.0.1</myfaces-core-version>
-        <myfaces-shared-html5-version>4.0.6-SNAPSHOT</myfaces-shared-html5-version>
     </properties>
 
 </project>
\ No newline at end of file
