You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by so...@apache.org on 2017/09/26 16:47:23 UTC

wicket git commit: Time field is rewritten to be independent component, build is fixed

Repository: wicket
Updated Branches:
  refs/heads/WICKET-6105-java.time c25e05e31 -> 2f1b9251b


Time field is rewritten to be independent component, build is fixed


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/2f1b9251
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/2f1b9251
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/2f1b9251

Branch: refs/heads/WICKET-6105-java.time
Commit: 2f1b9251b8f1a50a53ac40319eff22f5b7591869
Parents: c25e05e
Author: Maxim Solodovnik <so...@gmail.com>
Authored: Tue Sep 26 23:47:14 2017 +0700
Committer: Maxim Solodovnik <so...@gmail.com>
Committed: Tue Sep 26 23:47:14 2017 +0700

----------------------------------------------------------------------
 wicket-examples/pom.xml                         | 120 ++---
 .../ajax/builtin/modal/ModalContent1Page.html   |  12 +-
 .../ajax/builtin/modal/ModalContent1Page.java   |   7 +
 .../ajax/builtin/modal/ModalContent2Page.java   |   1 +
 .../ajax/builtin/modal/ModalPanel1.java         |  19 +-
 .../ajax/builtin/modal/ModalWindowPage.java     |   6 +
 .../bean/validation/BeanValidationPage.html     |  21 +-
 .../bean/validation/BeanValidationPage.java     |   4 +-
 .../markup/html/form/datetime/DateField.java    |  39 +-
 .../markup/html/form/datetime/DateLabel.java    |   2 +-
 .../html/form/datetime/DateTimeField.html       |   5 +-
 .../html/form/datetime/DateTimeField.java       | 387 ++--------------
 .../html/form/datetime/LocalDateConverter.java  |   2 +-
 .../html/form/datetime/LocalTimeConverter.java  | 103 +++++
 .../form/datetime/PatternDateConverter.java     |  24 +-
 .../form/datetime/PatternTimeConverter.java     |  85 ++++
 .../datetime/PatternZonedDateTimeConverter.java |  97 ++++
 .../html/form/datetime/StyleDateConverter.java  |  62 +--
 .../html/form/datetime/StyleTimeConverter.java  | 118 +++++
 .../datetime/StyleZonedDateTimeConverter.java   |   2 +-
 .../markup/html/form/datetime/TimeField.html    |  25 ++
 .../markup/html/form/datetime/TimeField.java    | 441 ++++++++++++++++++-
 .../html/form/datetime/DateConverterTest.java   |   4 +-
 23 files changed, 1032 insertions(+), 554 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/pom.xml
----------------------------------------------------------------------
diff --git a/wicket-examples/pom.xml b/wicket-examples/pom.xml
index b18a14f..0049b0a 100644
--- a/wicket-examples/pom.xml
+++ b/wicket-examples/pom.xml
@@ -31,32 +31,32 @@
 		action.
 	</description>
 
-    <properties>
-        <docker-maven-plugin.version>1.0.0</docker-maven-plugin.version>
-    </properties>
+	<properties>
+		<docker-maven-plugin.version>1.0.0</docker-maven-plugin.version>
+	</properties>
 
 	<dependencyManagement>
-    	<dependencies>
-    		<dependency>
-    			<groupId>com.github.axet</groupId>
-    			<artifactId>kaptcha</artifactId>
-    			<version>0.0.9</version>
-    		</dependency>
-    		<dependency>
-    			<groupId>com.github.cage</groupId>
-    			<artifactId>cage</artifactId>
-    			<version>1.0</version>
-    		</dependency>
-    		<dependency>
-    			<groupId>org.codelibs</groupId>
-    			<artifactId>jhighlight</artifactId>
-    			<version>1.0.3</version>
-    			<exclusions>
-    				<exclusion>
-    					<groupId>javax.servlet</groupId>
-    					<artifactId>servlet-api</artifactId>
-    				</exclusion>
-    			</exclusions>
+		<dependencies>
+			<dependency>
+				<groupId>com.github.axet</groupId>
+				<artifactId>kaptcha</artifactId>
+				<version>0.0.9</version>
+			</dependency>
+			<dependency>
+				<groupId>com.github.cage</groupId>
+				<artifactId>cage</artifactId>
+				<version>1.0</version>
+			</dependency>
+			<dependency>
+				<groupId>org.codelibs</groupId>
+				<artifactId>jhighlight</artifactId>
+				<version>1.0.3</version>
+				<exclusions>
+					<exclusion>
+						<groupId>javax.servlet</groupId>
+						<artifactId>servlet-api</artifactId>
+					</exclusion>
+				</exclusions>
 			</dependency>
 		</dependencies>
 	</dependencyManagement>
@@ -142,10 +142,10 @@
 			<groupId>org.apache.wicket</groupId>
 			<artifactId>wicket-velocity</artifactId>
 		</dependency>
-        <dependency>
-            <groupId>org.apache.wicket</groupId>
-            <artifactId>wicket-native-websocket-javax</artifactId>
-        </dependency>
+		<dependency>
+			<groupId>org.apache.wicket</groupId>
+			<artifactId>wicket-native-websocket-javax</artifactId>
+		</dependency>
 		<dependency>
 			<groupId>org.codelibs</groupId>
 			<artifactId>jhighlight</artifactId>
@@ -235,38 +235,38 @@
 		</plugins>
 		<pluginManagement>
 			<plugins>
-    			<plugin>
-    				<groupId>org.apache.maven.plugins</groupId>
-    				<artifactId>maven-javadoc-plugin</artifactId>
-    				<configuration>
-    					<skip>true</skip>
-    				</configuration>
-    			</plugin>
-    			<plugin>
-    				<groupId>org.apache.maven.plugins</groupId>
-    				<artifactId>maven-war-plugin</artifactId>
-    				<configuration>
-    					<!--  include the manifest entries so that we can emit the version of the examples. -->
-    					<archive>
-    						<manifest>
-    							<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-    							<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
-    						</manifest>
-    					</archive>
-    				</configuration>
-    			</plugin>
-    			<plugin>
-    				<groupId>org.mortbay.jetty</groupId>
-    				<artifactId>jetty-maven-plugin</artifactId>
-                    <version>${jetty.version}</version>
-                    <dependencies>
-                		<dependency>
-                			<groupId>javax.validation</groupId>
-                			<artifactId>validation-api</artifactId>
-                			<version>1.1.0.Final</version>
-                		</dependency>
-                    </dependencies>
-    			</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-javadoc-plugin</artifactId>
+					<configuration>
+						<skip>true</skip>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-war-plugin</artifactId>
+					<configuration>
+						<!--  include the manifest entries so that we can emit the version of the examples. -->
+						<archive>
+							<manifest>
+								<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+								<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
+							</manifest>
+						</archive>
+					</configuration>
+				</plugin>
+				<plugin>
+					<groupId>org.mortbay.jetty</groupId>
+					<artifactId>jetty-maven-plugin</artifactId>
+					<version>${jetty.version}</version>
+					<dependencies>
+						<dependency>
+							<groupId>javax.validation</groupId>
+							<artifactId>validation-api</artifactId>
+							<version>1.1.0.Final</version>
+						</dependency>
+					</dependencies>
+				</plugin>
 			</plugins>
 		</pluginManagement>
 	</build>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
index c5e8099..528940e 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.html
@@ -2,11 +2,11 @@
 <html xmlns:wicket="http://wicket.apache.org">
 	<head>
 		<title>This is modal window</title>
-		<style type="text/css">			
+		<style type="text/css">
 			body {
 				font-family: verdana, sans-serif;
 				font-size: 82%;
-				background-color: white;				
+				background-color: white;
 			}
 		</style>
 	</head>	
@@ -18,13 +18,11 @@
 		</p>
 		<p>
 			<div wicket:id="modal"></div>
-			<a wicket:id="open">Open another modal dialog</a>			
+			<a wicket:id="open">Open another modal dialog</a>
 		</p>
-		  
 		<p>
-		  <div>An example of a component that uses header contributions</div>
-		  <div wicket:id="dateTimeField" />
+			<div>An example of a component that uses header contributions</div>
+			<div wicket:id="dateTimeField" />
 		</p>
-		  
 	</body>
 </html>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
index 4111a46..5c252e4 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent1Page.java
@@ -30,6 +30,7 @@ import org.apache.wicket.markup.html.WebPage;
  */
 public class ModalContent1Page extends WebPage
 {
+	private static final long serialVersionUID = 1L;
 
 	/**
 	 * 
@@ -40,6 +41,8 @@ public class ModalContent1Page extends WebPage
 	{
 		add(new AjaxLink<Void>("closeOK")
 		{
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target)
 			{
@@ -51,6 +54,8 @@ public class ModalContent1Page extends WebPage
 
 		add(new AjaxLink<Void>("closeCancel")
 		{
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target)
 			{
@@ -85,6 +90,8 @@ public class ModalContent1Page extends WebPage
 
 		add(new AjaxLink<Void>("open")
 		{
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target)
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
index 0189a93..4b668ac 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalContent2Page.java
@@ -28,6 +28,7 @@ import org.apache.wicket.markup.html.WebPage;
  */
 public class ModalContent2Page extends WebPage
 {
+	private static final long serialVersionUID = 1L;
 
 	/**
 	 * @param window

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
index ec7bae6..3a9389a 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalPanel1.java
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.examples.ajax.builtin.modal;
 
-import java.util.Map;
-
 import org.apache.wicket.extensions.markup.html.form.datetime.DateTimeField;
 import org.apache.wicket.markup.html.panel.Panel;
 
@@ -26,6 +24,7 @@ import org.apache.wicket.markup.html.panel.Panel;
  */
 public class ModalPanel1 extends Panel
 {
+	private static final long serialVersionUID = 1L;
 
 	/**
 	 * @param id
@@ -33,20 +32,6 @@ public class ModalPanel1 extends Panel
 	public ModalPanel1(String id)
 	{
 		super(id);
-
-		add(new DateTimeField("dateTimeField")
-		{
-			/**
-			 * @see DateTimeField#configure(java.util.Map)
-			 */
-			@Override
-			protected void configure(Map<String, Object> widgetProperties)
-			{
-				super.configure(widgetProperties);
-				// IE 6 breaks layout with iframe - is that a YUI bug?
-				widgetProperties.put("iframe", false);
-			}
-		});
+		add(new DateTimeField("dateTimeField"));
 	}
-
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
index 7de1620..f8376ff 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/ajax/builtin/modal/ModalWindowPage.java
@@ -29,6 +29,8 @@ import org.apache.wicket.model.PropertyModel;
  */
 public class ModalWindowPage extends BasePage
 {
+	private static final long serialVersionUID = 1L;
+
 	public ModalWindowPage()
 	{
 		final Label result;
@@ -53,6 +55,8 @@ public class ModalWindowPage extends BasePage
 
 		add(new AjaxLink<Void>("showModal1")
 		{
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target)
 			{
@@ -80,6 +84,8 @@ public class ModalWindowPage extends BasePage
 
 		add(new AjaxLink<Void>("showModal2")
 		{
+			private static final long serialVersionUID = 1L;
+
 			@Override
 			public void onClick(AjaxRequestTarget target)
 			{

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
index a459fd9..db04a1c 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.html
@@ -5,15 +5,17 @@
 <style>
 	.note { font-size:.8em; }
 	.required {font-weight: bold;}
+	table {border-collapse: collapse; border-spacing: 0;}
+	th, td {padding: 4px;}
 </style>
 </head>
 <body>
-	<span wicket:id="mainNavigation" />
+	<span wicket:id="mainNavigation"></span>
 
 	<div wicket:id="feedbackErrors"></div>
-	
+
 	<form wicket:id="form" novalidate="novalidate">
-		<table cellspacing="0" cellpadding="4">
+		<table style="border-collapse: collapse; border-spacing: 0;">
 			<tr>
 				<td><label wicket:for="name"><wicket:label>Name</wicket:label></label></td>
 				<td><input wicket:id="name" type="text" size="30"/></td>
@@ -35,11 +37,12 @@
 				<td><pre class="note">m/d/yyyy field with @Past</pre></td>
 			</tr>
 			<tr>
-                <td><label wicket:for="password"><wicket:label>Password</wicket:label></label></td>
-                <td><input wicket:id="password" type="text" size="10"/></td>
-                <td><pre class="note">Custom constraint @ValidPassword with custom message bundles.<br/>A valid password must contain only alphanumeric chars and at least two digits.</pre>
-                </td>
-            </tr>
+				<td><label wicket:for="password"><wicket:label>Password</wicket:label></label></td>
+				<td><input wicket:id="password" type="text" size="10"/></td>
+				<td>
+					<pre class="note">Custom constraint @ValidPassword with custom message bundles.<br/>A valid password must contain only alphanumeric chars and at least two digits.</pre>
+				</td>
+			</tr>
 			<tr>
 				<td></td>
 				<td>
@@ -49,6 +52,6 @@
 			</tr>
 		</table>
 	</form>
-    <div wicket:id="feedbackSuccess"></div>
+	<div wicket:id="feedbackSuccess"></div>
 </body>
 </html>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
----------------------------------------------------------------------
diff --git a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
index b69b019..e1eb59d 100644
--- a/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
+++ b/wicket-examples/src/main/java/org/apache/wicket/examples/bean/validation/BeanValidationPage.java
@@ -18,7 +18,7 @@ package org.apache.wicket.examples.bean.validation;
 
 import org.apache.wicket.bean.validation.PropertyValidator;
 import org.apache.wicket.extensions.markup.html.form.datetime.DateField;
-import org.apache.wicket.extensions.markup.html.form.datetime.StyleZonedDateTimeConverter;
+import org.apache.wicket.extensions.markup.html.form.datetime.StyleDateConverter;
 import org.apache.wicket.examples.WicketExamplePage;
 import org.apache.wicket.feedback.ExactLevelFeedbackMessageFilter;
 import org.apache.wicket.feedback.FeedbackMessage;
@@ -53,7 +53,7 @@ public class BeanValidationPage extends WicketExamplePage
 		form.add(new TextField<>("phone", new PropertyModel<String>(this, "person.phone")).add(new PropertyValidator<>()));
 		form.add(new TextField<>("email", new PropertyModel<String>(this, "person.email")).add(new PropertyValidator<>()));
 		form.add(new DateField("birthdate", new PropertyModel<>(this, "person.birthdate"),
-			new StyleZonedDateTimeConverter("S-", true)).add(new PropertyValidator<>()));
+			new StyleDateConverter("S-")).add(new PropertyValidator<>()));
 		form.add(new TextField<>("password", new PropertyModel<String>(this, "person.password")).add(new PropertyValidator<>()));
 		
 		add(new FeedbackPanel("feedbackSuccess", new ExactLevelFeedbackMessageFilter(FeedbackMessage.INFO)));

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
index d4b5ef4..88d2637 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateField.java
@@ -51,7 +51,7 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	private static final long serialVersionUID = 1L;
 
 	/**
-	 * Creates a new DateTextField defaulting to using a short date pattern
+	 * Creates a new DateField defaulting to using a short date pattern
 	 * 
 	 * @param id
 	 *            The id of the text field
@@ -60,22 +60,22 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	 * @param datePattern
 	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
 	 *            patterns.
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField forDatePattern(String id, IModel<LocalDate> model, String datePattern)
 	{
-		return new DateField(id, model, new PatternDateConverter(datePattern, true));
+		return new DateField(id, model, new PatternDateConverter(datePattern));
 	}
 
 	/**
-	 * Creates a new DateTextField defaulting to using a short date pattern
+	 * Creates a new DateField defaulting to using a short date pattern
 	 * 
 	 * @param id
 	 *            The id of the text field
 	 * @param datePattern
 	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
 	 *            patterns.
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField forDatePattern(String id, String datePattern)
 	{
@@ -83,7 +83,7 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	}
 
 	/**
-	 * Creates a new DateTextField using the provided date style.
+	 * Creates a new DateField using the provided date style.
 	 * 
 	 * @param id
 	 *            The id of the text field
@@ -94,16 +94,15 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	 *            is the time style. Specify a character of 'S' for short style, 'M' for medium, 'L'
 	 *            for long, and 'F' for full. A date or time may be ommitted by specifying a style
 	 *            character '-'. See {@link org.joda.time.DateTimeFormat#forStyle(String)}.
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField forDateStyle(String id, IModel<LocalDate> model, String dateStyle)
 	{
-		FormatStyle dateFormatStyle = parseFormatStyle(dateStyle.charAt(0));
-		return new DateField(id, model, new StyleZonedDateTimeConverter(dateStyle, null, false));
+		return new DateField(id, model, new StyleDateConverter(dateStyle));
 	}
 
 	/**
-	 * Creates a new DateTextField using the provided date style.
+	 * Creates a new DateField using the provided date style.
 	 * 
 	 * @param id
 	 *            The id of the text field
@@ -112,7 +111,7 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	 *            is the time style. Specify a character of 'S' for short style, 'M' for medium, 'L'
 	 *            for long, and 'F' for full. A date or time may be ommitted by specifying a style
 	 *            character '-'. See {@link org.joda.time.DateTimeFormat#forStyle(String)}.
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField forDateStyle(String id, String dateStyle)
 	{
@@ -120,11 +119,11 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	}
 
 	/**
-	 * Creates a new DateTextField defaulting to using a short date pattern
+	 * Creates a new DateField defaulting to using a short date pattern
 	 * 
 	 * @param id
 	 *            The id of the text field
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField forShortStyle(String id)
 	{
@@ -132,27 +131,27 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	}
 
 	/**
-	 * Creates a new DateTextField defaulting to using a short date pattern
+	 * Creates a new DateField defaulting to using a short date pattern
 	 * 
 	 * @param id
 	 *            The id of the text field
 	 * @param model
 	 *            The model
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField forShortStyle(String id, IModel<LocalDate> model)
 	{
-		return new DateField(id, model, new StyleZonedDateTimeConverter(false));
+		return new DateField(id, model, new StyleDateConverter());
 	}
 
 	/**
-	 * Creates a new DateTextField using the provided converter.
+	 * Creates a new DateField using the provided converter.
 	 * 
 	 * @param id
 	 *            The id of the text field
 	 * @param converter
 	 *            the date converter
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField withConverter(String id, IDateConverter<LocalDate> converter)
 	{
@@ -160,7 +159,7 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	}
 
 	/**
-	 * Creates a new DateTextField using the provided converter.
+	 * Creates a new DateField using the provided converter.
 	 * 
 	 * @param id
 	 *            The id of the text field
@@ -168,7 +167,7 @@ public class DateField extends TextField<LocalDate> implements ITextFormatProvid
 	 *            The model
 	 * @param converter
 	 *            the date converter
-	 * @return DateTextField
+	 * @return DateField
 	 */
 	public static DateField withConverter(String id, IModel<LocalDate> model, IDateConverter<LocalDate> converter)
 	{

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
index 957e53e..1f8531a 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateLabel.java
@@ -64,7 +64,7 @@ public class DateLabel extends Label implements IGenericComponent<LocalDate, Dat
 	 */
 	public static DateLabel forDatePattern(String id, IModel<LocalDate> model, String datePattern)
 	{
-		return new DateLabel(id, model, new PatternDateConverter(datePattern, true));
+		return new DateLabel(id, model, new PatternZonedDateTimeConverter(datePattern, true));
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
index 8bcd43b..d92f2ce 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.html
@@ -18,9 +18,6 @@
 <wicket:panel xmlns:wicket="http://wicket.apache.org">
   <span style="white-space: nowrap;">
     <input type="text" wicket:id="date" size="12" />
-    <input type="text" wicket:id="hours" size="2" maxlength="2" />
-    <span wicket:id="hoursSeparator">&#160;:</span>
-    <input type="text" wicket:id="minutes" size="2" maxlength="2" />
-    <select wicket:id="amOrPmChoice"></select>
+    <span wicket:id="time" />
   </span>
 </wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
index eff009a..200129f 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/DateTimeField.java
@@ -16,33 +16,21 @@
  */
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
-import java.text.DecimalFormat;
-import java.text.NumberFormat;
 import java.time.LocalDate;
 import java.time.LocalTime;
 import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.time.temporal.ChronoField;
-import java.util.Arrays;
-import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
-import java.util.Map;
 import java.util.TimeZone;
 
 import org.apache.wicket.Session;
 import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
 import org.apache.wicket.core.request.ClientInfo;
-import org.apache.wicket.markup.html.WebMarkupContainer;
-import org.apache.wicket.markup.html.form.DropDownChoice;
 import org.apache.wicket.markup.html.form.FormComponentPanel;
-import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.IModel;
-import org.apache.wicket.model.Model;
 import org.apache.wicket.protocol.http.request.WebClientInfo;
-import org.apache.wicket.util.convert.IConverter;
-import org.apache.wicket.util.convert.converter.IntegerConverter;
-import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Works on a {@link java.time.ZonedDateTime} object. Displays a date field and a DatePicker, a field
@@ -77,64 +65,18 @@ import org.apache.wicket.validation.validator.RangeValidator;
  */
 public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 {
-	/**
-	 * Enumerated type for different ways of handling the render part of requests.
-	 */
-	public enum AM_PM {
-		/** */
-		AM("AM"),
-
-		/** */
-		PM("PM");
-
-		private  final String value;
-
-		AM_PM(final String name)
-		{
-			value = name;
-		}
-
-		@Override
-		public String toString()
-		{
-			return value;
-		}
-	}
-
 	private static final long serialVersionUID = 1L;
 
 	// Component-IDs
 	protected static final String DATE = "date";
-	protected static final String HOURS = "hours";
-	protected static final String MINUTES = "minutes";
-	protected static final String AM_OR_PM_CHOICE = "amOrPmChoice";
-
-	// PropertyModel string to access getAmOrPm
-	private static final String AM_OR_PM = "amOrPm";
-
-	private static final IConverter<Integer> MINUTES_CONVERTER = new IntegerConverter() {
-		private static final long serialVersionUID = 1L;
-
-		protected NumberFormat newNumberFormat(Locale locale) {
-			return new DecimalFormat("00");
-		}
-	};
-
-	// The dropdown list for AM/PM and it's associated model object
-	private DropDownChoice<AM_PM> amOrPmChoice;
-	private AM_PM amOrPm = AM_PM.AM;
+	protected static final String TIME = "time";
 
 	// The date TextField and it's associated model object
 	// Note that any time information in date will be ignored
 	private DateField dateField;
+	private TimeField timeField;
 	private ZonedDateTime dateTime = ZonedDateTime.now();
 
-	// The TextField for "hours" and it's associated model object
-	private TextField<Integer> hoursField;
-
-	// The TextField for "minutes" and it's associated model object
-	private TextField<Integer> minutesField;
-
 	/**
 	 * Construct.
 	 * 
@@ -156,121 +98,29 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 		super(id, model);
 
 		// Sets the type that will be used when updating the model for this component.
-		setType(Date.class);
+		setType(ZonedDateTime.class);
 
 		// Create and add the date TextField
-		add(dateField = newDateTextField(DATE, new DateModel()));
-
-		// Add a date picker to the date TextField
-//		dateField.add(newDatePicker());
-
-		// Create and add the "hours" TextField
-		add(hoursField = newHoursTextField(HOURS, new HoursModel(), Integer.class));
-
-		// Create and add the "minutes" TextField
-		add(minutesField = newMinutesTextField(MINUTES, new MinutesModel(), Integer.class));
-
-		// Create and add the "AM/PM" Listbox
-		add(amOrPmChoice = new DropDownChoice<>(AM_OR_PM_CHOICE, new AmPmModel(), Arrays.asList(AM_PM.values())));
-
-		add(new WebMarkupContainer("hoursSeparator")
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			public boolean isVisible()
-			{
-				return minutesField.determineVisibility();
-			}
-		});
-	}
-
-	/**
-	 * create a new {@link TextField} instance for hours to be added to this panel.
-	 * 
-	 * @param id
-	 *            the component id
-	 * @param model
-	 *            model that should be used by the {@link TextField}
-	 * @param type
-	 *            the type of the text field
-	 * @return a new text field instance
-	 */
-	protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) {
-		TextField<Integer> hoursTextField = new TextField<>(id, model, type);
-		hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator
-			.range(1, 12));
-		hoursTextField.setLabel(new Model<>(HOURS));
-		return hoursTextField;
-	}
-
-	/**
-	 * create a new {@link TextField} instance for minutes to be added to this panel.
-	 *
-	 * @param id
-	 *            the component id
-	 * @param model
-	 *            model that should be used by the {@link TextField}
-	 * @param type
-	 *            the type of the text field
-	 * @return a new text field instance
-	 */
-	protected TextField<Integer> newMinutesTextField(final String id, IModel<Integer> model,
-		Class<Integer> type)
-	{
-		TextField<Integer> minutesField = new TextField<Integer>(id, model, type)
-		{
-			private static final long serialVersionUID = 1L;
-
-			@Override
-			protected IConverter<?> createConverter(Class<?> type)
-			{
-				if (Integer.class.isAssignableFrom(type))
-				{
-					return MINUTES_CONVERTER;
-				}
-				return null;
-			}
-		};
-		minutesField.add(new RangeValidator<>(0, 59));
-		minutesField.setLabel(new Model<>(MINUTES));
-		return minutesField;
+		add(dateField = newDateField(DATE, new DateModel()));
+		add(timeField = newTimeField(TIME, new TimeModel()));
 	}
 
 	/**
 	 * 
 	 * @return The date TextField
 	 */
-	protected final DateField getDateTextField()
+	protected final DateField getDateField()
 	{
 		return dateField;
 	}
 
 	/**
-	 * Gets the amOrPm model object of the drop down choice.
 	 * 
-	 * @return amOrPm
-	 * 
-	 * @deprecated valid during rendering only
-	 */
-	public final AM_PM getAmOrPm()
-	{
-		return amOrPm;
-	}
-
-	/**
-	 * Gives overriding classes the option of adding (or even changing/ removing) configuration
-	 * properties for the javascript widget. See <a
-	 * href="http://developer.yahoo.com/yui/calendar/">the widget's documentation</a> for the
-	 * available options. If you want to override/ remove properties, you should call
-	 * super.configure(properties) first. If you don't call that, be aware that you will have to
-	 * call {@link #configure(java.util.Map)} manually if you like localized strings to be added.
-	 * 
-	 * @param widgetProperties
-	 *            the current widget properties
+	 * @return The date TextField
 	 */
-	protected void configure(Map<String, Object> widgetProperties)
+	protected final TimeField getTimeField()
 	{
+		return timeField;
 	}
 
 	@Override
@@ -278,18 +128,7 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 	{
 		// since we override convertInput, we can let this method return a value
 		// that is just suitable for error reporting
-		return dateField.getInput() + ", " + hoursField.getInput() + ":" + minutesField.getInput();
-	}
-
-	/**
-	 * Sets the amOrPm model object associated with the drop down choice.
-	 * 
-	 * @param amOrPm
-	 *            amOrPm
-	 */
-	public final void setAmOrPm(final AM_PM amOrPm)
-	{
-		this.amOrPm = amOrPm;
+		return String.format("%s, %s", dateField.getInput(), timeField.getInput());
 	}
 
 	/**
@@ -324,27 +163,16 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 		try
 		{
 			// Get the converted input values
-			LocalDate dateFieldInput = dateField.getConvertedInput();
-			Integer hoursInput = hoursField.getConvertedInput();
-			Integer minutesInput = minutesField.getConvertedInput();
-			AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();
+			LocalDate localDate = dateField.getConvertedInput();
 
-			if (dateFieldInput == null)
+			if (localDate == null)
 			{
 				return;
 			}
 
 			// Use the input to create a date object with proper timezone
-			LocalTime localTime = LocalTime.of(hoursInput, minutesInput);
-			ZonedDateTime date = ZonedDateTime.of(dateFieldInput, localTime, getClientTimeZone());
-
-			// Adjust for halfday if needed
-			if (use12HourFormat())
-			{
-				int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
-				date = date.with(ChronoField.AMPM_OF_DAY, halfday);
-//				date = date.with(ChronoField.HOUR_OF_AMPM, hours % 12);
-			}
+			LocalTime localTime = timeField.getConvertedInput();
+			ZonedDateTime date = ZonedDateTime.of(localDate, localTime, getClientTimeZone());
 
 			// The date will be in the server's timezone
 			setConvertedInput(date);
@@ -357,39 +185,31 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 	}
 
 	/**
-	 * A factory method for the DateTextField's model object.
-	 * 
-	 * @return any specialization of java.util.Date
-	 */
-	protected LocalDate newDateInstance()
-	{
-		return LocalDate.now();
-	}
-
-	/**
-	 * A factory method for the DateTextField's model object.
+	 * create a new {@link DateField} instance to be added to this panel.
 	 * 
-	 * @param time
-	 *            the time in milliseconds
-	 * @return any specialization of java.util.Date
+	 * @param id
+	 *            the component id
+	 * @param dateFieldModel
+	 *            model that should be used by the {@link DateField}
+	 * @return a new date text field instance
 	 */
-	protected Date newDateInstance(long time)
+	protected DateField newDateField(String id, IModel<LocalDate> dateFieldModel)
 	{
-		return new Date(time);
+		return DateField.forShortStyle(id, dateFieldModel);
 	}
 
 	/**
-	 * create a new {@link DateField} instance to be added to this panel.
+	 * create a new {@link TimeField} instance to be added to this panel.
 	 * 
 	 * @param id
 	 *            the component id
-	 * @param dateFieldModel
-	 *            model that should be used by the {@link DateField}
-	 * @return a new date text field instance
+	 * @param timeFieldModel
+	 *            model that should be used by the {@link TimeField}
+	 * @return a new time text field instance
 	 */
-	protected DateField newDateTextField(String id, IModel<LocalDate> dateFieldModel)
+	protected TimeField newTimeField(String id, IModel<LocalTime> timeFieldModel)
 	{
-		return DateField.forShortStyle(id, dateFieldModel);
+		return TimeField.forShortStyle(id, timeFieldModel);
 	}
 
 	/**
@@ -399,11 +219,7 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 	protected void onBeforeRender()
 	{
 		dateField.setRequired(isRequired());
-		hoursField.setRequired(isRequired());
-		minutesField.setRequired(isRequired());
-
-		boolean use12HourFormat = use12HourFormat();
-		amOrPmChoice.setVisible(use12HourFormat);
+		timeField.setRequired(isRequired());
 
 		ZonedDateTime modelObject = getModelObject();
 		if (modelObject == null)
@@ -423,93 +239,6 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 		super.onBeforeRender();
 	}
 
-	/**
-	 * Change a date in another timezone
-	 * 
-	 * @param date
-	 *            The input date.
-	 * @param zone
-	 *            The target timezone.
-	 * @return A new converted date.
-	 */
-	public static Date changeTimeZone(Date date, TimeZone zone)
-	{
-		Calendar first = Calendar.getInstance(zone);
-		first.setTimeInMillis(date.getTime());
-
-		Calendar output = Calendar.getInstance();
-		output.set(Calendar.YEAR, first.get(Calendar.YEAR));
-		output.set(Calendar.MONTH, first.get(Calendar.MONTH));
-		output.set(Calendar.DAY_OF_MONTH, first.get(Calendar.DAY_OF_MONTH));
-		output.set(Calendar.HOUR_OF_DAY, first.get(Calendar.HOUR_OF_DAY));
-		output.set(Calendar.MINUTE, first.get(Calendar.MINUTE));
-		output.set(Calendar.SECOND, first.get(Calendar.SECOND));
-		output.set(Calendar.MILLISECOND, first.get(Calendar.MILLISECOND));
-
-		return output.getTime();
-	}
-
-	/**
-	 * Checks whether the current {@link Locale} uses the 12h or 24h time format. This method can be
-	 * overridden to e.g. always use 24h format.
-	 * 
-	 * @return true, if the current {@link Locale} uses the 12h format.<br/>
-	 *         false, otherwise
-	 */
-	protected boolean use12HourFormat()
-	{
-		// TODO Fix !
-		return false;
-//		String pattern = DateTimeFormat.patternForStyle("-S", getLocale());
-//		return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1
-//			|| pattern.indexOf('K') != -1;
-	}
-
-	/**
-	 * @return either 12 or 24, depending on the hour format of the current {@link Locale}
-	 */
-	private int getMaximumHours()
-	{
-		return getMaximumHours(use12HourFormat());
-	}
-
-	/**
-	 * Convenience method (mainly for optimization purposes), in case {@link #use12HourFormat()} has
-	 * already been stored in a local variable and thus doesn't need to be computed again.
-	 * 
-	 * @param use12HourFormat
-	 *            the hour format to use
-	 * @return either 12 or 24, depending on the parameter <code>use12HourFormat</code>
-	 */
-	private int getMaximumHours(boolean use12HourFormat)
-	{
-		return use12HourFormat ? 12 : 24;
-	}
-//
-//	/**
-//	 * The DatePicker that gets added to the DateTimeField component. Users may override this method
-//	 * with a DatePicker of their choice.
-//	 *
-//	 * @return a new {@link DatePicker} instance
-//	 */
-//	protected DatePicker newDatePicker()
-//	{
-//		return new DatePicker()
-//		{
-//			private static final long serialVersionUID = 1L;
-//
-//			@Override
-//			protected void configure(final Map<String, Object> widgetProperties,
-//				final IHeaderResponse response, final Map<String, Object> initVariables)
-//			{
-//				super.configure(widgetProperties, response, initVariables);
-//
-//				DateTimeField.this.configure(widgetProperties);
-//			}
-//		};
-//	}
-
-
 	protected class DateModel implements IModel<LocalDate>
 	{
 		private static final long serialVersionUID = 1L;
@@ -534,42 +263,21 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 		}
 	}
 
-	protected class HoursModel implements IModel<Integer>
-	{
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		public Integer getObject()
-		{
-			return dateTime.getHour();
-		}
-
-		@Override
-		public void setObject(Integer hour)
-		{
-			dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, hour);
-		}
-
-		@Override
-		public void detach()
-		{
-		}
-	}
-
-	protected class MinutesModel implements IModel<Integer>
+	protected class TimeModel implements IModel<LocalTime>
 	{
 		private static final long serialVersionUID = 1L;
 
 		@Override
-		public Integer getObject()
+		public LocalTime getObject()
 		{
-			return dateTime.getMinute();
+			return dateTime.toLocalTime();
 		}
 
 		@Override
-		public void setObject(Integer minute)
+		public void setObject(LocalTime time)
 		{
-			dateTime = dateTime.with(ChronoField.MINUTE_OF_HOUR, minute);
+			dateTime = dateTime.with(ChronoField.HOUR_OF_DAY, time.getHour());
+			dateTime = dateTime.with(ChronoField.MINUTE_OF_HOUR, time.getMinute());
 		}
 
 		@Override
@@ -577,29 +285,4 @@ public class DateTimeField extends FormComponentPanel<ZonedDateTime>
 		{
 		}
 	}
-
-	protected class AmPmModel implements IModel<AM_PM>
-	{
-		private static final long serialVersionUID = 1L;
-
-		@Override
-		public AM_PM getObject()
-		{
-			int i = dateTime.get(ChronoField.AMPM_OF_DAY);
-			return i == 0 ? AM_PM.AM : AM_PM.PM;
-		}
-
-		@Override
-		public void setObject(AM_PM amPm)
-		{
-			int i = AM_PM.AM == amPm ? 0 : 1;
-			dateTime = dateTime.with(ChronoField.AMPM_OF_DAY, i);
-		}
-
-		@Override
-		public void detach()
-		{
-		}
-	}
-
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
index 9306d8d..28554bd 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalDateConverter.java
@@ -26,7 +26,7 @@ import org.apache.wicket.util.string.Strings;
 
 
 /**
- * Base class for Joda Time based date converters. It contains the logic to parse and format,
+ * Base class for java.time based date converters. It contains the logic to parse and format,
  * optionally taking the time zone difference between clients and the server into account.
  * <p>
  * Converters of this class are best suited for per-component use.

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
new file mode 100644
index 0000000..a10a662
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/LocalTimeConverter.java
@@ -0,0 +1,103 @@
+/*
+ * 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.wicket.extensions.markup.html.form.datetime;
+
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.wicket.util.convert.ConversionException;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.string.Strings;
+
+
+/**
+ * Base class for java.time based date converters. It contains the logic to parse and format,
+ * optionally taking the time zone difference between clients and the server into account.
+ * <p>
+ * Converters of this class are best suited for per-component use.
+ * </p>
+ * 
+ * @author eelcohillenius
+ */
+public abstract class LocalTimeConverter implements IDateConverter<LocalTime>
+{
+	private static final long serialVersionUID = 1L;
+
+	public LocalTime convertToObject(String value, DateTimeFormatter format, Locale locale) {
+		try
+		{
+			// parse date retaining the time of the submission
+			return LocalTime.parse(value, format);
+		}
+		catch (RuntimeException e)
+		{
+			throw newConversionException(e, locale);
+		}
+	}
+
+	@Override
+	public LocalTime convertToObject(String value, Locale locale)
+	{
+		if (Strings.isEmpty(value))
+		{
+			return null;
+		}
+
+		DateTimeFormatter format = getFormat(locale);
+		Args.notNull(format, "format");
+
+		return convertToObject(value, format, locale);
+	}
+
+	/**
+	 * Creates a ConversionException and sets additional context information to it.
+	 *
+	 * @param cause
+	 *            - {@link RuntimeException} cause
+	 * @param locale
+	 *            - {@link Locale} used to set 'format' variable with localized pattern
+	 * @return {@link ConversionException}
+	 */
+	ConversionException newConversionException(RuntimeException cause, Locale locale)
+	{
+		return new ConversionException(cause)
+				.setVariable("format", getPattern(locale));
+	}
+
+	@Override
+	public String convertToString(LocalTime time, Locale locale)
+	{
+		DateTimeFormatter format = getFormat(locale);
+		return format.format(time);
+	}
+
+	/**
+	 * @param locale
+	 *            The locale used to convert the value
+	 * @return Gets the pattern that is used for printing and parsing
+	 */
+	public abstract String getPattern(Locale locale);
+
+	/**
+	 * @param locale
+	 *            The locale used to convert the value
+	 * 
+	 * @return formatter The formatter for the current conversion
+	 */
+	public abstract DateTimeFormatter getFormat(Locale locale);
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
index e2b714f..54ea179 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternDateConverter.java
@@ -24,7 +24,7 @@ import org.apache.wicket.util.lang.Args;
 
 
 /**
- * Date converter that uses Joda Time and can be configured to take the time zone difference between
+ * Date converter that uses javax.time and can be configured to take the time zone difference between
  * clients and server into account. This converter is hard coded to use the provided custom date
  * pattern, no matter what current locale is used. See {@link SimpleDateFormat} for available
  * patterns.
@@ -33,15 +33,14 @@ import org.apache.wicket.util.lang.Args;
  * </p>
  * 
  * @see SimpleDateFormat
- * @see StyleZonedDateTimeConverter
+ * @see StyleDateConverter
  * @see org.apache.wicket.extensions.markup.html.form.DateTextField
- * @see java.time.ZonedDateTime
+ * @see java.time.LocalDate
  * @see DateTimeFormatter
- * @see java.time.ZoneId
  * 
  * @author eelcohillenius
  */
-public class PatternDateConverter extends ZonedDateTimeConverter
+public class PatternDateConverter extends LocalDateConverter
 {
 
 	private static final long serialVersionUID = 1L;
@@ -51,27 +50,16 @@ public class PatternDateConverter extends ZonedDateTimeConverter
 
 	/**
 	 * Construct.
-	 * </p>
-	 * When applyTimeZoneDifference is true, the current time is applied on the parsed date, and the
-	 * date will be corrected for the time zone difference between the server and the client. For
-	 * instance, if I'm in Seattle and the server I'm working on is in Amsterdam, the server is 9
-	 * hours ahead. So, if I'm inputting say 12/24 at a couple of hours before midnight, at the
-	 * server it is already 12/25. If this boolean is true, it will be transformed to 12/25, while
-	 * the client sees 12/24.
-	 * </p>
 	 * 
 	 * @param datePattern
 	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
 	 *            patterns.
-	 * @param applyTimeZoneDifference
-	 *            whether to apply the difference in time zones between client and server
 	 * @throws IllegalArgumentException
 	 *             in case the date pattern is null
 	 */
-	public PatternDateConverter(String datePattern, boolean applyTimeZoneDifference)
+	public PatternDateConverter(String datePattern)
 	{
-
-		super(applyTimeZoneDifference);
+		super();
 		this.datePattern = Args.notNull(datePattern, "datePattern");
 	}
 

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
new file mode 100644
index 0000000..021f500
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternTimeConverter.java
@@ -0,0 +1,85 @@
+/*
+ * 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.wicket.extensions.markup.html.form.datetime;
+
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.wicket.util.lang.Args;
+
+
+/**
+ * Date converter that uses javax.time and can be configured to take the time zone difference between
+ * clients and server into account. This converter is hard coded to use the provided custom date
+ * pattern, no matter what current locale is used. See {@link SimpleDateFormat} for available
+ * patterns.
+ * <p>
+ * This converter is especially suited on a per-component base.
+ * </p>
+ * 
+ * @see SimpleDateFormat
+ * @see StyleDateConverter
+ * @see org.apache.wicket.extensions.markup.html.form.DateTextField
+ * @see java.time.LocalTime
+ * @see DateTimeFormatter
+ * 
+ * @author eelcohillenius
+ */
+public class PatternTimeConverter extends LocalTimeConverter
+{
+
+	private static final long serialVersionUID = 1L;
+
+	/** pattern to use. */
+	private final String timePattern;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param timePattern
+	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
+	 *            patterns.
+	 * @throws IllegalArgumentException
+	 *             in case the date pattern is null
+	 */
+	public PatternTimeConverter(String timePattern)
+	{
+		super();
+		this.timePattern = Args.notNull(timePattern, "timePattern");
+	}
+
+	/**
+	 * Gets the optional date pattern.
+	 * 
+	 * @return datePattern
+	 */
+	@Override
+	public final String getPattern(Locale locale)
+	{
+		return timePattern;
+	}
+
+	/**
+	 * @return formatter The formatter for the current conversion
+	 */
+	@Override
+	public DateTimeFormatter getFormat(Locale locale)
+	{
+		return DateTimeFormatter.ofPattern(timePattern).withLocale(locale);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
new file mode 100644
index 0000000..c432d90
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/PatternZonedDateTimeConverter.java
@@ -0,0 +1,97 @@
+/*
+ * 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.wicket.extensions.markup.html.form.datetime;
+
+import java.text.SimpleDateFormat;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import org.apache.wicket.util.lang.Args;
+
+
+/**
+ * Date converter that uses javax.time and can be configured to take the time zone difference between
+ * clients and server into account. This converter is hard coded to use the provided custom date
+ * pattern, no matter what current locale is used. See {@link SimpleDateFormat} for available
+ * patterns.
+ * <p>
+ * This converter is especially suited on a per-component base.
+ * </p>
+ * 
+ * @see SimpleDateFormat
+ * @see StyleZonedDateTimeConverter
+ * @see org.apache.wicket.extensions.markup.html.form.DateTextField
+ * @see java.time.ZonedDateTime
+ * @see DateTimeFormatter
+ * @see java.time.ZoneId
+ * 
+ * @author eelcohillenius
+ */
+public class PatternZonedDateTimeConverter extends ZonedDateTimeConverter
+{
+
+	private static final long serialVersionUID = 1L;
+
+	/** pattern to use. */
+	private final String datePattern;
+
+	/**
+	 * Construct.
+	 * </p>
+	 * When applyTimeZoneDifference is true, the current time is applied on the parsed date, and the
+	 * date will be corrected for the time zone difference between the server and the client. For
+	 * instance, if I'm in Seattle and the server I'm working on is in Amsterdam, the server is 9
+	 * hours ahead. So, if I'm inputting say 12/24 at a couple of hours before midnight, at the
+	 * server it is already 12/25. If this boolean is true, it will be transformed to 12/25, while
+	 * the client sees 12/24.
+	 * </p>
+	 * 
+	 * @param datePattern
+	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
+	 *            patterns.
+	 * @param applyTimeZoneDifference
+	 *            whether to apply the difference in time zones between client and server
+	 * @throws IllegalArgumentException
+	 *             in case the date pattern is null
+	 */
+	public PatternZonedDateTimeConverter(String datePattern, boolean applyTimeZoneDifference)
+	{
+
+		super(applyTimeZoneDifference);
+		this.datePattern = Args.notNull(datePattern, "datePattern");
+	}
+
+	/**
+	 * Gets the optional date pattern.
+	 * 
+	 * @return datePattern
+	 */
+	@Override
+	public final String getPattern(Locale locale)
+	{
+		return datePattern;
+	}
+
+	/**
+	 * @return formatter The formatter for the current conversion
+	 */
+	@Override
+	public DateTimeFormatter getFormat(Locale locale)
+	{
+		return DateTimeFormatter.ofPattern(datePattern).withLocale(locale);
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
index 14e6d22..79decad 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleDateConverter.java
@@ -17,7 +17,6 @@
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
 import java.time.LocalDate;
-import java.time.ZonedDateTime;
 import java.time.chrono.IsoChronology;
 import java.time.format.DateTimeFormatter;
 import java.time.format.DateTimeFormatterBuilder;
@@ -25,7 +24,7 @@ import java.time.format.FormatStyle;
 import java.util.Locale;
 
 /**
- * Date converter that uses Joda Time and can be configured to take the time zone difference between
+ * Date converter that uses javax.time and can be configured to take the time zone difference between
  * clients and server into account, and that is configured for a certain date style. The pattern
  * will always be locale specific.
  * <p>
@@ -33,9 +32,8 @@ import java.util.Locale;
  * </p>
  * 
  * @see org.apache.wicket.extensions.markup.html.form.DateTextField
- * @see java.time.ZonedDateTime
+ * @see java.time.LocalDate
  * @see DateTimeFormatter
- * @see java.time.ZoneId
  * 
  * @author eelcohillenius
  */
@@ -60,33 +58,22 @@ public class StyleDateConverter extends LocalDateConverter
 
 	/**
 	 * Construct. The provided pattern will be used as the base format (but they will be localized
-	 * for the current locale) and if null, {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used. </p>
-	 * When applyTimeZoneDifference is true, the current time is applied on the parsed date, and the
-	 * date will be corrected for the time zone difference between the server and the client. For
-	 * instance, if I'm in Seattle and the server I'm working on is in Amsterdam, the server is 9
-	 * hours ahead. So, if I'm inputting say 12/24 at a couple of hours before midnight, at the
-	 * server it is already 12/25. If this boolean is true, it will be transformed to 12/25, while
-	 * the client sees 12/24. </p>
+	 * for the current locale) and if null, {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used.
 	 * 
 	 * @param dateStyle
 	 *            Date style to use. See {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
-	 * @param timeStyle
-	 *            Time style to use. See {@link DateTimeFormatter#ofLocalizedTime(FormatStyle)}
-	 * @param applyTimeZoneDifference
-	 *            whether to apply the difference in time zones between client and server
 	 * @throws IllegalArgumentException
 	 *             in case dateStyle is null
 	 */
-	public StyleDateConverter(FormatStyle dateStyle, FormatStyle timeStyle, boolean applyTimeZoneDifference)
+	public StyleDateConverter(FormatStyle dateStyle)
 	{
-		super(applyTimeZoneDifference);
+		super();
 		this.dateStyle = dateStyle;
-		this.timeStyle = timeStyle;
 	}
 
-	public StyleDateConverter(String dateTimeStyle, boolean applyTimeZoneDifference)
+	public StyleDateConverter(String dateStyle)
 	{
-		this(parseFormatStyle(dateTimeStyle.charAt(0)), parseFormatStyle(dateTimeStyle.charAt(1)), applyTimeZoneDifference);
+		this(parseFormatStyle(dateStyle.charAt(0)));
 	}
 
 	/**
@@ -97,8 +84,7 @@ public class StyleDateConverter extends LocalDateConverter
 	@Override
 	public final String getPattern(Locale locale)
 	{
-		String localizedDateTimePattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(dateStyle, timeStyle, IsoChronology.INSTANCE, locale);
-		return localizedDateTimePattern;
+		return DateTimeFormatterBuilder.getLocalizedDateTimePattern(dateStyle, null, IsoChronology.INSTANCE, locale);
 	}
 
 	/**
@@ -107,23 +93,7 @@ public class StyleDateConverter extends LocalDateConverter
 	@Override
 	public DateTimeFormatter getFormat(Locale locale)
 	{
-		DateTimeFormatter df = null;
-		if (dateStyle == null && timeStyle == null) {
-			return df;
-		}
-		if (timeStyle == null)
-		{
-			df = DateTimeFormatter.ofLocalizedDate(dateStyle);
-		}
-		else if (dateStyle == null)
-		{
-			df = DateTimeFormatter.ofLocalizedTime(timeStyle);
-		}
-		else
-		{
-			df = DateTimeFormatter.ofLocalizedDateTime(dateStyle, timeStyle);
-		}
-		return df.withLocale(locale);
+		return dateStyle == null ? null : DateTimeFormatter.ofLocalizedDate(dateStyle).withLocale(locale);
 	}
 
 	public static FormatStyle parseFormatStyle(char style)
@@ -132,23 +102,13 @@ public class StyleDateConverter extends LocalDateConverter
 	}
 
 	@Override
-	public ZonedDateTime convertToObject(String value, DateTimeFormatter format, Locale locale) {
+	public LocalDate convertToObject(String value, DateTimeFormatter format, Locale locale) {
 		if (format == null) {
 			return null;
 		}
 		try
 		{
-			if (timeStyle == null)
-			{
-				LocalDate d = LocalDate.parse(value, format);
-				return ZonedDateTime.of(d.atStartOfDay(), getTimeZone());
-			}
-			else if (dateStyle == null)
-			{
-				// not sure how we can get ZonedDateTime from time
-				return null;
-			}
-			return super.convertToObject(value, format, locale);
+			return LocalDate.parse(value, format);
 		}
 		catch (RuntimeException e)
 		{

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
new file mode 100644
index 0000000..8ac59b4
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleTimeConverter.java
@@ -0,0 +1,118 @@
+/*
+ * 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.wicket.extensions.markup.html.form.datetime;
+
+import java.time.LocalTime;
+import java.time.chrono.IsoChronology;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.FormatStyle;
+import java.util.Locale;
+
+/**
+ * Date converter that uses javax.time and can be configured to take the time zone difference between
+ * clients and server into account, and that is configured for a certain date style. The pattern
+ * will always be locale specific.
+ * <p>
+ * This converter is especially suited on a per-component base.
+ * </p>
+ * 
+ * @see org.apache.wicket.extensions.markup.html.form.DateTextField
+ * @see java.time.LocalTime
+ * @see DateTimeFormatter
+ * 
+ * @author eelcohillenius
+ */
+public class StyleTimeConverter extends LocalTimeConverter
+{
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * Date style to use. See {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
+	 */
+	private final FormatStyle timeStyle;
+
+	/**
+	 * Construct. The dateStyle 'S-' (which is the same as {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}) will
+	 * be used for constructing the date format for the current locale.
+	 * 
+	 */
+	public StyleTimeConverter()
+	{
+		this(FormatStyle.SHORT);
+	}
+
+	/**
+	 * Construct. The provided pattern will be used as the base format (but they will be localized
+	 * for the current locale) and if null, {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)} will be used.
+	 * 
+	 * @param timeStyle
+	 *            Date style to use. See {@link DateTimeFormatter#ofLocalizedDate(FormatStyle)}.
+	 * @throws IllegalArgumentException
+	 *             in case dateStyle is null
+	 */
+	public StyleTimeConverter(FormatStyle timeStyle)
+	{
+		super();
+		this.timeStyle = timeStyle;
+	}
+
+	public StyleTimeConverter(String timeStyle)
+	{
+		this(parseFormatStyle(timeStyle.charAt(0)));
+	}
+
+	/**
+	 * Gets the optional time pattern.
+	 * 
+	 * @return timePattern
+	 */
+	@Override
+	public final String getPattern(Locale locale)
+	{
+		return DateTimeFormatterBuilder.getLocalizedDateTimePattern(null, timeStyle, IsoChronology.INSTANCE, locale);
+	}
+
+	/**
+	 * @return formatter The formatter for the current conversion
+	 */
+	@Override
+	public DateTimeFormatter getFormat(Locale locale)
+	{
+		return timeStyle == null ? null : DateTimeFormatter.ofLocalizedDate(timeStyle).withLocale(locale);
+	}
+
+	public static FormatStyle parseFormatStyle(char style)
+	{
+		return DateField.parseFormatStyle(style);
+	}
+
+	@Override
+	public LocalTime convertToObject(String value, DateTimeFormatter format, Locale locale) {
+		if (format == null) {
+			return null;
+		}
+		try
+		{
+			return LocalTime.parse(value, format);
+		}
+		catch (RuntimeException e)
+		{
+			throw newConversionException(e, locale);
+		}
+	}
+}

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
index cb0f5be..c186cfe 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/StyleZonedDateTimeConverter.java
@@ -25,7 +25,7 @@ import java.time.format.FormatStyle;
 import java.util.Locale;
 
 /**
- * Date converter that uses Joda Time and can be configured to take the time zone difference between
+ * Date converter that uses javax.time and can be configured to take the time zone difference between
  * clients and server into account, and that is configured for a certain date style. The pattern
  * will always be locale specific.
  * <p>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
new file mode 100644
index 0000000..82cb00d
--- /dev/null
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.html
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!--
+   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.
+-->
+<wicket:panel xmlns:wicket="http://wicket.apache.org">
+  <span style="white-space: nowrap;">
+    <input type="number" wicket:id="hours" size="2" maxlength="2" />
+    <span wicket:id="hoursSeparator">&#160;:</span>
+    <input type="number" wicket:id="minutes" size="2" maxlength="2" />
+    <select wicket:id="amOrPmChoice"></select>
+  </span>
+</wicket:panel>

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
index aa0dea8..cf3cc29 100644
--- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
+++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/form/datetime/TimeField.java
@@ -16,10 +16,28 @@
  */
 package org.apache.wicket.extensions.markup.html.form.datetime;
 
-import java.time.ZonedDateTime;
+import java.text.DecimalFormat;
+import java.text.NumberFormat;
+import java.text.SimpleDateFormat;
+import java.time.LocalTime;
+import java.time.chrono.IsoChronology;
+import java.time.format.DateTimeFormatterBuilder;
+import java.time.format.FormatStyle;
+import java.time.temporal.ChronoField;
+import java.util.Arrays;
 import java.util.Locale;
 
+import org.apache.wicket.markup.html.WebMarkupContainer;
+import org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider;
+import org.apache.wicket.markup.html.form.DropDownChoice;
+import org.apache.wicket.markup.html.form.FormComponentPanel;
+import org.apache.wicket.markup.html.form.TextField;
 import org.apache.wicket.model.IModel;
+import org.apache.wicket.model.Model;
+import org.apache.wicket.util.convert.IConverter;
+import org.apache.wicket.util.convert.converter.IntegerConverter;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.validation.validator.RangeValidator;
 
 /**
  * Works on a {@link java.util.Date} object. Displays a field for hours and a field for minutes, and
@@ -28,21 +46,195 @@ import org.apache.wicket.model.IModel;
  * {@link TimeField#use12HourFormat}).
  * 
  * @author eelcohillenius
- * @see DateField for a variant with just the date field and date picker
+ * @see TimeField for a variant with just the date field and date picker
  */
-public class TimeField extends DateTimeField
+public class TimeField extends FormComponentPanel<LocalTime> implements ITextFormatProvider
 {
 	private static final long serialVersionUID = 1L;
 
 	/**
+	 * Enumerated type for different ways of handling the render part of requests.
+	 */
+	public enum AM_PM {
+		/** */
+		AM("AM"),
+
+		/** */
+		PM("PM");
+
+		private  final String value;
+
+		AM_PM(final String name)
+		{
+			value = name;
+		}
+
+		@Override
+		public String toString()
+		{
+			return value;
+		}
+	}
+	protected static final String HOURS = "hours";
+	protected static final String MINUTES = "minutes";
+	protected static final String AM_OR_PM_CHOICE = "amOrPmChoice";
+
+	private static final IConverter<Integer> MINUTES_CONVERTER = new IntegerConverter() {
+		private static final long serialVersionUID = 1L;
+
+		protected NumberFormat newNumberFormat(Locale locale) {
+			return new DecimalFormat("00");
+		}
+	};
+
+	// The TextField for "hours" and it's associated model object
+	private TextField<Integer> hoursField;
+
+	// The TextField for "minutes" and it's associated model object
+	private TextField<Integer> minutesField;
+
+	// The dropdown list for AM/PM and it's associated model object
+	private DropDownChoice<AM_PM> amOrPmChoice;
+	private LocalTime time = LocalTime.now();
+
+	/**
+	 * Creates a new TimeField defaulting to using a short date pattern
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param model
+	 *            The model
+	 * @param timePattern
+	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
+	 *            patterns.
+	 * @return TimeField
+	 */
+	public static TimeField forTimePattern(String id, IModel<LocalTime> model, String timePattern)
+	{
+		return new TimeField(id, model, new PatternTimeConverter(timePattern));
+	}
+
+	/**
+	 * Creates a new TimeField defaulting to using a short date pattern
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param timePattern
+	 *            The pattern to use. Must be not null. See {@link SimpleDateFormat} for available
+	 *            patterns.
+	 * @return TimeField
+	 */
+	public static TimeField forTimePattern(String id, String timePattern)
+	{
+		return forTimePattern(id, null, timePattern);
+	}
+
+	/**
+	 * Creates a new TimeField using the provided date style.
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param model
+	 *            The model
+	 * @param timeStyle
+	 *            Date style to use. The first character is the date style, and the second character
+	 *            is the time style. Specify a character of 'S' for short style, 'M' for medium, 'L'
+	 *            for long, and 'F' for full. A date or time may be ommitted by specifying a style
+	 *            character '-'. See {@link org.joda.time.DateTimeFormat#forStyle(String)}.
+	 * @return TimeField
+	 */
+	public static TimeField forTimeStyle(String id, IModel<LocalTime> model, String timeStyle)
+	{
+		return new TimeField(id, model, new StyleTimeConverter(timeStyle));
+	}
+
+	/**
+	 * Creates a new TimeField using the provided date style.
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param timeStyle
+	 *            Date style to use. The first character is the date style, and the second character
+	 *            is the time style. Specify a character of 'S' for short style, 'M' for medium, 'L'
+	 *            for long, and 'F' for full. A date or time may be ommitted by specifying a style
+	 *            character '-'. See {@link org.joda.time.DateTimeFormat#forStyle(String)}.
+	 * @return TimeField
+	 */
+	public static TimeField forTimeStyle(String id, String timeStyle)
+	{
+		return forTimeStyle(id, null, timeStyle);
+	}
+
+	/**
+	 * Creates a new TimeField defaulting to using a short date pattern
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @return TimeField
+	 */
+	public static TimeField forShortStyle(String id)
+	{
+		return forShortStyle(id, null);
+	}
+
+	/**
+	 * Creates a new TimeField defaulting to using a short date pattern
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param model
+	 *            The model
+	 * @return TimeField
+	 */
+	public static TimeField forShortStyle(String id, IModel<LocalTime> model)
+	{
+		return new TimeField(id, model, new StyleTimeConverter());
+	}
+
+	/**
+	 * Creates a new TimeField using the provided converter.
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param converter
+	 *            the date converter
+	 * @return TimeField
+	 */
+	public static TimeField withConverter(String id, IDateConverter<LocalTime> converter)
+	{
+		return withConverter(id, null, converter);
+	}
+
+	/**
+	 * Creates a new TimeField using the provided converter.
+	 * 
+	 * @param id
+	 *            The id of the text field
+	 * @param model
+	 *            The model
+	 * @param converter
+	 *            the date converter
+	 * @return TimeField
+	 */
+	public static TimeField withConverter(String id, IModel<LocalTime> model, IDateConverter<LocalTime> converter)
+	{
+		return new TimeField(id, model, converter);
+	}
+
+	/**
+	 * The converter for the TextField
+	 */
+	private final IDateConverter<LocalTime> converter;
+
+	/**
 	 * Construct.
 	 * 
 	 * @param id
 	 *      the component id
 	 */
-	public TimeField(String id)
+	public TimeField(String id, IDateConverter<LocalTime> converter)
 	{
-		this(id, null);
+		this(id, null, converter);
 	}
 
 	/**
@@ -53,19 +245,250 @@ public class TimeField extends DateTimeField
 	 * @param model
 	 *      the component's model
 	 */
-	public TimeField(String id, IModel<ZonedDateTime> model)
+	public TimeField(String id, IModel<LocalTime> model, IDateConverter<LocalTime> converter)
 	{
 		super(id, model);
 
-		getDateTextField().setVisibilityAllowed(false);
+		Args.notNull(converter, "converter");
+		this.converter = converter;
+
+		// Sets the type that will be used when updating the model for this component.
+		setType(LocalTime.class);
+
+
+		// Create and add the "hours" TextField
+		add(hoursField = newHoursTextField(HOURS, new HoursModel(), Integer.class));
+
+		// Create and add the "minutes" TextField
+		add(minutesField = newMinutesTextField(MINUTES, new MinutesModel(), Integer.class));
+
+		// Create and add the "AM/PM" Listbox
+		add(amOrPmChoice = new DropDownChoice<>(AM_OR_PM_CHOICE, new AmPmModel(), Arrays.asList(AM_PM.values())));
+
+		add(new WebMarkupContainer("hoursSeparator")
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			public boolean isVisible()
+			{
+				return minutesField.determineVisibility();
+			}
+		});
+	}
+
+	/**
+	 * create a new {@link TextField} instance for hours to be added to this panel.
+	 * 
+	 * @param id
+	 *            the component id
+	 * @param model
+	 *            model that should be used by the {@link TextField}
+	 * @param type
+	 *            the type of the text field
+	 * @return a new text field instance
+	 */
+	protected TextField<Integer> newHoursTextField(final String id, IModel<Integer> model, Class<Integer> type) {
+		TextField<Integer> hoursTextField = new TextField<>(id, model, type);
+		hoursTextField.add(getMaximumHours() == 24 ? RangeValidator.range(0, 23) : RangeValidator
+			.range(1, 12));
+		hoursTextField.setLabel(new Model<>(HOURS));
+		return hoursTextField;
+	}
+
+	/**
+	 * create a new {@link TextField} instance for minutes to be added to this panel.
+	 *
+	 * @param id
+	 *            the component id
+	 * @param model
+	 *            model that should be used by the {@link TextField}
+	 * @param type
+	 *            the type of the text field
+	 * @return a new text field instance
+	 */
+	protected TextField<Integer> newMinutesTextField(final String id, IModel<Integer> model,
+		Class<Integer> type)
+	{
+		TextField<Integer> minutesField = new TextField<Integer>(id, model, type)
+		{
+			private static final long serialVersionUID = 1L;
+
+			@Override
+			protected IConverter<?> createConverter(Class<?> type)
+			{
+				if (Integer.class.isAssignableFrom(type))
+				{
+					return MINUTES_CONVERTER;
+				}
+				return null;
+			}
+		};
+		minutesField.add(new RangeValidator<>(0, 59));
+		minutesField.setLabel(new Model<>(MINUTES));
+		return minutesField;
+	}
+
+	@Override
+	public String getInput()
+	{
+		// since we override convertInput, we can let this method return a value
+		// that is just suitable for error reporting
+		return String.format("%s:%s", hoursField.getInput(), minutesField.getInput());
 	}
 
 	@Override
 	public void convertInput()
 	{
-		ZonedDateTime modelObject = getModelObject();
-		getDateTextField().setConvertedInput(modelObject != null ? modelObject.toLocalDate() : newDateInstance());
+		Integer hoursInput = hoursField.getConvertedInput();
+		Integer minutesInput = minutesField.getConvertedInput();
+		AM_PM amOrPmInput = amOrPmChoice.getConvertedInput();
+
+		// Use the input to create a date object with proper timezone
+		LocalTime localTime = LocalTime.of(hoursInput, minutesInput);
+
+		// Adjust for halfday if needed
+		if (use12HourFormat())
+		{
+			int halfday = (amOrPmInput == AM_PM.PM ? 1 : 0);
+			localTime = localTime.with(ChronoField.AMPM_OF_DAY, halfday);
+		}
 		super.convertInput();
 	}
 
+	@Override
+	protected void onBeforeRender() {
+		hoursField.setRequired(isRequired());
+		minutesField.setRequired(isRequired());
+
+		boolean use12HourFormat = use12HourFormat();
+		amOrPmChoice.setVisible(use12HourFormat);
+		super.onBeforeRender();
+	}
+
+	/**
+	 * Checks whether the current {@link Locale} uses the 12h or 24h time format. This method can be
+	 * overridden to e.g. always use 24h format.
+	 * 
+	 * @return true, if the current {@link Locale} uses the 12h format.<br/>
+	 *         false, otherwise
+	 */
+	protected boolean use12HourFormat()
+	{
+		String pattern = DateTimeFormatterBuilder.getLocalizedDateTimePattern(null, FormatStyle.SHORT, IsoChronology.INSTANCE, getLocale());
+		return pattern.indexOf('a') != -1 || pattern.indexOf('h') != -1 || pattern.indexOf('K') != -1;
+	}
+
+	/**
+	 * @return either 12 or 24, depending on the hour format of the current {@link Locale}
+	 */
+	private int getMaximumHours()
+	{
+		return getMaximumHours(use12HourFormat());
+	}
+
+	/**
+	 * Convenience method (mainly for optimization purposes), in case {@link #use12HourFormat()} has
+	 * already been stored in a local variable and thus doesn't need to be computed again.
+	 * 
+	 * @param use12HourFormat
+	 *            the hour format to use
+	 * @return either 12 or 24, depending on the parameter <code>use12HourFormat</code>
+	 */
+	private int getMaximumHours(boolean use12HourFormat)
+	{
+		return use12HourFormat ? 12 : 24;
+	}
+
+
+	protected class HoursModel implements IModel<Integer>
+	{
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public Integer getObject()
+		{
+			return time.getHour();
+		}
+
+		@Override
+		public void setObject(Integer hour)
+		{
+			time = time.with(ChronoField.HOUR_OF_DAY, hour);
+		}
+
+		@Override
+		public void detach()
+		{
+		}
+	}
+
+	protected class MinutesModel implements IModel<Integer>
+	{
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public Integer getObject()
+		{
+			return time.getMinute();
+		}
+
+		@Override
+		public void setObject(Integer minute)
+		{
+			time = time.with(ChronoField.MINUTE_OF_HOUR, minute);
+		}
+
+		@Override
+		public void detach()
+		{
+		}
+	}
+
+	protected class AmPmModel implements IModel<AM_PM>
+	{
+		private static final long serialVersionUID = 1L;
+
+		@Override
+		public AM_PM getObject()
+		{
+			int i = time.get(ChronoField.AMPM_OF_DAY);
+			return i == 0 ? AM_PM.AM : AM_PM.PM;
+		}
+
+		@Override
+		public void setObject(AM_PM amPm)
+		{
+			int i = AM_PM.AM == amPm ? 0 : 1;
+			time = time.with(ChronoField.AMPM_OF_DAY, i);
+		}
+
+		@Override
+		public void detach()
+		{
+		}
+	}
+
+	/**
+	 * @return The specialized converter.
+	 * @see org.apache.wicket.Component#createConverter(java.lang.Class)
+	 */
+	@Override
+	protected IConverter<?> createConverter(Class<?> clazz)
+	{
+		if (LocalTime.class.isAssignableFrom(clazz))
+		{
+			return converter;
+		}
+		return null;
+	}
+
+	/**
+	 * @see org.apache.wicket.markup.html.form.AbstractTextComponent.ITextFormatProvider#getTextFormat()
+	 */
+	@Override
+	public final String getTextFormat()
+	{
+		return converter.getPattern(getLocale());
+	}
 }

http://git-wip-us.apache.org/repos/asf/wicket/blob/2f1b9251/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
index 73c5035..d590615 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/form/datetime/DateConverterTest.java
@@ -23,7 +23,7 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.Locale;
 
-import org.apache.wicket.extensions.markup.html.form.datetime.PatternDateConverter;
+import org.apache.wicket.extensions.markup.html.form.datetime.PatternZonedDateTimeConverter;
 import org.apache.wicket.extensions.markup.html.form.datetime.StyleZonedDateTimeConverter;
 import org.apache.wicket.util.convert.ConversionException;
 import org.apache.wicket.util.convert.IConverter;
@@ -51,7 +51,7 @@ public class DateConverterTest
 
 		Assert.assertEquals(locale, styleFormatter.getLocale());
 
-		PatternDateConverter patternDateConverter = new PatternDateConverter(
+		PatternZonedDateTimeConverter patternDateConverter = new PatternZonedDateTimeConverter(
 			styleDateConverter.getPattern(locale), false);
 		DateTimeFormatter patternFormatter = patternDateConverter.getFormat(locale);