diff --git a/src/KubeClient/Http/FactoryExtensions.cs b/src/KubeClient/Http/FactoryExtensions.cs
new file mode 100644
index 0000000..44f698f
--- /dev/null
+++ b/src/KubeClient/Http/FactoryExtensions.cs
@@ -0,0 +1,35 @@
+using System;
+
+namespace KubeClient.Http
+{
+ ///
+ /// Extension methods for .
+ ///
+ public static class FactoryExtensions
+ {
+ ///
+ /// Create a new HTTP request with the specified request URI.
+ ///
+ ///
+ /// The HTTP request factory.
+ ///
+ ///
+ /// The request URI (can be relative or absolute).
+ ///
+ ///
+ /// The new .
+ ///
+ public static HttpRequest Create(this HttpRequestFactory requestFactory, string requestUri)
+ {
+ if (requestFactory == null)
+ throw new ArgumentNullException(nameof(requestFactory));
+
+ if (String.IsNullOrWhiteSpace(requestUri))
+ throw new ArgumentException("Argument cannot be null, empty, or composed entirely of whitespace: 'requestUri'.", nameof(requestUri));
+
+ return requestFactory.Create(
+ new Uri(requestUri, UriKind.RelativeOrAbsolute)
+ );
+ }
+ }
+}
diff --git a/src/KubeClient/Http/HttpRequest.cs b/src/KubeClient/Http/HttpRequest.cs
new file mode 100644
index 0000000..0c32b5a
--- /dev/null
+++ b/src/KubeClient/Http/HttpRequest.cs
@@ -0,0 +1,407 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Collections.Specialized;
+using System.Diagnostics;
+using System.Linq;
+using System.Net.Http;
+
+namespace KubeClient.Http
+{
+ using Utilities;
+ using ValueProviders;
+
+ using RequestProperties = ImmutableDictionary;
+
+ ///
+ /// A template for an HTTP request.
+ ///
+ public sealed class HttpRequest
+ : HttpRequestBase, IHttpRequest, IHttpRequest