diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln
index 2761a830fa..9db8314362 100644
--- a/HttpAbstractions.sln
+++ b/HttpAbstractions.sln
@@ -27,6 +27,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -73,6 +75,10 @@ Global
{86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -88,5 +94,6 @@ Global
{68A538BA-D542-49CB-9615-B4F5A4E78C87} = {D38DDB2B-1138-4F45-8A6A-9499E880F620}
{E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620}
{D36288AF-8A0E-48DD-8AF8-15B72F91C70A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620}
+ {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620}
EndGlobalSection
EndGlobal
diff --git a/src/Microsoft.AspNet.Abstractions.Owin/Microsoft.AspNet.Abstractions.Owin.net45.csproj b/src/Microsoft.AspNet.Abstractions.Owin/Microsoft.AspNet.Abstractions.Owin.net45.csproj
new file mode 100644
index 0000000000..4f425dd45f
--- /dev/null
+++ b/src/Microsoft.AspNet.Abstractions.Owin/Microsoft.AspNet.Abstractions.Owin.net45.csproj
@@ -0,0 +1,69 @@
+
+
+
+
+ Debug
+ AnyCPU
+ {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}
+ Library
+ Properties
+ Microsoft.AspNet.Abstractions.Owin
+ Microsoft.AspNet.Abstractions.Owin
+ v4.5
+ 512
+ obj/net45
+
+
+ AnyCPU
+ true
+ full
+ false
+ bin\Debug\net45
+ DEBUG;TRACE;NET45
+ prompt
+ 4
+
+
+ AnyCPU
+ pdbonly
+ true
+ bin\Release\net45
+ TRACE;NET45
+ prompt
+ 4
+
+
+
+
+
+
+
+
+ False
+ ..\..\packages\Owin.1.0\lib\net40\Owin.dll
+
+
+ False
+ ..\..\packages\Microsoft.Owin.2.1.0\lib\net45\Microsoft.Owin.dll
+
+
+
+
+
+
+
+
+
+ {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}
+ Microsoft.AspNet.Abstractions
+
+
+
+
+
\ No newline at end of file
diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs
new file mode 100644
index 0000000000..885b7952d1
--- /dev/null
+++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNet.Abstractions.Owin;
+
+namespace Owin
+{
+ public static class OwinExtensions
+ {
+ public static void RunHttpContext(this IAppBuilder app, Func handler)
+ {
+ app.Run(context =>
+ {
+ var httpContext = new OwinHttpContext(context);
+
+ return handler(httpContext);
+ });
+ }
+ }
+}
diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs
new file mode 100644
index 0000000000..2762319fcd
--- /dev/null
+++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs
@@ -0,0 +1,175 @@
+using System;
+using System.IO;
+using System.Threading.Tasks;
+using Microsoft.AspNet.Abstractions;
+using Microsoft.Owin;
+
+namespace Microsoft.AspNet.Abstractions.Owin
+{
+ public class OwinHttpContext : HttpContext
+ {
+ private readonly IOwinContext _context;
+ private readonly HttpRequest _request;
+ private readonly HttpResponse _response;
+
+ public OwinHttpContext(IOwinContext context)
+ {
+ _context = context;
+ _request = new OwinHttpRequest(this, context.Request);
+ _response = new OwinHttpResponse(this, context.Response);
+ }
+
+ public override void Dispose()
+ {
+
+ }
+
+ public override object GetInterface(Type type)
+ {
+ return null;
+ }
+
+ public override HttpRequest Request
+ {
+ get { return _request; }
+ }
+
+ public override HttpResponse Response
+ {
+ get { return _response; }
+ }
+
+ public override void SetInterface(Type type, object instance)
+ {
+
+ }
+
+ private class OwinHttpRequest : HttpRequest
+ {
+ private HttpContext _context;
+ private IOwinRequest _request;
+
+ public OwinHttpRequest(HttpContext context, IOwinRequest request)
+ {
+ _context = context;
+ _request = request;
+ }
+
+ public override Stream Body
+ {
+ get
+ {
+ return _request.Body;
+ }
+ set
+ {
+ _request.Body = value;
+ }
+ }
+
+ public override HttpContext HttpContext
+ {
+ get { return _context; }
+ }
+
+ public override Microsoft.AspNet.Abstractions.PathString Path
+ {
+ get
+ {
+ return new Microsoft.AspNet.Abstractions.PathString(_request.Path.Value);
+ }
+ set
+ {
+ _request.Path = new Microsoft.Owin.PathString(value.Value);
+ }
+ }
+
+ public override Microsoft.AspNet.Abstractions.PathString PathBase
+ {
+ get
+ {
+ return new Microsoft.AspNet.Abstractions.PathString(_request.PathBase.Value);
+ }
+ set
+ {
+ _request.PathBase = new Microsoft.Owin.PathString(value.Value);
+ }
+ }
+
+ public override Microsoft.AspNet.Abstractions.QueryString QueryString
+ {
+ get
+ {
+ return new Microsoft.AspNet.Abstractions.QueryString(_request.QueryString.Value);
+ }
+ set
+ {
+ _request.QueryString = new Microsoft.Owin.QueryString(value.Value);
+ }
+ }
+
+ public override Uri Uri
+ {
+ get { return _request.Uri; }
+ }
+ }
+
+ private class OwinHttpResponse : HttpResponse
+ {
+ private readonly HttpContext _context;
+ private readonly IOwinResponse _response;
+
+ public OwinHttpResponse(HttpContext context, IOwinResponse response)
+ {
+ _context = context;
+ _response = response;
+ }
+
+ public override Stream Body
+ {
+ get
+ {
+ return _response.Body;
+ }
+ set
+ {
+ _response.Body = value;
+ }
+ }
+
+ public override string ContentType
+ {
+ get
+ {
+ return _response.ContentType;
+ }
+ set
+ {
+ _response.ContentType = value;
+ }
+ }
+
+ public override HttpContext HttpContext
+ {
+ get { return _context; }
+ }
+
+ public override int StatusCode
+ {
+ get
+ {
+ return _response.StatusCode;
+ }
+ set
+ {
+ _response.StatusCode = value;
+ }
+ }
+
+ public override Task WriteAsync(string data)
+ {
+ return _response.WriteAsync(data);
+ }
+ }
+ }
+}
diff --git a/src/Microsoft.AspNet.Abstractions.Owin/project.json b/src/Microsoft.AspNet.Abstractions.Owin/project.json
new file mode 100644
index 0000000000..b2b9a4babd
--- /dev/null
+++ b/src/Microsoft.AspNet.Abstractions.Owin/project.json
@@ -0,0 +1,11 @@
+{
+ "version": "0.1-alpha-*",
+ "dependencies": {
+ "Owin": "1.0",
+ "Microsoft.Owin": "2.1.0",
+ "Microsoft.AspNet.Abstractions": ""
+ },
+ "configurations": {
+ "net45": { }
+ }
+}
\ No newline at end of file
diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj
index 3c2308ba77..1b1196a9e7 100644
--- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj
+++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj
@@ -49,7 +49,7 @@
-
+