diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,21 @@
 # Changelog
 
-### 0.17.1.2
+#### 0.17.1.3
 
+* Javascript: generate new API instance every time. Some properties
+  were written to the prototype of the API object, and in Node,
+  importing it again could cause mixups of this data. Now every
+  instantiation of the API is a new object. This should have no impact
+  on user code, unless you're checking the API type with `instanceof`,
+  in which case it will now always return false.
+
+#### 0.17.1.2
+
 * Javascript: fix rare crash in error path.
+* Allow `HUnit 1.3.*`
+* Allow `process 1.3.*`.
 
-### 0.17.1.1
+#### 0.17.1.1
 
 * JavaScript/NodeJS: Use the received content-type instead of the accept header to decide whether to parse json.
 * Allow `vector 0.11.*`
diff --git a/files/Javascript/base.js b/files/Javascript/base.js
deleted file mode 100644
--- a/files/Javascript/base.js
+++ /dev/null
@@ -1,191 +0,0 @@
-// in nodejs, global is an object
-// in normal browser environment, global is undefined
-// in webpack, global is set to window
-var isNodeJs   = typeof global !== "undefined" && global.window === undefined;
-var isCommonJs = typeof module === "object" && module && typeof module.exports === "object";
-
-// require, that the nodejs will handle, but will remain not processed by webpack and the like
-var obfuscatedRequire = function (moduleName)
-{
-  return module["r" + "equire"](moduleName);
-}
-
-var $apinamespace$ =
-  function (url, secureUrl, modifyRequest)
-  {
-    var self = this;
-    var postfix          = '/v' + this.version + '/';
-    var contextUrl       = url + postfix;
-    var secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;
-
-    this.cookieJar = isNodeJs ? obfuscatedRequire('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);
-  };
-
-var jqFun;
-if (isNodeJs)
-{
-  // Export as Node module.
-  module.exports = $apinamespace$;
-
-  $apinamespace$.ajaxCall = nodeRequest;
-}
-else
-{
-  if (isCommonJs) {
-    // Export as CommonJs
-    module.exports = $apinamespace$;
-    jqFun = function () { return require("jquery"); };
-  } else if (typeof define === "function" && define.amd) {
-    // Export as AMD.
-    define("$apinamespace$", [], function () { return $apinamespace$; });
-    jqFun = function () { return window.$dollar$; };
-  } else {
-    // Export as global.
-    window.$apinamespace$ = $apinamespace$;
-    jqFun = function () { return window.$dollar$; };
-  }
-
-  $apinamespace$.ajaxCall = jQueryRequest;
-}
-
-$apinamespace$.addObject = function (obj1, obj2)
-{
-  for (var fld in obj2)
-    obj1[fld] = obj2[fld];
-};
-
-$apinamespace$.defaultAjaxOptions = {};
-$apinamespace$.defaultHeaders = {};
-
-function jQueryRequest (method, url, params, success, error, contentType, acceptHeader, data, callOpts, modifyRequest)
-{
-  var q = window.Q || function (a) { return a };
-  var jq = jqFun();
-
-  var headers = jq.extend(true, {}, $apinamespace$.defaultHeaders);
-  $apinamespace$.addObject(headers, { Accept : acceptHeader });
-
-  var callData =
-    { type        : method
-    , url         : url + (params ? '?' + jq.param(params) : '')
-    , cache       : false
-    , success     : success || function () {}
-    , error       : error || function () {}
-    , contentType : contentType
-    , headers     : headers
-    , xhrFields   : { withCredentials: true }
-    , data        : data || []
-    };
-
-  callData = modifyRequest(callData);
-
-  $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
-  $apinamespace$.addObject(callData, callOpts);
-
-  return q(jq.ajax(callData));
-}
-
-function nodeRequest (method, url, params, onSuccess, onError, contentType, acceptHeader, data, callOpts, modifyRequest)
-{
-  var allParams = {};
-  $apinamespace$.addObject(allParams, params);
-
-  if (method === "GET" || method === "HEAD")
-    // Avoid cached API responses.
-    allParams._ = Date.now();
-
-  var headers = { "Content-type" : contentType
-                , "Accept"       : acceptHeader
-                };
-
-  $apinamespace$.addObject(headers, $apinamespace$.defaultHeaders);
-
-  var callData =
-    { url     : url
-    , qs      : allParams
-    , method  : method
-    , headers : headers
-    };
-
-  if (data) callData.body = data;
-
-  callData = modifyRequest(callData);
-
-  $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
-  $apinamespace$.addObject(callData, callOpts);
-
-  return require("q").Promise(function (resolve, reject)
-  {
-    obfuscatedRequire("request")(callData, callback);
-
-    function callback (error, message, body)
-    {
-      if (message && message.statusCode >= 200 && message.statusCode < 300)
-      {
-        var parsedResponse = parse(body, message.headers);
-        onSuccess && onSuccess(parsedResponse, message);
-        resolve(parsedResponse)
-      }
-      else
-      {
-        if (!error)
-        {
-          error = new Error("HTTP request error");
-          error.statusCode = message && message.statusCode;
-          error.responseBody = body;
-        }
-
-        error.response = parse(body, message ? message.headers : {});
-
-        if (onError)
-          onError(error);
-
-        reject(error);
-      }
-    }
-  });
-
-  function parse (response, headers)
-  {
-    if (headers["content-type"] && headers["content-type"].split(";").indexOf("application/json") >= 0)
-    {
-      var r = response;
-      try
-      {
-        r = JSON.parse(response);
-      }
-      catch (e)
-      {
-        return r;
-      }
-      return r;
-    }
-    else return response;
-  }
-}
-
-$apinamespace$.setContext =
-  function (obj, url, secureUrl, modifyRequest)
-  {
-    obj.contextUrl = url;
-    obj.secureContextUrl = secureUrl;
-    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, modifyRequest);
-      }
-    }
-  };
diff --git a/files/Javascript/epilogue.js b/files/Javascript/epilogue.js
new file mode 100644
--- /dev/null
+++ b/files/Javascript/epilogue.js
@@ -0,0 +1,22 @@
+  return new $apinamespace$ (url, secureUrl, modifyRequest);
+}
+
+var jqFun;
+if (isNodeJs)
+{
+  // Export as Node module.
+  module.exports = $apinamespace$;
+}
+else
+{
+  if (isCommonJs) {
+    // Export as CommonJs
+    module.exports = $apinamespace$;
+  } else if (typeof define === "function" && define.amd) {
+    // Export as AMD.
+    define("$apinamespace$", [], function () { return $apinamespace$; });
+  } else {
+    // Export as global.
+    window.$apinamespace$ = $apinamespace$;
+  }
+}
diff --git a/files/Javascript/prelude.js b/files/Javascript/prelude.js
new file mode 100644
--- /dev/null
+++ b/files/Javascript/prelude.js
@@ -0,0 +1,185 @@
+// in nodejs, global is an object
+// in normal browser environment, global is undefined
+// in webpack, global is set to window
+var isNodeJs   = typeof global !== "undefined" && global.window === undefined;
+var isCommonJs = typeof module === "object" && module && typeof module.exports === "object";
+
+// require, that the nodejs will handle, but will remain not processed by webpack and the like
+var obfuscatedRequire = function (moduleName)
+{
+  return module["r" + "equire"](moduleName);
+}
+
+function $apinamespace$ (url, secureUrl, modifyRequest)
+{
+  var $apinamespace$ =
+    function (url, secureUrl, modifyRequest)
+    {
+      var self = this;
+      var postfix          = '/v' + this.version + '/';
+      var contextUrl       = url + postfix;
+      var secureContextUrl = (secureUrl || url.replace(/^http:/, "https:")) + postfix;
+
+      this.cookieJar = isNodeJs ? obfuscatedRequire('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);
+    };
+
+  var jqFun;
+  if (isNodeJs)
+  {
+    $apinamespace$.ajaxCall = nodeRequest;
+  }
+  else
+  {
+    if (isCommonJs) {
+      jqFun = function () { return require("jquery"); };
+    } else if (typeof define === "function" && define.amd) {
+      jqFun = function () { return window.$dollar$; };
+    } else {
+      jqFun = function () { return window.$dollar$; };
+    }
+
+    $apinamespace$.ajaxCall = jQueryRequest;
+  }
+
+  $apinamespace$.addObject = function (obj1, obj2)
+  {
+    for (var fld in obj2)
+      obj1[fld] = obj2[fld];
+  };
+
+  $apinamespace$.defaultAjaxOptions = {};
+  $apinamespace$.defaultHeaders = {};
+
+  function jQueryRequest (method, url, params, success, error, contentType, acceptHeader, data, callOpts, modifyRequest)
+  {
+    var q = window.Q || function (a) { return a };
+    var jq = jqFun();
+
+    var headers = jq.extend(true, {}, $apinamespace$.defaultHeaders);
+    $apinamespace$.addObject(headers, { Accept : acceptHeader });
+
+    var callData =
+      { type        : method
+      , url         : url + (params ? '?' + jq.param(params) : '')
+      , cache       : false
+      , success     : success || function () {}
+      , error       : error || function () {}
+      , contentType : contentType
+      , headers     : headers
+      , xhrFields   : { withCredentials: true }
+      , data        : data || []
+      };
+
+    callData = modifyRequest(callData);
+
+    $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
+    $apinamespace$.addObject(callData, callOpts);
+
+    return q(jq.ajax(callData));
+  }
+
+  function nodeRequest (method, url, params, onSuccess, onError, contentType, acceptHeader, data, callOpts, modifyRequest)
+  {
+    var allParams = {};
+    $apinamespace$.addObject(allParams, params);
+
+    if (method === "GET" || method === "HEAD")
+      // Avoid cached API responses.
+      allParams._ = Date.now();
+
+    var headers = { "Content-type" : contentType
+                  , "Accept"       : acceptHeader
+                  };
+
+    $apinamespace$.addObject(headers, $apinamespace$.defaultHeaders);
+
+    var callData =
+      { url     : url
+      , qs      : allParams
+      , method  : method
+      , headers : headers
+      };
+
+    if (data) callData.body = data;
+
+    callData = modifyRequest(callData);
+
+    $apinamespace$.addObject(callData, $apinamespace$.defaultAjaxOptions);
+    $apinamespace$.addObject(callData, callOpts);
+
+    return require("q").Promise(function (resolve, reject)
+    {
+      obfuscatedRequire("request")(callData, callback);
+
+      function callback (error, message, body)
+      {
+        if (message && message.statusCode >= 200 && message.statusCode < 300)
+        {
+          var parsedResponse = parse(body, message.headers);
+          onSuccess && onSuccess(parsedResponse, message);
+          resolve(parsedResponse)
+        }
+        else
+        {
+          if (!error)
+          {
+            error = new Error("HTTP request error");
+            error.statusCode = message && message.statusCode;
+            error.responseBody = body;
+          }
+
+          error.response = parse(body, message ? message.headers : {});
+
+          if (onError)
+            onError(error);
+
+          reject(error);
+        }
+      }
+    });
+
+    function parse (response, headers)
+    {
+      if (headers["content-type"] && headers["content-type"].split(";").indexOf("application/json") >= 0)
+      {
+        var r = response;
+        try
+        {
+          r = JSON.parse(response);
+        }
+        catch (e)
+        {
+          return r;
+        }
+        return r;
+      }
+      else return response;
+    }
+  }
+
+  $apinamespace$.setContext =
+    function (obj, url, secureUrl, modifyRequest)
+    {
+      obj.contextUrl = url;
+      obj.secureContextUrl = secureUrl;
+      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, 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.17.1.2
+version:             0.17.1.3
 description:         Documentation and client generation from rest definition.
 synopsis:            Documentation and client generation from rest definition.
 maintainer:          code@silk.co
@@ -14,7 +14,8 @@
   Docs/*.st
   Docs/*.js
   Docs/*.css
-  Javascript/base.js
+  Javascript/prelude.js
+  Javascript/epilogue.js
   Ruby/base.rb
 extra-source-files:
   CHANGELOG.md
@@ -61,10 +62,10 @@
     , hxt >= 9.2 && < 9.4
     , json-schema >= 0.6 && < 0.8
     , pretty >= 1.0 && < 1.2
-    , process >= 1.0 && < 1.3
+    , process >= 1.0 && < 1.4
     , rest-core >= 0.35 && < 0.37
     , safe >= 0.2 && < 0.4
-    , semigroups >= 0.5.0 && < 0.17
+    , semigroups >= 0.5 && < 0.18
     , scientific >= 0.3.2 && < 0.4
     , split >= 0.1 && < 0.3
     , text >= 0.11 && < 1.3
@@ -81,7 +82,7 @@
   ghc-options:       -Wall
   build-depends:
       base >= 4.5 && < 4.9
-    , HUnit == 1.2.*
+    , HUnit >= 1.2 && < 1.4
     , fclabels >= 1.0.4 && < 2.1
     , haskell-src-exts >= 1.15.0 && < 1.17
     , rest-core >= 0.35 && < 0.37
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
@@ -20,12 +20,13 @@
 
 mkJsApi :: H.ModuleName -> Bool -> Version -> Router m s -> IO String
 mkJsApi ns priv ver r =
-  do prelude <- liftM (render . setManyAttrib attrs . newSTMP) (readContent "Javascript/base.js")
+  do prelude <- liftM (render . setManyAttrib attrs . newSTMP) (readContent "Javascript/prelude.js")
+     epilogue <- liftM (render . setManyAttrib attrs . newSTMP) (readContent "Javascript/epilogue.js")
      let cod = showCode $ mkStack
                 [ unModuleName ns ++ ".prototype.version" .=. string (show ver)
                 , mkJsCode (unModuleName ns) priv r
                 ]
-     return $ mkJsModule (prelude ++ cod)
+     return $ mkJsModule (prelude ++ cod ++ epilogue)
   where attrs = [("apinamespace", unModuleName ns), ("dollar", "$")]
 
 mkJsModule :: String -> String
