diff --git a/src/System.Windows.Forms.Design.Editors/src/System/ComponentModel/Design/DateTimeEditor.cs b/src/System.Windows.Forms.Design.Editors/src/System/ComponentModel/Design/DateTimeEditor.cs
new file mode 100644
index 00000000000..46185560371
--- /dev/null
+++ b/src/System.Windows.Forms.Design.Editors/src/System/ComponentModel/Design/DateTimeEditor.cs
@@ -0,0 +1,156 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using System.Diagnostics.CodeAnalysis;
+using System.Drawing.Design;
+using System.Windows.Forms;
+using System.Windows.Forms.Design;
+
+namespace System.ComponentModel.Design
+{
+ ///
+ /// This date/time editor is a UITypeEditor suitable for
+ /// visually editing DateTime objects.
+ ///
+ public class DateTimeEditor : UITypeEditor
+ {
+ ///
+ /// Edits the given object value using the editor style provided by
+ /// GetEditorStyle. A service provider is provided so that any
+ /// required editing services can be obtained.
+ ///
+ public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
+ {
+ if (provider == null)
+ {
+ return value;
+ }
+
+ IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
+
+ if (edSvc == null)
+ {
+ return value;
+ }
+
+ using (DateTimeUI dateTimeUI = new DateTimeUI())
+ {
+ dateTimeUI.Start(edSvc, value);
+ edSvc.DropDownControl(dateTimeUI);
+ value = dateTimeUI.Value;
+ dateTimeUI.End();
+ }
+
+ return value;
+ }
+
+ ///
+ /// Retrieves the editing style of the Edit method. If the method
+ /// is not supported, this will return None.
+ ///
+ public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
+ {
+ return UITypeEditorEditStyle.DropDown;
+ }
+
+ ///
+ /// UI we drop down to pick dates.
+ ///
+ private class DateTimeUI : Control
+ {
+ private MonthCalendar _monthCalendar = new DateTimeMonthCalendar();
+ private object _value;
+ private IWindowsFormsEditorService _edSvc;
+
+ public DateTimeUI()
+ {
+ InitializeComponent();
+ Size = _monthCalendar.SingleMonthSize;
+ _monthCalendar.Resize += MonthCalResize;
+ }
+
+ public object Value
+ {
+ get
+ {
+ return _value;
+ }
+ }
+
+ public void End()
+ {
+ _edSvc = null;
+ _value = null;
+ }
+
+ private void MonthCalKeyDown(object sender, KeyEventArgs e)
+ {
+ switch (e.KeyCode)
+ {
+ case Keys.Enter:
+ OnDateSelected(sender, null);
+ break;
+ }
+ }
+
+ protected override void RescaleConstantsForDpi(int deviceDpiOld, int deviceDpiNew)
+ {
+ base.RescaleConstantsForDpi(deviceDpiOld, deviceDpiNew);
+
+ //Resizing the editor to fit to the SingleMonth size after Dpi changed.
+ Size = _monthCalendar.SingleMonthSize;
+ }
+
+ private void InitializeComponent()
+ {
+ _monthCalendar.DateSelected += OnDateSelected;
+ _monthCalendar.KeyDown += MonthCalKeyDown;
+ Controls.Add(_monthCalendar);
+ }
+
+ private void MonthCalResize(object sender, EventArgs e)
+ {
+ Size = _monthCalendar.Size;
+ }
+
+ private void OnDateSelected(object sender, DateRangeEventArgs e)
+ {
+ _value = _monthCalendar.SelectionStart;
+ _edSvc.CloseDropDown();
+ }
+
+ protected override void OnGotFocus(EventArgs e)
+ {
+ base.OnGotFocus(e);
+ _monthCalendar.Focus();
+ }
+
+ public void Start(IWindowsFormsEditorService edSvc, object value)
+ {
+ _edSvc = edSvc;
+ _value = value;
+
+ if (value != null)
+ {
+ DateTime dt = (DateTime)value;
+ _monthCalendar.SetDate((dt.Equals(DateTime.MinValue)) ? DateTime.Today : dt);
+ }
+ }
+
+ class DateTimeMonthCalendar : MonthCalendar
+ {
+ protected override bool IsInputKey(Keys keyData)
+ {
+ switch (keyData)
+ {
+ case Keys.Enter:
+ return true;
+ }
+
+ return base.IsInputKey(keyData);
+ }
+ }
+ }
+ }
+}