diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Changelog
 
+## 0.15
+
+* JavaScript/node.js: Clients now use and require Q promises
+* JavaScript/web: Will now use Q if available, and otherwise return the normal jQuery objects
+
+Bugfixes:
+* JavaScript: Fix propagation of URLs to secure end points
+
 ### 0.14.2
 
 * Generated JavaScript now also works as a Node module
diff --git a/files/Javascript/base.js b/files/Javascript/base.js
--- a/files/Javascript/base.js
+++ b/files/Javascript/base.js
@@ -1,10 +1,11 @@
 var $apinamespace$ =
   function (url, secureUrl)
   {
-    var postfix = '/v' + this.version + '/';
-    var sUrl = url + postfix;
-    $apinamespace$.setContext(this, sUrl);
-    this.secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;
+    var postfix          = '/v' + this.version + '/';
+    var contextUrl       = url + postfix;
+    var secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;
+
+    $apinamespace$.setContext(this, contextUrl, secureContextUrl);
   };
 
 if (typeof module === "object" && module && typeof module.exports === "object")
@@ -34,9 +35,12 @@
 };
 
 $apinamespace$.defaultAjaxOptions = {};
+$apinamespace$.defaultHeaders = {};
 
 function jQueryRequest (method, url, params, success, error, contentType, dataType, data, callOpts)
 {
+  var q = window.Q || function (a) { return a };
+
   var callData =
     { type: method
     , url: url + (params ? '?' + $dollar$.param(params) : '')
@@ -47,12 +51,13 @@
     , dataType: dataType
     , xhrFields: { withCredentials: true }
     , data: data || []
+    , headers: $apinamespace$.defaultHeaders
     };
 
   $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
   $apinamespace$.addObject(callData, callOpts);
 
-  return $dollar$.ajax(callData);
+  return q($dollar$.ajax(callData));
 }
 
 function nodeRequest (method, url, params, onSuccess, onError, contentType, dataType, data, callOpts)
@@ -71,6 +76,8 @@
   else if (dataType === 'xml')
     headers.Accept = 'text/xml';
 
+  $apinamespace$.addObject(headers, $apinamespace$.defaultHeaders);
+
   var callData =
     { url     : url
     , qs      : allParams
@@ -83,17 +90,35 @@
   $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
   $apinamespace$.addObject(callData, callOpts);
 
-  return require("request")(callData, callback);
-
-  function callback (error, message, response)
+  return require("q").Promise(function (resolve, reject)
   {
-    var parsedResponse = parse(response);
-    if (message.statusCode >= 200 && message.statusCode < 300)
-      onSuccess && onSuccess(parsedResponse, message);
-    else if (onError)
-      onError(error, parsedResponse, message);
-  }
+    require("request")(callData, callback);
 
+    function callback (error, message, body)
+    {
+      if (message.statusCode >= 200 && message.statusCode < 300)
+      {
+        var parsedResponse = parse(body);
+        onSuccess && onSuccess(parsedResponse, message);
+        resolve(parsedResponse)
+      }
+      else
+      {
+        if (!error)
+        {
+          error = new Error("HTTP request error");
+          error.statusCode = message.statusCode;
+          error.responseBody = body;
+        }
+
+        if (onError)
+          onError(error);
+
+        reject(error);
+      }
+    }
+  });
+
   function parse (response)
   {
     if (dataType === 'json')
@@ -103,15 +128,16 @@
 }
 
 $apinamespace$.setContext =
-  function (obj, url)
+  function (obj, url, secureUrl)
   {
     obj.contextUrl = url;
+    obj.secureContextUrl = secureUrl;
     for (var fld in obj)
     {
       if (obj[fld] != undefined && obj[fld].apiObjectType != undefined && obj[fld].apiObjectType == 'resourceDir')
       {
-        var newUrl = url + fld.replace(/([a-z0-9])([A-Z])/g, '$dollar$1-$dollar$2').toLowerCase() + '/'
-        $apinamespace$.setContext(obj[fld], newUrl);
+        var postfix = fld.replace(/([a-z0-9])([A-Z])/g, '$dollar$1-$dollar$2').toLowerCase() + '/';
+        $apinamespace$.setContext(obj[fld], url + postfix, secureUrl + postfix);
       }
     }
   };
diff --git a/rest-gen.cabal b/rest-gen.cabal
--- a/rest-gen.cabal
+++ b/rest-gen.cabal
@@ -1,5 +1,5 @@
 name:                rest-gen
-version:             0.14.2.1
+version:             0.15
 description:         Documentation and client generation from rest definition.
 synopsis:            Documentation and client generation from rest definition.
 maintainer:          code@silk.co
diff --git a/src/Rest/Gen/JavaScript.hs b/src/Rest/Gen/JavaScript.hs
--- a/src/Rest/Gen/JavaScript.hs
+++ b/src/Rest/Gen/JavaScript.hs
@@ -47,10 +47,10 @@
 mkAccessorConstructor :: String -> ApiResource -> Code
 mkAccessorConstructor ns resource =
   let constrName = jsDir (cleanName (resName resource))
-  in functionDecl constrName ["url"] $
+  in functionDecl constrName ["url", "secureUrl"] $
        jsIf (code $ "this instanceof " ++ constrName)
-            (proc (ns ++ ".setContext") (code "this, url"))
-         <-> jsElse (ret $ call (constrName ++ ".access") (code "url"))
+            (proc (ns ++ ".setContext") (code "this, url, secureUrl"))
+         <-> jsElse (ret $ call (constrName ++ ".access") (code "url, secureUrl"))
 
 mkPreFuncs :: String -> ApiResource -> Code
 mkPreFuncs ns node =
@@ -77,7 +77,9 @@
               ++ maybe "" (\i -> "' + encodeURIComponent(" ++ i ++ ") + '/") mIdent
       mIdent   = fmap (jsId . cleanName . description) $ ident ai
   in function fParams $
-      [ var "accessor" $ new "this" . code $ "this.contextUrl + '" ++ urlPart ++ "'"
+      [ var "postfix" $ "'" ++ urlPart ++ "'"
+      , var "accessor" $ new "this" . code $  "this.contextUrl + postfix, "
+                                           ++ "this.secureContextUrl + postfix"
       , "accessor.get" .=. mkFunction ns node
       , ret "accessor"
       ]
