diff --git a/RestClient.cs b/RestClient.cs
new file mode 100644
index 0000000..4cdb3bb
--- /dev/null
+++ b/RestClient.cs
@@ -0,0 +1,141 @@
+using System;
+using System.Collections.Generic;
+using System.Net.Http;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace WooCommerceNET
+{
+ ///
+ /// Rest API class to use HTTPClient instead of HttpWebRequest.
+ ///
+ public class RestClient : RestAPI
+ {
+ // HttpClient is intended to be instantiated once per application, rather than per-use.
+ private static readonly HttpClient HttpClient = new HttpClient();
+
+ public RestClient(string url, string key, string secret, bool authorizedHeader = true,
+ Func jsonSerializeFilter = null,
+ Func jsonDeserializeFilter = null)
+ : base(url, key, secret, authorizedHeader, jsonSerializeFilter, jsonDeserializeFilter)
+ {
+ //TODO - Need to work on requestFilter and responseFilter
+ }
+
+ public override async Task SendHttpClientRequest(string endpoint, RequestMethod method, T requestBody, Dictionary parms = null)
+ {
+ HttpRequestMessage request = new HttpRequestMessage();
+
+
+ if (Version == APIVersion.WordPressAPI)
+ {
+ if (string.IsNullOrEmpty(oauth_token) || string.IsNullOrEmpty(oauth_token_secret))
+ throw new Exception($"oauth_token and oauth_token_secret parameters are required when using WordPress REST API.");
+ }
+
+ if ((Version == APIVersion.WordPressAPIJWT || WCAuthWithJWT) && JWT_Object == null)
+ {
+ request.RequestUri = new Uri(wc_url.Replace("wp/v2", "jwt-auth/v1/token")
+ .Replace("wc/v1", "jwt-auth/v1/token")
+ .Replace("wc/v2", "jwt-auth/v1/token")
+ .Replace("wc/v3", "jwt-auth/v1/token"));
+
+
+ request.Method = HttpMethod.Post;
+
+ //if (JWTRequestFilter != null)
+ // JWTRequestFilter.Invoke(request);
+
+ request.Content = new StringContent($"username={wc_key}&password={wc_secret}",
+ Encoding.UTF8,
+ "application/x-www-form-urlencoded");
+
+ var jwtResponseMessage = await HttpClient.SendAsync(request);
+
+ //Check for responseMessage.IsSuccessStatusCode
+ string result = await jwtResponseMessage.Content.ReadAsStringAsync();
+
+ if (JWTDeserializeFilter != null)
+ result = JWTDeserializeFilter.Invoke(result);
+
+ JWT_Object = DeserializeJSon(result);
+ }
+
+ if (wc_url.StartsWith("https", StringComparison.OrdinalIgnoreCase) && Version != APIVersion.WordPressAPI && Version != APIVersion.WordPressAPIJWT)
+ {
+ if (AuthorizedHeader == true)
+ {
+ request.RequestUri = new Uri(wc_url + GetOAuthEndPoint(method.ToString(), endpoint, parms));
+
+ if (WCAuthWithJWT && JWT_Object != null)
+ request.Headers.Add("Authorization", "Bearer " + JWT_Object.token);
+ else
+ request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.GetEncoding("ISO-8859-1").GetBytes(wc_key + ":" + wc_secret)));
+
+ }
+ else
+ {
+ if (parms == null)
+ parms = new Dictionary();
+
+ if (!parms.ContainsKey("consumer_key"))
+ parms.Add("consumer_key", wc_key);
+ if (!parms.ContainsKey("consumer_secret"))
+ parms.Add("consumer_secret", wc_secret);
+
+ request.RequestUri = new Uri(wc_url + GetOAuthEndPoint(method.ToString(), endpoint, parms));
+ }
+ }
+ else
+ {
+ request.RequestUri = new Uri(wc_url + GetOAuthEndPoint(method.ToString(), endpoint, parms));
+ if (Version == APIVersion.WordPressAPIJWT)
+ request.Headers.Add("Authorization", "Bearer " + JWT_Object.token);
+ }
+
+
+ request.Method = new HttpMethod(method.ToString());
+
+ //if (webRequestFilter != null)
+ // webRequestFilter.Invoke(httpWebRequest);
+
+
+ if (requestBody != null && !string.IsNullOrWhiteSpace(requestBody.ToString()))
+ {
+ if (requestBody.GetType() == typeof(string))
+ {
+ if (requestBody.ToString() == "fileupload")
+ {
+
+ }
+ else
+ {
+ request.Content = new StringContent(requestBody.ToString(),
+ Encoding.UTF8,
+ "application/json");
+ }
+ }
+ else
+ {
+ request.Content = new StringContent(SerializeJSon(requestBody),
+ Encoding.UTF8,
+ "application/json");
+ }
+ }
+
+
+ var responseMessage = await HttpClient.SendAsync(request);
+ string responseResult = await responseMessage.Content.ReadAsStringAsync();
+ if (responseMessage.IsSuccessStatusCode)
+ {
+ return responseResult;
+ }
+ else
+ {
+ throw new Exception(responseResult);
+ }
+
+
+ }
+ }
+}