diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,13 @@
 # Changelog
 
+#### 0.16.1
+
+##### JavaScript
+
+* When instantiating API object you can now optionally pass a `modifyRequest` argument of type `RequestObject -> RequestObject` which is called before every request.
+
+* NodeJS: The `cookieJar` instance member is no longer available on sub resources, it can now only be accessed from the top-level api object. This is a breaking change for generated clients. It was a bad idea to use this to begin with since the cookie jar is shared across the entire api object.
+
 #### 0.16.0.4
 
 * JavaScript: Minor simplification in the template.
diff --git a/files/Javascript/base.js b/files/Javascript/base.js
--- a/files/Javascript/base.js
+++ b/files/Javascript/base.js
@@ -1,14 +1,24 @@
 var isNodeJs = typeof module === "object" && module && typeof module.exports === "object";
 
 var $apinamespace$ =
-  function (url, secureUrl)
+  function (url, secureUrl, modifyRequest)
   {
+    var self = this;
     var postfix          = '/v' + this.version + '/';
     var contextUrl       = url + postfix;
     var secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;
-    var cookieJar = isNodeJs ? require('request').jar() : undefined;
 
-    $apinamespace$.setContext(this, contextUrl, secureContextUrl, cookieJar);
+    this.cookieJar = isNodeJs ? require('request').jar() : undefined;
+
+    if(!modifyRequest) modifyRequest = function(req) { return req; };
+
+    var finalModifyRequest = function(req)
+    {
+      if (isNodeJs) req.jar = self.cookieJar;
+      return modifyRequest(req);
+    }
+
+    $apinamespace$.setContext(this, contextUrl, secureContextUrl, finalModifyRequest);
   };
 
 if (isNodeJs)
@@ -40,7 +50,7 @@
 $apinamespace$.defaultAjaxOptions = {};
 $apinamespace$.defaultHeaders = {};
 
-function jQueryRequest (method, url, params, success, error, contentType, acceptHeader, data, callOpts)
+function jQueryRequest (method, url, params, success, error, contentType, acceptHeader, data, callOpts, modifyRequest)
 {
   var q = window.Q || function (a) { return a };
 
@@ -59,13 +69,15 @@
     , data        : data || []
     };
 
+  callData = modifyRequest(callData);
+
   $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
   $apinamespace$.addObject(callData, callOpts);
 
   return q($dollar$.ajax(callData));
 }
 
-function nodeRequest (method, url, params, onSuccess, onError, contentType, acceptHeader, data, callOpts, cookieJar)
+function nodeRequest (method, url, params, onSuccess, onError, contentType, acceptHeader, data, callOpts, modifyRequest)
 {
   var allParams = {};
   $apinamespace$.addObject(allParams, params);
@@ -85,11 +97,12 @@
     , qs      : allParams
     , method  : method
     , headers : headers
-    , jar     : cookieJar
     };
 
   if (data) callData.body = data;
 
+  callData = modifyRequest(callData);
+
   $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
   $apinamespace$.addObject(callData, callOpts);
 
@@ -144,17 +157,17 @@
 }
 
 $apinamespace$.setContext =
-  function (obj, url, secureUrl, cookieJar)
+  function (obj, url, secureUrl, modifyRequest)
   {
     obj.contextUrl = url;
     obj.secureContextUrl = secureUrl;
-    obj.cookieJar = cookieJar;
+    obj.modifyRequest = modifyRequest;
     for (var fld in obj)
     {
       if (obj[fld] != undefined && obj[fld].apiObjectType != undefined && obj[fld].apiObjectType == 'resourceDir')
       {
         var postfix = fld.replace(/([a-z0-9])([A-Z])/g, '$dollar$1-$dollar$2').toLowerCase() + '/';
-        $apinamespace$.setContext(obj[fld], url + postfix, secureUrl + postfix, cookieJar);
+        $apinamespace$.setContext(obj[fld], url + postfix, secureUrl + postfix, modifyRequest);
       }
     }
   };
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.16.0.4
+version:             0.16.1
 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
@@ -51,10 +51,10 @@
 mkAccessorConstructor :: String -> ApiResource -> Code
 mkAccessorConstructor ns resource =
   let constrName = jsDir (cleanName (resName resource))
-  in functionDecl constrName ["url", "secureUrl", "cookieJar"] $
+  in functionDecl constrName ["url", "secureUrl", "modifyRequest"] $
        jsIf (code $ "this instanceof " ++ constrName)
-            (proc (ns ++ ".setContext") (code "this, url, secureUrl, cookieJar"))
-         <-> jsElse (ret $ call (constrName ++ ".access") (code "url, secureUrl, cookieJar"))
+            (proc (ns ++ ".setContext") (code "this, url, secureUrl, modifyRequest"))
+         <-> jsElse (ret $ call (constrName ++ ".access") (code "url, secureUrl, modifyRequest"))
 
 mkPreFuncs :: String -> ApiResource -> Code
 mkPreFuncs ns node =
@@ -84,7 +84,7 @@
       [ var "postfix" $ "'" ++ urlPart ++ "'"
       , var "accessor" $ new "this" . code $  "this.contextUrl + postfix, "
                                            ++ "this.secureContextUrl + postfix, "
-                                           ++ "this.cookieJar"
+                                           ++ "this.modifyRequest"
       , "accessor.get" .=. mkFunction ns node
       , ret "accessor"
       ]
@@ -111,7 +111,7 @@
           , string $ mOut
           , maybe (code "undefined") (\(p, _, f) -> f (code p)) mInp
           , code "callOpts"
-          , code "this.cookieJar"
+          , code "this.modifyRequest"
           ]
 
 resourceLoc :: String -> ApiResource -> String
