diff --git a/src/Microsoft.AspNet.Mvc.Core/Formatters/InputFormatter.cs b/src/Microsoft.AspNet.Mvc.Core/Formatters/InputFormatter.cs
new file mode 100644
index 0000000000..9962de7a39
--- /dev/null
+++ b/src/Microsoft.AspNet.Mvc.Core/Formatters/InputFormatter.cs
@@ -0,0 +1,105 @@
+// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
+// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
+
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.AspNet.Mvc.Core;
+using Microsoft.Net.Http.Headers;
+
+namespace Microsoft.AspNet.Mvc
+{
+ ///
+ /// Reads an object from the request body.
+ ///
+ public abstract class InputFormatter : IInputFormatter
+ {
+ ///
+ /// Gets the mutable collection of character encodings supported by
+ /// this . The encodings are
+ /// used when reading the data.
+ ///
+ public IList SupportedEncodings { get; } = new List();
+
+ ///
+ /// Gets the mutable collection of elements supported by
+ /// this .
+ ///
+ public IList SupportedMediaTypes { get; } = new List();
+
+ protected object GetDefaultValueForType(Type modelType)
+ {
+ if (modelType.GetTypeInfo().IsValueType)
+ {
+ return Activator.CreateInstance(modelType);
+ }
+
+ return null;
+ }
+
+ ///
+ public virtual bool CanRead(InputFormatterContext context)
+ {
+ var contentType = context.ActionContext.HttpContext.Request.ContentType;
+ MediaTypeHeaderValue requestContentType;
+ if (!MediaTypeHeaderValue.TryParse(contentType, out requestContentType))
+ {
+ return false;
+ }
+
+ return SupportedMediaTypes
+ .Any(supportedMediaType => supportedMediaType.IsSubsetOf(requestContentType));
+ }
+
+ ///
+ public virtual async Task