diff --git a/myfaces-html5-core/pom.xml b/myfaces-html5-core/pom.xml
index 1aaad9a..132fb1b 100644
--- a/myfaces-html5-core/pom.xml
+++ b/myfaces-html5-core/pom.xml
@@ -16,7 +16,7 @@
  * limitations under the License.
 -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
     <modelVersion>4.0.0</modelVersion>
 
@@ -82,6 +82,22 @@
             <type>jar</type>
             <scope>compile</scope>
         </dependency>
+
+        <!-- test dependencies -->
+
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <version>4.8.1</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.myfaces.test</groupId>
+            <artifactId>myfaces-test20</artifactId>
+            <version>1.0.0</version>
+            <scope>test</scope>
+        </dependency>
+
     </dependencies>
 
     <build>
@@ -242,7 +258,7 @@
                             <goal>make-config</goal>
                         </goals>
                     </execution>
-                    
+
                     <!-- generate <hx> JSP tld file -->
                     <execution>
                         <id>make-html5-hx-tld-forsite</id>
@@ -289,11 +305,11 @@
                             <goal>make-config</goal>
                         </goals>
                     </execution>
-                    
+
                 </executions>
             </plugin>
         </plugins>
-    </build>   
+    </build>
 
     <profiles>
         <profile>
@@ -309,7 +325,7 @@
                         -Running the install and site with generate-site profile fails since these executions is run already on install phase!
                         -So, for facelets documentation, only need to run site goal!
                     -->
-                    
+
                     <plugin>
                         <groupId>org.apache.myfaces.buildtools</groupId>
                         <artifactId>myfaces-builder-plugin</artifactId>
@@ -341,7 +357,7 @@
                             </execution>
                         </executions>
                     </plugin>
-                    
+
                 </plugins>
             </build>
 
@@ -352,15 +368,15 @@
                         <groupId>net.sourceforge.maven-taglib</groupId>
                         <artifactId>maven-taglib-plugin</artifactId>
                         <version>2.4</version>
-                            <configuration>
+                        <configuration>
                             <!-- 
                                 <taglib.src.dir>${basedir}/target/classes/META-INF</taglib.src.dir> -->
-                                <srcDir>${basedir}/target/tlddoc-facelets</srcDir>
-                                <!-- 
-                                <tldDocDir>${basedir}/target/site/tlddoc-facelets</tldDocDir>
-                                 -->
-                                <tldDocDir>${basedir}/target/site/tlddoc</tldDocDir>
-                            </configuration>
+                            <srcDir>${basedir}/target/tlddoc-facelets</srcDir>
+                            <!--
+                           <tldDocDir>${basedir}/target/site/tlddoc-facelets</tldDocDir>
+                            -->
+                            <tldDocDir>${basedir}/target/site/tlddoc</tldDocDir>
+                        </configuration>
                     </plugin>
 
                     <!-- trigger tagdoc-index report -->
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 a859531..67f376d 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
@@ -32,6 +32,7 @@
 public interface PassThroughAttributes
 {
     Map<String, String> AUDIO = map(13)
+        .attrs(PassThroughAttributeGroups.HTML_GLOBAL_PROPS)
         .attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
         //media props
         .attr(PRELOAD_PROP)
@@ -102,14 +103,12 @@
         .attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
         .attrs(PassThroughAttributeGroups.HTML5_INPUT_PROPS)
         .attr(REQUIRED_PROP)
-        .attr(READONLY_PROP)
         .unmodifiable();
 
     Map<String, String> INPUT_DATE_TIME = map(6)
         .attrs(PassThroughAttributeGroups.HTML5_GLOBAL_PROPS)
         .attrs(PassThroughAttributeGroups.HTML5_INPUT_PROPS)
         .attr(REQUIRED_PROP)
-        .attr(READONLY_PROP)
         .unmodifiable();
 
     Map<String, String> PROGRESS = map(11)
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/AbstractHtml5ViewControllerTestCase.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/AbstractHtml5ViewControllerTestCase.java
new file mode 100644
index 0000000..c6a78f3
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/AbstractHtml5ViewControllerTestCase.java
@@ -0,0 +1,52 @@
+/*
+ * 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.test;
+
+import org.apache.myfaces.test.mock.MockResponseWriter;
+
+import java.io.StringWriter;
+
+public abstract class AbstractHtml5ViewControllerTestCase extends org.apache.myfaces.test.base.AbstractViewControllerTestCase
+{
+    protected MockResponseWriter writer;
+
+    public AbstractHtml5ViewControllerTestCase(String name)
+    {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+
+        writer = new MockResponseWriter(new StringWriter(), null, null);
+        facesContext.setResponseWriter(writer);
+
+        TestUtils.addDefaultRenderers(facesContext);
+    }
+
+    @Override
+    protected void tearDown() throws Exception
+    {
+        writer = null;
+        super.tearDown();
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlCheckAttributesUtil.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlCheckAttributesUtil.java
new file mode 100644
index 0000000..d476c15
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlCheckAttributesUtil.java
@@ -0,0 +1,149 @@
+/*
+ * 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.test;
+
+import java.util.Map;
+
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+
+import org.apache.myfaces.test.mock.MockResponseWriter;
+
+public class HtmlCheckAttributesUtil
+{
+    private static void addBaseAttributes(UIComponent component, HtmlRenderedAttr[] attrs)
+    {
+        Map map = component.getAttributes();
+        for(int i = 0; i < attrs.length; i++) 
+        {
+            HtmlRenderedAttr attr = attrs[i];
+            map.put(attr.getName(), attr.getValue());
+        }
+    }
+    
+    private static void checkRenderedAttributes(HtmlRenderedAttr[] attrs, String output) throws Exception
+    {
+        for(int i = 0; i < attrs.length; i++) 
+        {
+            //assertContainsOnlyOnce(attrs[i], output);
+            checkAttributeOccurrences(attrs[i], output);
+        }
+    }
+    
+    /**
+     * This method adds all attributes from attrs into the component.  After adding the attributes,
+     * it calls the encodeAll() method of the component.  The html generated from the component's
+     * renderer will be checked to see if the attributes have been rendered correctly.
+     * @param component  The component whose attributes will be tested.
+     * @param context    
+     * @param writer     The ResponseWriter used by the renderer to output the html generated.
+     * @param attrs      An array of attributes which will be tested.
+     * @throws Exception
+     */
+    public static void checkRenderedAttributes(
+            UIComponent component, 
+            FacesContext context, 
+            MockResponseWriter writer,
+            HtmlRenderedAttr[] attrs) throws Exception 
+    {
+        
+        addBaseAttributes(component, attrs);
+        component.encodeBegin(context);
+        component.encodeChildren(context);
+        component.encodeEnd(context);
+        context.renderResponse();
+        checkRenderedAttributes(attrs, writer.getWriter().toString());
+    }
+    
+    /**
+     * Checks the attrs array if it has elements which were rendered incorrectly.
+     * @param attrs The attributes to be checked.
+     * @return True if there are attributes not rendered correctly.
+     */
+    public static boolean hasFailedAttrRender(HtmlRenderedAttr[] attrs) 
+    {
+        for(int i = 0; i < attrs.length; i++) 
+        {
+            if(!attrs[i].isRenderSuccessful()) return true;
+        }
+        return false;
+    }
+    
+    /**
+     * Constructs an error message string detailing which attributes were not rendered
+     * and which attributes were rendered more than once.
+     * @param attrs   The attributes to be tested.
+     * @param actual  The html generated by the renderer.
+     * @return The error message.
+     */
+    public static String constructErrorMessage(HtmlRenderedAttr[] attrs, String actual) 
+    {
+        StringBuffer messgBuffer = new StringBuffer();
+        for(int i = 0; i < attrs.length; i++) 
+        {
+            if(attrs[i].getErrorCode() == HtmlRenderedAttr.RENDERED_MORE_TIMES_THAN_EXPECTED) 
+            {
+                messgBuffer.append(attrs[i].getName()).append(" (");
+                messgBuffer.append(attrs[i].getExpectedHtml()).append(") was rendered more times (");
+                messgBuffer.append(attrs[i].getActualOccurrences()).append(") than expected (");
+                messgBuffer.append(attrs[i].getExpectedOccurrences()).append(").");
+                messgBuffer.append(System.getProperty("line.separator"));
+            } 
+            else if(attrs[i].getErrorCode() == HtmlRenderedAttr.RENDERED_LESS_TIMES_THAN_EXPECTED)
+            {
+                messgBuffer.append(attrs[i].getName()).append(" (");
+                messgBuffer.append(attrs[i].getExpectedHtml()).append(") was rendered less times (");
+                messgBuffer.append(attrs[i].getActualOccurrences()).append(") than expected (");
+                messgBuffer.append(attrs[i].getExpectedOccurrences()).append(").");
+                messgBuffer.append(System.getProperty("line.separator"));
+            }
+        }
+        messgBuffer.append("Actual HTML: ").append(actual);
+        return messgBuffer.toString();
+    }
+    
+    private static void checkAttributeOccurrences(HtmlRenderedAttr attr, String actual)
+    {
+        String expectedHtml = attr.getExpectedHtml();
+        
+        int index;
+        int offset = 0;
+        while((index=actual.indexOf(expectedHtml,offset)) != -1) 
+        {
+            attr.increaseActualOccurrences();
+            if(attr.getActualOccurrences() > attr.getExpectedOccurrences()) 
+            {
+                attr.setErrorCode(HtmlRenderedAttr.RENDERED_MORE_TIMES_THAN_EXPECTED);
+                return;
+            } 
+
+            offset += index + expectedHtml.length();
+        }
+        
+        if(attr.getActualOccurrences() < attr.getExpectedOccurrences()) 
+        {
+            attr.setErrorCode(HtmlRenderedAttr.RENDERED_LESS_TIMES_THAN_EXPECTED);
+        } 
+        else 
+        {
+            attr.setRenderSuccessful(true);
+        }
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlRenderedAttr.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlRenderedAttr.java
new file mode 100644
index 0000000..efd926c
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/HtmlRenderedAttr.java
@@ -0,0 +1,135 @@
+/*
+ * 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.test;
+
+public class HtmlRenderedAttr
+{
+    public static final int RENDERED_MORE_TIMES_THAN_EXPECTED = 1;
+    public static final int RENDERED_LESS_TIMES_THAN_EXPECTED = 2;
+    
+    private String name;
+    private Object value;
+    private String expectedHtml;
+    private boolean renderSuccessful;
+    private int errorCode;
+    private int expectedOccurrences;
+    private int actualOccurrences;
+    
+    public HtmlRenderedAttr(String name) {
+        this(name, name, name + "=\"" + name + "\"");
+        expectedOccurrences = 1;
+    }
+    
+    public HtmlRenderedAttr(String name, int expectedOccurences) {
+        this(name);
+        this.expectedOccurrences = expectedOccurences;
+    }
+    
+    /**
+     * Represents an attribute of a component that is expected to be
+     * rendered into html
+     * @param name  The name of the attribute.
+     * @param value The value of the attribute.
+     * @param expectedHtml The expected html output for this attribute.  
+     *     E.g. name="value".
+     */
+    public HtmlRenderedAttr(String name, Object value, String expectedHtml) {
+        this.name = name;
+        this.value = value;
+        this.expectedHtml = expectedHtml;
+        
+        renderSuccessful = false;
+        expectedOccurrences = 1;
+    }
+    
+    public HtmlRenderedAttr(String name, Object value, String expectedHtml, int occurances) {
+        this(name, value, expectedHtml);
+        this.expectedOccurrences = occurances;
+    }
+
+    public String getName()
+    {
+        return name;
+    }
+
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    public Object getValue()
+    {
+        return value;
+    }
+
+    public void setValue(Object value)
+    {
+        this.value = value;
+    }
+
+    public String getExpectedHtml()
+    {
+        return expectedHtml;
+    }
+
+    public void setExpectedHtml(String expectedHtml)
+    {
+        this.expectedHtml = expectedHtml;
+    }
+
+    /**
+     * This returns the result of the rendering of the attribute.
+     * @return True if the rendered html output of this attribute is
+     * the same as expectedHtml.  False if either the attribute was not
+     * rendered, it was rendered multiple times, or the rendered html
+     * is different from expectedHtml.
+     */
+    public boolean isRenderSuccessful()
+    {
+        return renderSuccessful;
+    }
+
+    public void setRenderSuccessful(boolean renderSuccessful)
+    {
+        this.renderSuccessful = renderSuccessful;
+    }
+
+    public int getErrorCode()
+    {
+        return errorCode;
+    }
+
+    public void setErrorCode(int errorCode)
+    {
+        this.errorCode = errorCode;
+        setRenderSuccessful(false);
+    }
+    
+    public void increaseActualOccurrences() {
+        actualOccurrences++;
+    }
+    
+    public int getActualOccurrences() {
+        return this.actualOccurrences;
+    }
+    
+    public int getExpectedOccurrences() {
+        return this.expectedOccurrences;
+    }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/TestUtils.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/TestUtils.java
new file mode 100644
index 0000000..1edd014
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5.test/TestUtils.java
@@ -0,0 +1,229 @@
+/*
+ * 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.test;
+
+import java.io.IOException;
+
+import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
+import javax.faces.context.FacesContext;
+import javax.faces.render.RenderKit;
+import javax.faces.render.Renderer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+public abstract class TestUtils
+{
+    /** Default Logger */
+    private static final Log log = LogFactory.getLog(TestUtils.class);
+
+    /** utility class, do not instantiate */
+    private TestUtils()
+    {
+        // utility class, disable instantiation
+    }
+
+    /**
+     * Add all of Tomahawk's renderers.  Currently this is not tied to 
+     * faces-config.xml, so all change to the file MUST also be made here.
+     * 
+     * @param facesContext
+     * @todo Do not add renderer if renderer is already added.
+     */
+    public static void addDefaultRenderers(FacesContext facesContext)
+    {
+        addRenderer(facesContext, "org.apache.myfaces.Div", "org.apache.myfaces.html5.Div",
+                "org.apache.myfaces.html5.renderkit.panel.DivRenderer");
+
+        addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.Text",
+                "org.apache.myfaces.html5.renderkit.input.HtmlInputTextRenderer");
+
+        addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.Color",
+                "org.apache.myfaces.html5.renderkit.input.HtmlInputColorRenderer");
+
+        addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.DateTime",
+                "org.apache.myfaces.html5.renderkit.input.HtmlInputDateTimeRenderer");
+
+        addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.Email",
+                "org.apache.myfaces.html5.renderkit.input.HtmlInputEmailRenderer");
+
+        addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.NumberSlider",
+                "org.apache.myfaces.html5.renderkit.input.HtmlInputNumberSliderRenderer");
+
+        addRenderer(facesContext, "javax.faces.Input", "org.apache.myfaces.html5.NumberSpinner",
+                "org.apache.myfaces.html5.renderkit.input.HtmlInputNumberSpinnerRenderer");
+
+        addRenderer(facesContext, "org.apache.myfaces.Media", "org.apache.myfaces.html5.Audio",
+                "org.apache.myfaces.html5.renderkit.media.AudioRenderer");
+
+        addRenderer(facesContext, "org.apache.myfaces.Media", "org.apache.myfaces.html5.Video",
+                "org.apache.myfaces.html5.renderkit.media.VideoRenderer");
+
+        addRenderer(facesContext, "org.apache.myfaces.Meter", "org.apache.myfaces.html5.Meter",
+                "org.apache.myfaces.html5.renderkit.output.MeterRenderer");
+
+        addRenderer(facesContext, "org.apache.myfaces.Progress", "org.apache.myfaces.html5.Progress",
+                "org.apache.myfaces.html5.renderkit.output.ProgressRenderer");
+
+        addRenderer(facesContext, "org.apache.myfaces.SlideView", "org.apache.myfaces.html5.SlideView",
+                "org.apache.myfaces.html5.renderkit.output.SlideViewRenderer");
+
+        addRenderer(facesContext, "org.apache.myfaces.Slide", "org.apache.myfaces.html5.Slide",
+                "org.apache.myfaces.html5.renderkit.output.SlideRenderer");
+
+    }
+
+    /**
+     * Add a renderer to the FacesContext.
+     * 
+     * @param facesContext Faces Context
+     * @param family Componenet Family
+     * @param rendererType Component Type
+     * @param renderClassName Class Name of Renderer
+     */
+    public static void addRenderer(FacesContext facesContext, String family,
+            String rendererType, String renderClassName)
+    {
+        Renderer renderer = (javax.faces.render.Renderer) newInstance(renderClassName);
+        RenderKit kit = facesContext.getRenderKit();
+        kit.addRenderer(family, rendererType, renderer);
+    }
+
+    /**
+     * Tries a Class.loadClass with the context class loader of the current thread first and
+     * automatically falls back to the ClassUtils class loader (i.e. the loader of the
+     * myfaces.jar lib) if necessary.
+     * 
+     * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+     *
+     * @param type fully qualified name of a non-primitive non-array class
+     * @return the corresponding Class
+     * @throws NullPointerException if type is null
+     * @throws ClassNotFoundException
+     */
+    private static Class classForName(String type)
+            throws ClassNotFoundException
+    {
+        if (type == null)
+            throw new NullPointerException("type");
+        try
+        {
+            // Try WebApp ClassLoader first
+            return Class.forName(type, false, // do not initialize for faster startup
+                    Thread.currentThread().getContextClassLoader());
+        }
+        catch (ClassNotFoundException ignore)
+        {
+            // fallback: Try ClassLoader for ClassUtils (i.e. the myfaces.jar lib)
+            return Class.forName(type, false, // do not initialize for faster startup
+                    TestUtils.class.getClassLoader());
+        }
+    }
+
+    /**
+     * Same as {@link #classForName(String)}, but throws a RuntimeException
+     * (FacesException) instead of a ClassNotFoundException.
+     *
+     * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+     *
+     * @return the corresponding Class
+     * @throws NullPointerException if type is null
+     * @throws FacesException if class not found
+     */
+    private static Class simpleClassForName(String type)
+    {
+        try
+        {
+            return classForName(type);
+        }
+        catch (ClassNotFoundException e)
+        {
+            log.error("Class " + type + " not found", e);
+            throw new FacesException(e);
+        }
+    }
+
+    /**
+     * Create an instance of the class with the type of <code>type</code>.
+     * 
+     * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+     *
+     * @param type Type of new class.
+     * @return Instance of the class <code>type</code>
+     * @throws FacesException
+     */
+    private static Object newInstance(String type) throws FacesException
+    {
+        if (type == null)
+            return null;
+        return newInstance(simpleClassForName(type));
+    }
+
+    /**
+     * Create an instance of the class <code>clazz</code>.
+     * 
+     * Note: This was copied from org.apache.myfaces.shared.util.ClassUtils
+     *
+     * @param clazz Class to create an instance of.
+     * @return Instance of the class <code>clazz</code>
+     * @throws FacesException
+     */
+    private static Object newInstance(Class clazz) throws FacesException
+    {
+        try
+        {
+            return clazz.newInstance();
+        }
+        catch (NoClassDefFoundError e)
+        {
+            log.error("Class : " + clazz.getName() + " not found.", e);
+            throw new FacesException(e);
+        }
+        catch (InstantiationException e)
+        {
+            log.error(e.getMessage(), e);
+            throw new FacesException(e);
+        }
+        catch (IllegalAccessException e)
+        {
+            log.error(e.getMessage(), e);
+            throw new FacesException(e);
+        }
+    }
+
+    /**
+     * Renderered a component, including it's children, then complete the reponse.
+     * 
+     * @param context Faces Context
+     * @param component Component to be rendered.
+     * @throws IOException Thrown while rendering.
+     */
+    public static void renderComponent(FacesContext context,
+            UIComponent component) throws IOException
+    {
+        Renderer renderer = context.getRenderKit().getRenderer(
+                component.getFamily(), component.getRendererType());
+        renderer.encodeBegin(context, component);
+        renderer.encodeChildren(context, component);
+        renderer.encodeEnd(context, component);
+        context.responseComplete();
+        context.renderResponse();
+    }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRendererTest.java
new file mode 100644
index 0000000..723b7a0
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputColorRendererTest.java
@@ -0,0 +1,56 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputColor;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputColorRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private HtmlInputColor htmlInputColor;
+
+    public HtmlInputColorRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        htmlInputColor = new HtmlInputColor();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception {
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Input props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputColor, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRendererTest.java
new file mode 100644
index 0000000..64cfe95
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputDateTimeRendererTest.java
@@ -0,0 +1,58 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputColor;
+import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputDateTimeRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private HtmlInputDateTime htmlInputDateTime;
+
+    public HtmlInputDateTimeRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        htmlInputDateTime = new HtmlInputDateTime();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception {
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Input props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+            new HtmlRenderedAttr("required", true, "required=\"true\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputDateTime, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRendererTest.java
new file mode 100644
index 0000000..41f572e
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputEmailRendererTest.java
@@ -0,0 +1,62 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.HtmlInputEmail;
+import org.apache.myfaces.html5.component.input.HtmlInputDateTime;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputEmailRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private HtmlInputEmail htmlInputEmail;
+
+    public HtmlInputEmailRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        htmlInputEmail = new HtmlInputEmail();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception {
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Input props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+
+            //email input props
+            new HtmlRenderedAttr("required", true, "required=\"true\""),
+            new HtmlRenderedAttr("multiple", true, "multiple=\"true\""),
+            new HtmlRenderedAttr("placeholder"),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputEmail, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRendererTest.java
new file mode 100644
index 0000000..847cf7c
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSliderRendererTest.java
@@ -0,0 +1,57 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.HtmlInputEmail;
+import org.apache.myfaces.html5.component.input.HtmlInputNumberSlider;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputNumberSliderRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private HtmlInputNumberSlider htmlInputNumberSlider;
+
+    public HtmlInputNumberSliderRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        htmlInputNumberSlider = new HtmlInputNumberSlider();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception {
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Input props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputNumberSlider, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRendererTest.java
new file mode 100644
index 0000000..ab8ac0b
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputNumberSpinnerRendererTest.java
@@ -0,0 +1,59 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputNumberSlider;
+import org.apache.myfaces.html5.component.input.HtmlInputNumberSpinner;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputNumberSpinnerRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private HtmlInputNumberSpinner htmlInputNumberSpinner;
+
+    public HtmlInputNumberSpinnerRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        htmlInputNumberSpinner = new HtmlInputNumberSpinner();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception {
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Input props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+            //spinner props
+            new HtmlRenderedAttr("required", true, "required=\"true\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputNumberSpinner, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRendererTest.java
new file mode 100644
index 0000000..7c160c5
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/input/HtmlInputTextRendererTest.java
@@ -0,0 +1,130 @@
+package org.apache.myfaces.html5.renderkit.input;
+
+import org.apache.myfaces.html5.component.input.HtmlInputText;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class HtmlInputTextRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private HtmlInputText htmlInputText;
+
+    public HtmlInputTextRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        this.htmlInputText = new HtmlInputText();
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+    }
+
+    public void testPassThruHtmlPropertiesForInputTextForTypeText() throws Exception
+    {
+        this.htmlInputText.setType("text");
+
+        doTestForInputText();
+    }
+
+    public void testPassThruHtmlPropertiesForInputTextForTypeSearch() throws Exception
+    {
+        this.htmlInputText.setType("search");
+
+        doTestForInputText();
+    }
+
+    public void testPassThruHtmlPropertiesForInputTextForTypeURL() throws Exception
+    {
+        this.htmlInputText.setType("url");
+
+        doTestForInputText();
+    }
+
+    public void testPassThruHtmlPropertiesForInputTextForTypeTel() throws Exception
+    {
+        this.htmlInputText.setType("tel");
+
+        doTestForInputText();
+    }
+
+
+
+    private void doTestForInputText() throws Exception {
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Input props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("datalist", "datalist", "list=\"datalist\""),
+            //text input props
+            new HtmlRenderedAttr("placeholder"),
+            new HtmlRenderedAttr("required", true, "required=\"true\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputText, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+    public void testPassThruHtmlPropertiesForInputTextForTypeTextarea() throws Exception
+    {
+        this.htmlInputText.setType("textarea");
+
+        HtmlRenderedAttr[] attrs = {
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //Common input props
+            new HtmlRenderedAttr("align"),
+            new HtmlRenderedAttr("alt"),
+            new HtmlRenderedAttr("maxlength", 3, "maxlength=\"3\""),
+            new HtmlRenderedAttr("readonly", true, "readonly=\"true\""),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            new HtmlRenderedAttr("disabled", true, "disabled=\"true\""),
+            //Textarea props
+            new HtmlRenderedAttr("autofocus", true, "autofocus=\"true\""),
+            new HtmlRenderedAttr("required", true, "required=\"true\""),
+            new HtmlRenderedAttr("cols", 1, "cols=\"1\""),
+            new HtmlRenderedAttr("rows", 1, "rows=\"1\""),
+            new HtmlRenderedAttr("wrap"),
+
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(htmlInputText, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/AudioRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/AudioRendererTest.java
new file mode 100644
index 0000000..9736f13
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/AudioRendererTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.media;
+
+import org.apache.myfaces.html5.component.media.Audio;
+import org.apache.myfaces.html5.component.media.Video;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class AudioRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private Audio audio;
+
+    public AudioRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        audio = new Audio();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //audio
+            new HtmlRenderedAttr("preload"),
+            new HtmlRenderedAttr("showControls", true, "controls=\"true\""),
+            new HtmlRenderedAttr("loop", true, "loop=\"true\""),
+            new HtmlRenderedAttr("autoplay", true, "autoplay=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(audio, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/VideoRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/VideoRendererTest.java
new file mode 100644
index 0000000..f47d80e
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/media/VideoRendererTest.java
@@ -0,0 +1,55 @@
+package org.apache.myfaces.html5.renderkit.media;
+
+import org.apache.myfaces.html5.component.media.Video;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class VideoRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private Video video;
+
+    public VideoRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        video = new Video();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //audio
+            new HtmlRenderedAttr("preload"),
+            new HtmlRenderedAttr("showControls", true, "controls=\"true\""),
+            new HtmlRenderedAttr("loop", true, "loop=\"true\""),
+            new HtmlRenderedAttr("autoplay", true, "autoplay=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //video
+            new HtmlRenderedAttr("poster"),
+            new HtmlRenderedAttr("width"),
+            new HtmlRenderedAttr("height"),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(video, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/MeterRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/MeterRendererTest.java
new file mode 100644
index 0000000..dafa43e
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/MeterRendererTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.output;
+
+import org.apache.myfaces.html5.component.output.Meter;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class MeterRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private Meter meter;
+
+    public MeterRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        meter = new Meter();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //meter
+            new HtmlRenderedAttr("value", 10.0, "value=\"10.0\""),
+            new HtmlRenderedAttr("maximum", 10.0, "max=\"10.0\""),
+            new HtmlRenderedAttr("minimum", 10.0, "min=\"10.0\""),
+            new HtmlRenderedAttr("low", 10.0, "low=\"10.0\""),
+            new HtmlRenderedAttr("high", 10.0, "high=\"10.0\""),
+            new HtmlRenderedAttr("optimum", 10.0, "optimum=\"10.0\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(meter, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/ProgressRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/ProgressRendererTest.java
new file mode 100644
index 0000000..ebfa86c
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/ProgressRendererTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.output;
+
+import org.apache.myfaces.html5.component.output.Meter;
+import org.apache.myfaces.html5.component.output.Progress;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class ProgressRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private Progress progress;
+
+    public ProgressRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        progress = new Progress();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+            //meter
+            new HtmlRenderedAttr("value", 10.0, "value=\"10.0\""),
+            new HtmlRenderedAttr("maximum", 10.0, "max=\"10.0\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(progress, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideRendererTest.java
new file mode 100644
index 0000000..61de075
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideRendererTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.output;
+
+import org.apache.myfaces.html5.component.output.Slide;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class SlideRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private Slide slide;
+
+    public SlideRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.slide = new Slide();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(slide, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideViewRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideViewRendererTest.java
new file mode 100644
index 0000000..ae5cf16
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/output/SlideViewRendererTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.output;
+
+import org.apache.myfaces.html5.component.output.SlideView;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+/**
+ * @author Ali Ok (aliok@apache.org)
+ */
+public class SlideViewRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private SlideView slideView;
+
+    public SlideViewRendererTest(String name) {
+        super(name);
+    }
+
+    @Override
+    protected void setUp() throws Exception {
+        super.setUp();
+        this.slideView = new SlideView();
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\""),
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(slideView, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+}
diff --git a/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/panel/DivRendererTest.java b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/panel/DivRendererTest.java
new file mode 100644
index 0000000..0c59ec1
--- /dev/null
+++ b/myfaces-html5-core/src/test/java/org/apache/myfaces/html5/renderkit/panel/DivRendererTest.java
@@ -0,0 +1,76 @@
+/*
+* 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.panel;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.apache.myfaces.html5.component.panel.Div;
+import org.apache.myfaces.html5.test.AbstractHtml5ViewControllerTestCase;
+import org.apache.myfaces.html5.test.HtmlCheckAttributesUtil;
+import org.apache.myfaces.html5.test.HtmlRenderedAttr;
+
+
+public class DivRendererTest extends AbstractHtml5ViewControllerTestCase {
+
+    private Div div;
+
+    public DivRendererTest(String name) {
+        super(name);
+    }
+
+    public static Test suite() {
+        return new TestSuite(DivRendererTest.class);
+    }
+
+    @Override
+    public void setUp() throws Exception {
+        super.setUp();
+        div = new Div();
+    }
+
+    @Override
+    public void tearDown() throws Exception {
+        super.tearDown();
+        div = null;
+    }
+
+    public void testPassThruHtmlProperties() throws Exception
+    {
+        HtmlRenderedAttr[] attrs = {
+            //Global Props
+            new HtmlRenderedAttr("dir"),
+            new HtmlRenderedAttr("lang"),
+            new HtmlRenderedAttr("style"),
+            new HtmlRenderedAttr("styleClass", "styleClass", "class=\"styleClass\""),
+            new HtmlRenderedAttr("title"),
+            new HtmlRenderedAttr("accesskey"),
+            new HtmlRenderedAttr("tabindex"),
+            //Html5 Global Props
+            new HtmlRenderedAttr("draggable", true, "draggable=\"true\""),
+            new HtmlRenderedAttr("hidden", true, "hidden=\"true\"")
+        };
+
+        HtmlCheckAttributesUtil.checkRenderedAttributes(div, facesContext, writer, attrs);
+        if(HtmlCheckAttributesUtil.hasFailedAttrRender(attrs))
+        {
+            fail(HtmlCheckAttributesUtil.constructErrorMessage(attrs, writer.getWriter().toString()));
+        }
+    }
+
+}
diff --git a/myfaces-html5-demo/pom.xml b/myfaces-html5-demo/pom.xml
index 6b803f8..a3be126 100644
--- a/myfaces-html5-demo/pom.xml
+++ b/myfaces-html5-demo/pom.xml
@@ -96,7 +96,7 @@
         <dependency>
             <groupId>org.apache.myfaces.html5</groupId>
             <artifactId>myfaces-html5-core</artifactId>
-            <version>${parent.version}</version>
+            <version>${project.parent.version}</version>
         </dependency>
 
         <dependency>
diff --git a/pom.xml b/pom.xml
index 27719de..6102407 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
   ~ "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
+  ~   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
diff --git a/src/site/site.xml b/src/site/site.xml
index 3014419..c14b766 100644
--- a/src/site/site.xml
+++ b/src/site/site.xml
@@ -8,7 +8,7 @@
   ~ "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
+  ~   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
