diff --git a/gui/ngXosLib/.bowerrc b/gui/ngXosLib/.bowerrc
new file mode 100644
index 0000000..637d54e
--- /dev/null
+++ b/gui/ngXosLib/.bowerrc
@@ -0,0 +1,3 @@
+{
+  "directory": "./bower_components"
+}
\ No newline at end of file
diff --git a/gui/ngXosLib/.gitignore b/gui/ngXosLib/.gitignore
new file mode 100644
index 0000000..bb93d68
--- /dev/null
+++ b/gui/ngXosLib/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+bower_components
\ No newline at end of file
diff --git a/gui/ngXosLib/README.md b/gui/ngXosLib/README.md
new file mode 100644
index 0000000..0166efd
--- /dev/null
+++ b/gui/ngXosLib/README.md
@@ -0,0 +1,101 @@
+# ngXosLib
+
+This is a collection of helpers to develop views as Angular SPA.
+
+## Tools
+
+This tools are designed to help you developing UI for XOS. As they born for this purpose if often necessary that a XOS instance is running on your sistem and responding at: `localhost:9999`. The `xos/configurations/frontend` is normally enough.
+
+### Apigen
+
+Usage: `npm run apigen`
+
+This tool will automatically generate an angular resource file for each endpoint available in Swagger.
+
+>You can generate api related documentation with: `npm run apidoc`. The output is locate in `api/docs`. You can have a list of available method also trough Swagger at `http://localhost:9999/docs/`
+
+### Vendors
+
+Xos comes with a preset of common libraries, as listed in `bower.json`:
+- angular
+- angular-route
+- angular-resource
+- angular-cookie
+- ng-lodash
+
+This libraries are server through Django, so they will not be included in your minified vendor file. To add a library and generate a new file (that will override the old one), you should:
+- enter `ngXosLib` folder
+- run `bower install [myPackage] --save`
+- rebuild the file with `gulp vendor`
+
+>_NOTE before adding libraries please discuss it to avoid this file to became huge_
+
+### Helpers
+
+XOS comes with an helper library that is automatically loaded in the Django template.
+
+To use it, add `xos.helpers` to your required modules:
+
+```
+angular.module('xos.myView', [
+  'xos.helpers'
+])
+```
+
+It will automatically ad a `token` to all your request, eventually you can take advantage of some other services:
+
+- **NoHyperlinks Interceptor**: will add a `?no_hyperlinks=1` to your request, to tell Django to return ids instead of links.
+- **XosApi** wrapper for `/xos` endpoints.
+- **XoslibApi** wrapper for `/xoslib` endpoints.
+- **HpcApi** wrapper for `/hpcapi` endpoints.
+
+>_NOTE: for the API related service, check documentation in [Apigen](#apigen) section._
+
+### Yo Xos
+
+We have created a [yeoman](http://yeoman.io/) generator to help you scaffolding views.
+
+>As it is in an early stage of development you should manually link it to your system, to do this enter `xos/core/xoslib/ngXosLib/generator-xos` and run `npm link`.
+
+#### To generate a new view
+
+From `xos/core/xoslib` run `yo xos`. This command will create a new folder with the provided name in: `xos/core/xoslib/ngXosViews` that contain your application.
+
+>If you left empty the view name it should be `xos/core/xoslib/ngXosViews/sampleView`
+
+#### Run a development server
+
+In your `view` folder and run `npm start`.
+
+_This will install required dependencies and start a local server with [BrowserSync](http://www.browsersync.io/)_
+
+#### Publish your view
+
+Once your view is done, from your view root folder, run: `npm run build`.
+
+This will build your application and copy files in the appropriate locations to be used by django.
+
+At this point you can enter: `http://localhost:9999/admin/core/dashboardview/add/` and add your custom view.
+
+>_NOTE url field should be `template:xosSampleView`_
+
+#### Install dependencies in your app
+
+To install a local dependency use bower with `--save`. Common modules are saved in `devDependencies` as they already loaded in the Django template.
+
+The `npm start` command is watching your dependencies and will automatically inject it in your `index.html`.
+
+#### Linting
+
+A styleguide is enforced trough [EsLint](http://eslint.org/) and is checked during the build process. We **highly** suggest to install the linter in your editor to have realtime hint.
+
+#### Test
+
+The generator set up a test environment with a default test.
+To run it execute: `npm test`
+
+## TODO
+
+- Use Angular $resource instead of $http
+- Use ngDoc instead of jsDoc
+- Define styleguide (both visual and js) and if needed define some UI components
\ No newline at end of file
diff --git a/gui/ngXosLib/api/.gitignore b/gui/ngXosLib/api/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gui/ngXosLib/api/.gitignore
diff --git a/gui/ngXosLib/api/ng-hpcapi.js b/gui/ngXosLib/api/ng-hpcapi.js
new file mode 100755
index 0000000..762b304
--- /dev/null
+++ b/gui/ngXosLib/api/ng-hpcapi.js
@@ -0,0 +1,5440 @@
+/*jshint -W069 */
+/*global angular:false */
+angular.module('xos.hpcapi', [])
+    .factory('hpcapi', ['$q', '$http', '$rootScope', function($q, $http, $rootScope) {
+        'use strict';
+
+        /**
+         * 
+         * @class hpcapi
+         * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.
+         * @param {string} [domainOrOptions.domain] - The project domain
+         * @param {string} [domainOrOptions.cache] - An angularjs cache implementation
+         * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties
+         * @param {string} [cache] - An angularjs cache implementation
+         */
+        var hpcapi = (function() {
+            function hpcapi(options, cache) {
+                var domain = (typeof options === 'object') ? options.domain : options;
+                this.domain = typeof(domain) === 'string' ? domain : 'http://localhost:9999';
+                cache = cache || ((typeof options === 'object') ? options.cache : cache);
+                this.cache = cache;
+            }
+
+            hpcapi.prototype.$on = function($scope, path, handler) {
+                var url = domain + path;
+                $scope.$on(url, function() {
+                    handler();
+                });
+                return this;
+            };
+
+            hpcapi.prototype.$broadcast = function(path) {
+                var url = domain + path;
+                //cache.remove(url);
+                $rootScope.$broadcast(url);
+                return this;
+            };
+
+            hpcapi.transformRequest = function(obj) {
+                var str = [];
+                for (var p in obj) {
+                    var val = obj[p];
+                    if (angular.isArray(val)) {
+                        val.forEach(function(val) {
+                            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                        });
+                    } else {
+                        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                    }
+                }
+                return str.join("&");
+            };
+
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Api_Root_GET
+             * 
+             */
+            hpcapi.prototype.Hpc_Api_Root_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Health_Check_List_GET
+             * 
+             */
+            hpcapi.prototype.Hpc_Health_Check_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpchealthchecks/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Health_Check_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} hpcService - 
+             * @param {choice} kind - 
+             * @param {string} resource_name - 
+             * @param {string} result_contains - 
+             * @param {integer} result_min_size - 
+             * @param {integer} result_max_size - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Health_Check_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpchealthchecks/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['resource_name'] !== undefined) {
+                    form['resource_name'] = parameters['resource_name'];
+                }
+
+                if (parameters['resource_name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: resource_name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['result_contains'] !== undefined) {
+                    form['result_contains'] = parameters['result_contains'];
+                }
+
+                if (parameters['result_min_size'] !== undefined) {
+                    form['result_min_size'] = parameters['result_min_size'];
+                }
+
+                if (parameters['result_max_size'] !== undefined) {
+                    form['result_max_size'] = parameters['result_max_size'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Health_Check_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Health_Check_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpchealthchecks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Health_Check_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} hpcService - 
+             * @param {choice} kind - 
+             * @param {string} resource_name - 
+             * @param {string} result_contains - 
+             * @param {integer} result_min_size - 
+             * @param {integer} result_max_size - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Health_Check_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpchealthchecks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['resource_name'] !== undefined) {
+                    form['resource_name'] = parameters['resource_name'];
+                }
+
+                if (parameters['resource_name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: resource_name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['result_contains'] !== undefined) {
+                    form['result_contains'] = parameters['result_contains'];
+                }
+
+                if (parameters['result_min_size'] !== undefined) {
+                    form['result_min_size'] = parameters['result_min_size'];
+                }
+
+                if (parameters['result_max_size'] !== undefined) {
+                    form['result_max_size'] = parameters['result_max_size'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Health_Check_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} hpcService - 
+             * @param {choice} kind - 
+             * @param {string} resource_name - 
+             * @param {string} result_contains - 
+             * @param {integer} result_min_size - 
+             * @param {integer} result_max_size - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Health_Check_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpchealthchecks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['resource_name'] !== undefined) {
+                    form['resource_name'] = parameters['resource_name'];
+                }
+
+                if (parameters['result_contains'] !== undefined) {
+                    form['result_contains'] = parameters['result_contains'];
+                }
+
+                if (parameters['result_min_size'] !== undefined) {
+                    form['result_min_size'] = parameters['result_min_size'];
+                }
+
+                if (parameters['result_max_size'] !== undefined) {
+                    form['result_max_size'] = parameters['result_max_size'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Health_Check_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Health_Check_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpchealthchecks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Service_List_GET
+             * 
+             */
+            hpcapi.prototype.Hpc_Service_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpcservices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Service_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} description - Description of Service
+             * @param {boolean} enabled - 
+             * @param {string} kind - Kind of service
+             * @param {string} name - Service Name
+             * @param {string} versionNumber - Version of Service Definition
+             * @param {boolean} published - 
+             * @param {string} view_url - 
+             * @param {string} icon_url - 
+             * @param {string} public_key - Public key string
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {string} cmi_hostname - 
+             * @param {boolean} hpc_port80 - Enable port 80 for HPC
+             * @param {string} watcher_hpc_network - Network for hpc_watcher to contact hpc instance
+             * @param {string} watcher_dnsdemux_network - Network for hpc_watcher to contact dnsdemux instance
+             * @param {string} watcher_dnsredir_network - Network for hpc_watcher to contact dnsredir instance
+             * 
+             */
+            hpcapi.prototype.Hpc_Service_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpcservices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['versionNumber'] !== undefined) {
+                    form['versionNumber'] = parameters['versionNumber'];
+                }
+
+                if (parameters['versionNumber'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: versionNumber'));
+                    return deferred.promise;
+                }
+
+                if (parameters['published'] !== undefined) {
+                    form['published'] = parameters['published'];
+                }
+
+                if (parameters['view_url'] !== undefined) {
+                    form['view_url'] = parameters['view_url'];
+                }
+
+                if (parameters['icon_url'] !== undefined) {
+                    form['icon_url'] = parameters['icon_url'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['cmi_hostname'] !== undefined) {
+                    form['cmi_hostname'] = parameters['cmi_hostname'];
+                }
+
+                if (parameters['hpc_port80'] !== undefined) {
+                    form['hpc_port80'] = parameters['hpc_port80'];
+                }
+
+                if (parameters['watcher_hpc_network'] !== undefined) {
+                    form['watcher_hpc_network'] = parameters['watcher_hpc_network'];
+                }
+
+                if (parameters['watcher_dnsdemux_network'] !== undefined) {
+                    form['watcher_dnsdemux_network'] = parameters['watcher_dnsdemux_network'];
+                }
+
+                if (parameters['watcher_dnsredir_network'] !== undefined) {
+                    form['watcher_dnsredir_network'] = parameters['watcher_dnsredir_network'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Service_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Service_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpcservices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Service_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} description - Description of Service
+             * @param {boolean} enabled - 
+             * @param {string} kind - Kind of service
+             * @param {string} name - Service Name
+             * @param {string} versionNumber - Version of Service Definition
+             * @param {boolean} published - 
+             * @param {string} view_url - 
+             * @param {string} icon_url - 
+             * @param {string} public_key - Public key string
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {string} cmi_hostname - 
+             * @param {boolean} hpc_port80 - Enable port 80 for HPC
+             * @param {string} watcher_hpc_network - Network for hpc_watcher to contact hpc instance
+             * @param {string} watcher_dnsdemux_network - Network for hpc_watcher to contact dnsdemux instance
+             * @param {string} watcher_dnsredir_network - Network for hpc_watcher to contact dnsredir instance
+             * 
+             */
+            hpcapi.prototype.Hpc_Service_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpcservices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['versionNumber'] !== undefined) {
+                    form['versionNumber'] = parameters['versionNumber'];
+                }
+
+                if (parameters['versionNumber'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: versionNumber'));
+                    return deferred.promise;
+                }
+
+                if (parameters['published'] !== undefined) {
+                    form['published'] = parameters['published'];
+                }
+
+                if (parameters['view_url'] !== undefined) {
+                    form['view_url'] = parameters['view_url'];
+                }
+
+                if (parameters['icon_url'] !== undefined) {
+                    form['icon_url'] = parameters['icon_url'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['cmi_hostname'] !== undefined) {
+                    form['cmi_hostname'] = parameters['cmi_hostname'];
+                }
+
+                if (parameters['hpc_port80'] !== undefined) {
+                    form['hpc_port80'] = parameters['hpc_port80'];
+                }
+
+                if (parameters['watcher_hpc_network'] !== undefined) {
+                    form['watcher_hpc_network'] = parameters['watcher_hpc_network'];
+                }
+
+                if (parameters['watcher_dnsdemux_network'] !== undefined) {
+                    form['watcher_dnsdemux_network'] = parameters['watcher_dnsdemux_network'];
+                }
+
+                if (parameters['watcher_dnsredir_network'] !== undefined) {
+                    form['watcher_dnsredir_network'] = parameters['watcher_dnsredir_network'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Service_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} description - Description of Service
+             * @param {boolean} enabled - 
+             * @param {string} kind - Kind of service
+             * @param {string} name - Service Name
+             * @param {string} versionNumber - Version of Service Definition
+             * @param {boolean} published - 
+             * @param {string} view_url - 
+             * @param {string} icon_url - 
+             * @param {string} public_key - Public key string
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {string} cmi_hostname - 
+             * @param {boolean} hpc_port80 - Enable port 80 for HPC
+             * @param {string} watcher_hpc_network - Network for hpc_watcher to contact hpc instance
+             * @param {string} watcher_dnsdemux_network - Network for hpc_watcher to contact dnsdemux instance
+             * @param {string} watcher_dnsredir_network - Network for hpc_watcher to contact dnsredir instance
+             * 
+             */
+            hpcapi.prototype.Hpc_Service_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpcservices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['versionNumber'] !== undefined) {
+                    form['versionNumber'] = parameters['versionNumber'];
+                }
+
+                if (parameters['published'] !== undefined) {
+                    form['published'] = parameters['published'];
+                }
+
+                if (parameters['view_url'] !== undefined) {
+                    form['view_url'] = parameters['view_url'];
+                }
+
+                if (parameters['icon_url'] !== undefined) {
+                    form['icon_url'] = parameters['icon_url'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['cmi_hostname'] !== undefined) {
+                    form['cmi_hostname'] = parameters['cmi_hostname'];
+                }
+
+                if (parameters['hpc_port80'] !== undefined) {
+                    form['hpc_port80'] = parameters['hpc_port80'];
+                }
+
+                if (parameters['watcher_hpc_network'] !== undefined) {
+                    form['watcher_hpc_network'] = parameters['watcher_hpc_network'];
+                }
+
+                if (parameters['watcher_dnsdemux_network'] !== undefined) {
+                    form['watcher_dnsdemux_network'] = parameters['watcher_dnsdemux_network'];
+                }
+
+                if (parameters['watcher_dnsredir_network'] !== undefined) {
+                    form['watcher_dnsredir_network'] = parameters['watcher_dnsredir_network'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Hpc_Service_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Hpc_Service_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/hpcservices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Origin_Server_List_GET
+             * 
+             */
+            hpcapi.prototype.Origin_Server_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/originservers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Origin_Server_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} origin_server_id - 
+             * @param {string} url - 
+             * @param {string} contentProvider - 
+             * @param {boolean} authenticated - Status for this Site
+             * @param {boolean} enabled - Status for this Site
+             * @param {choice} protocol - 
+             * @param {boolean} redirects - Indicates whether Origin Server redirects should be used for this Origin Server
+             * @param {string} description - 
+             * 
+             */
+            hpcapi.prototype.Origin_Server_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/originservers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['origin_server_id'] !== undefined) {
+                    form['origin_server_id'] = parameters['origin_server_id'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['url'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url'));
+                    return deferred.promise;
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['contentProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: contentProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters['authenticated'] !== undefined) {
+                    form['authenticated'] = parameters['authenticated'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['protocol'] !== undefined) {
+                    form['protocol'] = parameters['protocol'];
+                }
+
+                if (parameters['protocol'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: protocol'));
+                    return deferred.promise;
+                }
+
+                if (parameters['redirects'] !== undefined) {
+                    form['redirects'] = parameters['redirects'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Origin_Server_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Origin_Server_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/originservers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Origin_Server_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} origin_server_id - 
+             * @param {string} url - 
+             * @param {string} contentProvider - 
+             * @param {boolean} authenticated - Status for this Site
+             * @param {boolean} enabled - Status for this Site
+             * @param {choice} protocol - 
+             * @param {boolean} redirects - Indicates whether Origin Server redirects should be used for this Origin Server
+             * @param {string} description - 
+             * 
+             */
+            hpcapi.prototype.Origin_Server_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/originservers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['origin_server_id'] !== undefined) {
+                    form['origin_server_id'] = parameters['origin_server_id'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['url'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url'));
+                    return deferred.promise;
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['contentProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: contentProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters['authenticated'] !== undefined) {
+                    form['authenticated'] = parameters['authenticated'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['protocol'] !== undefined) {
+                    form['protocol'] = parameters['protocol'];
+                }
+
+                if (parameters['protocol'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: protocol'));
+                    return deferred.promise;
+                }
+
+                if (parameters['redirects'] !== undefined) {
+                    form['redirects'] = parameters['redirects'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Origin_Server_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} origin_server_id - 
+             * @param {string} url - 
+             * @param {string} contentProvider - 
+             * @param {boolean} authenticated - Status for this Site
+             * @param {boolean} enabled - Status for this Site
+             * @param {choice} protocol - 
+             * @param {boolean} redirects - Indicates whether Origin Server redirects should be used for this Origin Server
+             * @param {string} description - 
+             * 
+             */
+            hpcapi.prototype.Origin_Server_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/originservers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['origin_server_id'] !== undefined) {
+                    form['origin_server_id'] = parameters['origin_server_id'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['authenticated'] !== undefined) {
+                    form['authenticated'] = parameters['authenticated'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['protocol'] !== undefined) {
+                    form['protocol'] = parameters['protocol'];
+                }
+
+                if (parameters['redirects'] !== undefined) {
+                    form['redirects'] = parameters['redirects'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Origin_Server_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Origin_Server_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/originservers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Cdn_Prefix_List_GET
+             * 
+             */
+            hpcapi.prototype.Cdn_Prefix_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/cdnprefixs/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Cdn_Prefix_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} cdn_prefix_id - 
+             * @param {string} prefix - Registered Prefix for Domain
+             * @param {string} contentProvider - 
+             * @param {string} description - Description of Content Provider
+             * @param {string} defaultOriginServer - 
+             * @param {boolean} enabled - 
+             * 
+             */
+            hpcapi.prototype.Cdn_Prefix_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/cdnprefixs/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['cdn_prefix_id'] !== undefined) {
+                    form['cdn_prefix_id'] = parameters['cdn_prefix_id'];
+                }
+
+                if (parameters['prefix'] !== undefined) {
+                    form['prefix'] = parameters['prefix'];
+                }
+
+                if (parameters['prefix'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: prefix'));
+                    return deferred.promise;
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['contentProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: contentProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['defaultOriginServer'] !== undefined) {
+                    form['defaultOriginServer'] = parameters['defaultOriginServer'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Cdn_Prefix_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Cdn_Prefix_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/cdnprefixs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Cdn_Prefix_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} cdn_prefix_id - 
+             * @param {string} prefix - Registered Prefix for Domain
+             * @param {string} contentProvider - 
+             * @param {string} description - Description of Content Provider
+             * @param {string} defaultOriginServer - 
+             * @param {boolean} enabled - 
+             * 
+             */
+            hpcapi.prototype.Cdn_Prefix_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/cdnprefixs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['cdn_prefix_id'] !== undefined) {
+                    form['cdn_prefix_id'] = parameters['cdn_prefix_id'];
+                }
+
+                if (parameters['prefix'] !== undefined) {
+                    form['prefix'] = parameters['prefix'];
+                }
+
+                if (parameters['prefix'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: prefix'));
+                    return deferred.promise;
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['contentProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: contentProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['defaultOriginServer'] !== undefined) {
+                    form['defaultOriginServer'] = parameters['defaultOriginServer'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Cdn_Prefix_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} cdn_prefix_id - 
+             * @param {string} prefix - Registered Prefix for Domain
+             * @param {string} contentProvider - 
+             * @param {string} description - Description of Content Provider
+             * @param {string} defaultOriginServer - 
+             * @param {boolean} enabled - 
+             * 
+             */
+            hpcapi.prototype.Cdn_Prefix_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/cdnprefixs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['cdn_prefix_id'] !== undefined) {
+                    form['cdn_prefix_id'] = parameters['cdn_prefix_id'];
+                }
+
+                if (parameters['prefix'] !== undefined) {
+                    form['prefix'] = parameters['prefix'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['defaultOriginServer'] !== undefined) {
+                    form['defaultOriginServer'] = parameters['defaultOriginServer'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Cdn_Prefix_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Cdn_Prefix_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/cdnprefixs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Service_Provider_List_GET
+             * 
+             */
+            hpcapi.prototype.Service_Provider_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/serviceproviders/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Service_Provider_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} hpcService - 
+             * @param {integer} service_provider_id - 
+             * @param {string} name - Service Provider Name
+             * @param {string} description - Description of Service Provider
+             * @param {boolean} enabled - 
+             * 
+             */
+            hpcapi.prototype.Service_Provider_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/serviceproviders/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['hpcService'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: hpcService'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service_provider_id'] !== undefined) {
+                    form['service_provider_id'] = parameters['service_provider_id'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Service_Provider_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Service_Provider_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/serviceproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Service_Provider_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} hpcService - 
+             * @param {integer} service_provider_id - 
+             * @param {string} name - Service Provider Name
+             * @param {string} description - Description of Service Provider
+             * @param {boolean} enabled - 
+             * 
+             */
+            hpcapi.prototype.Service_Provider_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/serviceproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['hpcService'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: hpcService'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service_provider_id'] !== undefined) {
+                    form['service_provider_id'] = parameters['service_provider_id'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Service_Provider_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} hpcService - 
+             * @param {integer} service_provider_id - 
+             * @param {string} name - Service Provider Name
+             * @param {string} description - Description of Service Provider
+             * @param {boolean} enabled - 
+             * 
+             */
+            hpcapi.prototype.Service_Provider_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/serviceproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['service_provider_id'] !== undefined) {
+                    form['service_provider_id'] = parameters['service_provider_id'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Service_Provider_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Service_Provider_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/serviceproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Content_Provider_List_GET
+             * 
+             */
+            hpcapi.prototype.Content_Provider_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/contentproviders/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Content_Provider_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} content_provider_id - 
+             * @param {string} name - 
+             * @param {boolean} enabled - 
+             * @param {string} description - Description of Content Provider
+             * @param {string} serviceProvider - 
+             * 
+             */
+            hpcapi.prototype.Content_Provider_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/contentproviders/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['content_provider_id'] !== undefined) {
+                    form['content_provider_id'] = parameters['content_provider_id'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['serviceProvider'] !== undefined) {
+                    form['serviceProvider'] = parameters['serviceProvider'];
+                }
+
+                if (parameters['serviceProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: serviceProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Content_Provider_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Content_Provider_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/contentproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Content_Provider_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} content_provider_id - 
+             * @param {string} name - 
+             * @param {boolean} enabled - 
+             * @param {string} description - Description of Content Provider
+             * @param {string} serviceProvider - 
+             * 
+             */
+            hpcapi.prototype.Content_Provider_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/contentproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['content_provider_id'] !== undefined) {
+                    form['content_provider_id'] = parameters['content_provider_id'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['serviceProvider'] !== undefined) {
+                    form['serviceProvider'] = parameters['serviceProvider'];
+                }
+
+                if (parameters['serviceProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: serviceProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Content_Provider_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {integer} content_provider_id - 
+             * @param {string} name - 
+             * @param {boolean} enabled - 
+             * @param {string} description - Description of Content Provider
+             * @param {string} serviceProvider - 
+             * 
+             */
+            hpcapi.prototype.Content_Provider_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/contentproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['content_provider_id'] !== undefined) {
+                    form['content_provider_id'] = parameters['content_provider_id'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['serviceProvider'] !== undefined) {
+                    form['serviceProvider'] = parameters['serviceProvider'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Content_Provider_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Content_Provider_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/contentproviders/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Access_Map_List_GET
+             * 
+             */
+            hpcapi.prototype.Access_Map_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/accessmaps/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Access_Map_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} contentProvider - 
+             * @param {string} name - Name of the Access Map
+             * @param {string} description - 
+             * @param {string} map - specifies which client requests are allowed
+             * 
+             */
+            hpcapi.prototype.Access_Map_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/accessmaps/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['contentProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: contentProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['map'] !== undefined) {
+                    form['map'] = parameters['map'];
+                }
+
+                if (parameters['map'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: map'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Access_Map_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Access_Map_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/accessmaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Access_Map_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} contentProvider - 
+             * @param {string} name - Name of the Access Map
+             * @param {string} description - 
+             * @param {string} map - specifies which client requests are allowed
+             * 
+             */
+            hpcapi.prototype.Access_Map_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/accessmaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['contentProvider'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: contentProvider'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['map'] !== undefined) {
+                    form['map'] = parameters['map'];
+                }
+
+                if (parameters['map'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: map'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Access_Map_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} contentProvider - 
+             * @param {string} name - Name of the Access Map
+             * @param {string} description - 
+             * @param {string} map - specifies which client requests are allowed
+             * 
+             */
+            hpcapi.prototype.Access_Map_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/accessmaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['map'] !== undefined) {
+                    form['map'] = parameters['map'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Access_Map_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Access_Map_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/accessmaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Site_Map_List_GET
+             * 
+             */
+            hpcapi.prototype.Site_Map_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/sitemaps/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Site_Map_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} contentProvider - 
+             * @param {string} serviceProvider - 
+             * @param {string} cdnPrefix - 
+             * @param {string} hpcService - 
+             * @param {string} name - Name of the Site Map
+             * @param {string} description - 
+             * @param {string} map - specifies how to map requests to hpc instances
+             * @param {integer} map_id - 
+             * 
+             */
+            hpcapi.prototype.Site_Map_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/sitemaps/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['serviceProvider'] !== undefined) {
+                    form['serviceProvider'] = parameters['serviceProvider'];
+                }
+
+                if (parameters['cdnPrefix'] !== undefined) {
+                    form['cdnPrefix'] = parameters['cdnPrefix'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['map'] !== undefined) {
+                    form['map'] = parameters['map'];
+                }
+
+                if (parameters['map'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: map'));
+                    return deferred.promise;
+                }
+
+                if (parameters['map_id'] !== undefined) {
+                    form['map_id'] = parameters['map_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Site_Map_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Site_Map_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/sitemaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Site_Map_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} contentProvider - 
+             * @param {string} serviceProvider - 
+             * @param {string} cdnPrefix - 
+             * @param {string} hpcService - 
+             * @param {string} name - Name of the Site Map
+             * @param {string} description - 
+             * @param {string} map - specifies how to map requests to hpc instances
+             * @param {integer} map_id - 
+             * 
+             */
+            hpcapi.prototype.Site_Map_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/sitemaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['serviceProvider'] !== undefined) {
+                    form['serviceProvider'] = parameters['serviceProvider'];
+                }
+
+                if (parameters['cdnPrefix'] !== undefined) {
+                    form['cdnPrefix'] = parameters['cdnPrefix'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['map'] !== undefined) {
+                    form['map'] = parameters['map'];
+                }
+
+                if (parameters['map'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: map'));
+                    return deferred.promise;
+                }
+
+                if (parameters['map_id'] !== undefined) {
+                    form['map_id'] = parameters['map_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Site_Map_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} contentProvider - 
+             * @param {string} serviceProvider - 
+             * @param {string} cdnPrefix - 
+             * @param {string} hpcService - 
+             * @param {string} name - Name of the Site Map
+             * @param {string} description - 
+             * @param {string} map - specifies how to map requests to hpc instances
+             * @param {integer} map_id - 
+             * 
+             */
+            hpcapi.prototype.Site_Map_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/sitemaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['contentProvider'] !== undefined) {
+                    form['contentProvider'] = parameters['contentProvider'];
+                }
+
+                if (parameters['serviceProvider'] !== undefined) {
+                    form['serviceProvider'] = parameters['serviceProvider'];
+                }
+
+                if (parameters['cdnPrefix'] !== undefined) {
+                    form['cdnPrefix'] = parameters['cdnPrefix'];
+                }
+
+                if (parameters['hpcService'] !== undefined) {
+                    form['hpcService'] = parameters['hpcService'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['map'] !== undefined) {
+                    form['map'] = parameters['map'];
+                }
+
+                if (parameters['map_id'] !== undefined) {
+                    form['map_id'] = parameters['map_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name hpcapi#Site_Map_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            hpcapi.prototype.Site_Map_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/hpcapi/sitemaps/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = hpcapi.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+
+            return hpcapi;
+        })();
+
+        return hpcapi;
+    }]);
\ No newline at end of file
diff --git a/gui/ngXosLib/api/ng-xos.js b/gui/ngXosLib/api/ng-xos.js
new file mode 100755
index 0000000..20ea691
--- /dev/null
+++ b/gui/ngXosLib/api/ng-xos.js
@@ -0,0 +1,39957 @@
+/*jshint -W069 */
+/*global angular:false */
+angular.module('xos.xos', [])
+    .factory('xos', ['$q', '$http', '$rootScope', function($q, $http, $rootScope) {
+        'use strict';
+
+        /**
+         * 
+         * @class xos
+         * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.
+         * @param {string} [domainOrOptions.domain] - The project domain
+         * @param {string} [domainOrOptions.cache] - An angularjs cache implementation
+         * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties
+         * @param {string} [cache] - An angularjs cache implementation
+         */
+        var xos = (function() {
+            function xos(options, cache) {
+                var domain = (typeof options === 'object') ? options.domain : options;
+                this.domain = typeof(domain) === 'string' ? domain : 'http://localhost:9999';
+                cache = cache || ((typeof options === 'object') ? options.cache : cache);
+                this.cache = cache;
+            }
+
+            xos.prototype.$on = function($scope, path, handler) {
+                var url = domain + path;
+                $scope.$on(url, function() {
+                    handler();
+                });
+                return this;
+            };
+
+            xos.prototype.$broadcast = function(path) {
+                var url = domain + path;
+                //cache.remove(url);
+                $rootScope.$broadcast(url);
+                return this;
+            };
+
+            xos.transformRequest = function(obj) {
+                var str = [];
+                for (var p in obj) {
+                    var val = obj[p];
+                    if (angular.isArray(val)) {
+                        val.forEach(function(val) {
+                            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                        });
+                    } else {
+                        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                    }
+                }
+                return str.join("&");
+            };
+
+            /**
+             * 
+             * @method
+             * @name xos#Api_Root_GET
+             * 
+             */
+            xos.prototype.Api_Root_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Role_List_GET
+             * 
+             */
+            xos.prototype.Site_Role_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/site_roles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Role_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Site_Role_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/site_roles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Role_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Role_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/site_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Role_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Site_Role_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/site_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Role_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Site_Role_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/site_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Role_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Role_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/site_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Attribute_List_GET
+             * 
+             */
+            xos.prototype.Service_Attribute_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceattributes/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Attribute_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Attribute Name
+             * @param {string} value - Attribute Value
+             * @param {string} service - The Service this attribute is associated with
+             * 
+             */
+            xos.prototype.Service_Attribute_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceattributes/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Attribute_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Attribute_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceattributes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Attribute_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Attribute Name
+             * @param {string} value - Attribute Value
+             * @param {string} service - The Service this attribute is associated with
+             * 
+             */
+            xos.prototype.Service_Attribute_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceattributes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Attribute_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Attribute Name
+             * @param {string} value - Attribute Value
+             * @param {string} service - The Service this attribute is associated with
+             * 
+             */
+            xos.prototype.Service_Attribute_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceattributes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Attribute_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Attribute_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceattributes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Images_List_GET
+             * 
+             */
+            xos.prototype.Controller_Images_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerimages/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Images_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} image - 
+             * @param {string} controller - 
+             * @param {string} glance_image_id - Glance image id
+             * 
+             */
+            xos.prototype.Controller_Images_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerimages/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['image'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: image'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['glance_image_id'] !== undefined) {
+                    form['glance_image_id'] = parameters['glance_image_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Images_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Images_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerimages/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Images_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} image - 
+             * @param {string} controller - 
+             * @param {string} glance_image_id - Glance image id
+             * 
+             */
+            xos.prototype.Controller_Images_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerimages/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['image'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: image'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['glance_image_id'] !== undefined) {
+                    form['glance_image_id'] = parameters['glance_image_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Images_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} image - 
+             * @param {string} controller - 
+             * @param {string} glance_image_id - Glance image id
+             * 
+             */
+            xos.prototype.Controller_Images_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerimages/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['glance_image_id'] !== undefined) {
+                    form['glance_image_id'] = parameters['glance_image_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Images_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Images_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerimages/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Controller_Site_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersiteprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} site_privilege - 
+             * @param {string} role_id - Keystone id
+             * 
+             */
+            xos.prototype.Controller_Site_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersiteprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site_privilege'] !== undefined) {
+                    form['site_privilege'] = parameters['site_privilege'];
+                }
+
+                if (parameters['site_privilege'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site_privilege'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role_id'] !== undefined) {
+                    form['role_id'] = parameters['role_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Site_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersiteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} site_privilege - 
+             * @param {string} role_id - Keystone id
+             * 
+             */
+            xos.prototype.Controller_Site_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersiteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site_privilege'] !== undefined) {
+                    form['site_privilege'] = parameters['site_privilege'];
+                }
+
+                if (parameters['site_privilege'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site_privilege'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role_id'] !== undefined) {
+                    form['role_id'] = parameters['role_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} site_privilege - 
+             * @param {string} role_id - Keystone id
+             * 
+             */
+            xos.prototype.Controller_Site_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersiteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['site_privilege'] !== undefined) {
+                    form['site_privilege'] = parameters['site_privilege'];
+                }
+
+                if (parameters['role_id'] !== undefined) {
+                    form['role_id'] = parameters['role_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Site_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersiteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_List_GET
+             * 
+             */
+            xos.prototype.Image_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/images/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} disk_format - 
+             * @param {string} container_format - 
+             * @param {string} path - Path to image on local disk
+             * 
+             */
+            xos.prototype.Image_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/images/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['disk_format'] !== undefined) {
+                    form['disk_format'] = parameters['disk_format'];
+                }
+
+                if (parameters['disk_format'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: disk_format'));
+                    return deferred.promise;
+                }
+
+                if (parameters['container_format'] !== undefined) {
+                    form['container_format'] = parameters['container_format'];
+                }
+
+                if (parameters['container_format'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: container_format'));
+                    return deferred.promise;
+                }
+
+                if (parameters['path'] !== undefined) {
+                    form['path'] = parameters['path'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Image_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/images/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} disk_format - 
+             * @param {string} container_format - 
+             * @param {string} path - Path to image on local disk
+             * 
+             */
+            xos.prototype.Image_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/images/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['disk_format'] !== undefined) {
+                    form['disk_format'] = parameters['disk_format'];
+                }
+
+                if (parameters['disk_format'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: disk_format'));
+                    return deferred.promise;
+                }
+
+                if (parameters['container_format'] !== undefined) {
+                    form['container_format'] = parameters['container_format'];
+                }
+
+                if (parameters['container_format'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: container_format'));
+                    return deferred.promise;
+                }
+
+                if (parameters['path'] !== undefined) {
+                    form['path'] = parameters['path'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} disk_format - 
+             * @param {string} container_format - 
+             * @param {string} path - Path to image on local disk
+             * 
+             */
+            xos.prototype.Image_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/images/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['disk_format'] !== undefined) {
+                    form['disk_format'] = parameters['disk_format'];
+                }
+
+                if (parameters['container_format'] !== undefined) {
+                    form['container_format'] = parameters['container_format'];
+                }
+
+                if (parameters['path'] !== undefined) {
+                    form['path'] = parameters['path'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Image_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/images/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_List_GET
+             * 
+             */
+            xos.prototype.Network_Parameter_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparameters/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} parameter - The type of the parameter
+             * @param {string} value - The value of this parameter
+             * @param {string} content_type - 
+             * @param {integer} object_id - 
+             * 
+             */
+            xos.prototype.Network_Parameter_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparameters/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['parameter'] !== undefined) {
+                    form['parameter'] = parameters['parameter'];
+                }
+
+                if (parameters['parameter'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: parameter'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['content_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: content_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['object_id'] !== undefined) {
+                    form['object_id'] = parameters['object_id'];
+                }
+
+                if (parameters['object_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: object_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparameters/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} parameter - The type of the parameter
+             * @param {string} value - The value of this parameter
+             * @param {string} content_type - 
+             * @param {integer} object_id - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparameters/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['parameter'] !== undefined) {
+                    form['parameter'] = parameters['parameter'];
+                }
+
+                if (parameters['parameter'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: parameter'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['content_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: content_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['object_id'] !== undefined) {
+                    form['object_id'] = parameters['object_id'];
+                }
+
+                if (parameters['object_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: object_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} parameter - The type of the parameter
+             * @param {string} value - The value of this parameter
+             * @param {string} content_type - 
+             * @param {integer} object_id - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparameters/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['parameter'] !== undefined) {
+                    form['parameter'] = parameters['parameter'];
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['object_id'] !== undefined) {
+                    form['object_id'] = parameters['object_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparameters/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_List_GET
+             * 
+             */
+            xos.prototype.Site_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sites/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name for this Site
+             * @param {string} site_url - Site's Home URL Page
+             * @param {boolean} enabled - Status for this Site
+             * @param {boolean} hosts_nodes - Indicates whether or not the site host nodes
+             * @param {boolean} hosts_users - Indicates whether or not the site manages user accounts
+             * @param {string} location - 
+             * @param {number} longitude - 
+             * @param {number} latitude - 
+             * @param {string} login_base - Prefix for Slices associated with this Site
+             * @param {boolean} is_public - Indicates the visibility of this site to other members
+             * @param {string} abbreviated_name - 
+             * 
+             */
+            xos.prototype.Site_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sites/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site_url'] !== undefined) {
+                    form['site_url'] = parameters['site_url'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['hosts_nodes'] !== undefined) {
+                    form['hosts_nodes'] = parameters['hosts_nodes'];
+                }
+
+                if (parameters['hosts_users'] !== undefined) {
+                    form['hosts_users'] = parameters['hosts_users'];
+                }
+
+                if (parameters['location'] !== undefined) {
+                    form['location'] = parameters['location'];
+                }
+
+                if (parameters['location'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: location'));
+                    return deferred.promise;
+                }
+
+                if (parameters['longitude'] !== undefined) {
+                    form['longitude'] = parameters['longitude'];
+                }
+
+                if (parameters['latitude'] !== undefined) {
+                    form['latitude'] = parameters['latitude'];
+                }
+
+                if (parameters['login_base'] !== undefined) {
+                    form['login_base'] = parameters['login_base'];
+                }
+
+                if (parameters['login_base'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: login_base'));
+                    return deferred.promise;
+                }
+
+                if (parameters['is_public'] !== undefined) {
+                    form['is_public'] = parameters['is_public'];
+                }
+
+                if (parameters['abbreviated_name'] !== undefined) {
+                    form['abbreviated_name'] = parameters['abbreviated_name'];
+                }
+
+                if (parameters['abbreviated_name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: abbreviated_name'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name for this Site
+             * @param {string} site_url - Site's Home URL Page
+             * @param {boolean} enabled - Status for this Site
+             * @param {boolean} hosts_nodes - Indicates whether or not the site host nodes
+             * @param {boolean} hosts_users - Indicates whether or not the site manages user accounts
+             * @param {string} location - 
+             * @param {number} longitude - 
+             * @param {number} latitude - 
+             * @param {string} login_base - Prefix for Slices associated with this Site
+             * @param {boolean} is_public - Indicates the visibility of this site to other members
+             * @param {string} abbreviated_name - 
+             * 
+             */
+            xos.prototype.Site_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site_url'] !== undefined) {
+                    form['site_url'] = parameters['site_url'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['hosts_nodes'] !== undefined) {
+                    form['hosts_nodes'] = parameters['hosts_nodes'];
+                }
+
+                if (parameters['hosts_users'] !== undefined) {
+                    form['hosts_users'] = parameters['hosts_users'];
+                }
+
+                if (parameters['location'] !== undefined) {
+                    form['location'] = parameters['location'];
+                }
+
+                if (parameters['location'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: location'));
+                    return deferred.promise;
+                }
+
+                if (parameters['longitude'] !== undefined) {
+                    form['longitude'] = parameters['longitude'];
+                }
+
+                if (parameters['latitude'] !== undefined) {
+                    form['latitude'] = parameters['latitude'];
+                }
+
+                if (parameters['login_base'] !== undefined) {
+                    form['login_base'] = parameters['login_base'];
+                }
+
+                if (parameters['login_base'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: login_base'));
+                    return deferred.promise;
+                }
+
+                if (parameters['is_public'] !== undefined) {
+                    form['is_public'] = parameters['is_public'];
+                }
+
+                if (parameters['abbreviated_name'] !== undefined) {
+                    form['abbreviated_name'] = parameters['abbreviated_name'];
+                }
+
+                if (parameters['abbreviated_name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: abbreviated_name'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name for this Site
+             * @param {string} site_url - Site's Home URL Page
+             * @param {boolean} enabled - Status for this Site
+             * @param {boolean} hosts_nodes - Indicates whether or not the site host nodes
+             * @param {boolean} hosts_users - Indicates whether or not the site manages user accounts
+             * @param {string} location - 
+             * @param {number} longitude - 
+             * @param {number} latitude - 
+             * @param {string} login_base - Prefix for Slices associated with this Site
+             * @param {boolean} is_public - Indicates the visibility of this site to other members
+             * @param {string} abbreviated_name - 
+             * 
+             */
+            xos.prototype.Site_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['site_url'] !== undefined) {
+                    form['site_url'] = parameters['site_url'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['hosts_nodes'] !== undefined) {
+                    form['hosts_nodes'] = parameters['hosts_nodes'];
+                }
+
+                if (parameters['hosts_users'] !== undefined) {
+                    form['hosts_users'] = parameters['hosts_users'];
+                }
+
+                if (parameters['location'] !== undefined) {
+                    form['location'] = parameters['location'];
+                }
+
+                if (parameters['longitude'] !== undefined) {
+                    form['longitude'] = parameters['longitude'];
+                }
+
+                if (parameters['latitude'] !== undefined) {
+                    form['latitude'] = parameters['latitude'];
+                }
+
+                if (parameters['login_base'] !== undefined) {
+                    form['login_base'] = parameters['login_base'];
+                }
+
+                if (parameters['is_public'] !== undefined) {
+                    form['is_public'] = parameters['is_public'];
+                }
+
+                if (parameters['abbreviated_name'] !== undefined) {
+                    form['abbreviated_name'] = parameters['abbreviated_name'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Role_List_GET
+             * 
+             */
+            xos.prototype.Tenant_Root_Role_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootroles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Role_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Role_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootroles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Role_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Role_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Role_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Role_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Role_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Role_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Role_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Role_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Role_List_GET
+             * 
+             */
+            xos.prototype.Slice_Role_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_roles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Role_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Slice_Role_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_roles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Role_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Role_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Role_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Slice_Role_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Role_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {choice} role - 
+             * 
+             */
+            xos.prototype.Slice_Role_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Role_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Role_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tag_List_GET
+             * 
+             */
+            xos.prototype.Tag_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tags/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tag_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} service - The Service this Tag is associated with
+             * @param {string} name - The name of this tag
+             * @param {string} value - The value of this tag
+             * @param {string} content_type - 
+             * @param {integer} object_id - 
+             * 
+             */
+            xos.prototype.Tag_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tags/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['content_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: content_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['object_id'] !== undefined) {
+                    form['object_id'] = parameters['object_id'];
+                }
+
+                if (parameters['object_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: object_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tag_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tag_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tag_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} service - The Service this Tag is associated with
+             * @param {string} name - The name of this tag
+             * @param {string} value - The value of this tag
+             * @param {string} content_type - 
+             * @param {integer} object_id - 
+             * 
+             */
+            xos.prototype.Tag_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['content_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: content_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['object_id'] !== undefined) {
+                    form['object_id'] = parameters['object_id'];
+                }
+
+                if (parameters['object_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: object_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tag_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} service - The Service this Tag is associated with
+             * @param {string} name - The name of this tag
+             * @param {string} value - The value of this tag
+             * @param {string} content_type - 
+             * @param {integer} object_id - 
+             * 
+             */
+            xos.prototype.Tag_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['object_id'] !== undefined) {
+                    form['object_id'] = parameters['object_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tag_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tag_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Invoice_List_GET
+             * 
+             */
+            xos.prototype.Invoice_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/invoices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Invoice_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} date - 
+             * @param {string} account - 
+             * 
+             */
+            xos.prototype.Invoice_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/invoices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['date'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: date'));
+                    return deferred.promise;
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['account'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: account'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Invoice_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Invoice_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/invoices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Invoice_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} date - 
+             * @param {string} account - 
+             * 
+             */
+            xos.prototype.Invoice_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/invoices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['date'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: date'));
+                    return deferred.promise;
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['account'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: account'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Invoice_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} date - 
+             * @param {string} account - 
+             * 
+             */
+            xos.prototype.Invoice_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/invoices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Invoice_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Invoice_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/invoices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Slice_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_privileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} slice - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Slice_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_privileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_privileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} slice - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Slice_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_privileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} slice - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Slice_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_privileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slice_privileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Flavor_List_GET
+             * 
+             */
+            xos.prototype.Flavor_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/flavors/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Flavor_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - name of this flavor, as displayed to users
+             * @param {string} description - 
+             * @param {string} flavor - flavor string used to configure deployments
+             * @param {integer} order - used to order flavors when displayed in a list
+             * @param {boolean} default - make this a default flavor to use when creating new instances
+             * 
+             */
+            xos.prototype.Flavor_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/flavors/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['flavor'] !== undefined) {
+                    form['flavor'] = parameters['flavor'];
+                }
+
+                if (parameters['flavor'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: flavor'));
+                    return deferred.promise;
+                }
+
+                if (parameters['order'] !== undefined) {
+                    form['order'] = parameters['order'];
+                }
+
+                if (parameters['order'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: order'));
+                    return deferred.promise;
+                }
+
+                if (parameters['default'] !== undefined) {
+                    form['default'] = parameters['default'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Flavor_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Flavor_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/flavors/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Flavor_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - name of this flavor, as displayed to users
+             * @param {string} description - 
+             * @param {string} flavor - flavor string used to configure deployments
+             * @param {integer} order - used to order flavors when displayed in a list
+             * @param {boolean} default - make this a default flavor to use when creating new instances
+             * 
+             */
+            xos.prototype.Flavor_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/flavors/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['flavor'] !== undefined) {
+                    form['flavor'] = parameters['flavor'];
+                }
+
+                if (parameters['flavor'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: flavor'));
+                    return deferred.promise;
+                }
+
+                if (parameters['order'] !== undefined) {
+                    form['order'] = parameters['order'];
+                }
+
+                if (parameters['order'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: order'));
+                    return deferred.promise;
+                }
+
+                if (parameters['default'] !== undefined) {
+                    form['default'] = parameters['default'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Flavor_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - name of this flavor, as displayed to users
+             * @param {string} description - 
+             * @param {string} flavor - flavor string used to configure deployments
+             * @param {integer} order - used to order flavors when displayed in a list
+             * @param {boolean} default - make this a default flavor to use when creating new instances
+             * 
+             */
+            xos.prototype.Flavor_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/flavors/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['flavor'] !== undefined) {
+                    form['flavor'] = parameters['flavor'];
+                }
+
+                if (parameters['order'] !== undefined) {
+                    form['order'] = parameters['order'];
+                }
+
+                if (parameters['default'] !== undefined) {
+                    form['default'] = parameters['default'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Flavor_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Flavor_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/flavors/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Port_List_GET
+             * 
+             */
+            xos.prototype.Port_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/ports/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Port_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} instance - 
+             * @param {string} ip - Instance ip address
+             * @param {string} port_id - Quantum port id
+             * @param {string} mac - MAC address associated with this port
+             * 
+             */
+            xos.prototype.Port_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/ports/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['network'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: network'));
+                    return deferred.promise;
+                }
+
+                if (parameters['instance'] !== undefined) {
+                    form['instance'] = parameters['instance'];
+                }
+
+                if (parameters['ip'] !== undefined) {
+                    form['ip'] = parameters['ip'];
+                }
+
+                if (parameters['port_id'] !== undefined) {
+                    form['port_id'] = parameters['port_id'];
+                }
+
+                if (parameters['mac'] !== undefined) {
+                    form['mac'] = parameters['mac'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Port_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Port_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/ports/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Port_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} instance - 
+             * @param {string} ip - Instance ip address
+             * @param {string} port_id - Quantum port id
+             * @param {string} mac - MAC address associated with this port
+             * 
+             */
+            xos.prototype.Port_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/ports/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['network'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: network'));
+                    return deferred.promise;
+                }
+
+                if (parameters['instance'] !== undefined) {
+                    form['instance'] = parameters['instance'];
+                }
+
+                if (parameters['ip'] !== undefined) {
+                    form['ip'] = parameters['ip'];
+                }
+
+                if (parameters['port_id'] !== undefined) {
+                    form['port_id'] = parameters['port_id'];
+                }
+
+                if (parameters['mac'] !== undefined) {
+                    form['mac'] = parameters['mac'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Port_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} instance - 
+             * @param {string} ip - Instance ip address
+             * @param {string} port_id - Quantum port id
+             * @param {string} mac - MAC address associated with this port
+             * 
+             */
+            xos.prototype.Port_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/ports/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['instance'] !== undefined) {
+                    form['instance'] = parameters['instance'];
+                }
+
+                if (parameters['ip'] !== undefined) {
+                    form['ip'] = parameters['ip'];
+                }
+
+                if (parameters['port_id'] !== undefined) {
+                    form['port_id'] = parameters['port_id'];
+                }
+
+                if (parameters['mac'] !== undefined) {
+                    form['mac'] = parameters['mac'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Port_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Port_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/ports/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_List_GET
+             * 
+             */
+            xos.prototype.Controller_Site_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersites/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - 
+             * @param {string} controller - 
+             * @param {string} tenant_id - Keystone tenant id
+             * 
+             */
+            xos.prototype.Controller_Site_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersites/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['tenant_id'] !== undefined) {
+                    form['tenant_id'] = parameters['tenant_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Site_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - 
+             * @param {string} controller - 
+             * @param {string} tenant_id - Keystone tenant id
+             * 
+             */
+            xos.prototype.Controller_Site_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['tenant_id'] !== undefined) {
+                    form['tenant_id'] = parameters['tenant_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - 
+             * @param {string} controller - 
+             * @param {string} tenant_id - Keystone tenant id
+             * 
+             */
+            xos.prototype.Controller_Site_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['tenant_id'] !== undefined) {
+                    form['tenant_id'] = parameters['tenant_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Site_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Site_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersites/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Project_List_GET
+             * 
+             */
+            xos.prototype.Project_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/projects/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Project_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of Project
+             * 
+             */
+            xos.prototype.Project_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/projects/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Project_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Project_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/projects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Project_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of Project
+             * 
+             */
+            xos.prototype.Project_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/projects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Project_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of Project
+             * 
+             */
+            xos.prototype.Project_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/projects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Project_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Project_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/projects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_List_GET
+             * 
+             */
+            xos.prototype.Slice_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - The Name of the Slice
+             * @param {boolean} enabled - Status for this Slice
+             * @param {boolean} omf_friendly - 
+             * @param {string} description - High level description of the slice and expected activities
+             * @param {string} slice_url - 
+             * @param {string} site - The Site this Slice belongs to
+             * @param {integer} max_instances - 
+             * @param {string} service - 
+             * @param {string} network - 
+             * @param {string} serviceClass - 
+             * @param {string} creator - 
+             * @param {string} default_flavor - 
+             * @param {string} default_image - 
+             * @param {string} mount_data_sets - 
+             * 
+             */
+            xos.prototype.Slice_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['omf_friendly'] !== undefined) {
+                    form['omf_friendly'] = parameters['omf_friendly'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['slice_url'] !== undefined) {
+                    form['slice_url'] = parameters['slice_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['max_instances'] !== undefined) {
+                    form['max_instances'] = parameters['max_instances'];
+                }
+
+                if (parameters['max_instances'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: max_instances'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['default_flavor'] !== undefined) {
+                    form['default_flavor'] = parameters['default_flavor'];
+                }
+
+                if (parameters['default_image'] !== undefined) {
+                    form['default_image'] = parameters['default_image'];
+                }
+
+                if (parameters['mount_data_sets'] !== undefined) {
+                    form['mount_data_sets'] = parameters['mount_data_sets'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - The Name of the Slice
+             * @param {boolean} enabled - Status for this Slice
+             * @param {boolean} omf_friendly - 
+             * @param {string} description - High level description of the slice and expected activities
+             * @param {string} slice_url - 
+             * @param {string} site - The Site this Slice belongs to
+             * @param {integer} max_instances - 
+             * @param {string} service - 
+             * @param {string} network - 
+             * @param {string} serviceClass - 
+             * @param {string} creator - 
+             * @param {string} default_flavor - 
+             * @param {string} default_image - 
+             * @param {string} mount_data_sets - 
+             * 
+             */
+            xos.prototype.Slice_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['omf_friendly'] !== undefined) {
+                    form['omf_friendly'] = parameters['omf_friendly'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['slice_url'] !== undefined) {
+                    form['slice_url'] = parameters['slice_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['max_instances'] !== undefined) {
+                    form['max_instances'] = parameters['max_instances'];
+                }
+
+                if (parameters['max_instances'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: max_instances'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['default_flavor'] !== undefined) {
+                    form['default_flavor'] = parameters['default_flavor'];
+                }
+
+                if (parameters['default_image'] !== undefined) {
+                    form['default_image'] = parameters['default_image'];
+                }
+
+                if (parameters['mount_data_sets'] !== undefined) {
+                    form['mount_data_sets'] = parameters['mount_data_sets'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - The Name of the Slice
+             * @param {boolean} enabled - Status for this Slice
+             * @param {boolean} omf_friendly - 
+             * @param {string} description - High level description of the slice and expected activities
+             * @param {string} slice_url - 
+             * @param {string} site - The Site this Slice belongs to
+             * @param {integer} max_instances - 
+             * @param {string} service - 
+             * @param {string} network - 
+             * @param {string} serviceClass - 
+             * @param {string} creator - 
+             * @param {string} default_flavor - 
+             * @param {string} default_image - 
+             * @param {string} mount_data_sets - 
+             * 
+             */
+            xos.prototype.Slice_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['omf_friendly'] !== undefined) {
+                    form['omf_friendly'] = parameters['omf_friendly'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['slice_url'] !== undefined) {
+                    form['slice_url'] = parameters['slice_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['max_instances'] !== undefined) {
+                    form['max_instances'] = parameters['max_instances'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['default_flavor'] !== undefined) {
+                    form['default_flavor'] = parameters['default_flavor'];
+                }
+
+                if (parameters['default_image'] !== undefined) {
+                    form['default_image'] = parameters['default_image'];
+                }
+
+                if (parameters['mount_data_sets'] !== undefined) {
+                    form['mount_data_sets'] = parameters['mount_data_sets'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_List_GET
+             * 
+             */
+            xos.prototype.Network_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networks/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} template - 
+             * @param {string} subnet - 
+             * @param {string} ports - 
+             * @param {string} labels - 
+             * @param {string} owner - Slice that owns control of this Network
+             * @param {integer} guaranteed_bandwidth - 
+             * @param {boolean} permit_all_slices - 
+             * @param {string} topology_parameters - 
+             * @param {string} controller_url - 
+             * @param {string} controller_parameters - 
+             * @param {string} network_id - Quantum network
+             * @param {string} router_id - Quantum router id
+             * @param {string} subnet_id - Quantum subnet id
+             * @param {boolean} autoconnect - This network can be autoconnected to the slice that owns it
+             * 
+             */
+            xos.prototype.Network_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networks/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['template'] !== undefined) {
+                    form['template'] = parameters['template'];
+                }
+
+                if (parameters['template'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: template'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subnet'] !== undefined) {
+                    form['subnet'] = parameters['subnet'];
+                }
+
+                if (parameters['ports'] !== undefined) {
+                    form['ports'] = parameters['ports'];
+                }
+
+                if (parameters['labels'] !== undefined) {
+                    form['labels'] = parameters['labels'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['owner'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: owner'));
+                    return deferred.promise;
+                }
+
+                if (parameters['guaranteed_bandwidth'] !== undefined) {
+                    form['guaranteed_bandwidth'] = parameters['guaranteed_bandwidth'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: guaranteed_bandwidth'));
+                    return deferred.promise;
+                }
+
+                if (parameters['permit_all_slices'] !== undefined) {
+                    form['permit_all_slices'] = parameters['permit_all_slices'];
+                }
+
+                if (parameters['topology_parameters'] !== undefined) {
+                    form['topology_parameters'] = parameters['topology_parameters'];
+                }
+
+                if (parameters['controller_url'] !== undefined) {
+                    form['controller_url'] = parameters['controller_url'];
+                }
+
+                if (parameters['controller_parameters'] !== undefined) {
+                    form['controller_parameters'] = parameters['controller_parameters'];
+                }
+
+                if (parameters['network_id'] !== undefined) {
+                    form['network_id'] = parameters['network_id'];
+                }
+
+                if (parameters['router_id'] !== undefined) {
+                    form['router_id'] = parameters['router_id'];
+                }
+
+                if (parameters['subnet_id'] !== undefined) {
+                    form['subnet_id'] = parameters['subnet_id'];
+                }
+
+                if (parameters['autoconnect'] !== undefined) {
+                    form['autoconnect'] = parameters['autoconnect'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} template - 
+             * @param {string} subnet - 
+             * @param {string} ports - 
+             * @param {string} labels - 
+             * @param {string} owner - Slice that owns control of this Network
+             * @param {integer} guaranteed_bandwidth - 
+             * @param {boolean} permit_all_slices - 
+             * @param {string} topology_parameters - 
+             * @param {string} controller_url - 
+             * @param {string} controller_parameters - 
+             * @param {string} network_id - Quantum network
+             * @param {string} router_id - Quantum router id
+             * @param {string} subnet_id - Quantum subnet id
+             * @param {boolean} autoconnect - This network can be autoconnected to the slice that owns it
+             * 
+             */
+            xos.prototype.Network_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['template'] !== undefined) {
+                    form['template'] = parameters['template'];
+                }
+
+                if (parameters['template'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: template'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subnet'] !== undefined) {
+                    form['subnet'] = parameters['subnet'];
+                }
+
+                if (parameters['ports'] !== undefined) {
+                    form['ports'] = parameters['ports'];
+                }
+
+                if (parameters['labels'] !== undefined) {
+                    form['labels'] = parameters['labels'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['owner'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: owner'));
+                    return deferred.promise;
+                }
+
+                if (parameters['guaranteed_bandwidth'] !== undefined) {
+                    form['guaranteed_bandwidth'] = parameters['guaranteed_bandwidth'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: guaranteed_bandwidth'));
+                    return deferred.promise;
+                }
+
+                if (parameters['permit_all_slices'] !== undefined) {
+                    form['permit_all_slices'] = parameters['permit_all_slices'];
+                }
+
+                if (parameters['topology_parameters'] !== undefined) {
+                    form['topology_parameters'] = parameters['topology_parameters'];
+                }
+
+                if (parameters['controller_url'] !== undefined) {
+                    form['controller_url'] = parameters['controller_url'];
+                }
+
+                if (parameters['controller_parameters'] !== undefined) {
+                    form['controller_parameters'] = parameters['controller_parameters'];
+                }
+
+                if (parameters['network_id'] !== undefined) {
+                    form['network_id'] = parameters['network_id'];
+                }
+
+                if (parameters['router_id'] !== undefined) {
+                    form['router_id'] = parameters['router_id'];
+                }
+
+                if (parameters['subnet_id'] !== undefined) {
+                    form['subnet_id'] = parameters['subnet_id'];
+                }
+
+                if (parameters['autoconnect'] !== undefined) {
+                    form['autoconnect'] = parameters['autoconnect'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} template - 
+             * @param {string} subnet - 
+             * @param {string} ports - 
+             * @param {string} labels - 
+             * @param {string} owner - Slice that owns control of this Network
+             * @param {integer} guaranteed_bandwidth - 
+             * @param {boolean} permit_all_slices - 
+             * @param {string} topology_parameters - 
+             * @param {string} controller_url - 
+             * @param {string} controller_parameters - 
+             * @param {string} network_id - Quantum network
+             * @param {string} router_id - Quantum router id
+             * @param {string} subnet_id - Quantum subnet id
+             * @param {boolean} autoconnect - This network can be autoconnected to the slice that owns it
+             * 
+             */
+            xos.prototype.Network_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['template'] !== undefined) {
+                    form['template'] = parameters['template'];
+                }
+
+                if (parameters['subnet'] !== undefined) {
+                    form['subnet'] = parameters['subnet'];
+                }
+
+                if (parameters['ports'] !== undefined) {
+                    form['ports'] = parameters['ports'];
+                }
+
+                if (parameters['labels'] !== undefined) {
+                    form['labels'] = parameters['labels'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] !== undefined) {
+                    form['guaranteed_bandwidth'] = parameters['guaranteed_bandwidth'];
+                }
+
+                if (parameters['permit_all_slices'] !== undefined) {
+                    form['permit_all_slices'] = parameters['permit_all_slices'];
+                }
+
+                if (parameters['topology_parameters'] !== undefined) {
+                    form['topology_parameters'] = parameters['topology_parameters'];
+                }
+
+                if (parameters['controller_url'] !== undefined) {
+                    form['controller_url'] = parameters['controller_url'];
+                }
+
+                if (parameters['controller_parameters'] !== undefined) {
+                    form['controller_parameters'] = parameters['controller_parameters'];
+                }
+
+                if (parameters['network_id'] !== undefined) {
+                    form['network_id'] = parameters['network_id'];
+                }
+
+                if (parameters['router_id'] !== undefined) {
+                    form['router_id'] = parameters['router_id'];
+                }
+
+                if (parameters['subnet_id'] !== undefined) {
+                    form['subnet_id'] = parameters['subnet_id'];
+                }
+
+                if (parameters['autoconnect'] !== undefined) {
+                    form['autoconnect'] = parameters['autoconnect'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_List_GET
+             * 
+             */
+            xos.prototype.Service_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/services/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} description - Description of Service
+             * @param {boolean} enabled - 
+             * @param {string} kind - Kind of service
+             * @param {string} name - Service Name
+             * @param {string} versionNumber - Version of Service Definition
+             * @param {boolean} published - 
+             * @param {string} view_url - 
+             * @param {string} icon_url - 
+             * @param {string} public_key - Public key string
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * 
+             */
+            xos.prototype.Service_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/services/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['versionNumber'] !== undefined) {
+                    form['versionNumber'] = parameters['versionNumber'];
+                }
+
+                if (parameters['versionNumber'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: versionNumber'));
+                    return deferred.promise;
+                }
+
+                if (parameters['published'] !== undefined) {
+                    form['published'] = parameters['published'];
+                }
+
+                if (parameters['view_url'] !== undefined) {
+                    form['view_url'] = parameters['view_url'];
+                }
+
+                if (parameters['icon_url'] !== undefined) {
+                    form['icon_url'] = parameters['icon_url'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/services/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} description - Description of Service
+             * @param {boolean} enabled - 
+             * @param {string} kind - Kind of service
+             * @param {string} name - Service Name
+             * @param {string} versionNumber - Version of Service Definition
+             * @param {boolean} published - 
+             * @param {string} view_url - 
+             * @param {string} icon_url - 
+             * @param {string} public_key - Public key string
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * 
+             */
+            xos.prototype.Service_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/services/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['versionNumber'] !== undefined) {
+                    form['versionNumber'] = parameters['versionNumber'];
+                }
+
+                if (parameters['versionNumber'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: versionNumber'));
+                    return deferred.promise;
+                }
+
+                if (parameters['published'] !== undefined) {
+                    form['published'] = parameters['published'];
+                }
+
+                if (parameters['view_url'] !== undefined) {
+                    form['view_url'] = parameters['view_url'];
+                }
+
+                if (parameters['icon_url'] !== undefined) {
+                    form['icon_url'] = parameters['icon_url'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} description - Description of Service
+             * @param {boolean} enabled - 
+             * @param {string} kind - Kind of service
+             * @param {string} name - Service Name
+             * @param {string} versionNumber - Version of Service Definition
+             * @param {boolean} published - 
+             * @param {string} view_url - 
+             * @param {string} icon_url - 
+             * @param {string} public_key - Public key string
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * 
+             */
+            xos.prototype.Service_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/services/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['versionNumber'] !== undefined) {
+                    form['versionNumber'] = parameters['versionNumber'];
+                }
+
+                if (parameters['published'] !== undefined) {
+                    form['published'] = parameters['published'];
+                }
+
+                if (parameters['view_url'] !== undefined) {
+                    form['view_url'] = parameters['view_url'];
+                }
+
+                if (parameters['icon_url'] !== undefined) {
+                    form['icon_url'] = parameters['icon_url'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/services/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Class_List_GET
+             * 
+             */
+            xos.prototype.Service_Class_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceclasses/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Class_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} description - 
+             * @param {integer} commitment - 
+             * @param {integer} membershipFee - 
+             * @param {integer} membershipFeeMonths - 
+             * @param {boolean} upgradeRequiresApproval - 
+             * 
+             */
+            xos.prototype.Service_Class_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceclasses/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['description'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: description'));
+                    return deferred.promise;
+                }
+
+                if (parameters['commitment'] !== undefined) {
+                    form['commitment'] = parameters['commitment'];
+                }
+
+                if (parameters['commitment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: commitment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['membershipFee'] !== undefined) {
+                    form['membershipFee'] = parameters['membershipFee'];
+                }
+
+                if (parameters['membershipFee'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: membershipFee'));
+                    return deferred.promise;
+                }
+
+                if (parameters['membershipFeeMonths'] !== undefined) {
+                    form['membershipFeeMonths'] = parameters['membershipFeeMonths'];
+                }
+
+                if (parameters['membershipFeeMonths'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: membershipFeeMonths'));
+                    return deferred.promise;
+                }
+
+                if (parameters['upgradeRequiresApproval'] !== undefined) {
+                    form['upgradeRequiresApproval'] = parameters['upgradeRequiresApproval'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Class_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Class_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceclasses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Class_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} description - 
+             * @param {integer} commitment - 
+             * @param {integer} membershipFee - 
+             * @param {integer} membershipFeeMonths - 
+             * @param {boolean} upgradeRequiresApproval - 
+             * 
+             */
+            xos.prototype.Service_Class_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceclasses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['description'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: description'));
+                    return deferred.promise;
+                }
+
+                if (parameters['commitment'] !== undefined) {
+                    form['commitment'] = parameters['commitment'];
+                }
+
+                if (parameters['commitment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: commitment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['membershipFee'] !== undefined) {
+                    form['membershipFee'] = parameters['membershipFee'];
+                }
+
+                if (parameters['membershipFee'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: membershipFee'));
+                    return deferred.promise;
+                }
+
+                if (parameters['membershipFeeMonths'] !== undefined) {
+                    form['membershipFeeMonths'] = parameters['membershipFeeMonths'];
+                }
+
+                if (parameters['membershipFeeMonths'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: membershipFeeMonths'));
+                    return deferred.promise;
+                }
+
+                if (parameters['upgradeRequiresApproval'] !== undefined) {
+                    form['upgradeRequiresApproval'] = parameters['upgradeRequiresApproval'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Class_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} description - 
+             * @param {integer} commitment - 
+             * @param {integer} membershipFee - 
+             * @param {integer} membershipFeeMonths - 
+             * @param {boolean} upgradeRequiresApproval - 
+             * 
+             */
+            xos.prototype.Service_Class_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceclasses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['commitment'] !== undefined) {
+                    form['commitment'] = parameters['commitment'];
+                }
+
+                if (parameters['membershipFee'] !== undefined) {
+                    form['membershipFee'] = parameters['membershipFee'];
+                }
+
+                if (parameters['membershipFeeMonths'] !== undefined) {
+                    form['membershipFeeMonths'] = parameters['membershipFeeMonths'];
+                }
+
+                if (parameters['upgradeRequiresApproval'] !== undefined) {
+                    form['upgradeRequiresApproval'] = parameters['upgradeRequiresApproval'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Class_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Class_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceclasses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Payment_List_GET
+             * 
+             */
+            xos.prototype.Payment_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/payments/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Payment_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} account - 
+             * @param {number} amount - 
+             * @param {string} date - 
+             * 
+             */
+            xos.prototype.Payment_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/payments/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['account'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: account'));
+                    return deferred.promise;
+                }
+
+                if (parameters['amount'] !== undefined) {
+                    form['amount'] = parameters['amount'];
+                }
+
+                if (parameters['amount'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: amount'));
+                    return deferred.promise;
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['date'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: date'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Payment_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Payment_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/payments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Payment_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} account - 
+             * @param {number} amount - 
+             * @param {string} date - 
+             * 
+             */
+            xos.prototype.Payment_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/payments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['account'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: account'));
+                    return deferred.promise;
+                }
+
+                if (parameters['amount'] !== undefined) {
+                    form['amount'] = parameters['amount'];
+                }
+
+                if (parameters['amount'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: amount'));
+                    return deferred.promise;
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['date'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: date'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Payment_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} account - 
+             * @param {number} amount - 
+             * @param {string} date - 
+             * 
+             */
+            xos.prototype.Payment_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/payments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['amount'] !== undefined) {
+                    form['amount'] = parameters['amount'];
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Payment_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Payment_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/payments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Subscriber_List_GET
+             * 
+             */
+            xos.prototype.Subscriber_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/subscribers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Subscriber_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Subscriber_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/subscribers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Subscriber_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Subscriber_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/subscribers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Subscriber_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Subscriber_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/subscribers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Subscriber_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Subscriber_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/subscribers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Subscriber_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Subscriber_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/subscribers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Instance_List_GET
+             * 
+             */
+            xos.prototype.Instance_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/instances/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Instance_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} instance_id - Nova instance id
+             * @param {string} instance_uuid - Nova instance uuid
+             * @param {string} name - Instance name
+             * @param {string} instance_name - OpenStack generated name
+             * @param {string} ip - Instance ip address
+             * @param {string} image - 
+             * @param {string} creator - 
+             * @param {string} slice - 
+             * @param {string} deployment - 
+             * @param {string} node - 
+             * @param {integer} numberCores - Number of cores for instance
+             * @param {string} flavor - Flavor of this instance
+             * @param {string} userData - user_data passed to instance during creation
+             * 
+             */
+            xos.prototype.Instance_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/instances/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['instance_id'] !== undefined) {
+                    form['instance_id'] = parameters['instance_id'];
+                }
+
+                if (parameters['instance_uuid'] !== undefined) {
+                    form['instance_uuid'] = parameters['instance_uuid'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['instance_name'] !== undefined) {
+                    form['instance_name'] = parameters['instance_name'];
+                }
+
+                if (parameters['ip'] !== undefined) {
+                    form['ip'] = parameters['ip'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['image'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: image'));
+                    return deferred.promise;
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['node'] !== undefined) {
+                    form['node'] = parameters['node'];
+                }
+
+                if (parameters['node'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: node'));
+                    return deferred.promise;
+                }
+
+                if (parameters['numberCores'] !== undefined) {
+                    form['numberCores'] = parameters['numberCores'];
+                }
+
+                if (parameters['numberCores'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: numberCores'));
+                    return deferred.promise;
+                }
+
+                if (parameters['flavor'] !== undefined) {
+                    form['flavor'] = parameters['flavor'];
+                }
+
+                if (parameters['flavor'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: flavor'));
+                    return deferred.promise;
+                }
+
+                if (parameters['userData'] !== undefined) {
+                    form['userData'] = parameters['userData'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Instance_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Instance_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/instances/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Instance_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} instance_id - Nova instance id
+             * @param {string} instance_uuid - Nova instance uuid
+             * @param {string} name - Instance name
+             * @param {string} instance_name - OpenStack generated name
+             * @param {string} ip - Instance ip address
+             * @param {string} image - 
+             * @param {string} creator - 
+             * @param {string} slice - 
+             * @param {string} deployment - 
+             * @param {string} node - 
+             * @param {integer} numberCores - Number of cores for instance
+             * @param {string} flavor - Flavor of this instance
+             * @param {string} userData - user_data passed to instance during creation
+             * 
+             */
+            xos.prototype.Instance_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/instances/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['instance_id'] !== undefined) {
+                    form['instance_id'] = parameters['instance_id'];
+                }
+
+                if (parameters['instance_uuid'] !== undefined) {
+                    form['instance_uuid'] = parameters['instance_uuid'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['instance_name'] !== undefined) {
+                    form['instance_name'] = parameters['instance_name'];
+                }
+
+                if (parameters['ip'] !== undefined) {
+                    form['ip'] = parameters['ip'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['image'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: image'));
+                    return deferred.promise;
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['node'] !== undefined) {
+                    form['node'] = parameters['node'];
+                }
+
+                if (parameters['node'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: node'));
+                    return deferred.promise;
+                }
+
+                if (parameters['numberCores'] !== undefined) {
+                    form['numberCores'] = parameters['numberCores'];
+                }
+
+                if (parameters['numberCores'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: numberCores'));
+                    return deferred.promise;
+                }
+
+                if (parameters['flavor'] !== undefined) {
+                    form['flavor'] = parameters['flavor'];
+                }
+
+                if (parameters['flavor'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: flavor'));
+                    return deferred.promise;
+                }
+
+                if (parameters['userData'] !== undefined) {
+                    form['userData'] = parameters['userData'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Instance_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} instance_id - Nova instance id
+             * @param {string} instance_uuid - Nova instance uuid
+             * @param {string} name - Instance name
+             * @param {string} instance_name - OpenStack generated name
+             * @param {string} ip - Instance ip address
+             * @param {string} image - 
+             * @param {string} creator - 
+             * @param {string} slice - 
+             * @param {string} deployment - 
+             * @param {string} node - 
+             * @param {integer} numberCores - Number of cores for instance
+             * @param {string} flavor - Flavor of this instance
+             * @param {string} userData - user_data passed to instance during creation
+             * 
+             */
+            xos.prototype.Instance_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/instances/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['instance_id'] !== undefined) {
+                    form['instance_id'] = parameters['instance_id'];
+                }
+
+                if (parameters['instance_uuid'] !== undefined) {
+                    form['instance_uuid'] = parameters['instance_uuid'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['instance_name'] !== undefined) {
+                    form['instance_name'] = parameters['instance_name'];
+                }
+
+                if (parameters['ip'] !== undefined) {
+                    form['ip'] = parameters['ip'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['node'] !== undefined) {
+                    form['node'] = parameters['node'];
+                }
+
+                if (parameters['numberCores'] !== undefined) {
+                    form['numberCores'] = parameters['numberCores'];
+                }
+
+                if (parameters['flavor'] !== undefined) {
+                    form['flavor'] = parameters['flavor'];
+                }
+
+                if (parameters['userData'] !== undefined) {
+                    form['userData'] = parameters['userData'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Instance_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Instance_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/instances/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Charge_List_GET
+             * 
+             */
+            xos.prototype.Charge_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/charges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Charge_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} account - 
+             * @param {string} slice - 
+             * @param {choice} kind - 
+             * @param {choice} state - 
+             * @param {string} date - 
+             * @param {string} object - 
+             * @param {number} amount - 
+             * @param {number} coreHours - 
+             * @param {string} invoice - 
+             * 
+             */
+            xos.prototype.Charge_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/charges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['account'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: account'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['state'] !== undefined) {
+                    form['state'] = parameters['state'];
+                }
+
+                if (parameters['state'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: state'));
+                    return deferred.promise;
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['date'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: date'));
+                    return deferred.promise;
+                }
+
+                if (parameters['object'] !== undefined) {
+                    form['object'] = parameters['object'];
+                }
+
+                if (parameters['object'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: object'));
+                    return deferred.promise;
+                }
+
+                if (parameters['amount'] !== undefined) {
+                    form['amount'] = parameters['amount'];
+                }
+
+                if (parameters['amount'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: amount'));
+                    return deferred.promise;
+                }
+
+                if (parameters['coreHours'] !== undefined) {
+                    form['coreHours'] = parameters['coreHours'];
+                }
+
+                if (parameters['coreHours'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: coreHours'));
+                    return deferred.promise;
+                }
+
+                if (parameters['invoice'] !== undefined) {
+                    form['invoice'] = parameters['invoice'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Charge_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Charge_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/charges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Charge_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} account - 
+             * @param {string} slice - 
+             * @param {choice} kind - 
+             * @param {choice} state - 
+             * @param {string} date - 
+             * @param {string} object - 
+             * @param {number} amount - 
+             * @param {number} coreHours - 
+             * @param {string} invoice - 
+             * 
+             */
+            xos.prototype.Charge_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/charges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['account'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: account'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['state'] !== undefined) {
+                    form['state'] = parameters['state'];
+                }
+
+                if (parameters['state'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: state'));
+                    return deferred.promise;
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['date'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: date'));
+                    return deferred.promise;
+                }
+
+                if (parameters['object'] !== undefined) {
+                    form['object'] = parameters['object'];
+                }
+
+                if (parameters['object'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: object'));
+                    return deferred.promise;
+                }
+
+                if (parameters['amount'] !== undefined) {
+                    form['amount'] = parameters['amount'];
+                }
+
+                if (parameters['amount'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: amount'));
+                    return deferred.promise;
+                }
+
+                if (parameters['coreHours'] !== undefined) {
+                    form['coreHours'] = parameters['coreHours'];
+                }
+
+                if (parameters['coreHours'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: coreHours'));
+                    return deferred.promise;
+                }
+
+                if (parameters['invoice'] !== undefined) {
+                    form['invoice'] = parameters['invoice'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Charge_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} account - 
+             * @param {string} slice - 
+             * @param {choice} kind - 
+             * @param {choice} state - 
+             * @param {string} date - 
+             * @param {string} object - 
+             * @param {number} amount - 
+             * @param {number} coreHours - 
+             * @param {string} invoice - 
+             * 
+             */
+            xos.prototype.Charge_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/charges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['account'] !== undefined) {
+                    form['account'] = parameters['account'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['state'] !== undefined) {
+                    form['state'] = parameters['state'];
+                }
+
+                if (parameters['date'] !== undefined) {
+                    form['date'] = parameters['date'];
+                }
+
+                if (parameters['object'] !== undefined) {
+                    form['object'] = parameters['object'];
+                }
+
+                if (parameters['amount'] !== undefined) {
+                    form['amount'] = parameters['amount'];
+                }
+
+                if (parameters['coreHours'] !== undefined) {
+                    form['coreHours'] = parameters['coreHours'];
+                }
+
+                if (parameters['invoice'] !== undefined) {
+                    form['invoice'] = parameters['invoice'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Charge_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Charge_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/charges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Program_List_GET
+             * 
+             */
+            xos.prototype.Program_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/programs/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Program_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Service Name
+             * @param {string} description - Description of Service
+
+             * @param {choice} command - Command to run
+             * @param {string} owner - 
+             * @param {string} contents - Contents of Program
+             * @param {string} output - Output of Program
+             * @param {string} messages - Debug messages
+             * @param {string} status - Status of program
+             * 
+             */
+            xos.prototype.Program_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/programs/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                form['kind'] = 'tosca';
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['command'] !== undefined) {
+                    form['command'] = parameters['command'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['contents'] !== undefined) {
+                    form['contents'] = parameters['contents'];
+                }
+
+                if (parameters['output'] !== undefined) {
+                    form['output'] = parameters['output'];
+                }
+
+                if (parameters['messages'] !== undefined) {
+                    form['messages'] = parameters['messages'];
+                }
+
+                if (parameters['status'] !== undefined) {
+                    form['status'] = parameters['status'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Program_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Program_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/programs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Program_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Service Name
+             * @param {string} description - Description of Service
+
+             * @param {choice} command - Command to run
+             * @param {string} owner - 
+             * @param {string} contents - Contents of Program
+             * @param {string} output - Output of Program
+             * @param {string} messages - Debug messages
+             * @param {string} status - Status of program
+             * 
+             */
+            xos.prototype.Program_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/programs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                form['kind'] = 'tosca';
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['command'] !== undefined) {
+                    form['command'] = parameters['command'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['contents'] !== undefined) {
+                    form['contents'] = parameters['contents'];
+                }
+
+                if (parameters['output'] !== undefined) {
+                    form['output'] = parameters['output'];
+                }
+
+                if (parameters['messages'] !== undefined) {
+                    form['messages'] = parameters['messages'];
+                }
+
+                if (parameters['status'] !== undefined) {
+                    form['status'] = parameters['status'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Program_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Service Name
+             * @param {string} description - Description of Service
+
+             * @param {choice} command - Command to run
+             * @param {string} owner - 
+             * @param {string} contents - Contents of Program
+             * @param {string} output - Output of Program
+             * @param {string} messages - Debug messages
+             * @param {string} status - Status of program
+             * 
+             */
+            xos.prototype.Program_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/programs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                form['kind'] = 'tosca';
+
+                if (parameters['command'] !== undefined) {
+                    form['command'] = parameters['command'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['contents'] !== undefined) {
+                    form['contents'] = parameters['contents'];
+                }
+
+                if (parameters['output'] !== undefined) {
+                    form['output'] = parameters['output'];
+                }
+
+                if (parameters['messages'] !== undefined) {
+                    form['messages'] = parameters['messages'];
+                }
+
+                if (parameters['status'] !== undefined) {
+                    form['status'] = parameters['status'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Program_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Program_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/programs/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Role_List_GET
+             * 
+             */
+            xos.prototype.Role_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/roles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Role_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} role_type - 
+             * @param {string} role - 
+             * @param {string} description - 
+             * @param {string} content_type - 
+             * 
+             */
+            xos.prototype.Role_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/roles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role_type'] !== undefined) {
+                    form['role_type'] = parameters['role_type'];
+                }
+
+                if (parameters['role_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['description'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: description'));
+                    return deferred.promise;
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['content_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: content_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Role_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Role_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Role_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} role_type - 
+             * @param {string} role - 
+             * @param {string} description - 
+             * @param {string} content_type - 
+             * 
+             */
+            xos.prototype.Role_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role_type'] !== undefined) {
+                    form['role_type'] = parameters['role_type'];
+                }
+
+                if (parameters['role_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['description'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: description'));
+                    return deferred.promise;
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters['content_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: content_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Role_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} role_type - 
+             * @param {string} role - 
+             * @param {string} description - 
+             * @param {string} content_type - 
+             * 
+             */
+            xos.prototype.Role_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['role_type'] !== undefined) {
+                    form['role_type'] = parameters['role_type'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['content_type'] !== undefined) {
+                    form['content_type'] = parameters['content_type'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Role_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Role_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/roles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Usable_Object_List_GET
+             * 
+             */
+            xos.prototype.Usable_Object_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usableobjects/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Usable_Object_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * 
+             */
+            xos.prototype.Usable_Object_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usableobjects/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Usable_Object_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Usable_Object_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usableobjects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Usable_Object_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * 
+             */
+            xos.prototype.Usable_Object_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usableobjects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Usable_Object_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * 
+             */
+            xos.prototype.Usable_Object_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usableobjects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Usable_Object_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Usable_Object_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usableobjects/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Provider_List_GET
+             * 
+             */
+            xos.prototype.Provider_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/providers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Provider_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Provider_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/providers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Provider_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Provider_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/providers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Provider_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Provider_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/providers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Provider_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Provider_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/providers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Provider_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Provider_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/providers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Credential_List_GET
+             * 
+             */
+            xos.prototype.Slice_Credential_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicecredentials/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Credential_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} slice - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.Slice_Credential_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicecredentials/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['key_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: key_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters['enc_value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: enc_value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Credential_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Credential_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Credential_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} slice - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.Slice_Credential_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['key_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: key_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters['enc_value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: enc_value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Credential_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} slice - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.Slice_Credential_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Credential_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Credential_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Node_List_GET
+             * 
+             */
+            xos.prototype.Node_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/nodes/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Node_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Node
+             * @param {string} site_deployment - 
+             * @param {string} site - 
+             * 
+             */
+            xos.prototype.Node_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/nodes/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site_deployment'] !== undefined) {
+                    form['site_deployment'] = parameters['site_deployment'];
+                }
+
+                if (parameters['site_deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site_deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Node_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Node_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/nodes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Node_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Node
+             * @param {string} site_deployment - 
+             * @param {string} site - 
+             * 
+             */
+            xos.prototype.Node_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/nodes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site_deployment'] !== undefined) {
+                    form['site_deployment'] = parameters['site_deployment'];
+                }
+
+                if (parameters['site_deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site_deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Node_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Node
+             * @param {string} site_deployment - 
+             * @param {string} site - 
+             * 
+             */
+            xos.prototype.Node_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/nodes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['site_deployment'] !== undefined) {
+                    form['site_deployment'] = parameters['site_deployment'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Node_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Node_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/nodes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Dashboard_View_List_GET
+             * 
+             */
+            xos.prototype.Dashboard_View_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/dashboardviews/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Dashboard_View_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the View
+             * @param {string} url - URL of Dashboard
+             * @param {boolean} enabled - 
+             * 
+             */
+            xos.prototype.Dashboard_View_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/dashboardviews/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['url'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Dashboard_View_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Dashboard_View_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/dashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Dashboard_View_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the View
+             * @param {string} url - URL of Dashboard
+             * @param {boolean} enabled - 
+             * 
+             */
+            xos.prototype.Dashboard_View_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/dashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['url'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Dashboard_View_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the View
+             * @param {string} url - URL of Dashboard
+             * @param {boolean} enabled - 
+             * 
+             */
+            xos.prototype.Dashboard_View_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/dashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Dashboard_View_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Dashboard_View_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/dashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Network_List_GET
+             * 
+             */
+            xos.prototype.Controller_Network_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllernetworks/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Network_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} controller - 
+             * @param {string} net_id - Quantum network
+             * @param {string} router_id - Quantum router id
+             * @param {string} subnet_id - Quantum subnet id
+             * @param {string} subnet - 
+             * 
+             */
+            xos.prototype.Controller_Network_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllernetworks/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['network'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: network'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['net_id'] !== undefined) {
+                    form['net_id'] = parameters['net_id'];
+                }
+
+                if (parameters['router_id'] !== undefined) {
+                    form['router_id'] = parameters['router_id'];
+                }
+
+                if (parameters['subnet_id'] !== undefined) {
+                    form['subnet_id'] = parameters['subnet_id'];
+                }
+
+                if (parameters['subnet'] !== undefined) {
+                    form['subnet'] = parameters['subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Network_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Network_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllernetworks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Network_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} controller - 
+             * @param {string} net_id - Quantum network
+             * @param {string} router_id - Quantum router id
+             * @param {string} subnet_id - Quantum subnet id
+             * @param {string} subnet - 
+             * 
+             */
+            xos.prototype.Controller_Network_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllernetworks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['network'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: network'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['net_id'] !== undefined) {
+                    form['net_id'] = parameters['net_id'];
+                }
+
+                if (parameters['router_id'] !== undefined) {
+                    form['router_id'] = parameters['router_id'];
+                }
+
+                if (parameters['subnet_id'] !== undefined) {
+                    form['subnet_id'] = parameters['subnet_id'];
+                }
+
+                if (parameters['subnet'] !== undefined) {
+                    form['subnet'] = parameters['subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Network_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} controller - 
+             * @param {string} net_id - Quantum network
+             * @param {string} router_id - Quantum router id
+             * @param {string} subnet_id - Quantum subnet id
+             * @param {string} subnet - 
+             * 
+             */
+            xos.prototype.Controller_Network_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllernetworks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['net_id'] !== undefined) {
+                    form['net_id'] = parameters['net_id'];
+                }
+
+                if (parameters['router_id'] !== undefined) {
+                    form['router_id'] = parameters['router_id'];
+                }
+
+                if (parameters['subnet_id'] !== undefined) {
+                    form['subnet_id'] = parameters['subnet_id'];
+                }
+
+                if (parameters['subnet'] !== undefined) {
+                    form['subnet'] = parameters['subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Network_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Network_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllernetworks/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Deployments_List_GET
+             * 
+             */
+            xos.prototype.Image_Deployments_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/imagedeploymentses/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Deployments_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} image - 
+             * @param {string} deployment - 
+             * 
+             */
+            xos.prototype.Image_Deployments_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/imagedeploymentses/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['image'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: image'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Deployments_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Image_Deployments_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/imagedeploymentses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Deployments_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} image - 
+             * @param {string} deployment - 
+             * 
+             */
+            xos.prototype.Image_Deployments_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/imagedeploymentses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['image'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: image'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Deployments_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} image - 
+             * @param {string} deployment - 
+             * 
+             */
+            xos.prototype.Image_Deployments_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/imagedeploymentses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['image'] !== undefined) {
+                    form['image'] = parameters['image'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Image_Deployments_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Image_Deployments_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/imagedeploymentses/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_User_List_GET
+             * 
+             */
+            xos.prototype.Controller_User_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerusers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_User_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} controller - 
+             * @param {string} kuser_id - Keystone user id
+             * 
+             */
+            xos.prototype.Controller_User_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerusers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['kuser_id'] !== undefined) {
+                    form['kuser_id'] = parameters['kuser_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_User_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_User_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerusers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_User_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} controller - 
+             * @param {string} kuser_id - Keystone user id
+             * 
+             */
+            xos.prototype.Controller_User_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerusers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['kuser_id'] !== undefined) {
+                    form['kuser_id'] = parameters['kuser_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_User_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} controller - 
+             * @param {string} kuser_id - Keystone user id
+             * 
+             */
+            xos.prototype.Controller_User_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerusers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['kuser_id'] !== undefined) {
+                    form['kuser_id'] = parameters['kuser_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_User_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_User_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerusers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reserved_Resource_List_GET
+             * 
+             */
+            xos.prototype.Reserved_Resource_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservedresources/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reserved_Resource_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} instance - 
+             * @param {string} resource - 
+             * @param {integer} quantity - 
+             * @param {string} reservationSet - 
+             * 
+             */
+            xos.prototype.Reserved_Resource_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservedresources/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['instance'] !== undefined) {
+                    form['instance'] = parameters['instance'];
+                }
+
+                if (parameters['instance'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: instance'));
+                    return deferred.promise;
+                }
+
+                if (parameters['resource'] !== undefined) {
+                    form['resource'] = parameters['resource'];
+                }
+
+                if (parameters['resource'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: resource'));
+                    return deferred.promise;
+                }
+
+                if (parameters['quantity'] !== undefined) {
+                    form['quantity'] = parameters['quantity'];
+                }
+
+                if (parameters['quantity'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: quantity'));
+                    return deferred.promise;
+                }
+
+                if (parameters['reservationSet'] !== undefined) {
+                    form['reservationSet'] = parameters['reservationSet'];
+                }
+
+                if (parameters['reservationSet'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: reservationSet'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reserved_Resource_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Reserved_Resource_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservedresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reserved_Resource_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} instance - 
+             * @param {string} resource - 
+             * @param {integer} quantity - 
+             * @param {string} reservationSet - 
+             * 
+             */
+            xos.prototype.Reserved_Resource_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservedresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['instance'] !== undefined) {
+                    form['instance'] = parameters['instance'];
+                }
+
+                if (parameters['instance'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: instance'));
+                    return deferred.promise;
+                }
+
+                if (parameters['resource'] !== undefined) {
+                    form['resource'] = parameters['resource'];
+                }
+
+                if (parameters['resource'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: resource'));
+                    return deferred.promise;
+                }
+
+                if (parameters['quantity'] !== undefined) {
+                    form['quantity'] = parameters['quantity'];
+                }
+
+                if (parameters['quantity'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: quantity'));
+                    return deferred.promise;
+                }
+
+                if (parameters['reservationSet'] !== undefined) {
+                    form['reservationSet'] = parameters['reservationSet'];
+                }
+
+                if (parameters['reservationSet'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: reservationSet'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reserved_Resource_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} instance - 
+             * @param {string} resource - 
+             * @param {integer} quantity - 
+             * @param {string} reservationSet - 
+             * 
+             */
+            xos.prototype.Reserved_Resource_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservedresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['instance'] !== undefined) {
+                    form['instance'] = parameters['instance'];
+                }
+
+                if (parameters['resource'] !== undefined) {
+                    form['resource'] = parameters['resource'];
+                }
+
+                if (parameters['quantity'] !== undefined) {
+                    form['quantity'] = parameters['quantity'];
+                }
+
+                if (parameters['reservationSet'] !== undefined) {
+                    form['reservationSet'] = parameters['reservationSet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reserved_Resource_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Reserved_Resource_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservedresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Template_List_GET
+             * 
+             */
+            xos.prototype.Network_Template_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networktemplates/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Template_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} description - 
+             * @param {integer} guaranteed_bandwidth - 
+             * @param {choice} visibility - 
+             * @param {choice} translation - 
+             * @param {string} shared_network_name - 
+             * @param {string} shared_network_id - Quantum network
+             * @param {choice} topology_kind - 
+             * @param {choice} controller_kind - 
+             * 
+             */
+            xos.prototype.Network_Template_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networktemplates/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] !== undefined) {
+                    form['guaranteed_bandwidth'] = parameters['guaranteed_bandwidth'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: guaranteed_bandwidth'));
+                    return deferred.promise;
+                }
+
+                if (parameters['visibility'] !== undefined) {
+                    form['visibility'] = parameters['visibility'];
+                }
+
+                if (parameters['visibility'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: visibility'));
+                    return deferred.promise;
+                }
+
+                if (parameters['translation'] !== undefined) {
+                    form['translation'] = parameters['translation'];
+                }
+
+                if (parameters['translation'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: translation'));
+                    return deferred.promise;
+                }
+
+                if (parameters['shared_network_name'] !== undefined) {
+                    form['shared_network_name'] = parameters['shared_network_name'];
+                }
+
+                if (parameters['shared_network_id'] !== undefined) {
+                    form['shared_network_id'] = parameters['shared_network_id'];
+                }
+
+                if (parameters['topology_kind'] !== undefined) {
+                    form['topology_kind'] = parameters['topology_kind'];
+                }
+
+                if (parameters['topology_kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: topology_kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller_kind'] !== undefined) {
+                    form['controller_kind'] = parameters['controller_kind'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Template_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Template_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networktemplates/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Template_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} description - 
+             * @param {integer} guaranteed_bandwidth - 
+             * @param {choice} visibility - 
+             * @param {choice} translation - 
+             * @param {string} shared_network_name - 
+             * @param {string} shared_network_id - Quantum network
+             * @param {choice} topology_kind - 
+             * @param {choice} controller_kind - 
+             * 
+             */
+            xos.prototype.Network_Template_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networktemplates/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] !== undefined) {
+                    form['guaranteed_bandwidth'] = parameters['guaranteed_bandwidth'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: guaranteed_bandwidth'));
+                    return deferred.promise;
+                }
+
+                if (parameters['visibility'] !== undefined) {
+                    form['visibility'] = parameters['visibility'];
+                }
+
+                if (parameters['visibility'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: visibility'));
+                    return deferred.promise;
+                }
+
+                if (parameters['translation'] !== undefined) {
+                    form['translation'] = parameters['translation'];
+                }
+
+                if (parameters['translation'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: translation'));
+                    return deferred.promise;
+                }
+
+                if (parameters['shared_network_name'] !== undefined) {
+                    form['shared_network_name'] = parameters['shared_network_name'];
+                }
+
+                if (parameters['shared_network_id'] !== undefined) {
+                    form['shared_network_id'] = parameters['shared_network_id'];
+                }
+
+                if (parameters['topology_kind'] !== undefined) {
+                    form['topology_kind'] = parameters['topology_kind'];
+                }
+
+                if (parameters['topology_kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: topology_kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller_kind'] !== undefined) {
+                    form['controller_kind'] = parameters['controller_kind'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Template_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} description - 
+             * @param {integer} guaranteed_bandwidth - 
+             * @param {choice} visibility - 
+             * @param {choice} translation - 
+             * @param {string} shared_network_name - 
+             * @param {string} shared_network_id - Quantum network
+             * @param {choice} topology_kind - 
+             * @param {choice} controller_kind - 
+             * 
+             */
+            xos.prototype.Network_Template_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networktemplates/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['guaranteed_bandwidth'] !== undefined) {
+                    form['guaranteed_bandwidth'] = parameters['guaranteed_bandwidth'];
+                }
+
+                if (parameters['visibility'] !== undefined) {
+                    form['visibility'] = parameters['visibility'];
+                }
+
+                if (parameters['translation'] !== undefined) {
+                    form['translation'] = parameters['translation'];
+                }
+
+                if (parameters['shared_network_name'] !== undefined) {
+                    form['shared_network_name'] = parameters['shared_network_name'];
+                }
+
+                if (parameters['shared_network_id'] !== undefined) {
+                    form['shared_network_id'] = parameters['shared_network_id'];
+                }
+
+                if (parameters['topology_kind'] !== undefined) {
+                    form['topology_kind'] = parameters['topology_kind'];
+                }
+
+                if (parameters['controller_kind'] !== undefined) {
+                    form['controller_kind'] = parameters['controller_kind'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Template_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Template_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networktemplates/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Slice_List_GET
+             * 
+             */
+            xos.prototype.Network_Slice_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkslices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Slice_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} slice - 
+             * 
+             */
+            xos.prototype.Network_Slice_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkslices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['network'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: network'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Slice_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Slice_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Slice_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} slice - 
+             * 
+             */
+            xos.prototype.Network_Slice_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['network'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: network'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Slice_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} network - 
+             * @param {string} slice - 
+             * 
+             */
+            xos.prototype.Network_Slice_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Slice_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Slice_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Dashboard_View_List_GET
+             * 
+             */
+            xos.prototype.User_Dashboard_View_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/userdashboardviews/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Dashboard_View_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} dashboardView - 
+             * @param {integer} order - 
+             * 
+             */
+            xos.prototype.User_Dashboard_View_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/userdashboardviews/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['dashboardView'] !== undefined) {
+                    form['dashboardView'] = parameters['dashboardView'];
+                }
+
+                if (parameters['dashboardView'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: dashboardView'));
+                    return deferred.promise;
+                }
+
+                if (parameters['order'] !== undefined) {
+                    form['order'] = parameters['order'];
+                }
+
+                if (parameters['order'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: order'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Dashboard_View_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.User_Dashboard_View_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/userdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Dashboard_View_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} dashboardView - 
+             * @param {integer} order - 
+             * 
+             */
+            xos.prototype.User_Dashboard_View_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/userdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['dashboardView'] !== undefined) {
+                    form['dashboardView'] = parameters['dashboardView'];
+                }
+
+                if (parameters['dashboardView'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: dashboardView'));
+                    return deferred.promise;
+                }
+
+                if (parameters['order'] !== undefined) {
+                    form['order'] = parameters['order'];
+                }
+
+                if (parameters['order'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: order'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Dashboard_View_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} dashboardView - 
+             * @param {integer} order - 
+             * 
+             */
+            xos.prototype.User_Dashboard_View_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/userdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['dashboardView'] !== undefined) {
+                    form['dashboardView'] = parameters['dashboardView'];
+                }
+
+                if (parameters['order'] !== undefined) {
+                    form['order'] = parameters['order'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Dashboard_View_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.User_Dashboard_View_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/userdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_List_GET
+             * 
+             */
+            xos.prototype.Controller_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Controller
+             * @param {string} backend_type - Type of compute controller, e.g. EC2, OpenStack, or OpenStack version
+             * @param {string} version - Controller version
+             * @param {string} auth_url - Auth url for the compute controller
+             * @param {string} admin_user - Username of an admin user at this controller
+             * @param {string} admin_password - Password of theadmin user at this controller
+             * @param {string} admin_tenant - Name of the tenant the admin user belongs to
+             * @param {string} domain - Name of the domain this controller belongs to
+             * @param {string} rabbit_host - IP address of rabbitmq server at this controller
+             * @param {string} rabbit_user - Username of rabbitmq server at this controller
+             * @param {string} rabbit_password - Password of rabbitmq server at this controller
+             * @param {string} deployment - 
+             * 
+             */
+            xos.prototype.Controller_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['backend_type'] !== undefined) {
+                    form['backend_type'] = parameters['backend_type'];
+                }
+
+                if (parameters['backend_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['version'] !== undefined) {
+                    form['version'] = parameters['version'];
+                }
+
+                if (parameters['version'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: version'));
+                    return deferred.promise;
+                }
+
+                if (parameters['auth_url'] !== undefined) {
+                    form['auth_url'] = parameters['auth_url'];
+                }
+
+                if (parameters['admin_user'] !== undefined) {
+                    form['admin_user'] = parameters['admin_user'];
+                }
+
+                if (parameters['admin_password'] !== undefined) {
+                    form['admin_password'] = parameters['admin_password'];
+                }
+
+                if (parameters['admin_tenant'] !== undefined) {
+                    form['admin_tenant'] = parameters['admin_tenant'];
+                }
+
+                if (parameters['domain'] !== undefined) {
+                    form['domain'] = parameters['domain'];
+                }
+
+                if (parameters['rabbit_host'] !== undefined) {
+                    form['rabbit_host'] = parameters['rabbit_host'];
+                }
+
+                if (parameters['rabbit_user'] !== undefined) {
+                    form['rabbit_user'] = parameters['rabbit_user'];
+                }
+
+                if (parameters['rabbit_password'] !== undefined) {
+                    form['rabbit_password'] = parameters['rabbit_password'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Controller
+             * @param {string} backend_type - Type of compute controller, e.g. EC2, OpenStack, or OpenStack version
+             * @param {string} version - Controller version
+             * @param {string} auth_url - Auth url for the compute controller
+             * @param {string} admin_user - Username of an admin user at this controller
+             * @param {string} admin_password - Password of theadmin user at this controller
+             * @param {string} admin_tenant - Name of the tenant the admin user belongs to
+             * @param {string} domain - Name of the domain this controller belongs to
+             * @param {string} rabbit_host - IP address of rabbitmq server at this controller
+             * @param {string} rabbit_user - Username of rabbitmq server at this controller
+             * @param {string} rabbit_password - Password of rabbitmq server at this controller
+             * @param {string} deployment - 
+             * 
+             */
+            xos.prototype.Controller_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['backend_type'] !== undefined) {
+                    form['backend_type'] = parameters['backend_type'];
+                }
+
+                if (parameters['backend_type'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_type'));
+                    return deferred.promise;
+                }
+
+                if (parameters['version'] !== undefined) {
+                    form['version'] = parameters['version'];
+                }
+
+                if (parameters['version'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: version'));
+                    return deferred.promise;
+                }
+
+                if (parameters['auth_url'] !== undefined) {
+                    form['auth_url'] = parameters['auth_url'];
+                }
+
+                if (parameters['admin_user'] !== undefined) {
+                    form['admin_user'] = parameters['admin_user'];
+                }
+
+                if (parameters['admin_password'] !== undefined) {
+                    form['admin_password'] = parameters['admin_password'];
+                }
+
+                if (parameters['admin_tenant'] !== undefined) {
+                    form['admin_tenant'] = parameters['admin_tenant'];
+                }
+
+                if (parameters['domain'] !== undefined) {
+                    form['domain'] = parameters['domain'];
+                }
+
+                if (parameters['rabbit_host'] !== undefined) {
+                    form['rabbit_host'] = parameters['rabbit_host'];
+                }
+
+                if (parameters['rabbit_user'] !== undefined) {
+                    form['rabbit_user'] = parameters['rabbit_user'];
+                }
+
+                if (parameters['rabbit_password'] !== undefined) {
+                    form['rabbit_password'] = parameters['rabbit_password'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Controller
+             * @param {string} backend_type - Type of compute controller, e.g. EC2, OpenStack, or OpenStack version
+             * @param {string} version - Controller version
+             * @param {string} auth_url - Auth url for the compute controller
+             * @param {string} admin_user - Username of an admin user at this controller
+             * @param {string} admin_password - Password of theadmin user at this controller
+             * @param {string} admin_tenant - Name of the tenant the admin user belongs to
+             * @param {string} domain - Name of the domain this controller belongs to
+             * @param {string} rabbit_host - IP address of rabbitmq server at this controller
+             * @param {string} rabbit_user - Username of rabbitmq server at this controller
+             * @param {string} rabbit_password - Password of rabbitmq server at this controller
+             * @param {string} deployment - 
+             * 
+             */
+            xos.prototype.Controller_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['backend_type'] !== undefined) {
+                    form['backend_type'] = parameters['backend_type'];
+                }
+
+                if (parameters['version'] !== undefined) {
+                    form['version'] = parameters['version'];
+                }
+
+                if (parameters['auth_url'] !== undefined) {
+                    form['auth_url'] = parameters['auth_url'];
+                }
+
+                if (parameters['admin_user'] !== undefined) {
+                    form['admin_user'] = parameters['admin_user'];
+                }
+
+                if (parameters['admin_password'] !== undefined) {
+                    form['admin_password'] = parameters['admin_password'];
+                }
+
+                if (parameters['admin_tenant'] !== undefined) {
+                    form['admin_tenant'] = parameters['admin_tenant'];
+                }
+
+                if (parameters['domain'] !== undefined) {
+                    form['domain'] = parameters['domain'];
+                }
+
+                if (parameters['rabbit_host'] !== undefined) {
+                    form['rabbit_host'] = parameters['rabbit_host'];
+                }
+
+                if (parameters['rabbit_user'] !== undefined) {
+                    form['rabbit_user'] = parameters['rabbit_user'];
+                }
+
+                if (parameters['rabbit_password'] !== undefined) {
+                    form['rabbit_password'] = parameters['rabbit_password'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_List_GET
+             * 
+             */
+            xos.prototype.User_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/users/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_List_POST
+             * @param {string} password - 
+             * @param {string} last_login - 
+             * @param {string} email - 
+             * @param {string} username - 
+             * @param {string} firstname - person's given name
+             * @param {string} lastname - person's surname
+             * @param {string} phone - phone number contact
+             * @param {string} user_url - 
+             * @param {string} site - Site this user will be homed too
+             * @param {string} public_key - Public key string
+             * @param {boolean} is_active - 
+             * @param {boolean} is_admin - 
+             * @param {boolean} is_staff - 
+             * @param {boolean} is_readonly - 
+             * @param {boolean} is_registering - 
+             * @param {boolean} is_appuser - 
+             * @param {string} login_page - send this user to a specific page on login
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {choice} timezone - 
+             * 
+             */
+            xos.prototype.User_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/users/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['password'] !== undefined) {
+                    form['password'] = parameters['password'];
+                }
+
+                if (parameters['password'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: password'));
+                    return deferred.promise;
+                }
+
+                if (parameters['last_login'] !== undefined) {
+                    form['last_login'] = parameters['last_login'];
+                }
+
+                if (parameters['last_login'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: last_login'));
+                    return deferred.promise;
+                }
+
+                if (parameters['email'] !== undefined) {
+                    form['email'] = parameters['email'];
+                }
+
+                if (parameters['email'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: email'));
+                    return deferred.promise;
+                }
+
+                if (parameters['username'] !== undefined) {
+                    form['username'] = parameters['username'];
+                }
+
+                if (parameters['username'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: username'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firstname'] !== undefined) {
+                    form['firstname'] = parameters['firstname'];
+                }
+
+                if (parameters['firstname'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firstname'));
+                    return deferred.promise;
+                }
+
+                if (parameters['lastname'] !== undefined) {
+                    form['lastname'] = parameters['lastname'];
+                }
+
+                if (parameters['lastname'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: lastname'));
+                    return deferred.promise;
+                }
+
+                if (parameters['phone'] !== undefined) {
+                    form['phone'] = parameters['phone'];
+                }
+
+                if (parameters['user_url'] !== undefined) {
+                    form['user_url'] = parameters['user_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['is_active'] !== undefined) {
+                    form['is_active'] = parameters['is_active'];
+                }
+
+                if (parameters['is_admin'] !== undefined) {
+                    form['is_admin'] = parameters['is_admin'];
+                }
+
+                if (parameters['is_staff'] !== undefined) {
+                    form['is_staff'] = parameters['is_staff'];
+                }
+
+                if (parameters['is_readonly'] !== undefined) {
+                    form['is_readonly'] = parameters['is_readonly'];
+                }
+
+                if (parameters['is_registering'] !== undefined) {
+                    form['is_registering'] = parameters['is_registering'];
+                }
+
+                if (parameters['is_appuser'] !== undefined) {
+                    form['is_appuser'] = parameters['is_appuser'];
+                }
+
+                if (parameters['login_page'] !== undefined) {
+                    form['login_page'] = parameters['login_page'];
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['timezone'] !== undefined) {
+                    form['timezone'] = parameters['timezone'];
+                }
+
+                if (parameters['timezone'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: timezone'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.User_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/users/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} password - 
+             * @param {string} last_login - 
+             * @param {string} email - 
+             * @param {string} username - 
+             * @param {string} firstname - person's given name
+             * @param {string} lastname - person's surname
+             * @param {string} phone - phone number contact
+             * @param {string} user_url - 
+             * @param {string} site - Site this user will be homed too
+             * @param {string} public_key - Public key string
+             * @param {boolean} is_active - 
+             * @param {boolean} is_admin - 
+             * @param {boolean} is_staff - 
+             * @param {boolean} is_readonly - 
+             * @param {boolean} is_registering - 
+             * @param {boolean} is_appuser - 
+             * @param {string} login_page - send this user to a specific page on login
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {choice} timezone - 
+             * 
+             */
+            xos.prototype.User_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/users/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['password'] !== undefined) {
+                    form['password'] = parameters['password'];
+                }
+
+                if (parameters['password'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: password'));
+                    return deferred.promise;
+                }
+
+                if (parameters['last_login'] !== undefined) {
+                    form['last_login'] = parameters['last_login'];
+                }
+
+                if (parameters['last_login'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: last_login'));
+                    return deferred.promise;
+                }
+
+                if (parameters['email'] !== undefined) {
+                    form['email'] = parameters['email'];
+                }
+
+                if (parameters['email'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: email'));
+                    return deferred.promise;
+                }
+
+                if (parameters['username'] !== undefined) {
+                    form['username'] = parameters['username'];
+                }
+
+                if (parameters['username'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: username'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firstname'] !== undefined) {
+                    form['firstname'] = parameters['firstname'];
+                }
+
+                if (parameters['firstname'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firstname'));
+                    return deferred.promise;
+                }
+
+                if (parameters['lastname'] !== undefined) {
+                    form['lastname'] = parameters['lastname'];
+                }
+
+                if (parameters['lastname'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: lastname'));
+                    return deferred.promise;
+                }
+
+                if (parameters['phone'] !== undefined) {
+                    form['phone'] = parameters['phone'];
+                }
+
+                if (parameters['user_url'] !== undefined) {
+                    form['user_url'] = parameters['user_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['is_active'] !== undefined) {
+                    form['is_active'] = parameters['is_active'];
+                }
+
+                if (parameters['is_admin'] !== undefined) {
+                    form['is_admin'] = parameters['is_admin'];
+                }
+
+                if (parameters['is_staff'] !== undefined) {
+                    form['is_staff'] = parameters['is_staff'];
+                }
+
+                if (parameters['is_readonly'] !== undefined) {
+                    form['is_readonly'] = parameters['is_readonly'];
+                }
+
+                if (parameters['is_registering'] !== undefined) {
+                    form['is_registering'] = parameters['is_registering'];
+                }
+
+                if (parameters['is_appuser'] !== undefined) {
+                    form['is_appuser'] = parameters['is_appuser'];
+                }
+
+                if (parameters['login_page'] !== undefined) {
+                    form['login_page'] = parameters['login_page'];
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['timezone'] !== undefined) {
+                    form['timezone'] = parameters['timezone'];
+                }
+
+                if (parameters['timezone'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: timezone'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} password - 
+             * @param {string} last_login - 
+             * @param {string} email - 
+             * @param {string} username - 
+             * @param {string} firstname - person's given name
+             * @param {string} lastname - person's surname
+             * @param {string} phone - phone number contact
+             * @param {string} user_url - 
+             * @param {string} site - Site this user will be homed too
+             * @param {string} public_key - Public key string
+             * @param {boolean} is_active - 
+             * @param {boolean} is_admin - 
+             * @param {boolean} is_staff - 
+             * @param {boolean} is_readonly - 
+             * @param {boolean} is_registering - 
+             * @param {boolean} is_appuser - 
+             * @param {string} login_page - send this user to a specific page on login
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {choice} timezone - 
+             * 
+             */
+            xos.prototype.User_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/users/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['password'] !== undefined) {
+                    form['password'] = parameters['password'];
+                }
+
+                if (parameters['last_login'] !== undefined) {
+                    form['last_login'] = parameters['last_login'];
+                }
+
+                if (parameters['email'] !== undefined) {
+                    form['email'] = parameters['email'];
+                }
+
+                if (parameters['username'] !== undefined) {
+                    form['username'] = parameters['username'];
+                }
+
+                if (parameters['firstname'] !== undefined) {
+                    form['firstname'] = parameters['firstname'];
+                }
+
+                if (parameters['lastname'] !== undefined) {
+                    form['lastname'] = parameters['lastname'];
+                }
+
+                if (parameters['phone'] !== undefined) {
+                    form['phone'] = parameters['phone'];
+                }
+
+                if (parameters['user_url'] !== undefined) {
+                    form['user_url'] = parameters['user_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['public_key'] !== undefined) {
+                    form['public_key'] = parameters['public_key'];
+                }
+
+                if (parameters['is_active'] !== undefined) {
+                    form['is_active'] = parameters['is_active'];
+                }
+
+                if (parameters['is_admin'] !== undefined) {
+                    form['is_admin'] = parameters['is_admin'];
+                }
+
+                if (parameters['is_staff'] !== undefined) {
+                    form['is_staff'] = parameters['is_staff'];
+                }
+
+                if (parameters['is_readonly'] !== undefined) {
+                    form['is_readonly'] = parameters['is_readonly'];
+                }
+
+                if (parameters['is_registering'] !== undefined) {
+                    form['is_registering'] = parameters['is_registering'];
+                }
+
+                if (parameters['is_appuser'] !== undefined) {
+                    form['is_appuser'] = parameters['is_appuser'];
+                }
+
+                if (parameters['login_page'] !== undefined) {
+                    form['login_page'] = parameters['login_page'];
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['timezone'] !== undefined) {
+                    form['timezone'] = parameters['timezone'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.User_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/users/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_List_GET
+             * 
+             */
+            xos.prototype.Deployment_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deployments/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Deployment
+             * @param {string} accessControl - Access control list that specifies which sites/users may use nodes in this deployment
+             * 
+             */
+            xos.prototype.Deployment_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deployments/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['accessControl'] !== undefined) {
+                    form['accessControl'] = parameters['accessControl'];
+                }
+
+                if (parameters['accessControl'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: accessControl'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Deployment_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Deployment
+             * @param {string} accessControl - Access control list that specifies which sites/users may use nodes in this deployment
+             * 
+             */
+            xos.prototype.Deployment_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['accessControl'] !== undefined) {
+                    form['accessControl'] = parameters['accessControl'];
+                }
+
+                if (parameters['accessControl'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: accessControl'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - Name of the Deployment
+             * @param {string} accessControl - Access control list that specifies which sites/users may use nodes in this deployment
+             * 
+             */
+            xos.prototype.Deployment_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['accessControl'] !== undefined) {
+                    form['accessControl'] = parameters['accessControl'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Deployment_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reservation_List_GET
+             * 
+             */
+            xos.prototype.Reservation_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservations/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reservation_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} startTime - 
+             * @param {string} slice - 
+             * @param {integer} duration - 
+             * 
+             */
+            xos.prototype.Reservation_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservations/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['startTime'] !== undefined) {
+                    form['startTime'] = parameters['startTime'];
+                }
+
+                if (parameters['startTime'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: startTime'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['duration'] !== undefined) {
+                    form['duration'] = parameters['duration'];
+                }
+
+                if (parameters['duration'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: duration'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reservation_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Reservation_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservations/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reservation_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} startTime - 
+             * @param {string} slice - 
+             * @param {integer} duration - 
+             * 
+             */
+            xos.prototype.Reservation_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservations/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['startTime'] !== undefined) {
+                    form['startTime'] = parameters['startTime'];
+                }
+
+                if (parameters['startTime'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: startTime'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['duration'] !== undefined) {
+                    form['duration'] = parameters['duration'];
+                }
+
+                if (parameters['duration'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: duration'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reservation_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} startTime - 
+             * @param {string} slice - 
+             * @param {integer} duration - 
+             * 
+             */
+            xos.prototype.Reservation_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservations/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['startTime'] !== undefined) {
+                    form['startTime'] = parameters['startTime'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['duration'] !== undefined) {
+                    form['duration'] = parameters['duration'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Reservation_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Reservation_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/reservations/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Site_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/siteprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} site - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Site_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/siteprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/siteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} site - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Site_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/siteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} site - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Site_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/siteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/siteprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_List_GET
+             * 
+             */
+            xos.prototype.Controller_Slice_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerslices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} slice - 
+             * @param {string} tenant_id - Keystone tenant id
+             * 
+             */
+            xos.prototype.Controller_Slice_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerslices/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['tenant_id'] !== undefined) {
+                    form['tenant_id'] = parameters['tenant_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Slice_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} slice - 
+             * @param {string} tenant_id - Keystone tenant id
+             * 
+             */
+            xos.prototype.Controller_Slice_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['tenant_id'] !== undefined) {
+                    form['tenant_id'] = parameters['tenant_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} slice - 
+             * @param {string} tenant_id - Keystone tenant id
+             * 
+             */
+            xos.prototype.Controller_Slice_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['tenant_id'] !== undefined) {
+                    form['tenant_id'] = parameters['tenant_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Slice_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerslices/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_List_GET
+             * 
+             */
+            xos.prototype.Tenant_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenants/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Tenant_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenants/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters['connect_method'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: connect_method'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Tenant_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters['connect_method'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: connect_method'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Tenant_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Dashboard_View_List_GET
+             * 
+             */
+            xos.prototype.Controller_Dashboard_View_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerdashboardviews/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Dashboard_View_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} dashboardView - 
+             * @param {boolean} enabled - 
+             * @param {string} url - URL of Dashboard
+             * 
+             */
+            xos.prototype.Controller_Dashboard_View_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerdashboardviews/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['dashboardView'] !== undefined) {
+                    form['dashboardView'] = parameters['dashboardView'];
+                }
+
+                if (parameters['dashboardView'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: dashboardView'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['url'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Dashboard_View_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Dashboard_View_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Dashboard_View_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} dashboardView - 
+             * @param {boolean} enabled - 
+             * @param {string} url - URL of Dashboard
+             * 
+             */
+            xos.prototype.Controller_Dashboard_View_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['dashboardView'] !== undefined) {
+                    form['dashboardView'] = parameters['dashboardView'];
+                }
+
+                if (parameters['dashboardView'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: dashboardView'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters['url'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Dashboard_View_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} dashboardView - 
+             * @param {boolean} enabled - 
+             * @param {string} url - URL of Dashboard
+             * 
+             */
+            xos.prototype.Controller_Dashboard_View_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['dashboardView'] !== undefined) {
+                    form['dashboardView'] = parameters['dashboardView'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['url'] !== undefined) {
+                    form['url'] = parameters['url'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Dashboard_View_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Dashboard_View_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerdashboardviews/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Account_List_GET
+             * 
+             */
+            xos.prototype.Account_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/accounts/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Account_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - Site for this account
+             * 
+             */
+            xos.prototype.Account_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/accounts/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Account_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Account_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/accounts/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Account_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - Site for this account
+             * 
+             */
+            xos.prototype.Account_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/accounts/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Account_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - Site for this account
+             * 
+             */
+            xos.prototype.Account_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/accounts/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Account_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Account_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/accounts/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_List_GET
+             * 
+             */
+            xos.prototype.Tenant_Root_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantroots/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Tenant_Root_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantroots/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantroots/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantroots/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} name - name
+             * @param {string} service_specific_attribute - 
+             * @param {string} service_specific_id - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantroots/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantroots/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Role_List_GET
+             * 
+             */
+            xos.prototype.Controller_Role_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerroles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Role_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+
+             * 
+             */
+            xos.prototype.Controller_Role_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerroles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                form['role'] = 'admin';
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Role_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Role_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Role_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+
+             * 
+             */
+            xos.prototype.Controller_Role_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                form['role'] = 'admin';
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Role_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+
+             * 
+             */
+            xos.prototype.Controller_Role_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                form['role'] = 'admin';
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Role_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Role_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllerroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Type_List_GET
+             * 
+             */
+            xos.prototype.Network_Parameter_Type_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparametertypes/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Type_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - The name of this parameter
+             * @param {string} description - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Type_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparametertypes/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['description'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: description'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Type_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Type_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparametertypes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Type_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - The name of this parameter
+             * @param {string} description - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Type_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparametertypes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['description'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: description'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Type_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - The name of this parameter
+             * @param {string} description - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Type_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparametertypes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Network_Parameter_Type_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Network_Parameter_Type_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/networkparametertypes/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Credential_List_GET
+             * 
+             */
+            xos.prototype.Site_Credential_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitecredentials/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Credential_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.Site_Credential_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitecredentials/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['key_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: key_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters['enc_value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: enc_value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Credential_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Credential_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Credential_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.Site_Credential_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['key_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: key_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters['enc_value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: enc_value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Credential_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.Site_Credential_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Credential_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Credential_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitecredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Deployment_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} deployment - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Deployment_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Deployment_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} deployment - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Deployment_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} deployment - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Deployment_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Deployment_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Controller_Slice_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersliceprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} slice_privilege - 
+             * @param {string} role_id - Keystone id
+             * 
+             */
+            xos.prototype.Controller_Slice_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersliceprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice_privilege'] !== undefined) {
+                    form['slice_privilege'] = parameters['slice_privilege'];
+                }
+
+                if (parameters['slice_privilege'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice_privilege'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role_id'] !== undefined) {
+                    form['role_id'] = parameters['role_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Slice_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersliceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} slice_privilege - 
+             * @param {string} role_id - Keystone id
+             * 
+             */
+            xos.prototype.Controller_Slice_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersliceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['controller'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: controller'));
+                    return deferred.promise;
+                }
+
+                if (parameters['slice_privilege'] !== undefined) {
+                    form['slice_privilege'] = parameters['slice_privilege'];
+                }
+
+                if (parameters['slice_privilege'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice_privilege'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role_id'] !== undefined) {
+                    form['role_id'] = parameters['role_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} controller - 
+             * @param {string} slice_privilege - 
+             * @param {string} role_id - Keystone id
+             * 
+             */
+            xos.prototype.Controller_Slice_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersliceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['slice_privilege'] !== undefined) {
+                    form['slice_privilege'] = parameters['slice_privilege'];
+                }
+
+                if (parameters['role_id'] !== undefined) {
+                    form['role_id'] = parameters['role_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Controller_Slice_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Controller_Slice_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/controllersliceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Deployment_List_GET
+             * 
+             */
+            xos.prototype.Site_Deployment_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitedeployments/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Deployment_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - 
+             * @param {string} deployment - 
+             * @param {string} controller - 
+             * @param {string} availability_zone - OpenStack availability zone
+             * 
+             */
+            xos.prototype.Site_Deployment_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitedeployments/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['availability_zone'] !== undefined) {
+                    form['availability_zone'] = parameters['availability_zone'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Deployment_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Deployment_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitedeployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Deployment_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - 
+             * @param {string} deployment - 
+             * @param {string} controller - 
+             * @param {string} availability_zone - OpenStack availability zone
+             * 
+             */
+            xos.prototype.Site_Deployment_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitedeployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['deployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: deployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['availability_zone'] !== undefined) {
+                    form['availability_zone'] = parameters['availability_zone'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Deployment_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} site - 
+             * @param {string} deployment - 
+             * @param {string} controller - 
+             * @param {string} availability_zone - OpenStack availability zone
+             * 
+             */
+            xos.prototype.Site_Deployment_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitedeployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['deployment'] !== undefined) {
+                    form['deployment'] = parameters['deployment'];
+                }
+
+                if (parameters['controller'] !== undefined) {
+                    form['controller'] = parameters['controller'];
+                }
+
+                if (parameters['availability_zone'] !== undefined) {
+                    form['availability_zone'] = parameters['availability_zone'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Site_Deployment_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Site_Deployment_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/sitedeployments/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_With_Container_List_GET
+             * 
+             */
+            xos.prototype.Tenant_With_Container_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantwithcontainers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_With_Container_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Tenant_With_Container_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantwithcontainers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters['connect_method'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: connect_method'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_With_Container_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_With_Container_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantwithcontainers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_With_Container_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Tenant_With_Container_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantwithcontainers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters['connect_method'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: connect_method'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_With_Container_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Tenant_With_Container_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantwithcontainers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_With_Container_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_With_Container_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantwithcontainers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Role_List_GET
+             * 
+             */
+            xos.prototype.Deployment_Role_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentroles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Role_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+
+             * 
+             */
+            xos.prototype.Deployment_Role_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentroles/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                form['role'] = 'admin';
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Role_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Deployment_Role_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Role_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+
+             * 
+             */
+            xos.prototype.Deployment_Role_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                form['role'] = 'admin';
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Role_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+
+             * 
+             */
+            xos.prototype.Deployment_Role_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                form['role'] = 'admin';
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Deployment_Role_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Deployment_Role_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/deploymentroles/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Credential_List_GET
+             * 
+             */
+            xos.prototype.User_Credential_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usercredentials/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Credential_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.User_Credential_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usercredentials/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['key_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: key_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters['enc_value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: enc_value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Credential_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.User_Credential_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usercredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Credential_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.User_Credential_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usercredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['key_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: key_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters['enc_value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: enc_value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Credential_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - The User this credential is associated with
+             * @param {string} name - The credential type, e.g. ec2
+             * @param {string} key_id - The backend id of this credential
+             * @param {string} enc_value - The key value of this credential
+             * 
+             */
+            xos.prototype.User_Credential_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usercredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['key_id'] !== undefined) {
+                    form['key_id'] = parameters['key_id'];
+                }
+
+                if (parameters['enc_value'] !== undefined) {
+                    form['enc_value'] = parameters['enc_value'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#User_Credential_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.User_Credential_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/usercredentials/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Tenant_Root_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} tenant_root - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['tenant_root'] !== undefined) {
+                    form['tenant_root'] = parameters['tenant_root'];
+                }
+
+                if (parameters['tenant_root'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: tenant_root'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} tenant_root - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['tenant_root'] !== undefined) {
+                    form['tenant_root'] = parameters['tenant_root'];
+                }
+
+                if (parameters['tenant_root'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: tenant_root'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} tenant_root - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['tenant_root'] !== undefined) {
+                    form['tenant_root'] = parameters['tenant_root'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Tenant_Root_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Tenant_Root_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/tenantrootprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Tag_List_GET
+             * 
+             */
+            xos.prototype.Slice_Tag_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicetags/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Tag_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} slice - 
+             * @param {choice} name - The name of this tag
+             * @param {string} value - The value of this tag
+             * 
+             */
+            xos.prototype.Slice_Tag_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicetags/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Tag_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Tag_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicetags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Tag_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} slice - 
+             * @param {choice} name - The name of this tag
+             * @param {string} value - The value of this tag
+             * 
+             */
+            xos.prototype.Slice_Tag_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicetags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['slice'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: slice'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters['value'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: value'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Tag_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} slice - 
+             * @param {choice} name - The name of this tag
+             * @param {string} value - The value of this tag
+             * 
+             */
+            xos.prototype.Slice_Tag_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicetags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['slice'] !== undefined) {
+                    form['slice'] = parameters['slice'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['value'] !== undefined) {
+                    form['value'] = parameters['value'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Slice_Tag_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Slice_Tag_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/slicetags/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Coarse_Tenant_List_GET
+             * 
+             */
+            xos.prototype.Coarse_Tenant_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/coarsetenants/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Coarse_Tenant_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Coarse_Tenant_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/coarsetenants/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters['connect_method'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: connect_method'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Coarse_Tenant_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Coarse_Tenant_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/coarsetenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Coarse_Tenant_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Coarse_Tenant_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/coarsetenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['kind'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: kind'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters['connect_method'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: connect_method'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Coarse_Tenant_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} kind - 
+             * @param {string} provider_service - 
+             * @param {string} subscriber_service - 
+             * @param {string} subscriber_tenant - 
+             * @param {string} subscriber_user - 
+             * @param {string} subscriber_root - 
+             * @param {string} service_specific_id - 
+             * @param {string} service_specific_attribute - 
+             * @param {choice} connect_method - 
+             * 
+             */
+            xos.prototype.Coarse_Tenant_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/coarsetenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['kind'] !== undefined) {
+                    form['kind'] = parameters['kind'];
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['subscriber_service'] !== undefined) {
+                    form['subscriber_service'] = parameters['subscriber_service'];
+                }
+
+                if (parameters['subscriber_tenant'] !== undefined) {
+                    form['subscriber_tenant'] = parameters['subscriber_tenant'];
+                }
+
+                if (parameters['subscriber_user'] !== undefined) {
+                    form['subscriber_user'] = parameters['subscriber_user'];
+                }
+
+                if (parameters['subscriber_root'] !== undefined) {
+                    form['subscriber_root'] = parameters['subscriber_root'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_attribute'] !== undefined) {
+                    form['service_specific_attribute'] = parameters['service_specific_attribute'];
+                }
+
+                if (parameters['connect_method'] !== undefined) {
+                    form['connect_method'] = parameters['connect_method'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Coarse_Tenant_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Coarse_Tenant_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/coarsetenants/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Router_List_GET
+             * 
+             */
+            xos.prototype.Router_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/routers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Router_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} owner - 
+             * 
+             */
+            xos.prototype.Router_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/routers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['owner'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: owner'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Router_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Router_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/routers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Router_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} owner - 
+             * 
+             */
+            xos.prototype.Router_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/routers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters['owner'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: owner'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Router_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} name - 
+             * @param {string} owner - 
+             * 
+             */
+            xos.prototype.Router_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/routers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['owner'] !== undefined) {
+                    form['owner'] = parameters['owner'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Router_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Router_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/routers/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Resource_List_GET
+             * 
+             */
+            xos.prototype.Service_Resource_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceresources/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Resource_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} serviceClass - 
+             * @param {string} name - 
+             * @param {integer} maxUnitsDeployment - 
+             * @param {integer} maxUnitsNode - 
+             * @param {integer} maxDuration - 
+             * @param {integer} bucketInRate - 
+             * @param {integer} bucketMaxSize - 
+             * @param {integer} cost - 
+             * @param {boolean} calendarReservable - 
+             * 
+             */
+            xos.prototype.Service_Resource_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceresources/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['serviceClass'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: serviceClass'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['maxUnitsDeployment'] !== undefined) {
+                    form['maxUnitsDeployment'] = parameters['maxUnitsDeployment'];
+                }
+
+                if (parameters['maxUnitsDeployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: maxUnitsDeployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['maxUnitsNode'] !== undefined) {
+                    form['maxUnitsNode'] = parameters['maxUnitsNode'];
+                }
+
+                if (parameters['maxUnitsNode'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: maxUnitsNode'));
+                    return deferred.promise;
+                }
+
+                if (parameters['maxDuration'] !== undefined) {
+                    form['maxDuration'] = parameters['maxDuration'];
+                }
+
+                if (parameters['maxDuration'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: maxDuration'));
+                    return deferred.promise;
+                }
+
+                if (parameters['bucketInRate'] !== undefined) {
+                    form['bucketInRate'] = parameters['bucketInRate'];
+                }
+
+                if (parameters['bucketInRate'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: bucketInRate'));
+                    return deferred.promise;
+                }
+
+                if (parameters['bucketMaxSize'] !== undefined) {
+                    form['bucketMaxSize'] = parameters['bucketMaxSize'];
+                }
+
+                if (parameters['bucketMaxSize'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: bucketMaxSize'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cost'] !== undefined) {
+                    form['cost'] = parameters['cost'];
+                }
+
+                if (parameters['cost'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cost'));
+                    return deferred.promise;
+                }
+
+                if (parameters['calendarReservable'] !== undefined) {
+                    form['calendarReservable'] = parameters['calendarReservable'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Resource_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Resource_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Resource_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} serviceClass - 
+             * @param {string} name - 
+             * @param {integer} maxUnitsDeployment - 
+             * @param {integer} maxUnitsNode - 
+             * @param {integer} maxDuration - 
+             * @param {integer} bucketInRate - 
+             * @param {integer} bucketMaxSize - 
+             * @param {integer} cost - 
+             * @param {boolean} calendarReservable - 
+             * 
+             */
+            xos.prototype.Service_Resource_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['serviceClass'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: serviceClass'));
+                    return deferred.promise;
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['maxUnitsDeployment'] !== undefined) {
+                    form['maxUnitsDeployment'] = parameters['maxUnitsDeployment'];
+                }
+
+                if (parameters['maxUnitsDeployment'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: maxUnitsDeployment'));
+                    return deferred.promise;
+                }
+
+                if (parameters['maxUnitsNode'] !== undefined) {
+                    form['maxUnitsNode'] = parameters['maxUnitsNode'];
+                }
+
+                if (parameters['maxUnitsNode'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: maxUnitsNode'));
+                    return deferred.promise;
+                }
+
+                if (parameters['maxDuration'] !== undefined) {
+                    form['maxDuration'] = parameters['maxDuration'];
+                }
+
+                if (parameters['maxDuration'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: maxDuration'));
+                    return deferred.promise;
+                }
+
+                if (parameters['bucketInRate'] !== undefined) {
+                    form['bucketInRate'] = parameters['bucketInRate'];
+                }
+
+                if (parameters['bucketInRate'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: bucketInRate'));
+                    return deferred.promise;
+                }
+
+                if (parameters['bucketMaxSize'] !== undefined) {
+                    form['bucketMaxSize'] = parameters['bucketMaxSize'];
+                }
+
+                if (parameters['bucketMaxSize'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: bucketMaxSize'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cost'] !== undefined) {
+                    form['cost'] = parameters['cost'];
+                }
+
+                if (parameters['cost'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cost'));
+                    return deferred.promise;
+                }
+
+                if (parameters['calendarReservable'] !== undefined) {
+                    form['calendarReservable'] = parameters['calendarReservable'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Resource_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} serviceClass - 
+             * @param {string} name - 
+             * @param {integer} maxUnitsDeployment - 
+             * @param {integer} maxUnitsNode - 
+             * @param {integer} maxDuration - 
+             * @param {integer} bucketInRate - 
+             * @param {integer} bucketMaxSize - 
+             * @param {integer} cost - 
+             * @param {boolean} calendarReservable - 
+             * 
+             */
+            xos.prototype.Service_Resource_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['maxUnitsDeployment'] !== undefined) {
+                    form['maxUnitsDeployment'] = parameters['maxUnitsDeployment'];
+                }
+
+                if (parameters['maxUnitsNode'] !== undefined) {
+                    form['maxUnitsNode'] = parameters['maxUnitsNode'];
+                }
+
+                if (parameters['maxDuration'] !== undefined) {
+                    form['maxDuration'] = parameters['maxDuration'];
+                }
+
+                if (parameters['bucketInRate'] !== undefined) {
+                    form['bucketInRate'] = parameters['bucketInRate'];
+                }
+
+                if (parameters['bucketMaxSize'] !== undefined) {
+                    form['bucketMaxSize'] = parameters['bucketMaxSize'];
+                }
+
+                if (parameters['cost'] !== undefined) {
+                    form['cost'] = parameters['cost'];
+                }
+
+                if (parameters['calendarReservable'] !== undefined) {
+                    form['calendarReservable'] = parameters['calendarReservable'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Resource_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Resource_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceresources/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Privilege_List_GET
+             * 
+             */
+            xos.prototype.Service_Privilege_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Privilege_List_POST
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} service - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Service_Privilege_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceprivileges/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Privilege_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Privilege_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Privilege_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} service - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Service_Privilege_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['backend_status'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: backend_status'));
+                    return deferred.promise;
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['user'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: user'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters['role'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: role'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Privilege_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} policed - 
+             * @param {string} backend_register - 
+             * @param {string} backend_status - 
+             * @param {boolean} deleted - 
+             * @param {boolean} write_protect - 
+             * @param {boolean} lazy_blocked - 
+             * @param {boolean} no_sync - 
+             * @param {string} user - 
+             * @param {string} service - 
+             * @param {string} role - 
+             * 
+             */
+            xos.prototype.Service_Privilege_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['policed'] !== undefined) {
+                    form['policed'] = parameters['policed'];
+                }
+
+                if (parameters['backend_register'] !== undefined) {
+                    form['backend_register'] = parameters['backend_register'];
+                }
+
+                if (parameters['backend_status'] !== undefined) {
+                    form['backend_status'] = parameters['backend_status'];
+                }
+
+                if (parameters['deleted'] !== undefined) {
+                    form['deleted'] = parameters['deleted'];
+                }
+
+                if (parameters['write_protect'] !== undefined) {
+                    form['write_protect'] = parameters['write_protect'];
+                }
+
+                if (parameters['lazy_blocked'] !== undefined) {
+                    form['lazy_blocked'] = parameters['lazy_blocked'];
+                }
+
+                if (parameters['no_sync'] !== undefined) {
+                    form['no_sync'] = parameters['no_sync'];
+                }
+
+                if (parameters['user'] !== undefined) {
+                    form['user'] = parameters['user'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['role'] !== undefined) {
+                    form['role'] = parameters['role'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xos#Service_Privilege_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xos.prototype.Service_Privilege_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xos/serviceprivileges/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xos.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+
+            return xos;
+        })();
+
+        return xos;
+    }]);
\ No newline at end of file
diff --git a/gui/ngXosLib/api/ng-xoslib.js b/gui/ngXosLib/api/ng-xoslib.js
new file mode 100755
index 0000000..16b5d9b
--- /dev/null
+++ b/gui/ngXosLib/api/ng-xoslib.js
@@ -0,0 +1,6174 @@
+/*jshint -W069 */
+/*global angular:false */
+angular.module('xos.xoslib', [])
+    .factory('xoslib', ['$q', '$http', '$rootScope', function($q, $http, $rootScope) {
+        'use strict';
+
+        /**
+         * 
+         * @class xoslib
+         * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.
+         * @param {string} [domainOrOptions.domain] - The project domain
+         * @param {string} [domainOrOptions.cache] - An angularjs cache implementation
+         * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties
+         * @param {string} [cache] - An angularjs cache implementation
+         */
+        var xoslib = (function() {
+            function xoslib(options, cache) {
+                var domain = (typeof options === 'object') ? options.domain : options;
+                this.domain = typeof(domain) === 'string' ? domain : 'http://localhost:9999';
+                cache = cache || ((typeof options === 'object') ? options.cache : cache);
+                this.cache = cache;
+            }
+
+            xoslib.prototype.$on = function($scope, path, handler) {
+                var url = domain + path;
+                $scope.$on(url, function() {
+                    handler();
+                });
+                return this;
+            };
+
+            xoslib.prototype.$broadcast = function(path) {
+                var url = domain + path;
+                //cache.remove(url);
+                $rootScope.$broadcast(url);
+                return this;
+            };
+
+            xoslib.transformRequest = function(obj) {
+                var str = [];
+                for (var p in obj) {
+                    var val = obj[p];
+                    if (angular.isArray(val)) {
+                        val.forEach(function(val) {
+                            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                        });
+                    } else {
+                        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                    }
+                }
+                return str.join("&");
+            };
+
+            /**
+             * 
+             * @method
+             * @name xoslib#Monitoring_Channel_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Monitoring_Channel_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/monitoringchannel/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Monitoring_Channel_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} provider_service - 
+             * 
+             */
+            xoslib.prototype.Monitoring_Channel_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/monitoringchannel/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Monitoring_Channel_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} provider_service - 
+             * 
+             */
+            xoslib.prototype.Monitoring_Channel_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/monitoringchannel/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Monitoring_Channel_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Monitoring_Channel_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/monitoringchannel/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Monitoring_Channel_List_GET
+             * 
+             */
+            xoslib.prototype.Monitoring_Channel_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/monitoringchannel/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Monitoring_Channel_List_POST
+             * @param {string} provider_service - 
+             * 
+             */
+            xoslib.prototype.Monitoring_Channel_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/monitoringchannel/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Hpc_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Hpc_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/hpcview/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Hpc_List_GET
+             * 
+             */
+            xoslib.prototype.Hpc_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/hpcview/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Tenant_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Tenant_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/tenantview/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Tenant_List_GET
+             * 
+             */
+            xoslib.prototype.Tenant_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/tenantview/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Port_Forwarding_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Port_Forwarding_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/portforwarding/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Port_Forwarding_List_GET
+             * 
+             */
+            xoslib.prototype.Port_Forwarding_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/portforwarding/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Ssh_Key_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Ssh_Key_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/sshkeys/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Ssh_Key_List_GET
+             * 
+             */
+            xoslib.prototype.Ssh_Key_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/sshkeys/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Debug_get_vbng_dump
+             * 
+             */
+            xoslib.prototype.Cord_Debug_get_vbng_dump = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/cord_debug/vbng_dump/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/cordsubscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_Detail_PUT
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/cordsubscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_Detail_PATCH
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/cordsubscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/cordsubscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_List_GET
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/cordsubscriber/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_List_POST
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/cordsubscriber/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_list
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_list = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_update
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_update = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_partial_update
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_partial_update = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_update
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_update = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_destroy
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_destroy = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_retrieve
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_retrieve = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_vcpe_synced
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_vcpe_synced = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/vcpe_synced/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_url_filter
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_url_filter = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/url_filter/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_set_url_filter
+             * @param {string} pk - 
+             * @param {string} level - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_set_url_filter = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/url_filter/{level}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{level}', parameters['level']);
+
+                if (parameters['level'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: level'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_services
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_services = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/services/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_service
+             * @param {string} pk - 
+             * @param {string} service - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_service = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/services/{service}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{service}', parameters['service']);
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_enable_service
+             * @param {string} pk - 
+             * @param {string} service - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_enable_service = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/services/{service}/true/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{service}', parameters['service']);
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_disable_service
+             * @param {string} pk - 
+             * @param {string} service - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_disable_service = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/services/{service}/false/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{service}', parameters['service']);
+
+                if (parameters['service'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_create_user
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_create_user = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_users
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_users = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_clear_users
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_clear_users = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/clearusers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_clear_users
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_clear_users = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/clearusers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_clear_users
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_clear_users = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/clearusers/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_create_user
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_create_user = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/newuser/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_create_user
+             * @param {string} pk - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_create_user = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/newuser/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_delete_user
+             * @param {string} pk - 
+             * @param {string} uid - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_delete_user = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/{uid}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{uid}', parameters['uid']);
+
+                if (parameters['uid'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: uid'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_user_level
+             * @param {string} pk - 
+             * @param {string} uid - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_user_level = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/{uid}/url_filter/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{uid}', parameters['uid']);
+
+                if (parameters['uid'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: uid'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_set_user_level
+             * @param {string} pk - 
+             * @param {string} uid - 
+             * @param {string} level - 
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_set_user_level = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/users/{uid}/url_filter/{level}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{uid}', parameters['uid']);
+
+                if (parameters['uid'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: uid'));
+                    return deferred.promise;
+                }
+
+                path = path.replace('{level}', parameters['level']);
+
+                if (parameters['level'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: level'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_bbsdump
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_bbsdump = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subscriber/{pk}/bbsdump/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_initdemo
+             * @param {boolean} firewall_enable - 
+             * @param {string} firewall_rules - 
+             * @param {boolean} url_filter_enable - 
+             * @param {string} url_filter_rules - 
+             * @param {string} url_filter_level - 
+             * @param {boolean} vcpe_synced - 
+             * @param {boolean} cdn_enable - 
+             * @param {string} routeable_subnet - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_initdemo = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/initdemo/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['firewall_enable'] !== undefined) {
+                    form['firewall_enable'] = parameters['firewall_enable'];
+                }
+
+                if (parameters['firewall_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['firewall_rules'] !== undefined) {
+                    form['firewall_rules'] = parameters['firewall_rules'];
+                }
+
+                if (parameters['firewall_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: firewall_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_enable'] !== undefined) {
+                    form['url_filter_enable'] = parameters['url_filter_enable'];
+                }
+
+                if (parameters['url_filter_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_rules'] !== undefined) {
+                    form['url_filter_rules'] = parameters['url_filter_rules'];
+                }
+
+                if (parameters['url_filter_rules'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: url_filter_rules'));
+                    return deferred.promise;
+                }
+
+                if (parameters['url_filter_level'] !== undefined) {
+                    form['url_filter_level'] = parameters['url_filter_level'];
+                }
+
+                if (parameters['vcpe_synced'] !== undefined) {
+                    form['vcpe_synced'] = parameters['vcpe_synced'];
+                }
+
+                if (parameters['vcpe_synced'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vcpe_synced'));
+                    return deferred.promise;
+                }
+
+                if (parameters['cdn_enable'] !== undefined) {
+                    form['cdn_enable'] = parameters['cdn_enable'];
+                }
+
+                if (parameters['cdn_enable'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: cdn_enable'));
+                    return deferred.promise;
+                }
+
+                if (parameters['routeable_subnet'] !== undefined) {
+                    form['routeable_subnet'] = parameters['routeable_subnet'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_initdemo
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_initdemo = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/initdemo/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_ssiddetail
+             * @param {string} ssid - 
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_ssiddetail = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subidlookup/{ssid}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{ssid}', parameters['ssid']);
+
+                if (parameters['ssid'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: ssid'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_ssidlist
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_ssidlist = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/subidlookup/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_Subscriber_get_vbng_mapping
+             * 
+             */
+            xoslib.prototype.Cord_Subscriber_get_vbng_mapping = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/rs/vbng_mapping/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_User_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_User_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/corduser/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_User_Detail_PUT
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_User_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/corduser/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_User_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Cord_User_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/corduser/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_User_List_GET
+             * 
+             */
+            xoslib.prototype.Cord_User_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/corduser/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Cord_User_List_POST
+             * 
+             */
+            xoslib.prototype.Cord_User_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/corduser/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Volt_Tenant_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Volt_Tenant_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/volttenant/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Volt_Tenant_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} provider_service - 
+             * @param {string} service_specific_id - 
+             * @param {string} vlan_id - 
+             * 
+             */
+            xoslib.prototype.Volt_Tenant_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/volttenant/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service_specific_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['vlan_id'] !== undefined) {
+                    form['vlan_id'] = parameters['vlan_id'];
+                }
+
+                if (parameters['vlan_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vlan_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Volt_Tenant_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} provider_service - 
+             * @param {string} service_specific_id - 
+             * @param {string} vlan_id - 
+             * 
+             */
+            xoslib.prototype.Volt_Tenant_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/volttenant/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['vlan_id'] !== undefined) {
+                    form['vlan_id'] = parameters['vlan_id'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Volt_Tenant_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Volt_Tenant_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/volttenant/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Volt_Tenant_List_GET
+             * 
+             */
+            xoslib.prototype.Volt_Tenant_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/volttenant/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Volt_Tenant_List_POST
+             * @param {string} provider_service - 
+             * @param {string} service_specific_id - 
+             * @param {string} vlan_id - 
+             * 
+             */
+            xoslib.prototype.Volt_Tenant_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/volttenant/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['provider_service'] !== undefined) {
+                    form['provider_service'] = parameters['provider_service'];
+                }
+
+                if (parameters['provider_service'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: provider_service'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service_specific_id'] !== undefined) {
+                    form['service_specific_id'] = parameters['service_specific_id'];
+                }
+
+                if (parameters['service_specific_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: service_specific_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters['vlan_id'] !== undefined) {
+                    form['vlan_id'] = parameters['vlan_id'];
+                }
+
+                if (parameters['vlan_id'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: vlan_id'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Slice_Plus_Detail_GET
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Slice_Plus_Detail_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/slicesplus/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Slice_Plus_Detail_PUT
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} name - The Name of the Slice
+             * @param {boolean} enabled - Status for this Slice
+             * @param {boolean} omf_friendly - 
+             * @param {string} description - High level description of the slice and expected activities
+             * @param {string} slice_url - 
+             * @param {string} site - The Site this Slice belongs to
+             * @param {integer} max_instances - 
+             * @param {string} service - 
+             * @param {string} network - 
+             * @param {string} mount_data_sets - 
+             * @param {string} default_image - 
+             * @param {string} default_flavor - 
+             * @param {string} serviceClass - 
+             * @param {string} creator - 
+             * @param {string} network_ports - 
+             * @param {string} site_allocation - 
+             * @param {string} site_ready - 
+             * @param {string} users - 
+             * @param {string} user_names - 
+             * 
+             */
+            xoslib.prototype.Slice_Plus_Detail_PUT = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/slicesplus/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['omf_friendly'] !== undefined) {
+                    form['omf_friendly'] = parameters['omf_friendly'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['slice_url'] !== undefined) {
+                    form['slice_url'] = parameters['slice_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['max_instances'] !== undefined) {
+                    form['max_instances'] = parameters['max_instances'];
+                }
+
+                if (parameters['max_instances'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: max_instances'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['mount_data_sets'] !== undefined) {
+                    form['mount_data_sets'] = parameters['mount_data_sets'];
+                }
+
+                if (parameters['default_image'] !== undefined) {
+                    form['default_image'] = parameters['default_image'];
+                }
+
+                if (parameters['default_flavor'] !== undefined) {
+                    form['default_flavor'] = parameters['default_flavor'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['network_ports'] !== undefined) {
+                    form['network_ports'] = parameters['network_ports'];
+                }
+
+                if (parameters['site_allocation'] !== undefined) {
+                    form['site_allocation'] = parameters['site_allocation'];
+                }
+
+                if (parameters['site_ready'] !== undefined) {
+                    form['site_ready'] = parameters['site_ready'];
+                }
+
+                if (parameters['users'] !== undefined) {
+                    form['users'] = parameters['users'];
+                }
+
+                if (parameters['user_names'] !== undefined) {
+                    form['user_names'] = parameters['user_names'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PUT',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Slice_Plus_Detail_PATCH
+             * @param {string} pk - 
+             * @param {string} enacted - 
+             * @param {string} name - The Name of the Slice
+             * @param {boolean} enabled - Status for this Slice
+             * @param {boolean} omf_friendly - 
+             * @param {string} description - High level description of the slice and expected activities
+             * @param {string} slice_url - 
+             * @param {string} site - The Site this Slice belongs to
+             * @param {integer} max_instances - 
+             * @param {string} service - 
+             * @param {string} network - 
+             * @param {string} mount_data_sets - 
+             * @param {string} default_image - 
+             * @param {string} default_flavor - 
+             * @param {string} serviceClass - 
+             * @param {string} creator - 
+             * @param {string} network_ports - 
+             * @param {string} site_allocation - 
+             * @param {string} site_ready - 
+             * @param {string} users - 
+             * @param {string} user_names - 
+             * 
+             */
+            xoslib.prototype.Slice_Plus_Detail_PATCH = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/slicesplus/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['omf_friendly'] !== undefined) {
+                    form['omf_friendly'] = parameters['omf_friendly'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['slice_url'] !== undefined) {
+                    form['slice_url'] = parameters['slice_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['max_instances'] !== undefined) {
+                    form['max_instances'] = parameters['max_instances'];
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['mount_data_sets'] !== undefined) {
+                    form['mount_data_sets'] = parameters['mount_data_sets'];
+                }
+
+                if (parameters['default_image'] !== undefined) {
+                    form['default_image'] = parameters['default_image'];
+                }
+
+                if (parameters['default_flavor'] !== undefined) {
+                    form['default_flavor'] = parameters['default_flavor'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['network_ports'] !== undefined) {
+                    form['network_ports'] = parameters['network_ports'];
+                }
+
+                if (parameters['site_allocation'] !== undefined) {
+                    form['site_allocation'] = parameters['site_allocation'];
+                }
+
+                if (parameters['site_ready'] !== undefined) {
+                    form['site_ready'] = parameters['site_ready'];
+                }
+
+                if (parameters['users'] !== undefined) {
+                    form['users'] = parameters['users'];
+                }
+
+                if (parameters['user_names'] !== undefined) {
+                    form['user_names'] = parameters['user_names'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'PATCH',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Slice_Plus_Detail_DELETE
+             * @param {string} pk - 
+             * 
+             */
+            xoslib.prototype.Slice_Plus_Detail_DELETE = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/slicesplus/{pk}/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                path = path.replace('{pk}', parameters['pk']);
+
+                if (parameters['pk'] === undefined) {
+                    deferred.reject(new Error('Missing required path parameter: pk'));
+                    return deferred.promise;
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'DELETE',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Slice_Plus_List_GET
+             * 
+             */
+            xoslib.prototype.Slice_Plus_List_GET = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/slicesplus/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var cached = parameters.$cache && parameters.$cache.get(url);
+                if (cached !== undefined && parameters.$refresh !== true) {
+                    deferred.resolve(cached);
+                    return deferred.promise;
+                }
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'GET',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+            /**
+             * 
+             * @method
+             * @name xoslib#Slice_Plus_List_POST
+             * @param {string} enacted - 
+             * @param {string} name - The Name of the Slice
+             * @param {boolean} enabled - Status for this Slice
+             * @param {boolean} omf_friendly - 
+             * @param {string} description - High level description of the slice and expected activities
+             * @param {string} slice_url - 
+             * @param {string} site - The Site this Slice belongs to
+             * @param {integer} max_instances - 
+             * @param {string} service - 
+             * @param {string} network - 
+             * @param {string} mount_data_sets - 
+             * @param {string} default_image - 
+             * @param {string} default_flavor - 
+             * @param {string} serviceClass - 
+             * @param {string} creator - 
+             * @param {string} network_ports - 
+             * @param {string} site_allocation - 
+             * @param {string} site_ready - 
+             * @param {string} users - 
+             * @param {string} user_names - 
+             * 
+             */
+            xoslib.prototype.Slice_Plus_List_POST = function(parameters) {
+                if (parameters === undefined) {
+                    parameters = {};
+                }
+                var deferred = $q.defer();
+
+                var domain = this.domain;
+                var path = '/xoslib/slicesplus/';
+
+                var body;
+                var queryParameters = {};
+                var headers = {};
+                var form = {};
+
+                if (parameters['enacted'] !== undefined) {
+                    form['enacted'] = parameters['enacted'];
+                }
+
+                if (parameters['name'] !== undefined) {
+                    form['name'] = parameters['name'];
+                }
+
+                if (parameters['name'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: name'));
+                    return deferred.promise;
+                }
+
+                if (parameters['enabled'] !== undefined) {
+                    form['enabled'] = parameters['enabled'];
+                }
+
+                if (parameters['omf_friendly'] !== undefined) {
+                    form['omf_friendly'] = parameters['omf_friendly'];
+                }
+
+                if (parameters['description'] !== undefined) {
+                    form['description'] = parameters['description'];
+                }
+
+                if (parameters['slice_url'] !== undefined) {
+                    form['slice_url'] = parameters['slice_url'];
+                }
+
+                if (parameters['site'] !== undefined) {
+                    form['site'] = parameters['site'];
+                }
+
+                if (parameters['site'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: site'));
+                    return deferred.promise;
+                }
+
+                if (parameters['max_instances'] !== undefined) {
+                    form['max_instances'] = parameters['max_instances'];
+                }
+
+                if (parameters['max_instances'] === undefined) {
+                    deferred.reject(new Error('Missing required form parameter: max_instances'));
+                    return deferred.promise;
+                }
+
+                if (parameters['service'] !== undefined) {
+                    form['service'] = parameters['service'];
+                }
+
+                if (parameters['network'] !== undefined) {
+                    form['network'] = parameters['network'];
+                }
+
+                if (parameters['mount_data_sets'] !== undefined) {
+                    form['mount_data_sets'] = parameters['mount_data_sets'];
+                }
+
+                if (parameters['default_image'] !== undefined) {
+                    form['default_image'] = parameters['default_image'];
+                }
+
+                if (parameters['default_flavor'] !== undefined) {
+                    form['default_flavor'] = parameters['default_flavor'];
+                }
+
+                if (parameters['serviceClass'] !== undefined) {
+                    form['serviceClass'] = parameters['serviceClass'];
+                }
+
+                if (parameters['creator'] !== undefined) {
+                    form['creator'] = parameters['creator'];
+                }
+
+                if (parameters['network_ports'] !== undefined) {
+                    form['network_ports'] = parameters['network_ports'];
+                }
+
+                if (parameters['site_allocation'] !== undefined) {
+                    form['site_allocation'] = parameters['site_allocation'];
+                }
+
+                if (parameters['site_ready'] !== undefined) {
+                    form['site_ready'] = parameters['site_ready'];
+                }
+
+                if (parameters['users'] !== undefined) {
+                    form['users'] = parameters['users'];
+                }
+
+                if (parameters['user_names'] !== undefined) {
+                    form['user_names'] = parameters['user_names'];
+                }
+
+                if (parameters.$queryParameters) {
+                    Object.keys(parameters.$queryParameters)
+                        .forEach(function(parameterName) {
+                            var parameter = parameters.$queryParameters[parameterName];
+                            queryParameters[parameterName] = parameter;
+                        });
+                }
+
+                var url = domain + path;
+                var options = {
+                    timeout: parameters.$timeout,
+                    method: 'POST',
+                    url: url,
+                    params: queryParameters,
+                    data: body,
+                    headers: headers
+                };
+                if (Object.keys(form).length > 0) {
+                    options.data = form;
+                    options.headers['Content-Type'] = 'application/x-www-form-urlencoded';
+                    options.transformRequest = xoslib.transformRequest;
+                }
+                $http(options)
+                    .success(function(data, status, headers, config) {
+                        deferred.resolve(data);
+                        if (parameters.$cache !== undefined) {
+                            parameters.$cache.put(url, data, parameters.$cacheItemOpts ? parameters.$cacheItemOpts : {});
+                        }
+                    })
+                    .error(function(data, status, headers, config) {
+                        deferred.reject({
+                            status: status,
+                            headers: headers,
+                            config: config,
+                            body: data
+                        });
+                    });
+
+                return deferred.promise;
+            };
+
+            return xoslib;
+        })();
+
+        return xoslib;
+    }]);
\ No newline at end of file
diff --git a/gui/ngXosLib/apiTemplates/custom-angular-class.mustache b/gui/ngXosLib/apiTemplates/custom-angular-class.mustache
new file mode 100644
index 0000000..c92a870
--- /dev/null
+++ b/gui/ngXosLib/apiTemplates/custom-angular-class.mustache
@@ -0,0 +1,82 @@
+/*jshint -W069 */
+/*global angular:false */
+angular.module('{{&moduleName}}', [])
+.factory('{{&className}}', ['$q', '$http', '$rootScope', function($q, $http, $rootScope){
+    'use strict';
+
+    /**
+     * {{&description}}
+     * @class {{&className}}
+     * @param {(string|object)} [domainOrOptions] - The project domain or options object. If object, see the object's optional properties.
+     * @param {string} [domainOrOptions.domain] - The project domain
+     * @param {string} [domainOrOptions.cache] - An angularjs cache implementation
+     * @param {object} [domainOrOptions.token] - auth token - object with value property and optional headerOrQueryName and isQuery properties
+     * @param {string} [cache] - An angularjs cache implementation
+     */
+    var {{&className}} = (function(){
+        function {{&className}}(options, cache){
+            var domain = (typeof options === 'object') ? options.domain : options;
+            this.domain = typeof(domain) === 'string' ? domain : '{{&domain}}';
+            cache = cache || ((typeof options === 'object') ? options.cache : cache);
+            this.cache = cache;
+            {{#isSecure}}
+                this.token = (typeof options === 'object') ? (options.token ? options.token : {}) : {};
+            {{/isSecure}}
+        }
+
+        {{&className}}.prototype.$on = function($scope, path, handler){
+            var url = domain + path;
+            $scope.$on(url, function(){
+                handler();
+            });
+            return this;
+        };
+
+        {{&className}}.prototype.$broadcast = function(path){
+            var url = domain + path;
+            //cache.remove(url);
+            $rootScope.$broadcast(url);
+            return this;
+        };
+
+        {{&className}}.transformRequest = function(obj) {
+            var str = [];
+            for(var p in obj) {
+                var val = obj[p];
+                if(angular.isArray(val)) {
+                   val.forEach(function(val){
+                     str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                   });
+                } else {
+                   str.push(encodeURIComponent(p) + "=" + encodeURIComponent(val));
+                }
+            }
+            return str.join("&");
+        };
+
+        {{#isSecure}}
+            /**
+             * Set Token
+             * @method
+             * @name {{&className}}#setToken
+             * @param {string} value - token's value
+             * @param {string} headerOrQueryName - the header or query name to send the token at
+             * @param {boolean} isQuery - true if send the token as query param, otherwise, send as header param
+             *
+             */
+            {{&className}}.prototype.setToken = function (value, headerOrQueryName, isQuery) {
+                this.token.value = value;
+                this.token.headerOrQueryName = headerOrQueryName;
+                this.token.isQuery = isQuery;
+            };
+        {{/isSecure}}
+
+        {{#methods}}
+            {{> method}}
+        {{/methods}}
+
+  return {{&className}};
+    })();
+
+    return {{&className}};
+}]);
diff --git a/gui/ngXosLib/bower.json b/gui/ngXosLib/bower.json
new file mode 100644
index 0000000..554e02f
--- /dev/null
+++ b/gui/ngXosLib/bower.json
@@ -0,0 +1,27 @@
+{
+  "name": "ngXosVendor",
+  "version": "1.0.0",
+  "authors": [
+    "Matteo Scandolo <matteo.scandolo@link-me.it>"
+  ],
+  "description": "List of common used library in XOS environment",
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+    "angular": "~1.4.7",
+    "angular-ui-router": "~0.2.15",
+    "angular-resource": "~1.4.7",
+    "ng-lodash": "~0.3.0",
+    "angular-cookies": "~1.4.7",
+    "swagger-angular-client": "~0.1.12"
+  },
+  "devDependencies": {
+    "angular-mocks": "~1.4.7"
+  }
+}
diff --git a/gui/ngXosLib/generator-xos/app/index.js b/gui/ngXosLib/generator-xos/app/index.js
new file mode 100755
index 0000000..547a8f9
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/index.js
@@ -0,0 +1,154 @@
+'use strict';
+
+var generators = require('yeoman-generator');
+var user = require('../node_modules/yeoman-generator/lib/actions/user');
+
+var config = {};
+
+module.exports = generators.Base.extend({
+  _fistCharToUpper: function(string){
+    return string.replace(/^./, string[0].toUpperCase());
+  },
+  prompting: {
+    name:function(){
+      var done = this.async();
+      this.prompt({
+        type    : 'input',
+        name    : 'name',
+        message : 'Your project name',
+        default : this.config.get('name') // value set in .yo-rc.json
+      }, function (answers) {
+        // TODO check if this view already exist
+        config.name = answers.name;
+        done();
+      }.bind(this));
+    },
+    host:function(){
+      var done = this.async();
+      this.prompt({
+        type    : 'input',
+        name    : 'host',
+        message : 'Your project remote host (with port)'
+      }, function (answers) {
+        config.host = answers.host;
+        done();
+      }.bind(this));
+    },
+    token:function(){
+      var done = this.async();
+      this.prompt({
+        type    : 'input',
+        name    : 'token',
+        message : 'Insert your active session token'
+      }, function (answers) {
+        config.token = answers.token;
+        done();
+      }.bind(this));
+    },
+    session:function(){
+      var done = this.async();
+      this.prompt({
+        type    : 'input',
+        name    : 'session',
+        message : 'Insert your active session id'
+      }, function (answers) {
+        config.session = answers.session;
+        done();
+      }.bind(this));
+    }
+  },
+  writing: {
+    rcFiles: function(){
+      this.fs.copy(this.templatePath('.bowerrc'), this.destinationPath(`${this.config.get('folder')}/${config.name}/.bowerrc`));
+      this.fs.copy(this.templatePath('.gitignore'), this.destinationPath(`${this.config.get('folder')}/${config.name}/.gitignore`));
+    },
+    packageJson: function(){
+      this.fs.copyTpl(
+        this.templatePath('package.json'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/package.json`),
+        { name: config.name, author: {name:user.git.name()} }
+      );
+    },
+    envConfig: function(){
+      this.fs.copyTpl(
+        this.templatePath('env/default.js'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/env/default.js`),
+        { host: config.host, token: config.token, session: config.session }
+      );
+    },
+    bowerJson: function(){
+      this.fs.copyTpl(
+        this.templatePath('bower.json'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/bower.json`),
+        { name: config.name, author: {name:user.git.name(), email: user.git.email()} }
+      );
+    },
+    index: function(){
+      this.fs.copyTpl(
+        this.templatePath('src/index.html'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/src/index.html`),
+        { name: config.name, fileName: this._fistCharToUpper(config.name) }
+      );
+    },
+    css: function(){
+      this.fs.copyTpl(
+        this.templatePath('src/css/dev.css'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/src/css/dev.css`),
+        {fileName: this._fistCharToUpper(config.name)}
+      );
+    },
+    mainJs: function(){
+      this.fs.copyTpl(
+        this.templatePath('src/js/main.js'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/src/js/main.js`),
+        { name: config.name, fileName: this._fistCharToUpper(config.name) }
+      );
+    },
+    template: function(){
+      this.fs.copy(this.templatePath('src/templates/users-list.tpl.html'), this.destinationPath(`${this.config.get('folder')}/${config.name}/src/templates/users-list.tpl.html`));
+    },
+    gulp: function(){
+      this.fs.copyTpl(
+        this.templatePath('gulp/*.js'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/gulp`),
+        {name:config.name, fileName: this._fistCharToUpper(config.name)}
+      );
+      this.fs.copy(this.templatePath('gulpfile.js'), this.destinationPath(`${this.config.get('folder')}/${config.name}/gulpfile.js`));
+    },
+    karma: function(){
+      this.fs.copy(
+        this.templatePath('karma.conf.js'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/karma.conf.js`)
+      );
+    },
+    spec: function(){
+      const userName = user.git.name().split(' ');
+      this.fs.copyTpl(
+        this.templatePath('spec/sample.test.js'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/spec/sample.test.js`),
+        { name: config.name, user: {email: user.git.email(), firstname: userName[0], lastname: userName[1] } }
+      );
+    },
+    lint: function(){
+      this.fs.copy(
+        this.templatePath('.eslintrc'),
+        this.destinationPath(`${this.config.get('folder')}/${config.name}/.eslintrc`)
+      );
+    }
+  },
+  install: function(){
+    var done = this.async();
+    this.prompt({
+      type    : 'confirm',
+      name    : 'deps',
+      message : 'Install dependecies?',
+      default : false // value set in .yo-rc.json
+    }, function (answers) {
+      if(answers.deps){
+        process.chdir(`${this.config.get('folder')}/${config.name}`);
+        this.installDependencies();
+      }
+      done();
+    }.bind(this));
+  }
+});
diff --git a/gui/ngXosLib/generator-xos/app/templates/.bowerrc b/gui/ngXosLib/generator-xos/app/templates/.bowerrc
new file mode 100644
index 0000000..e491038
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/.bowerrc
@@ -0,0 +1,3 @@
+{
+  "directory": "src/vendor/"
+}
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/.eslintrc b/gui/ngXosLib/generator-xos/app/templates/.eslintrc
new file mode 100644
index 0000000..c852748
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/.eslintrc
@@ -0,0 +1,42 @@
+{
+    "ecmaFeatures": {
+        "blockBindings": true,
+        "forOf": true,
+        "destructuring": true,
+        "arrowFunctions": true,
+        "templateStrings": true
+    },
+    "env": { 
+        "browser": true,
+        "node": true,
+        "es6": true
+    },
+    "plugins": [
+        //"angular"
+    ],
+    "rules": {
+        "quotes": [2, "single"],
+        "camelcase": [1, {"properties": "always"}],
+        "no-underscore-dangle": 1,
+        "eqeqeq": [2, "smart"],
+        "no-alert": 1,
+        "key-spacing": [1, { "beforeColon": false, "afterColon": true }],
+        "indent": [2, 2],
+        "no-irregular-whitespace": 1,
+        "eol-last": 0,
+        "max-nested-callbacks": [2, 4],
+        "comma-spacing": [1, {"before": false, "after": true}],
+        "no-trailing-spaces": [1, { skipBlankLines: true }],
+        "no-unused-vars": [1, {"vars": "all", "args": "after-used"}],
+        "new-cap": 0,
+
+        //"angular/ng_module_name": [2, '/^xos\.*[a-z]*$/'],
+        //"angular/ng_controller_name": [2, '/^[a-z].*Ctrl$/'],
+        //"angular/ng_service_name": [2, '/^[A-Z].*Service$/'],
+        //"angular/ng_directive_name": [2, '/^[a-z]+[[A-Z].*]*$/'],
+        //"angular/ng_di": [0, "function or array"]
+    },
+    "globals" :{
+        "angular": true
+    } 
+}
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/.gitignore b/gui/ngXosLib/generator-xos/app/templates/.gitignore
new file mode 100644
index 0000000..567aee4
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/.gitignore
@@ -0,0 +1,6 @@
+dist/
+src/vendor
+.tmp
+node_modules
+npm-debug.log
+dist/
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/bower.json b/gui/ngXosLib/generator-xos/app/templates/bower.json
new file mode 100644
index 0000000..672aedc
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/bower.json
@@ -0,0 +1,29 @@
+{
+  "name": "xos-<%= name %>",
+  "version": "0.0.0",
+  "authors": [
+    "<%= author.name %> <<%= author.email %>>"
+  ],
+  "description": "The <%= name %> view",
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "static/js/vendor/",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+  },
+  "devDependencies": {
+    "jquery": "~2.1.4",
+    "angular-mocks": "~1.4.7",
+    "angular": "~1.4.7",
+    "angular-ui-router": "~0.2.15",
+    "angular-cookies": "~1.4.7",
+    "angular-resource": "~1.4.7",
+    "ng-lodash": "~0.3.0",
+    "bootstrap-css": "2.3.2"
+  }
+}
diff --git a/gui/ngXosLib/generator-xos/app/templates/env/default.js b/gui/ngXosLib/generator-xos/app/templates/env/default.js
new file mode 100644
index 0000000..5db8632
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/env/default.js
@@ -0,0 +1,13 @@
+// This is a default configuration for your development environment.
+// You can duplicate this configuration for any of your Backend Environments.
+// Different configurations are loaded setting a NODE_ENV variable that contain the config file name.
+// `NODE_ENV=local npm start`
+//
+// If xoscsrftoken or xossessionid are not specified the browser value are used
+// (works only for local environment as both application are served on the same domain)
+
+module.exports = {
+  host: '<%= host %>',
+  xoscsrftoken: '<%= token %>',
+  xossessionid: '<%= session %>'
+};
diff --git a/gui/ngXosLib/generator-xos/app/templates/gulp/build.js b/gui/ngXosLib/generator-xos/app/templates/gulp/build.js
new file mode 100644
index 0000000..4a04218
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/gulp/build.js
@@ -0,0 +1,118 @@
+'use strict';
+
+// BUILD
+//
+// The only purpose of this gulpfile is to build a XOS view and copy the correct files into
+// .html => dashboards
+// .js (minified and concat) => static/js
+//
+// The template are parsed and added to js with angular $templateCache
+
+var gulp = require('gulp');
+var ngAnnotate = require('gulp-ng-annotate');
+var uglify = require('gulp-uglify');
+var templateCache = require('gulp-angular-templatecache');
+var runSequence = require('run-sequence');
+var concat = require('gulp-concat');
+var del = require('del');
+var wiredep = require('wiredep');
+var angularFilesort = require('gulp-angular-filesort');
+var _ = require('lodash');
+var eslint = require('gulp-eslint');
+var inject = require('gulp-inject');
+var rename = require('gulp-rename');
+var replace = require('gulp-replace');
+
+var TEMPLATE_FOOTER = `}]);
+angular.module('xos.<%= name %>').run(function($location){$location.path('/')});
+angular.bootstrap(angular.element('#xos<%= fileName %>'), ['xos.<%= name %>']);`;
+
+module.exports = function(options){
+  
+  // delete previous builded file
+  gulp.task('clean', function(){
+    return del(
+      [options.dashboards + 'xos<%= fileName %>.html'],
+      {force: true}
+    );
+  });
+
+  // compile and minify scripts
+  gulp.task('scripts', function() {
+    return gulp.src([
+      options.tmp + '**/*.js'
+    ])
+    .pipe(ngAnnotate())
+    .pipe(angularFilesort())
+    .pipe(concat('xos<%= fileName %>.js'))
+    .pipe(uglify())
+    .pipe(gulp.dest(options.static + 'js/'));
+  });
+
+  // set templates in cache
+  gulp.task('templates', function(){
+    return gulp.src('./src/templates/*.html')
+      .pipe(templateCache({
+        module: 'xos.<%= name %>',
+        root: 'templates/',
+        templateFooter: TEMPLATE_FOOTER
+      }))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  // copy html index to Django Folder
+  gulp.task('copyHtml', ['clean'], function(){
+    return gulp.src(options.src + 'index.html')
+      // remove dev dependencies from html
+      .pipe(replace(/<!-- bower:css -->(\n.*)*\n<!-- endbower --><!-- endcss -->/, ''))
+      .pipe(replace(/<!-- bower:js -->(\n.*)*\n<!-- endbower --><!-- endjs -->/, ''))
+      .pipe(replace(/ng-app=".*"\s/, ''))
+      // injecting minified files
+      .pipe(
+        inject(
+          gulp.src([
+            options.static + 'js/vendor/xos<%= fileName %>Vendor.js',
+            options.static + 'js/xos<%= fileName %>.js'
+          ])
+        )
+      )
+      .pipe(rename('xos<%= fileName %>.html'))
+      .pipe(gulp.dest(options.dashboards));
+  });
+
+  // minify vendor js files
+  gulp.task('wiredep', function(){
+    var bowerDeps = wiredep().js;
+    if(!bowerDeps){
+      return;
+    }
+
+    // remove angular (it's already loaded)
+    _.remove(bowerDeps, function(dep){
+      return dep.indexOf('angular/angular.js') !== -1;
+    });
+
+    return gulp.src(bowerDeps)
+      .pipe(concat('xos<%= fileName %>Vendor.js'))
+      .pipe(uglify())
+      .pipe(gulp.dest(options.static + 'js/vendor/'));
+  });
+
+  gulp.task('lint', function () {
+    return gulp.src(['src/js/**/*.js'])
+      .pipe(eslint())
+      .pipe(eslint.format())
+      .pipe(eslint.failAfterError());
+  });
+
+  gulp.task('build', function() {
+    runSequence(
+      'templates',
+      'babel',
+      'scripts',
+      'wiredep',
+      'copyHtml',
+      'cleanTmp'
+    );
+  });
+};
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/gulp/server.js b/gui/ngXosLib/generator-xos/app/templates/gulp/server.js
new file mode 100644
index 0000000..7605294
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/gulp/server.js
@@ -0,0 +1,146 @@
+'use strict';
+
+var gulp = require('gulp');
+var browserSync = require('browser-sync').create();
+var inject = require('gulp-inject');
+var runSequence = require('run-sequence');
+var angularFilesort = require('gulp-angular-filesort');
+var babel = require('gulp-babel');
+var wiredep = require('wiredep').stream;
+var httpProxy = require('http-proxy');
+var del = require('del');
+
+const environment = process.env.NODE_ENV;
+
+if (environment){
+  var conf = require(`../env/${environment}.js`);
+}
+else{
+  var conf = require('../env/default.js')
+}
+
+var proxy = httpProxy.createProxyServer({
+  target: conf.host || 'http://0.0.0.0:9999'
+});
+
+
+proxy.on('error', function(error, req, res) {
+  res.writeHead(500, {
+    'Content-Type': 'text/plain'
+  });
+
+  console.error('[Proxy]', error);
+});
+
+module.exports = function(options){
+
+  // open in browser with sync and proxy to 0.0.0.0
+  gulp.task('browser', function() {
+    browserSync.init({
+      // reloadDelay: 500,
+      // logLevel: 'debug',
+      // logConnections: true,
+      startPath: '#/',
+      snippetOptions: {
+        rule: {
+          match: /<!-- browserSync -->/i
+        }
+      },
+      server: {
+        baseDir: options.src,
+        routes: {
+          '/api': options.api,
+          '/xosHelpers/src': options.helpers
+        },
+        middleware: function(req, res, next){
+          if(
+            req.url.indexOf('/xos/') !== -1 ||
+            req.url.indexOf('/xoslib/') !== -1 ||
+            req.url.indexOf('/hpcapi/') !== -1
+          ){
+            if(conf.xoscsrftoken && conf.xossessionid){
+              req.headers.cookie = `xoscsrftoken=${conf.xoscsrftoken}; xossessionid=${conf.xossessionid}`;
+              req.headers['x-csrftoken'] = conf.xoscsrftoken;
+            }
+            proxy.web(req, res);
+          }
+          else{
+            next();
+          }
+        }
+      }
+    });
+
+    gulp.watch(options.src + 'js/**/*.js', ['js-watch']);
+    gulp.watch(options.src + 'vendor/**/*.js', ['bower'], function(){
+      browserSync.reload();
+    });
+    gulp.watch(options.src + '**/*.html', function(){
+      browserSync.reload();
+    });
+  });
+
+  // transpile js with sourceMaps
+  gulp.task('babel', function(){
+    return gulp.src(options.scripts + '**/*.js')
+      .pipe(babel({sourceMaps: true}))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  // inject scripts
+  gulp.task('injectScript', ['cleanTmp', 'babel'], function(){
+    return gulp.src(options.src + 'index.html')
+      .pipe(
+        inject(
+          gulp.src([
+            options.tmp + '**/*.js',
+            options.api + '*.js',
+            options.helpers + '**/*.js'
+          ])
+          .pipe(angularFilesort()),
+          {
+            ignorePath: [options.src, '/../../ngXosLib']
+          }
+        )
+      )
+      .pipe(gulp.dest(options.src));
+  });
+
+  // inject CSS
+  gulp.task('injectCss', function(){
+    return gulp.src(options.src + 'index.html')
+      .pipe(
+        inject(
+          gulp.src(options.src + 'css/*.css'),
+          {
+            ignorePath: [options.src]
+          }
+          )
+        )
+      .pipe(gulp.dest(options.src));
+  });
+
+  // inject bower dependencies with wiredep
+  gulp.task('bower', function () {
+    return gulp.src(options.src + 'index.html')
+    .pipe(wiredep({devDependencies: true}))
+    .pipe(gulp.dest(options.src));
+  });
+
+  gulp.task('js-watch', ['injectScript'], function(){
+    browserSync.reload();
+  });
+
+  gulp.task('cleanTmp', function(){
+    return del([options.tmp + '**/*']);
+  });
+
+  gulp.task('serve', function() {
+    runSequence(
+      'bower',
+      'injectScript',
+      'injectCss',
+      ['browser']
+    );
+  });
+};
diff --git a/gui/ngXosLib/generator-xos/app/templates/gulpfile.js b/gui/ngXosLib/generator-xos/app/templates/gulpfile.js
new file mode 100644
index 0000000..b2cdab8
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/gulpfile.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var gulp = require('gulp');
+var wrench = require('wrench');
+
+var options = {
+  src: 'src/',
+  scripts: 'src/js/',
+  tmp: 'src/.tmp',
+  dist: 'dist/',
+  api: '../../ngXosLib/api/',
+  helpers: '../../ngXosLib/xosHelpers/src/',
+  static: '../../../xos/core/xoslib/static/', // this is the django static folder
+  dashboards: '../../../xos/core/xoslib/dashboards/' // this is the django html folder
+};
+
+wrench.readdirSyncRecursive('./gulp')
+.map(function(file) {
+  require('./gulp/' + file)(options);
+});
+
+gulp.task('default', function () {
+  gulp.start('build');
+});
diff --git a/gui/ngXosLib/generator-xos/app/templates/karma.conf.js b/gui/ngXosLib/generator-xos/app/templates/karma.conf.js
new file mode 100644
index 0000000..83d3f63
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/karma.conf.js
@@ -0,0 +1,88 @@
+// Karma configuration
+// Generated on Tue Oct 06 2015 09:27:10 GMT+0000 (UTC)
+
+/* eslint indent: [2,2], quotes: [2, "single"]*/
+
+/*eslint-disable*/
+var wiredep = require('wiredep');
+var path = require('path');
+
+var bowerComponents = wiredep( {devDependencies: true} )[ 'js' ].map(function( file ){
+  return path.relative(process.cwd(), file);
+});
+
+module.exports = function(config) {
+/*eslint-enable*/
+  config.set({
+
+    // base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: '',
+
+
+    // frameworks to use
+    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine'],
+
+
+    // list of files / patterns to load in the browser
+    files: bowerComponents.concat([
+      '../../static/js/xosApi.js',
+      '../../static/js/vendor/ngXosHelpers.js',
+      'src/js/**/*.js',
+      'spec/**/*.mock.js',
+      'spec/**/*.test.js',
+      'src/**/*.html'
+    ]),
+
+
+    // list of files to exclude
+    exclude: [
+    ],
+
+
+    // preprocess matching files before serving them to the browser
+    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+    preprocessors: {
+      'src/js/**/*.js': ['babel'],
+      'spec/**/*.test.js': ['babel'],
+      'src/**/*.html': ['ng-html2js']
+    },
+
+    ngHtml2JsPreprocessor: {
+      stripPrefix: 'src/', //strip the src path from template url (http://stackoverflow.com/questions/22869668/karma-unexpected-request-when-testing-angular-directive-even-with-ng-html2js)
+      moduleName: 'templates' // define the template module name
+    },
+
+    // test results reporter to use
+    // possible values: 'dots', 'progress'
+    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['mocha'],
+
+
+    // web server port
+    port: 9876,
+
+
+    // enable / disable colors in the output (reporters and logs)
+    colors: true,
+
+
+    // level of logging
+    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+    logLevel: config.LOG_INFO,
+
+
+    // enable / disable watching file and executing tests whenever any file changes
+    autoWatch: true,
+
+
+    // start these browsers
+    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+    browsers: ['PhantomJS'],
+
+
+    // Continuous Integration mode
+    // if true, Karma captures browsers, runs the tests and exits
+    singleRun: false
+  });
+};
diff --git a/gui/ngXosLib/generator-xos/app/templates/package.json b/gui/ngXosLib/generator-xos/app/templates/package.json
new file mode 100644
index 0000000..7a842fe
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "xos-<%= name %>",
+  "version": "1.0.0",
+  "description": "Angular Application for XOS, created with generator-xos",
+  "scripts": {
+    "prestart": "npm install && bower install",
+    "start": "gulp serve",
+    "prebuild": "npm install && bower install",
+    "build": "gulp",
+    "test": "karma start",
+    "lint": "eslint src/js/"
+  },
+  "keywords": [
+    "XOS",
+    "Angular",
+    "XOSlib"
+  ],
+  "author": "<%= author.name %>",
+  "license": "MIT",
+  "dependencies": {},
+  "devDependencies": {
+    "browser-sync": "^2.9.11",
+    "del": "^2.0.2",
+    "gulp": "^3.9.0",
+    "gulp-angular-filesort": "^1.1.1",
+    "gulp-angular-templatecache": "^1.8.0",
+    "gulp-babel": "^5.3.0",
+    "gulp-concat": "^2.6.0",
+    "gulp-inject": "^3.0.0",
+    "gulp-minify-html": "^1.0.4",
+    "gulp-rename": "^1.2.2",
+    "gulp-replace": "^0.5.4",
+    "gulp-uglify": "^1.4.2",
+    "http-proxy": "^1.12.0",
+    "proxy-middleware": "^0.15.0",
+    "run-sequence": "^1.1.4",
+    "wiredep": "^3.0.0-beta",
+    "wrench": "^1.5.8",
+    "gulp-ng-annotate": "^1.1.0",
+    "lodash": "^3.10.1",
+    "eslint": "^1.8.0",
+    "eslint-plugin-angular": "linkmesrl/eslint-plugin-angular",
+    "gulp-eslint": "^1.0.0"
+  }
+}
diff --git a/gui/ngXosLib/generator-xos/app/templates/spec/sample.test.js b/gui/ngXosLib/generator-xos/app/templates/spec/sample.test.js
new file mode 100644
index 0000000..10a74ad
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/spec/sample.test.js
@@ -0,0 +1,37 @@
+'use strict';
+
+describe('The User List', () => {
+  
+  var scope, element, isolatedScope, httpBackend;
+
+  beforeEach(module('xos.<%= name %>'));
+  beforeEach(module('templates'));
+
+  beforeEach(inject(function($httpBackend, $compile, $rootScope){
+    
+    httpBackend = $httpBackend;
+    // Setting up mock request
+    $httpBackend.expectGET('/xos/users/?no_hyperlinks=1').respond([
+      {
+        email: '<%= user.email %>',
+        firstname: '<%= user.firstname %>',
+        lastname: '<%= user.lastname %>' 
+      }
+    ]);
+  
+    scope = $rootScope.$new();
+    element = angular.element('<users-list></users-list>');
+    $compile(element)(scope);
+    scope.$digest();
+    isolatedScope = element.isolateScope().vm;
+  }));
+
+  it('should load 1 users', () => {
+    httpBackend.flush();
+    expect(isolatedScope.users.length).toBe(1);
+    expect(isolatedScope.users[0].email).toEqual('<%= user.email %>');
+    expect(isolatedScope.users[0].firstname).toEqual('<%= user.firstname %>');
+    expect(isolatedScope.users[0].lastname).toEqual('<%= user.lastname %>');
+  });
+
+});
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/src/css/dev.css b/gui/ngXosLib/generator-xos/app/templates/src/css/dev.css
new file mode 100644
index 0000000..d7bc2d9
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/src/css/dev.css
@@ -0,0 +1,5 @@
+#xos<%=fileName%>{
+  position: absolute;
+  top: 100px;
+  left: 200px;
+}
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/src/index.html b/gui/ngXosLib/generator-xos/app/templates/src/index.html
new file mode 100644
index 0000000..b271d11
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/src/index.html
@@ -0,0 +1,14 @@
+<!-- browserSync -->
+<!-- bower:css -->
+<!-- endbower --><!-- endcss -->
+<!-- inject:css -->
+<!-- endinject -->
+
+<div ng-app="xos.<%= name %>" id="xos<%= fileName %>">
+    <div ui-view></div>
+</div>
+
+<!-- bower:js -->
+<!-- endbower --><!-- endjs -->
+<!-- inject:js -->
+<!-- endinject -->
diff --git a/gui/ngXosLib/generator-xos/app/templates/src/js/main.js b/gui/ngXosLib/generator-xos/app/templates/src/js/main.js
new file mode 100644
index 0000000..878e4eb
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/src/js/main.js
@@ -0,0 +1,38 @@
+'use strict';
+
+angular.module('xos.<%= name %>', [
+  'ngResource',
+  'ngCookies',
+  'ngLodash',
+  'ui.router',
+  'xos.helpers'
+])
+.config(($stateProvider) => {
+  $stateProvider
+  .state('user-list', {
+    url: '/',
+    template: '<users-list></users-list>'
+  });
+})
+.config(function($httpProvider){
+  $httpProvider.interceptors.push('NoHyperlinks');
+})
+.directive('usersList', function(){
+  return {
+    restrict: 'E',
+    scope: {},
+    bindToController: true,
+    controllerAs: 'vm',
+    templateUrl: 'templates/users-list.tpl.html',
+    controller: function(XosApi){
+      // retrieving user list
+      XosApi.User_List_GET()
+      .then((users) => {
+        this.users = users;
+      })
+      .catch((e) => {
+        throw new Error(e);
+      });
+    }
+  };
+});
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html b/gui/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html
new file mode 100644
index 0000000..2983ad0
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/app/templates/src/templates/users-list.tpl.html
@@ -0,0 +1,14 @@
+<div class="row">
+  <h1>Users List</h1>
+  <p>This is only an example view.</p>
+</div>
+<div class="row">
+  <div class="span4">Email</div>
+  <div class="span4">First Name</div>
+  <div class="span4">Last Name</div>
+</div>  
+<div class="row" ng-repeat="user in vm.users">
+  <div class="span4">{{user.email}}</div>
+  <div class="span4">{{user.firstname}}</div>
+  <div class="span4">{{user.lastname}}</div>
+</div>  
\ No newline at end of file
diff --git a/gui/ngXosLib/generator-xos/package.json b/gui/ngXosLib/generator-xos/package.json
new file mode 100755
index 0000000..58b5a33
--- /dev/null
+++ b/gui/ngXosLib/generator-xos/package.json
@@ -0,0 +1,17 @@
+{
+  "name": "generator-xos",
+  "version": "1.0.0",
+  "description": "View generator for XOS",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "Matteo Scandolo",
+  "license": "ISC",
+  "dependencies": {
+    "yeoman-generator": "^0.21.1"
+  },
+  "files": [
+    "app"
+  ]
+}
diff --git a/gui/ngXosLib/gulp/ngXosHelpers.js b/gui/ngXosLib/gulp/ngXosHelpers.js
new file mode 100644
index 0000000..cc68513
--- /dev/null
+++ b/gui/ngXosLib/gulp/ngXosHelpers.js
@@ -0,0 +1,16 @@
+var gulp = require('gulp');
+var uglify = require('gulp-uglify');
+var concat = require("gulp-concat");
+var ngAnnotate = require('gulp-ng-annotate');
+var angularFilesort = require('gulp-angular-filesort');
+
+module.exports = function(options){
+  gulp.task('helpers', function(){
+    return gulp.src([options.xosHelperSource + '**/*.js'])
+      .pipe(angularFilesort())
+      .pipe(concat('ngXosHelpers.js'))
+      .pipe(ngAnnotate())
+      .pipe(uglify())
+      .pipe(gulp.dest(options.ngXosVendor));
+  });
+};
\ No newline at end of file
diff --git a/gui/ngXosLib/gulp/ngXosVendor.js b/gui/ngXosLib/gulp/ngXosVendor.js
new file mode 100644
index 0000000..613ec7a
--- /dev/null
+++ b/gui/ngXosLib/gulp/ngXosVendor.js
@@ -0,0 +1,14 @@
+var gulp = require('gulp');
+var uglify = require('gulp-uglify');
+var concat = require("gulp-concat");
+var wiredep = require('wiredep');
+
+module.exports = function(options){
+  gulp.task('vendor', function(){
+    var bowerDeps = wiredep().js;
+    return gulp.src(bowerDeps)
+      .pipe(concat('ngXosVendor.js'))
+      .pipe(uglify())
+      .pipe(gulp.dest(options.ngXosVendor));
+  });
+};
\ No newline at end of file
diff --git a/gui/ngXosLib/gulpfile.js b/gui/ngXosLib/gulpfile.js
new file mode 100644
index 0000000..da08f7e
--- /dev/null
+++ b/gui/ngXosLib/gulpfile.js
@@ -0,0 +1,18 @@
+'use strict';
+
+var gulp = require('gulp');
+var wrench = require('wrench');
+
+var options = {
+  ngXosVendor: '../static/js/vendor/', //save here the minfied vendor file, this is automatically loaded in the django page
+  xosHelperSource: './xosHelpers/src/'
+};
+
+wrench.readdirSyncRecursive('./gulp')
+.map(function(file) {
+  require('./gulp/' + file)(options);
+});
+
+gulp.task('default', function () {
+  gulp.start('vendor');
+});
diff --git a/gui/ngXosLib/karma.conf.js b/gui/ngXosLib/karma.conf.js
new file mode 100644
index 0000000..06939fb
--- /dev/null
+++ b/gui/ngXosLib/karma.conf.js
@@ -0,0 +1,84 @@
+// Karma configuration
+// Generated on Tue Oct 06 2015 09:27:10 GMT+0000 (UTC)
+
+/* eslint indent: [2,2], quotes: [2, "single"]*/
+
+/*eslint-disable*/
+var wiredep = require('wiredep');
+var path = require('path');
+
+var bowerComponents = wiredep({devDependencies: true})[ 'js' ].map(function( file ){
+  return path.relative(process.cwd(), file);
+});
+
+module.exports = function(config) {
+/*eslint-enable*/
+  config.set({
+
+    // base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: '',
+
+
+    // frameworks to use
+    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine'],
+
+
+    // list of files / patterns to load in the browser
+    files: bowerComponents.concat([
+      'xosHelpers/src/*.module.js',
+      'xosHelpers/src/**/*.js',
+      'xosHelpers/spec/**/*.test.js',
+    ]),
+
+
+    // list of files to exclude
+    exclude: [
+    ],
+
+
+    // preprocess matching files before serving them to the browser
+    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+    preprocessors: {
+      '**/*.test.js': ['babel'],
+      'src/**/*.html': ['ng-html2js']
+    },
+
+    ngHtml2JsPreprocessor: {
+      stripPrefix: 'src/', //strip the src path from template url (http://stackoverflow.com/questions/22869668/karma-unexpected-request-when-testing-angular-directive-even-with-ng-html2js)
+      moduleName: 'templates' // define the template module name
+    },
+
+    // test results reporter to use
+    // possible values: 'dots', 'progress'
+    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['mocha'],
+
+
+    // web server port
+    port: 9876,
+
+
+    // enable / disable colors in the output (reporters and logs)
+    colors: true,
+
+
+    // level of logging
+    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+    logLevel: config.LOG_INFO,
+
+
+    // enable / disable watching file and executing tests whenever any file changes
+    autoWatch: true,
+
+
+    // start these browsers
+    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+    browsers: ['PhantomJS'],
+
+
+    // Continuous Integration mode
+    // if true, Karma captures browsers, runs the tests and exits
+    singleRun: false
+  });
+};
diff --git a/gui/ngXosLib/package.json b/gui/ngXosLib/package.json
new file mode 100644
index 0000000..16a4150
--- /dev/null
+++ b/gui/ngXosLib/package.json
@@ -0,0 +1,33 @@
+{
+  "name": "ng-xos-lib",
+  "version": "1.0.0",
+  "description": "Angular Version of XosLib, containing Helpers and ngResources",
+  "main": "index.js",
+  "scripts": {
+    "test": "karma start",
+    "apigen": "node xos-resource-generator.js",
+    "swagger": "node xos-swagger-def.js",
+    "apidoc": "jsdoc api/ng-xos.js api/ng-xoslib.js api/ng-hpcapi.js -d api/docs"
+  },
+  "author": "Matteo Scandolo",
+  "license": "ISC",
+  "dependencies": {
+    "bluebird": "^3.0.5",
+    "chalk": "^1.1.1",
+    "concat": "^1.0.0",
+    "eslint": "^1.8.0",
+    "eslint-plugin-angular": "linkmesrl/eslint-plugin-angular",
+    "fetch-swagger-schema": "^0.1.2",
+    "jsdoc": "^3.3.3",
+    "swagger-js-codegen": "^1.1.5"
+  },
+  "devDependencies": {
+    "gulp": "^3.9.0",
+    "gulp-angular-filesort": "^1.1.1",
+    "gulp-concat": "^2.6.0",
+    "gulp-ng-annotate": "^1.1.0",
+    "gulp-uglify": "^1.4.2",
+    "wiredep": "^3.0.0-beta",
+    "wrench": "^1.5.8"
+  }
+}
diff --git a/gui/ngXosLib/xos-resource-generator.js b/gui/ngXosLib/xos-resource-generator.js
new file mode 100644
index 0000000..b24bf9b
--- /dev/null
+++ b/gui/ngXosLib/xos-resource-generator.js
@@ -0,0 +1,99 @@
+'use strict';
+
+var fs = require('fs');
+var CodeGen = require('swagger-js-codegen').CodeGen;
+var fetchSchema = require('fetch-swagger-schema');
+var P = require('bluebird');
+var chalk = require('chalk');
+var concat = require('concat')
+
+/////////////
+// HELPERS //
+/////////////
+
+var fetchSwagger = P.promisify(function(url, done){
+  fetchSchema(url, function(error, schema){
+    if(error) {
+      return done(error);
+    }
+    done(null, schema);
+  });
+});
+
+// Write to file promisified
+var writeToFile = P.promisify(function(file, content, done) {
+  fs.writeFile(file, content, function(err) {
+    if(err) {
+        return done(err);
+    }
+
+    done(null, file + ' has been saved');
+  }); 
+});
+
+var concatFiles = P.promisify(function(files, dest, done){
+  concat(files, dest, function (error) {
+    if(error){
+      return done(error);
+    }
+    done();
+  })
+});
+
+////////////////////
+// generator loop //
+////////////////////
+
+P.coroutine(function*(){
+  
+  var generatedFiles = [];
+
+  console.log(chalk.green('Generating APIs '));
+
+  let mainDef = yield fetchSwagger('http://localhost:9999/docs/api-docs/');
+
+  for(let i = 0; i < mainDef.apis.length; i++){
+    
+    const path = mainDef.apis[i].path.replace('/', '');
+  
+    process.stdout.write(chalk.green(`Starting ${path} generation `));
+    
+    let loader = setInterval(function(){
+      process.stdout.write(chalk.green('.'));
+    }, 500);
+
+
+    let def = yield fetchSwagger(`http://localhost:9999/docs/api-docs/${path}`);
+    yield writeToFile(`api/ng-${path}.js`, CodeGen.getAngularCode({ 
+      moduleName: `xos.${path}`, 
+      className: `${path}`, 
+      swagger: def,
+      lint: false,
+      template: {
+        class: fs.readFileSync('apiTemplates/custom-angular-class.mustache', 'utf-8'),
+        method: fs.readFileSync('node_modules/swagger-js-codegen/templates/method.mustache', 'utf-8'),
+        request: fs.readFileSync('node_modules/swagger-js-codegen/templates/angular-request.mustache', 'utf-8')
+    }
+    }));
+  
+    generatedFiles.push(`api/ng-${path}.js`);
+
+    clearInterval(loader);
+    process.stdout.write('\n');
+  }
+
+  // TODO rewrite concat to minify API
+  // evaluate to use gulp instead to manage this
+  // at least minify
+  yield concatFiles(generatedFiles, '../static/js/xosApi.js');
+
+  console.log(chalk.green('APIs Ready!'));
+
+  process.exit();
+
+})()
+.catch(function(e){
+  process.stdout.write('\n');
+  console.error(e);
+  process.exit(e.code);
+});
diff --git a/gui/ngXosLib/xos-swagger-def.js b/gui/ngXosLib/xos-swagger-def.js
new file mode 100644
index 0000000..64db936
--- /dev/null
+++ b/gui/ngXosLib/xos-swagger-def.js
@@ -0,0 +1,96 @@
+// This was generating the files needed from https://github.com/signalfx/swagger-angular-client
+// But this module is not parsing the format in which our Swagger is generating JSON files
+
+'use strict';
+
+var fs = require('fs');
+var CodeGen = require('swagger-js-codegen').CodeGen;
+var fetchSchema = require('fetch-swagger-schema');
+var P = require('bluebird');
+var chalk = require('chalk');
+var concat = require('concat')
+
+/////////////
+// HELPERS //
+/////////////
+
+var fetchSwagger = P.promisify(function(url, done){
+  fetchSchema(url, function(error, schema){
+    if(error) {
+      return done(error);
+    }
+    done(null, schema);
+  });
+});
+
+// Write to file promisified
+var writeToFile = P.promisify(function(file, content, done) {
+  fs.writeFile(file, content, function(err) {
+    if(err) {
+        return done(err);
+    }
+
+    done(null, file + ' has been saved');
+  }); 
+});
+
+var concatFiles = P.promisify(function(files, dest, done){
+  concat(files, dest, function (error) {
+    if(error){
+      return done(error);
+    }
+    done();
+  })
+});
+
+////////////////////
+// generator loop //
+////////////////////
+
+P.coroutine(function*(){
+  
+  var generatedFiles = [];
+
+  console.log(chalk.green('Generating APIs '));
+
+  let mainDef = yield fetchSwagger('http://localhost:9999/docs/api-docs/');
+
+  yield writeToFile(`api/ngXosApi-runtime.js`, `window.XosApi = ${JSON.stringify(mainDef)}`)
+
+  for(let i = 0; i < mainDef.apis.length; i++){
+    
+    const path = mainDef.apis[i].path.replace('/', '');
+  
+    process.stdout.write(chalk.green(`Starting ${path} generation `));
+    
+    let loader = setInterval(function(){
+      process.stdout.write(chalk.green('.'));
+    }, 500);
+
+
+    let def = yield fetchSwagger(`http://localhost:9999/docs/api-docs/${path}`);
+    
+    yield writeToFile(`api/ng-${path}.json`, JSON.stringify(def));
+    yield writeToFile(`api/ng-${path}.js`, `window.${path}Api = ${JSON.stringify(def)}`)
+  
+    generatedFiles.push(`api/ng-${path}.js`);
+
+    clearInterval(loader);
+    process.stdout.write('\n');
+  }
+
+  // TODO rewrite concat to minify API
+  // evaluate to use gulp instead to manage this
+  // at least minify
+  yield concatFiles(generatedFiles, '../static/js/xosApi.js');
+
+  console.log(chalk.green('APIs Ready!'));
+
+  process.exit();
+
+})()
+.catch(function(e){
+  process.stdout.write('\n');
+  console.error(e);
+  process.exit(e.code);
+});
diff --git a/gui/ngXosLib/xosHelpers/spec/csrftoken.test.js b/gui/ngXosLib/xosHelpers/spec/csrftoken.test.js
new file mode 100644
index 0000000..6a74040
--- /dev/null
+++ b/gui/ngXosLib/xosHelpers/spec/csrftoken.test.js
@@ -0,0 +1,20 @@
+'use strict';
+
+describe('The xos.helper module', () => {
+  
+  var app, httpProvider;
+
+  beforeEach(module('xos.helpers'));
+  beforeEach(function(){
+    module(function($httpProvider){
+      httpProvider = $httpProvider;
+    });
+  });
+
+
+
+  it('should set SetCSRFToken interceptor', inject(($http) => {
+    expect(httpProvider.interceptors).toContain('SetCSRFToken');
+  }));
+
+});
\ No newline at end of file
diff --git a/gui/ngXosLib/xosHelpers/src/services/api.services.js b/gui/ngXosLib/xosHelpers/src/services/api.services.js
new file mode 100644
index 0000000..7a4baba
--- /dev/null
+++ b/gui/ngXosLib/xosHelpers/src/services/api.services.js
@@ -0,0 +1,32 @@
+(function() {
+  'use strict';
+
+    angular
+        .module('xos.helpers')
+        .service('XosApi', xosApi)
+        .service('XoslibApi', xoslibApi)
+        .service('HpcApi', hpcApi);
+
+    var xosApiCache, xoslibApiCache, hpcApiCache;
+
+    function xosApi(xos) { 
+      if(!xosApiCache){
+        xosApiCache = new xos({domain: ''});
+      }
+      return xosApiCache;
+    }
+
+    function xoslibApi(xoslib) { 
+      if(!xoslibApiCache){
+        xoslibApiCache = new xoslib({domain: ''});
+      }
+      return xoslibApiCache;
+    }
+
+    function hpcApi(hpcapi) { 
+      if(!hpcApiCache){
+        hpcApiCache = new hpcapi({domain: ''});
+      }
+      return hpcApiCache;
+    }
+})();
\ No newline at end of file
diff --git a/gui/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js b/gui/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js
new file mode 100644
index 0000000..283e90d
--- /dev/null
+++ b/gui/ngXosLib/xosHelpers/src/services/csrfToken.interceptor.js
@@ -0,0 +1,18 @@
+(function() {
+    'use strict';
+
+    angular
+        .module('xos.helpers')
+        .factory('SetCSRFToken', setCSRFToken);
+
+    function setCSRFToken($cookies) {
+      return {
+        request: function(request){
+          if(request.method !== 'GET'){
+            request.headers['X-CSRFToken'] = $cookies.get('xoscsrftoken');
+          }
+          return request;
+        }
+      };
+    }
+})();
diff --git a/gui/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js b/gui/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js
new file mode 100644
index 0000000..6059f99
--- /dev/null
+++ b/gui/ngXosLib/xosHelpers/src/services/noHyperlinks.interceptor.js
@@ -0,0 +1,18 @@
+(function() {
+    'use strict';
+
+    angular
+        .module('xos.helpers')
+        .factory('NoHyperlinks', noHyperlinks);
+
+    function noHyperlinks() { 
+      return {
+        request: function(request){
+          if(request.url.indexOf('.html') === -1){
+            request.url += '?no_hyperlinks=1';
+          }
+          return request;
+        }
+      };
+    }
+})();
\ No newline at end of file
diff --git a/gui/ngXosLib/xosHelpers/src/xosHelpers.module.js b/gui/ngXosLib/xosHelpers/src/xosHelpers.module.js
new file mode 100644
index 0000000..1f73be1
--- /dev/null
+++ b/gui/ngXosLib/xosHelpers/src/xosHelpers.module.js
@@ -0,0 +1,22 @@
+(function() {
+    'use strict';
+
+    angular
+        .module('xos.helpers',[
+          'ngCookies',
+          'xos.xos',
+          'xos.hpcapi',
+          'xos.xoslib'
+        ])
+        .config(config);
+
+    function config($httpProvider, $interpolateProvider, $resourceProvider) { 
+      $httpProvider.interceptors.push('SetCSRFToken');
+
+      $interpolateProvider.startSymbol('{$');
+      $interpolateProvider.endSymbol('$}');
+
+      // NOTE http://www.masnun.com/2013/09/18/django-rest-framework-angularjs-resource-trailing-slash-problem.html
+      $resourceProvider.defaults.stripTrailingSlashes = false;
+    }
+})();
\ No newline at end of file
diff --git a/gui/ngXosViews/.gitignore b/gui/ngXosViews/.gitignore
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/gui/ngXosViews/.gitignore
diff --git a/gui/ngXosViews/ceilometerDashboard/.bowerrc b/gui/ngXosViews/ceilometerDashboard/.bowerrc
new file mode 100644
index 0000000..e491038
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/.bowerrc
@@ -0,0 +1,3 @@
+{
+  "directory": "src/vendor/"
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/.eslintrc b/gui/ngXosViews/ceilometerDashboard/.eslintrc
new file mode 100644
index 0000000..868fd4b
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/.eslintrc
@@ -0,0 +1,44 @@
+{
+    "ecmaFeatures": {
+        "blockBindings": true,
+        "forOf": true,
+        "destructuring": true,
+        "arrowFunctions": true,
+        "templateStrings": true
+    },
+    "env": { 
+        "browser": true,
+        "node": true,
+        "es6": true
+    },
+    "plugins": [
+        //"angular"
+    ],
+    "rules": {
+        "quotes": [2, "single"],
+        "camelcase": [0, {"properties": "always"}],
+        "no-underscore-dangle": 1,
+        "eqeqeq": [2, "smart"],
+        "no-alert": 1,
+        "key-spacing": [1, { "beforeColon": false, "afterColon": true }],
+        "indent": [2, 2],
+        "no-irregular-whitespace": 1,
+        "eol-last": 0,
+        "max-nested-callbacks": [2, 4],
+        "comma-spacing": [1, {"before": false, "after": true}],
+        "no-trailing-spaces": [1, { skipBlankLines: true }],
+        "no-unused-vars": [1, {"vars": "all", "args": "after-used"}],
+        "new-cap": 0,
+        "no-undef": 2,
+
+        //"angular/ng_module_name": [2, '/^xos\.*[a-z]*$/'],
+        //"angular/ng_controller_name": [2, '/^[a-z].*Ctrl$/'],
+        //"angular/ng_service_name": [2, '/^[A-Z].*Service$/'],
+        //"angular/ng_directive_name": [2, '/^[a-z]+[[A-Z].*]*$/'],
+        //"angular/ng_di": [0, "function or array"]
+    },
+    "globals" :{
+        "angular": true,
+        "Chart": true
+    } 
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/.gitignore b/gui/ngXosViews/ceilometerDashboard/.gitignore
new file mode 100644
index 0000000..567aee4
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/.gitignore
@@ -0,0 +1,6 @@
+dist/
+src/vendor
+.tmp
+node_modules
+npm-debug.log
+dist/
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/bower.json b/gui/ngXosViews/ceilometerDashboard/bower.json
new file mode 100644
index 0000000..363d59d
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/bower.json
@@ -0,0 +1,37 @@
+{
+  "name": "xos-ceilometerDashboard",
+  "version": "0.0.0",
+  "authors": [
+    "Matteo Scandolo <teo@onlab.us>"
+  ],
+  "description": "The ceilometerDashboard view",
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "static/js/vendor/",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+    "angular-chart.js": "~0.8.7",
+    "angular-animate": "~1.4.8",
+    "ui.bootstrap": "~0.14.3"
+  },
+  "devDependencies": {
+    "jquery": "~2.1.4",
+    "angular-mocks": "~1.4.7",
+    "angular": "~1.4.7",
+    "angular-ui-router": "~0.2.15",
+    "angular-cookies": "~1.4.7",
+    "angular-resource": "~1.4.7",
+    "ng-lodash": "~0.3.0",
+    "bootstrap-css": "3.3.4"
+  },
+  "overrides": {
+    "ui.bootstrap": {
+      "main": ["src/accordion/accordion.js", "src/collapse/collapse.js"]
+    }
+  }
+}
diff --git a/gui/ngXosViews/ceilometerDashboard/env/default.js b/gui/ngXosViews/ceilometerDashboard/env/default.js
new file mode 100644
index 0000000..778faac
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/env/default.js
@@ -0,0 +1,13 @@
+// This is a default configuration for your development environment.
+// You can duplicate this configuration for any of your Backend Environments.
+// Different configurations are loaded setting a NODE_ENV variable that contain the config file name.
+// `NODE_ENV=local npm start`
+//
+// If xoscsrftoken or xossessionid are not specified the browser value are used
+// (works only for local environment as both application are served on the same domain)
+
+module.exports = {
+  host: 'http://clnode015.clemson.cloudlab.us:9999/',
+  xoscsrftoken: 'gvAeNnr2DoQMorphFSxs4nXDSIDAT61Q',
+  xossessionid: 'qu69xzr4u5755w9hhuqa0djxacvi9k9i'
+};
diff --git a/gui/ngXosViews/ceilometerDashboard/env/srikanth.js b/gui/ngXosViews/ceilometerDashboard/env/srikanth.js
new file mode 100644
index 0000000..8d76a20
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/env/srikanth.js
@@ -0,0 +1,13 @@
+// This is a default configuration for your development environment.
+// You can duplicate this configuration for any of your Backend Environments.
+// Different configurations are loaded setting a NODE_ENV variable that contain the config file name.
+// `NODE_ENV=local npm start`
+//
+// If xoscsrftoken or xossessionid are not specified the browser value are used
+// (works only for local environment as both application are served on the same domain)
+
+module.exports = {
+  host: 'http://130.127.133.87:9999',
+  xoscsrftoken: 'Ed51juEvODfN01dtXO7iqRkXDdBIL0sr',
+  xossessionid: 'b3vg7a2qtm7roclcwlqkf7f5xca645jx'
+};
diff --git a/gui/ngXosViews/ceilometerDashboard/gulp/build.js b/gui/ngXosViews/ceilometerDashboard/gulp/build.js
new file mode 100644
index 0000000..9f9bfb8
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/gulp/build.js
@@ -0,0 +1,149 @@
+'use strict';
+
+// BUILD
+//
+// The only purpose of this gulpfile is to build a XOS view and copy the correct files into
+// .html => dashboards
+// .js (minified and concat) => static/js
+//
+// The template are parsed and added to js with angular $templateCache
+
+var gulp = require('gulp');
+var ngAnnotate = require('gulp-ng-annotate');
+var uglify = require('gulp-uglify');
+var templateCache = require('gulp-angular-templatecache');
+var runSequence = require('run-sequence');
+var concat = require('gulp-concat');
+var del = require('del');
+var wiredep = require('wiredep');
+var angularFilesort = require('gulp-angular-filesort');
+var _ = require('lodash');
+var eslint = require('gulp-eslint');
+var inject = require('gulp-inject');
+var rename = require('gulp-rename');
+var replace = require('gulp-replace');
+var postcss = require('gulp-postcss');
+var autoprefixer = require('autoprefixer');
+var mqpacker = require('css-mqpacker');
+var csswring = require('csswring');
+
+var TEMPLATE_FOOTER = `}]);
+angular.module('xos.ceilometerDashboard').run(function($location){$location.path('/')});
+angular.bootstrap(angular.element('#xosCeilometerDashboard'), ['xos.ceilometerDashboard']);`;
+
+module.exports = function(options){
+  
+  // delete previous builded file
+  gulp.task('clean', function(){
+    return del(
+      [options.dashboards + 'xosCeilometerDashboard.html'],
+      {force: true}
+    );
+  });
+
+  // minify css
+  gulp.task('css', function () {
+    var processors = [
+      autoprefixer({browsers: ['last 1 version']}),
+      mqpacker,
+      csswring
+    ];
+    
+    gulp.src([
+      `${options.css}**/*.css`,
+      `!${options.css}dev.css`
+    ])
+    .pipe(postcss(processors))
+    .pipe(gulp.dest(options.tmp + '/css/'));
+  });
+
+  gulp.task('copyCss', ['css'], function(){
+    return gulp.src([`${options.tmp}/css/*.css`])
+    .pipe(concat('xosCeilometerDashboard.css'))
+    .pipe(gulp.dest(options.static + 'css/'))
+  });
+
+  // compile and minify scripts
+  gulp.task('scripts', function() {
+    return gulp.src([
+      options.tmp + '**/*.js'
+    ])
+    .pipe(ngAnnotate())
+    .pipe(angularFilesort())
+    .pipe(concat('xosCeilometerDashboard.js'))
+    .pipe(uglify())
+    .pipe(gulp.dest(options.static + 'js/'));
+  });
+
+  // set templates in cache
+  gulp.task('templates', function(){
+    return gulp.src('./src/templates/*.html')
+      .pipe(templateCache({
+        module: 'xos.ceilometerDashboard',
+        root: 'templates/',
+        templateFooter: TEMPLATE_FOOTER
+      }))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  // copy html index to Django Folder
+  gulp.task('copyHtml', ['clean'], function(){
+    return gulp.src(options.src + 'index.html')
+      // remove dev dependencies from html
+      .pipe(replace(/<!-- bower:css -->(\n.*)*\n<!-- endbower --><!-- endcss -->/, ''))
+      .pipe(replace(/<!-- bower:js -->(\n.*)*\n<!-- endbower --><!-- endjs -->/, ''))
+      .pipe(replace(/ng-app=".*"\s/, ''))
+      //rewriting css path
+      // .pipe(replace(/(<link.*">)/, ''))
+      // injecting minified files
+      .pipe(
+        inject(
+          gulp.src([
+            options.static + 'js/vendor/xosCeilometerDashboardVendor.js',
+            options.static + 'js/xosCeilometerDashboard.js',
+            options.static + 'css/xosCeilometerDashboard.css'
+          ])
+        )
+      )
+      .pipe(rename('xosCeilometerDashboard.html'))
+      .pipe(gulp.dest(options.dashboards));
+  });
+
+  // minify vendor js files
+  gulp.task('wiredep', function(){
+    var bowerDeps = wiredep().js;
+    if(!bowerDeps){
+      return;
+    }
+
+    // remove angular (it's already loaded)
+    _.remove(bowerDeps, function(dep){
+      return dep.indexOf('angular/angular.js') !== -1;
+    });
+
+    return gulp.src(bowerDeps)
+      .pipe(concat('xosCeilometerDashboardVendor.js'))
+      .pipe(uglify())
+      .pipe(gulp.dest(options.static + 'js/vendor/'));
+  });
+
+  gulp.task('lint', function () {
+    return gulp.src(['src/js/**/*.js'])
+      .pipe(eslint())
+      .pipe(eslint.format())
+      .pipe(eslint.failAfterError());
+  });
+
+  gulp.task('build', function() {
+    runSequence(
+      'lint',
+      'templates',
+      'babel',
+      'scripts',
+      'wiredep',
+      'copyHtml',
+      'copyCss',
+      'cleanTmp'
+    );
+  });
+};
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/gulp/server.js b/gui/ngXosViews/ceilometerDashboard/gulp/server.js
new file mode 100644
index 0000000..7268b13
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/gulp/server.js
@@ -0,0 +1,159 @@
+'use strict';
+
+var gulp = require('gulp');
+var browserSync = require('browser-sync').create();
+var inject = require('gulp-inject');
+var runSequence = require('run-sequence');
+var angularFilesort = require('gulp-angular-filesort');
+var babel = require('gulp-babel');
+var wiredep = require('wiredep').stream;
+var httpProxy = require('http-proxy');
+var del = require('del');
+var debug = require('gulp-debug');
+
+const environment = process.env.NODE_ENV;
+
+if (environment){
+  var conf = require(`../env/${environment}.js`);
+}
+else{
+  var conf = require('../env/default.js')
+}
+
+console.log(conf);
+
+var proxy = httpProxy.createProxyServer({
+  target: conf.host || 'http://0.0.0.0:9999'
+});
+
+
+proxy.on('error', function(error, req, res) {
+  res.writeHead(500, {
+    'Content-Type': 'text/plain'
+  });
+
+  console.error('[Proxy]', error);
+});
+
+module.exports = function(options){
+
+  // open in browser with sync and proxy to 0.0.0.0
+  gulp.task('browser', function() {
+    browserSync.init({
+      // reloadDelay: 500,
+      // logLevel: 'debug',
+      // logConnections: true,
+      startPath: '#/',
+      snippetOptions: {
+        rule: {
+          match: /<!-- browserSync -->/i
+        }
+      },
+      server: {
+        baseDir: options.src,
+        routes: {
+          '/api': options.api,
+          '/xosHelpers/src': options.helpers
+        },
+        middleware: function(req, res, next){
+          if(
+            req.url.indexOf('/xos/') !== -1 ||
+            req.url.indexOf('/xoslib/') !== -1 ||
+            req.url.indexOf('/hpcapi/') !== -1
+          ){
+            if(conf.xoscsrftoken && conf.xossessionid){
+              req.headers.cookie = `xoscsrftoken=${conf.xoscsrftoken}; xossessionid=${conf.xossessionid}`;
+              req.headers['x-csrftoken'] = conf.xoscsrftoken;
+            }
+            proxy.web(req, res);
+          }
+          else{
+            next();
+          }
+        }
+      }
+    });
+
+    gulp.watch(options.src + 'js/**/*.js', ['js-watch']);
+    
+    gulp.watch(options.src + 'vendor/**/*.js', ['bower'], function(){
+      console.log('Bower Package added!');
+      browserSync.reload();
+    });
+    gulp.watch(options.src + '**/*.html', function(){
+      browserSync.reload();
+    });
+  });
+
+  // transpile js with sourceMaps
+  gulp.task('babel', function(){
+    return gulp.src([options.scripts + '**/*.js'])
+      .pipe(babel({sourceMaps: true}))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  // inject scripts
+  gulp.task('injectScript', function(){
+    console.log(options.tmp);
+    runSequence(
+       'cleanTmp',
+       'babel',
+        function() {
+          return gulp.src(options.src + 'index.html')
+          .pipe(
+            inject(
+              gulp.src([
+                options.tmp + '**/*.js',
+                options.api + '*.js',
+                options.helpers + '**/*.js'
+              ])
+              // .pipe(debug({title: 'unicorn:'}))
+              .pipe(angularFilesort()),
+              {
+                ignorePath: [options.src, '/../../ngXosLib']
+              }
+            )
+          )
+          .pipe(gulp.dest(options.src));
+        }
+      );
+  });
+
+  // inject CSS
+  gulp.task('injectCss', function(){
+    return gulp.src(options.src + 'index.html')
+      .pipe(
+        inject(
+          gulp.src(options.src + 'css/*.css'),
+          {
+            ignorePath: [options.src]
+          }
+          )
+        )
+      .pipe(gulp.dest(options.src));
+  });
+
+  // inject bower dependencies with wiredep
+  gulp.task('bower', function () {
+    return gulp.src(options.src + 'index.html')
+    .pipe(wiredep({devDependencies: true}))
+    .pipe(gulp.dest(options.src));
+  });
+
+  gulp.task('js-watch', ['injectScript'], function(){
+    browserSync.reload();
+  });
+
+  gulp.task('cleanTmp', function(){
+    return del([options.tmp + '**/*']);
+  });
+
+  gulp.task('serve', function() {
+    runSequence(
+      'bower',
+      'injectScript',
+      'injectCss',
+      ['browser']
+    );
+  });
+};
diff --git a/gui/ngXosViews/ceilometerDashboard/gulpfile.js b/gui/ngXosViews/ceilometerDashboard/gulpfile.js
new file mode 100644
index 0000000..a3523ee
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/gulpfile.js
@@ -0,0 +1,25 @@
+'use strict';
+
+var gulp = require('gulp');
+var wrench = require('wrench');
+
+var options = {
+  src: 'src/',
+  css: 'src/css/',
+  scripts: 'src/js/',
+  tmp: 'src/.tmp',
+  dist: 'dist/',
+  api: '../../ngXosLib/api/',
+  helpers: '../../ngXosLib/xosHelpers/src/',
+  static: '../../../xos/core/xoslib/static/', // this is the django static folder
+  dashboards: '../../../xos/core/xoslib/dashboards/' // this is the django html folder
+};
+
+wrench.readdirSyncRecursive('./gulp')
+.map(function(file) {
+  require('./gulp/' + file)(options);
+});
+
+gulp.task('default', function () {
+  gulp.start('build');
+});
diff --git a/gui/ngXosViews/ceilometerDashboard/karma.conf.js b/gui/ngXosViews/ceilometerDashboard/karma.conf.js
new file mode 100644
index 0000000..12d0697
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/karma.conf.js
@@ -0,0 +1,95 @@
+// Karma configuration
+// Generated on Tue Oct 06 2015 09:27:10 GMT+0000 (UTC)
+
+/* eslint indent: [2,2], quotes: [2, "single"]*/
+
+/*eslint-disable*/
+var wiredep = require('wiredep');
+var path = require('path');
+
+var bowerComponents = wiredep( {devDependencies: true} )[ 'js' ].map(function( file ){
+  return path.relative(process.cwd(), file);
+});
+/*eslint-enable*/
+module.exports = function(config) {
+  config.set({
+
+    // base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: '',
+
+
+    // frameworks to use
+    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine'],
+
+
+    // list of files / patterns to load in the browser
+    files: bowerComponents.concat([
+      'src/css/**/*.css',
+      '../../static/js/xosApi.js',
+      '../../static/js/vendor/ngXosHelpers.js',
+      'src/js/**/*.js',
+      'spec/**/*.mock.js',
+      'spec/**/*.test.js',
+      'src/**/*.html'
+    ]),
+
+
+    // list of files to exclude
+    exclude: [
+    ],
+
+
+    // preprocess matching files before serving them to the browser
+    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+    preprocessors: {
+      'src/js/**/*.js': ['babel'],
+      'spec/**/*.js': ['babel'],
+      'src/**/*.html': ['ng-html2js']
+    },
+
+    babelPreprocessor: {
+      options: {
+        presets: ['es2015'],
+        sourceMap: 'inline'
+      }
+    },
+
+    ngHtml2JsPreprocessor: {
+      stripPrefix: 'src/', //strip the src path from template url (http://stackoverflow.com/questions/22869668/karma-unexpected-request-when-testing-angular-directive-even-with-ng-html2js)
+      moduleName: 'templates' // define the template module name
+    },
+
+    // test results reporter to use
+    // possible values: 'dots', 'progress'
+    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['mocha'],
+
+
+    // web server port
+    port: 9876,
+
+
+    // enable / disable colors in the output (reporters and logs)
+    colors: true,
+
+
+    // level of logging
+    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+    logLevel: config.LOG_INFO,
+
+
+    // enable / disable watching file and executing tests whenever any file changes
+    autoWatch: true,
+
+
+    // start these browsers
+    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+    browsers: ['PhantomJS'],
+
+
+    // Continuous Integration mode
+    // if true, Karma captures browsers, runs the tests and exits
+    singleRun: false
+  });
+};
diff --git a/gui/ngXosViews/ceilometerDashboard/package.json b/gui/ngXosViews/ceilometerDashboard/package.json
new file mode 100644
index 0000000..0a9ccae
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/package.json
@@ -0,0 +1,62 @@
+{
+  "name": "xos-ceilometerDashboard",
+  "version": "1.0.0",
+  "description": "Angular Application for XOS, created with generator-xos",
+  "scripts": {
+    "prestart": "npm install && bower install",
+    "start": "gulp serve",
+    "prebuild": "npm install && bower install",
+    "build": "gulp",
+    "pretest": "npm install",
+    "test": "karma start",
+    "lint": "eslint src/js/"
+  },
+  "keywords": [
+    "XOS",
+    "Angular",
+    "XOSlib"
+  ],
+  "author": "Matteo Scandolo",
+  "license": "MIT",
+  "dependencies": {},
+  "devDependencies": {
+    "autoprefixer": "^6.1.2",
+    "babel": "^6.3.13",
+    "babel-preset-es2015": "^6.3.13",
+    "browser-sync": "^2.9.11",
+    "css-mqpacker": "^4.0.0",
+    "csswring": "^4.1.1",
+    "del": "^2.0.2",
+    "eslint": "^1.8.0",
+    "eslint-plugin-angular": "linkmesrl/eslint-plugin-angular",
+    "gulp": "^3.9.0",
+    "gulp-angular-filesort": "^1.1.1",
+    "gulp-angular-templatecache": "^1.8.0",
+    "gulp-babel": "^5.3.0",
+    "gulp-concat": "^2.6.0",
+    "gulp-debug": "^2.1.2",
+    "gulp-eslint": "^1.0.0",
+    "gulp-inject": "^3.0.0",
+    "gulp-minify-html": "^1.0.4",
+    "gulp-ng-annotate": "^1.1.0",
+    "gulp-postcss": "^6.0.1",
+    "gulp-rename": "^1.2.2",
+    "gulp-replace": "^0.5.4",
+    "gulp-uglify": "^1.4.2",
+    "http-proxy": "^1.12.0",
+    "jasmine-core": "^2.4.1",
+    "karma": "^0.13.15",
+    "karma-babel-preprocessor": "^6.0.1",
+    "karma-jasmine": "^0.3.6",
+    "karma-mocha-reporter": "^1.1.3",
+    "karma-ng-html2js-preprocessor": "^0.2.0",
+    "karma-phantomjs-launcher": "^0.2.1",
+    "lodash": "^3.10.1",
+    "mocha": "^2.3.4",
+    "phantomjs": "^1.9.19",
+    "proxy-middleware": "^0.15.0",
+    "run-sequence": "^1.1.4",
+    "wiredep": "^3.0.0-beta",
+    "wrench": "^1.5.8"
+  }
+}
diff --git a/gui/ngXosViews/ceilometerDashboard/spec/.eslintrc b/gui/ngXosViews/ceilometerDashboard/spec/.eslintrc
new file mode 100644
index 0000000..ad4bc2d
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/spec/.eslintrc
@@ -0,0 +1,9 @@
+{
+    "globals" :{
+        "describe": true,
+        "beforeEach": true,
+        "it": true,
+        "inject": true,
+        "expect": true
+    } 
+}
diff --git a/gui/ngXosViews/ceilometerDashboard/spec/backend.mock.js b/gui/ngXosViews/ceilometerDashboard/spec/backend.mock.js
new file mode 100644
index 0000000..c7642bb
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/spec/backend.mock.js
@@ -0,0 +1,98 @@
+'use strict';
+(function () {
+
+  const meters = [
+    // service_1
+    //  - slice_1
+    //    - resource_1
+    // service_2
+    //  - slice_2
+    //    - resource_2
+    //    - resource_3
+    //  - slice_3
+    //    - resource_4
+    {
+      service: 'service_1',
+      slice: 'slice_1',
+      resource_name: 'resource_1',
+      resource_id: 'resource_id_1',
+      name: 'instance_1',
+      unit: 'instance'
+    },
+    {
+      service: 'service_2',
+      slice: 'slice_2',
+      resource_name: 'resource_2',
+      resource_id: 'resource_id_2',
+      name: 'instance_2',
+      unit: 'instance'
+    },
+    {
+      service: 'service_2',
+      slice: 'slice_2',
+      resource_name: 'resource_3',
+      resource_id: 'resource_id_3',
+      name: 'instance_2',
+      unit: 'instance'
+    },
+    {
+      service: 'service_2',
+      slice: 'slice_3',
+      resource_name: 'resource_4',
+      resource_id: 'resource_id_4',
+      name: 'instance_3',
+      unit: 'instance'
+    }
+  ];
+
+  const samples = [
+    {
+      meter: 'cpu',
+      resource_name: 'fakeName',
+      project_id: 'fakeTenant',
+      timestamp: '2015-12-15T00:34:08',
+      volume: 110
+    },
+    {
+      meter: 'cpu',
+      resource_name: 'fakeName',
+      project_id: 'fakeTenant',
+      timestamp: '2015-12-15T00:44:08',
+      volume: 120
+    },
+    {
+      meter: 'cpu',
+      resource_name: 'anotherName',
+      project_id: 'anotherTenant',
+      timestamp: '2015-12-15T00:24:08',
+      volume: 210
+    },
+    {
+      meter: 'cpu',
+      resource_name: 'anotherName',
+      project_id: 'anotherTenant',
+      timestamp: '2015-12-15T00:34:08',
+      volume: 220
+    },
+    {
+      meter: 'cpu',
+      resource_name: 'anotherName',
+      project_id: 'anotherTenant',
+      timestamp: '2015-12-15T00:44:08',
+      volume: 230
+    },
+    {
+      meter: 'cpu',
+      resource_name: 'thirdName',
+      project_id: 'thirdTenant',
+      timestamp: '2015-12-15T00:44:08',
+      volume: 310
+    }
+  ];
+
+  angular.module('xos.ceilometerDashboard')
+  .run(($httpBackend) => {
+    $httpBackend.whenGET(/metersamples/).respond(samples);
+    $httpBackend.whenGET(/meters/).respond(meters);
+  });
+})();
diff --git a/gui/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js b/gui/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js
new file mode 100644
index 0000000..c5bb850
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/spec/ceilometer.test.js
@@ -0,0 +1,137 @@
+'use strict';
+
+describe('In Ceilometer View', () => {
+  
+  var scope, element, vm, httpBackend;
+
+  beforeEach(module('xos.ceilometerDashboard'));
+  beforeEach(module('templates'));
+
+  beforeEach(inject(($httpBackend, $rootScope) => {
+    httpBackend = $httpBackend;
+    scope = $rootScope.$new();
+  }))
+
+  describe('The dashboard', () => {
+    beforeEach(inject(function($httpBackend, $compile){
+      element = angular.element('<ceilometer-dashboard></ceilometer-dashboard>');
+      $compile(element)(scope);
+      scope.$digest();
+      vm = element.isolateScope().vm;
+      httpBackend.flush();
+    }));
+
+    describe('when loading meters', () => {
+      it('should group meters by services', () => {
+        expect(Object.keys(vm.projects).length).toBe(2);
+      });
+
+      it('should group services by slices', () => {
+        expect(Object.keys(vm.projects.service_2).length).toBe(2);
+      });
+
+      it('should group slices by resources', () => {
+        expect(Object.keys(vm.projects.service_2.slice_2).length).toBe(2);
+      });
+    });
+  });
+
+  describe('the sample view', () => {
+    beforeEach(inject(function($httpBackend, $compile, $stateParams){
+
+      $stateParams.name = 'fakeName';
+      $stateParams.tenant = 'fakeTenant';
+
+      element = angular.element('<ceilometer-samples></ceilometer-samples>');
+      $compile(element)(scope);
+      scope.$digest();
+      vm = element.isolateScope().vm;
+      httpBackend.flush();
+    }));
+
+    it('should group samples by resource_id', () => {
+      expect(Object.keys(vm.samplesList.fakeTenant).length).toBe(2)
+      expect(Object.keys(vm.samplesList.anotherTenant).length).toBe(3)
+      expect(Object.keys(vm.samplesList.thirdTenant).length).toBe(1)
+    });
+
+    it('should add the comparable samples to the dropdown list', () => {
+      expect(vm.sampleLabels[0].id).toEqual('anotherTenant')
+      expect(vm.sampleLabels[1].id).toEqual('thirdTenant')
+    });
+
+    it('should add the selected meter to the chart', () => {
+      expect(vm.chart.labels.length).toBe(2);
+      expect(vm.chart.series[0]).toBe('fakeTenant');
+      expect(vm.chart.data[0].length).toBe(2);
+      expect(vm.chart.data[0][0]).toBe(110);
+      expect(vm.chart.data[0][1]).toBe(120);
+      expect(vm.chartMeters[0].project_id).toBe('fakeTenant')
+      expect(vm.chartMeters[0].resource_name).toBe('fakeName')
+    });
+
+    it('should add a sample to the chart', () => {
+      vm.addMeterToChart('anotherTenant');
+      expect(vm.chart.labels.length).toBe(3);
+      expect(vm.chart.data[1].length).toBe(3);
+      expect(vm.chart.data[1][0]).toBe(210);
+      expect(vm.chart.data[1][1]).toBe(220);
+      expect(vm.chart.data[1][2]).toBe(230);
+      expect(vm.chartMeters[1].project_id).toBe('anotherTenant')
+      expect(vm.chartMeters[1].resource_name).toBe('anotherName')
+    });
+
+    it('should remove a sample from the chart', () => {
+      // for simplyvity add a tenant (it's tested)
+      vm.addMeterToChart('anotherTenant');
+      vm.removeFromChart(vm.chartMeters[0]);
+      expect(vm.chart.data[0].length).toBe(3);
+      expect(vm.chart.data[0][0]).toBe(210);
+      expect(vm.chart.data[0][1]).toBe(220);
+      expect(vm.chart.data[0][2]).toBe(230);
+      expect(vm.chartMeters[0].project_id).toBe('anotherTenant')
+      expect(vm.chartMeters[0].resource_name).toBe('anotherName')
+    });
+
+    describe('The format sample labels method', () => {
+      it('should create an array of unique labels', () => {
+        // unique because every resource has multiple samples (time-series)
+        const samples = [
+          {project_id: 1, resource_name: 'fakeName'},
+          {project_id: 1, resource_name: 'fakeName'},
+          {project_id: 2, resource_name: 'anotherName'},
+          {project_id: 2, resource_name: 'anotherName'}
+        ];
+
+        const result = vm.formatSamplesLabels(samples);
+
+        expect(result.length).toBe(2);
+        expect(result[0]).toEqual({id: 1, name: 'fakeName'});
+        expect(result[1]).toEqual({id: 2, name: 'anotherName'});
+      });
+    });
+  });
+});
+
+describe('The orderObjectByKey filter', () => {
+  var $filter;
+
+  beforeEach(function () {
+    module('xos.ceilometerDashboard');
+
+    inject(function (_$filter_) {
+      $filter = _$filter_;
+    });
+  });
+
+  it('should order an object by the key value', function () {
+    // Arrange.
+    const list = {c: 3, b: 2, a: 1};
+
+    // call the filter function
+    const result = $filter('orderObjectByKey')(list);
+
+    // Assert.
+    expect(result).toEqual({a: 1, b: 2, c: 3});
+  });
+});
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css b/gui/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css
new file mode 100644
index 0000000..4e6fa88
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/css/ceilometerDashboard.css
@@ -0,0 +1,265 @@
+#xosCeilometerDashboard{
+  position: relative;
+}
+
+/* Panel Layout */
+.panel {
+  margin-top: 10px;
+}
+
+.panel-body:not(:first-child) {
+  border-top: 1px solid #e3e3e3;
+}
+
+.panel-body .row {
+  margin-top: 10px;
+}
+
+/* Chart details */
+.chart {
+  width: 100%;
+  height: 300px;
+}
+
+.btn-chart, .btn-chart:hover {
+  color: #fff;
+}
+
+.side-container {
+  position: relative;
+}
+
+.service-list {
+  margin-top: -10px;
+}
+
+.service-list h3 {
+  margin-top: 0px;
+  margin-bottom: 0px;
+}
+
+.service-list a {
+  text-decoration: none;
+  color: #333;
+}
+
+.meters, .stats {
+  margin-top: 25px;
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  margin-bottom: 50px;
+}
+
+/* LOADER */
+.loader {
+  font-size: 10px;
+  margin: 150px auto;
+  text-indent: -9999em;
+  width: 11em;
+  height: 11em;
+  border-radius: 50%;
+  background: #ffffff;
+  background: -moz-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
+  background: -webkit-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
+  background: -o-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
+  background: -ms-linear-gradient(left, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
+  background: linear-gradient(to right, #ffffff 10%, rgba(255, 255, 255, 0) 42%);
+  position: relative;
+  -webkit-animation: load3 1.4s infinite linear;
+  animation: load3 1.4s infinite linear;
+  -webkit-transform: translateZ(0);
+  -ms-transform: translateZ(0);
+  transform: translateZ(0);
+}
+.loader:before {
+  width: 50%;
+  height: 50%;
+  background: #105E9E;
+  border-radius: 100% 0 0 0;
+  position: absolute;
+  top: 0;
+  left: 0;
+  content: '';
+}
+.loader:after {
+  background: #fff;
+  width: 75%;
+  height: 75%;
+  border-radius: 50%;
+  content: '';
+  margin: auto;
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+}
+@-webkit-keyframes load3 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+@keyframes load3 {
+  0% {
+    -webkit-transform: rotate(0deg);
+    transform: rotate(0deg);
+  }
+  100% {
+    -webkit-transform: rotate(360deg);
+    transform: rotate(360deg);
+  }
+}
+
+/* VIEW ANIMATION */
+
+[ui-view] {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  margin-bottom: 100px;
+}
+
+/* FROM DASHBOARD TO DETAIL */
+
+/* dash out */
+[ui-view].ceilometerDashboard.ng-leave {
+  animation:1s bounceOutLeft ease; 
+}
+/* samples in */
+[ui-view].samples.ng-enter {
+  animation:1s bounceInRight ease;
+}
+
+/* FROM DETAIL TO DASHBOARD */
+
+/* samples out */
+[ui-view].samples.ng-leave {
+  animation:1s bounceOutRight ease; 
+}
+/* dash in */
+[ui-view].ceilometerDashboard.ng-enter {
+  animation:1s bounceInLeft ease;
+}
+
+/* COLUMS ANIMATION */
+/* when showing the thing */
+.animate .animate-slide-left.ng-hide-remove { 
+  animation:0.5s bounceInRight ease; 
+}
+
+/* when hiding the picture */
+.animate .animate-slide-left.ng-hide-add {
+  animation:0.5s bounceOutRight ease;
+}
+
+/* ANIMATIONS */
+
+@keyframes bounceInRight {
+  from, 60%, 75%, 90%, to {
+    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  from {
+    opacity: 0;
+    transform: translate3d(3000px, 0, 0);
+  }
+
+  60% {
+    opacity: 1;
+    transform: translate3d(-25px, 0, 0);
+  }
+
+  75% {
+    transform: translate3d(10px, 0, 0);
+  }
+
+  90% {
+    transform: translate3d(-5px, 0, 0);
+  }
+
+  to {
+    transform: none;
+  }
+}
+
+@keyframes bounceInLeft {
+  from, 60%, 75%, 90%, to {
+    animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
+  }
+
+  0% {
+    opacity: 0;
+    transform: translate3d(-3000px, 0, 0);
+  }
+
+  60% {
+    opacity: 1;
+    transform: translate3d(25px, 0, 0);
+  }
+
+  75% {
+    transform: translate3d(-10px, 0, 0);
+  }
+
+  90% {
+    transform: translate3d(5px, 0, 0);
+  }
+
+  to {
+    transform: none;
+  }
+}
+
+@keyframes slideInUp {
+  from {
+    transform: translate3d(0, 100%, 0);
+    visibility: visible;
+  }
+
+  to {
+    transform: translate3d(0, 0, 0);
+  }
+}
+
+@keyframes bounceOutRight {
+  20% {
+    opacity: 1;
+    transform: translate3d(-20px, 0, 0);
+  }
+
+  to {
+    opacity: 0;
+    transform: translate3d(2000px, 0, 0);
+  }
+}
+
+@keyframes bounceOutLeft {
+  20% {
+    opacity: 1;
+    transform: translate3d(20px, 0, 0);
+  }
+
+  to {
+    opacity: 0;
+    transform: translate3d(-2000px, 0, 0);
+  }
+}
+
+@keyframes slideOutDown {
+  from {
+    transform: translate3d(0, 0, 0);
+  }
+
+  to {
+    visibility: hidden;
+    transform: translate3d(0, 100%, 0);
+  }
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/css/dev.css b/gui/ngXosViews/ceilometerDashboard/src/css/dev.css
new file mode 100644
index 0000000..228d394
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/css/dev.css
@@ -0,0 +1,14 @@
+@media (min-width: 768px) {
+  #xosCeilometerDashboard {
+    position: absolute;
+    top: 100px;
+    left: 20%;
+    width: 80%;
+  }
+}
+
+@media (min-width: 768px) {
+  #xosCeilometerDashboard {
+    margin: 10px
+  }
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/index.html b/gui/ngXosViews/ceilometerDashboard/src/index.html
new file mode 100644
index 0000000..6363764
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/index.html
@@ -0,0 +1,41 @@
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, max-scale=1">
+<!-- browserSync -->
+<!-- bower:css -->
+<link rel="stylesheet" href="vendor/angular-chart.js/dist/angular-chart.css" />
+<link rel="stylesheet" href="vendor/bootstrap-css/css/bootstrap.min.css" />
+<!-- endbower --><!-- endcss -->
+<!-- inject:css -->
+<link rel="stylesheet" href="/css/ceilometerDashboard.css">
+<link rel="stylesheet" href="/css/dev.css">
+<!-- endinject -->
+<div ng-app="xos.ceilometerDashboard" id="xosCeilometerDashboard">
+  <div ui-view ng-class="stateName"></div>
+</div>
+
+<!-- bower:js -->
+<script src="vendor/angular/angular.js"></script>
+<script src="vendor/Chart.js/Chart.js"></script>
+<script src="vendor/angular-chart.js/dist/angular-chart.js"></script>
+<script src="vendor/angular-animate/angular-animate.js"></script>
+<script src="vendor/ui.bootstrap/src/accordion/accordion.js"></script>
+<script src="vendor/ui.bootstrap/src/collapse/collapse.js"></script>
+<script src="vendor/jquery/dist/jquery.js"></script>
+<script src="vendor/angular-mocks/angular-mocks.js"></script>
+<script src="vendor/angular-ui-router/release/angular-ui-router.js"></script>
+<script src="vendor/angular-cookies/angular-cookies.js"></script>
+<script src="vendor/angular-resource/angular-resource.js"></script>
+<script src="vendor/ng-lodash/build/ng-lodash.js"></script>
+<script src="vendor/bootstrap-css/js/bootstrap.min.js"></script>
+<!-- endbower --><!-- endjs -->
+
+<!-- inject:js -->
+<script src="/xosHelpers/src/xosHelpers.module.js"></script>
+<script src="/xosHelpers/src/services/noHyperlinks.interceptor.js"></script>
+<script src="/xosHelpers/src/services/csrfToken.interceptor.js"></script>
+<script src="/xosHelpers/src/services/api.services.js"></script>
+<script src="/api/ng-xoslib.js"></script>
+<script src="/api/ng-xos.js"></script>
+<script src="/api/ng-hpcapi.js"></script>
+<script src="/.tmp/main.js"></script>
+<!-- endinject -->
diff --git a/gui/ngXosViews/ceilometerDashboard/src/js/main.js b/gui/ngXosViews/ceilometerDashboard/src/js/main.js
new file mode 100644
index 0000000..a20d563
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/js/main.js
@@ -0,0 +1,375 @@
+'use strict';
+
+angular.module('xos.ceilometerDashboard', [
+  'ngResource',
+  'ngCookies',
+  'ngLodash',
+  'ui.router',
+  'xos.helpers',
+  'ngAnimate',
+  'chart.js',
+  'ui.bootstrap.accordion'
+])
+.config(($stateProvider, $urlRouterProvider) => {
+  $stateProvider
+  .state('ceilometerDashboard', {
+    url: '/',
+    template: '<ceilometer-dashboard></ceilometer-dashboard>'
+  })
+  .state('samples', {
+    url: '/:name/:tenant/samples',
+    template: '<ceilometer-samples></ceilometer-samples>'
+  });
+  $urlRouterProvider.otherwise('/');
+})
+.config(function($httpProvider){
+  $httpProvider.interceptors.push('NoHyperlinks');
+})
+.run(function($rootScope){
+  $rootScope.stateName = 'ceilometerDashboard';
+  $rootScope.$on('$stateChangeStart', (event, toState) => {
+    $rootScope.stateName = toState.name;
+  })
+})
+.service('Ceilometer', function($http, $q, lodash){
+
+  this.getMeters = () => {
+    let deferred = $q.defer();
+
+    $http.get('/xoslib/meters/', {cache: true})
+    // $http.get('../meters_mock.json', {cache: true})
+    .then((res) => {
+      deferred.resolve(res.data)
+    })
+    .catch((e) => {
+      deferred.reject(e);
+    });
+
+    return deferred.promise;
+  }
+
+  this.getSamples = (name, tenant) => {
+    let deferred = $q.defer();
+
+    $http.get(`/xoslib/metersamples/`, {params: {meter: name, tenant: tenant}})
+    .then((res) => {
+      deferred.resolve(res.data)
+    })
+    .catch((e) => {
+      deferred.reject(e);
+    });
+
+    return deferred.promise;
+  }
+
+  this.getStats = (sliceName) => {
+    let deferred = $q.defer();
+
+    $http.get('/xoslib/meterstatistics/', {cache: true})
+    // $http.get('../stats_mock.son', {cache: true})
+    .then((res) => {
+      deferred.resolve(lodash.filter(res.data, {slice: sliceName}))
+    })
+    .catch((e) => {
+      deferred.reject(e);
+    });
+
+    return deferred.promise;
+  };
+
+  // hold dashboard status (opened service, slice, resource)
+  this.selectedService = null;
+  this.selectedSlice = null;
+  this.selectedResource = null;
+})
+.directive('ceilometerDashboard', function(lodash){
+  return {
+    restrict: 'E',
+    scope: {},
+    bindToController: true,
+    controllerAs: 'vm',
+    templateUrl: 'templates/ceilometer-dashboard.tpl.html',
+    controller: function(Ceilometer){
+
+      console.log(Ceilometer.selectedService, Ceilometer.selectedSlice, Ceilometer.selectedResource);
+
+      // this open the accordion
+      this.accordion = {
+        open: {}
+      }
+
+      /**
+      * Open the active panel base on the service stored values
+      */
+      this.openPanels = () => {
+        if(Ceilometer.selectedService){
+          this.accordion.open[Ceilometer.selectedService] = true;
+          if(Ceilometer.selectedSlice){
+            this.selectedSlice = Ceilometer.selectedSlice;
+            this.selectedResources = this.projects[Ceilometer.selectedService][Ceilometer.selectedSlice]
+            if(Ceilometer.selectedResource){
+              this.selectedResource = Ceilometer.selectedResource;
+              this.selectedMeters = this.selectedResources[Ceilometer.selectedResource];
+            }
+          }
+        }
+      }
+
+      this.loadMeters = () => {
+        this.loader = true;
+
+        // TODO rename projects in meters
+        Ceilometer.getMeters()
+        .then(meters => {
+          //group project by service
+          this.projects = lodash.groupBy(meters, 'service');
+          lodash.forEach(Object.keys(this.projects), (project) => {
+            // inside each service group by slice
+            this.projects[project] = lodash.groupBy(this.projects[project], 'slice');
+            lodash.forEach(Object.keys(this.projects[project]), (slice) => {
+              // inside each service => slice group by resource
+              this.projects[project][slice] = lodash.groupBy(this.projects[project][slice], 'resource_name');
+            });
+          });
+
+          // open selected panels
+          this.openPanels();
+        })
+        .catch(err => {
+          this.error = err.data.detail;
+        })
+        .finally(() => {
+          this.loader = false;
+        });
+      }
+
+      this.loadMeters();
+
+      /**
+      * Select Resources for a slice
+      *
+      * @param Array resources The list of selected resources
+      * @returns void
+      */
+      this.selectedResources = null;
+      this.selectResources = (resources, slice, service) => {
+        //cleaning
+        this.selectedResources = null;
+        this.selectedResource = null;
+        this.selectedMeters = null;
+
+        // hold the resource list for the current slice
+        this.selectedResources = resources;
+        this.selectedSlice = slice;
+        this.selectedService = service;
+
+        // store the status
+        Ceilometer.selectedSlice = slice;
+        Ceilometer.selectedService = service;
+      }
+
+      /**
+      * Select Meters for a resource
+      *
+      * @param Array meters The list of selected resources
+      * @returns void
+      */
+      this.selectedMeters = null;
+      this.selectMeters = (meters, resource) => {
+        this.selectedMeters = meters;
+
+        Ceilometer.selectedResource = resource;
+        this.selectedResource = resource;
+      }
+
+    }
+  };
+})
+.directive('ceilometerSamples', function(lodash, $stateParams){
+  return {
+    restrict: 'E',
+    scope: {
+      name: '=name',
+      tenant: '=tenant'
+    },
+    bindToController: true,
+    controllerAs: 'vm',
+    templateUrl: 'templates/ceilometer-samples.tpl.html',
+    controller: function(Ceilometer) {
+
+      // console.log(Ceilometer.selectResource);
+
+      this.chartColors = [
+        '#286090',
+        '#F7464A',
+        '#46BFBD',
+        '#FDB45C',
+        '#97BBCD',
+        '#4D5360',
+        '#8c4f9f'
+      ];
+
+      this.chart = {
+        series: [],
+        labels: [],
+        data: []
+      }
+
+      Chart.defaults.global.colours = this.chartColors;
+      
+      this.chartType = 'line';
+
+      if($stateParams.name && $stateParams.tenant){
+        this.name = $stateParams.name;
+        this.tenant = $stateParams.tenant;
+        // TODO rename tenant in project_id
+      }
+      else{
+        throw new Error('Missing Name and Tenant Params!');
+      }
+
+      /**
+      * Goes trough the array and format date to be used as labels
+      *
+      * @param Array data
+      * @returns Array a list of labels
+      */
+
+      this.getLabels = (data) => {
+        return data.reduce((list, item) => {
+          let date = new Date(item.timestamp);
+          list.push(`${date.getHours()}:${(date.getMinutes()<10?'0':'') + date.getMinutes()}:${date.getSeconds()}`);
+          return list;
+        }, []);
+      };
+
+      /**
+      * Goes trough the array and return a flat array of values
+      *
+      * @param Array data
+      * @returns Array a list of values
+      */
+
+      this.getData = (data) => {
+        return data.reduce((list, item) => {
+          list.push(item.volume);
+          return list;
+        }, []);
+      }
+
+      /**
+      * Add a samples to the chart
+      *
+      * @param string resource_id
+      */
+      this.chartMeters = [];
+      this.addMeterToChart = (project_id) => {
+        this.chart['labels'] = this.getLabels(lodash.sortBy(this.samplesList[project_id], 'timestamp'));
+        this.chart['series'].push(project_id);
+        this.chart['data'].push(this.getData(lodash.sortBy(this.samplesList[project_id], 'timestamp')));
+        this.chartMeters.push(this.samplesList[project_id][0]); //use the 0 as are all samples for the same resource and I need the name
+        lodash.remove(this.sampleLabels, {id: project_id});
+      }
+
+      this.removeFromChart = (meter) => {
+        this.chart.data.splice(this.chart.series.indexOf(meter.project_id), 1);
+        this.chart.series.splice(this.chart.series.indexOf(meter.project_id), 1);
+        this.chartMeters.splice(lodash.findIndex(this.chartMeters, {project_id: meter.project_id}), 1);
+        this.sampleLabels.push({
+          id: meter.project_id,
+          name: meter.resource_name || meter.project_id
+        })
+      };
+
+      /**
+      * Format samples to create a list of labels and ids
+      */
+     
+      this.formatSamplesLabels = (samples) => {
+
+        return lodash.uniq(samples, 'project_id')
+        .reduce((labels, item) => {
+          labels.push({
+            id: item.project_id,
+            name: item.resource_name || item.project_id
+          });
+          return labels;
+        }, []);
+      }
+
+
+      /**
+      * Load the samples and format data
+      */
+
+      this.showSamples = () => {
+        this.loader = true;
+        // Ceilometer.getSamples(this.name, this.tenant) //fetch one
+        Ceilometer.getSamples(this.name) //fetch all
+        .then(res => {
+
+          // setup data for visualization
+          this.samplesList = lodash.groupBy(res, 'project_id');
+          this.sampleLabels = this.formatSamplesLabels(res);
+          
+          // add current meter to chart
+          this.addMeterToChart(this.tenant);
+
+        })
+        .catch(err => {
+          this.error = err.data.detail;
+        })
+        .finally(() => {
+          this.loader = false;
+        });
+      };
+
+      this.showSamples();
+    }
+  }
+})
+.directive('ceilometerStats', function(){
+  return {
+    restrict: 'E',
+    scope: {
+      name: '=name',
+    },
+    bindToController: true,
+    controllerAs: 'vm',
+    templateUrl: 'templates/ceilometer-stats.tpl.html',
+    controller: function($scope, Ceilometer) {
+      this.getStats = () => {
+        this.loader = true;
+        Ceilometer.getStats(this.name)
+        .then(res => {
+          this.stats = res;
+        })
+        .catch(err => {
+          this.error = err.data;
+        })
+        .finally(() => {
+          this.loader = false;
+        });
+      };
+
+      this.getStats();
+
+      $scope.$watch(() => this.name, () => {this.getStats();});
+    }
+  }
+})
+.filter('orderObjectByKey', function(lodash) {
+  return function(items) {
+
+    if(!items){
+      return;
+    }
+
+    return lodash.reduce(Object.keys(items).reverse(), (list, key) => {
+      list[key] = items[key];
+      return list;
+    }, {});
+
+  };
+});
+;
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/meters_mock.json b/gui/ngXosViews/ceilometerDashboard/src/meters_mock.json
new file mode 100644
index 0000000..7ff0c68
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/meters_mock.json
@@ -0,0 +1,1266 @@
+[
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "197bc772-ff13-4b68-96e6-d4a4b1730fe7", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_volt-4", 
+        "meter_id": "MTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3K2luc3RhbmNl\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "bde67a22-7579-4097-9406-c15eb2b9ae27", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_vbng-2", 
+        "meter_id": "YmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3K2luc3RhbmNl\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "Other", 
+        "resource_id": "0a802169-5918-4c28-9014-635ae6602cdb", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_volt-5", 
+        "meter_id": "MGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiK2luc3RhbmNl\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "service_vcpe", 
+        "resource_id": "f71e7c55-2435-45a4-aa9a-073f97ceccbc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vcpe-7", 
+        "meter_id": "ZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjK2luc3RhbmNl\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "Other", 
+        "resource_id": "98535996-e184-4996-a28e-61647e5d31d0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vbng-6", 
+        "meter_id": "OTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwK2luc3RhbmNl\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "Other", 
+        "resource_id": "f5c71396-9092-42da-91ec-434259bde2ef", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_clients-3", 
+        "meter_id": "ZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmK2luc3RhbmNl\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "instance", 
+        "service": "service_ceilometer", 
+        "resource_id": "bdb0ff14-e848-446c-acb4-63e232487dc0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_ceilometer-8", 
+        "meter_id": "YmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwK2luc3RhbmNl\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "197bc772-ff13-4b68-96e6-d4a4b1730fe7", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_volt-4", 
+        "meter_id": "MTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3K21lbW9yeQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "bde67a22-7579-4097-9406-c15eb2b9ae27", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_vbng-2", 
+        "meter_id": "YmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3K21lbW9yeQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "Other", 
+        "resource_id": "0a802169-5918-4c28-9014-635ae6602cdb", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_volt-5", 
+        "meter_id": "MGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiK21lbW9yeQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "service_vcpe", 
+        "resource_id": "f71e7c55-2435-45a4-aa9a-073f97ceccbc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vcpe-7", 
+        "meter_id": "ZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjK21lbW9yeQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "Other", 
+        "resource_id": "98535996-e184-4996-a28e-61647e5d31d0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vbng-6", 
+        "meter_id": "OTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwK21lbW9yeQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "Other", 
+        "resource_id": "f5c71396-9092-42da-91ec-434259bde2ef", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_clients-3", 
+        "meter_id": "ZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmK21lbW9yeQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory", 
+        "service": "service_ceilometer", 
+        "resource_id": "bdb0ff14-e848-446c-acb4-63e232487dc0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_ceilometer-8", 
+        "meter_id": "YmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwK21lbW9yeQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "197bc772-ff13-4b68-96e6-d4a4b1730fe7", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_volt-4", 
+        "meter_id": "MTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3K21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "bde67a22-7579-4097-9406-c15eb2b9ae27", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_vbng-2", 
+        "meter_id": "YmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3K21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "Other", 
+        "resource_id": "0a802169-5918-4c28-9014-635ae6602cdb", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_volt-5", 
+        "meter_id": "MGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiK21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "service_vcpe", 
+        "resource_id": "f71e7c55-2435-45a4-aa9a-073f97ceccbc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vcpe-7", 
+        "meter_id": "ZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjK21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "Other", 
+        "resource_id": "98535996-e184-4996-a28e-61647e5d31d0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vbng-6", 
+        "meter_id": "OTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwK21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "Other", 
+        "resource_id": "f5c71396-9092-42da-91ec-434259bde2ef", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_clients-3", 
+        "meter_id": "ZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmK21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "memory.usage", 
+        "service": "service_ceilometer", 
+        "resource_id": "bdb0ff14-e848-446c-acb4-63e232487dc0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_ceilometer-8", 
+        "meter_id": "YmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwK21lbW9yeS51c2FnZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "MB", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "197bc772-ff13-4b68-96e6-d4a4b1730fe7", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_volt-4", 
+        "meter_id": "MTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3K2NwdQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "bde67a22-7579-4097-9406-c15eb2b9ae27", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_vbng-2", 
+        "meter_id": "YmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3K2NwdQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "Other", 
+        "resource_id": "0a802169-5918-4c28-9014-635ae6602cdb", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_volt-5", 
+        "meter_id": "MGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiK2NwdQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "service_vcpe", 
+        "resource_id": "f71e7c55-2435-45a4-aa9a-073f97ceccbc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vcpe-7", 
+        "meter_id": "ZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjK2NwdQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "Other", 
+        "resource_id": "98535996-e184-4996-a28e-61647e5d31d0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vbng-6", 
+        "meter_id": "OTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwK2NwdQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "Other", 
+        "resource_id": "f5c71396-9092-42da-91ec-434259bde2ef", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_clients-3", 
+        "meter_id": "ZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmK2NwdQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu", 
+        "service": "service_ceilometer", 
+        "resource_id": "bdb0ff14-e848-446c-acb4-63e232487dc0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_ceilometer-8", 
+        "meter_id": "YmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwK2NwdQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "cumulative", 
+        "unit": "ns", 
+        "description": "CPU time used"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "197bc772-ff13-4b68-96e6-d4a4b1730fe7", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_volt-4", 
+        "meter_id": "MTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3K2NwdV91dGls\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "bde67a22-7579-4097-9406-c15eb2b9ae27", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_onos_vbng-2", 
+        "meter_id": "YmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3K2NwdV91dGls\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "Other", 
+        "resource_id": "0a802169-5918-4c28-9014-635ae6602cdb", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_volt-5", 
+        "meter_id": "MGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiK2NwdV91dGls\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "service_vcpe", 
+        "resource_id": "f71e7c55-2435-45a4-aa9a-073f97ceccbc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vcpe-7", 
+        "meter_id": "ZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjK2NwdV91dGls\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "Other", 
+        "resource_id": "98535996-e184-4996-a28e-61647e5d31d0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_vbng-6", 
+        "meter_id": "OTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwK2NwdV91dGls\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "Other", 
+        "resource_id": "f5c71396-9092-42da-91ec-434259bde2ef", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_clients-3", 
+        "meter_id": "ZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmK2NwdV91dGls\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "cpu_util", 
+        "service": "service_ceilometer", 
+        "resource_id": "bdb0ff14-e848-446c-acb4-63e232487dc0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "mysite_ceilometer-8", 
+        "meter_id": "YmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwK2NwdV91dGls\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "%", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000002-197bc772-ff13-4b68-96e6-d4a4b1730fe7-tap27815de2-07", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap27815de2-07", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDItMTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3LXRh\ncDI3ODE1ZGUyLTA3K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000002-197bc772-ff13-4b68-96e6-d4a4b1730fe7-tap8f02bde6-e4", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap8f02bde6-e4", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDItMTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3LXRh\ncDhmMDJiZGU2LWU0K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000004-bde67a22-7579-4097-9406-c15eb2b9ae27-tap265bab7b-93", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap265bab7b-93", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDQtYmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3LXRh\ncDI2NWJhYjdiLTkzK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000004-bde67a22-7579-4097-9406-c15eb2b9ae27-tap6d838c10-05", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap6d838c10-05", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDQtYmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3LXRh\ncDZkODM4YzEwLTA1K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tap5ef062b7-1d", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap5ef062b7-1d", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncDVlZjA2MmI3LTFkK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tap905990b8-db", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap905990b8-db", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncDkwNTk5MGI4LWRiK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tapa216d1f0-3e", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapa216d1f0-3e", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncGEyMTZkMWYwLTNlK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tapd80be99a-b6", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapd80be99a-b6", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncGQ4MGJlOTlhLWI2K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tap5afd137f-19", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap5afd137f-19", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncDVhZmQxMzdmLTE5K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tap9a6306b4-7e", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap9a6306b4-7e", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncDlhNjMwNmI0LTdlK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tapc59abc32-a4", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapc59abc32-a4", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncGM1OWFiYzMyLWE0K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tapf1e00a14-22", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapf1e00a14-22", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncGYxZTAwYTE0LTIyK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tapabf29bde-bc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapabf29bde-bc", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGFiZjI5YmRlLWJjK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tapbc16b000-82", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapbc16b000-82", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGJjMTZiMDAwLTgyK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tape44bc1cc-46", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tape44bc1cc-46", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGU0NGJjMWNjLTQ2K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tape4f20024-47", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tape4f20024-47", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGU0ZjIwMDI0LTQ3K25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000003-f5c71396-9092-42da-91ec-434259bde2ef-tap3518d7f8-9f", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap3518d7f8-9f", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDMtZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmLXRh\ncDM1MThkN2Y4LTlmK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000003-f5c71396-9092-42da-91ec-434259bde2ef-tap7409a9c5-e0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap7409a9c5-e0", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDMtZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmLXRh\ncDc0MDlhOWM1LWUwK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000003-f5c71396-9092-42da-91ec-434259bde2ef-tapde69764f-3d", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapde69764f-3d", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDMtZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmLXRh\ncGRlNjk3NjRmLTNkK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-00000005-bdb0ff14-e848-446c-acb4-63e232487dc0-tap8d13e0d5-d2", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap8d13e0d5-d2", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDUtYmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwLXRh\ncDhkMTNlMGQ1LWQyK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-00000005-bdb0ff14-e848-446c-acb4-63e232487dc0-tapa5d252a8-ae", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapa5d252a8-ae", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDUtYmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwLXRh\ncGE1ZDI1MmE4LWFlK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.incoming.bytes.rate", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-00000005-bdb0ff14-e848-446c-acb4-63e232487dc0-tapb06a526b-03", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapb06a526b-03", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDUtYmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwLXRh\ncGIwNmE1MjZiLTAzK25ldHdvcmsuaW5jb21pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000002-197bc772-ff13-4b68-96e6-d4a4b1730fe7-tap27815de2-07", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap27815de2-07", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDItMTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3LXRh\ncDI3ODE1ZGUyLTA3K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000002-197bc772-ff13-4b68-96e6-d4a4b1730fe7-tap8f02bde6-e4", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap8f02bde6-e4", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDItMTk3YmM3NzItZmYxMy00YjY4LTk2ZTYtZDRhNGIxNzMwZmU3LXRh\ncDhmMDJiZGU2LWU0K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "bfef8341327245d682c7bada50aceecb", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000004-bde67a22-7579-4097-9406-c15eb2b9ae27-tap265bab7b-93", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap265bab7b-93", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDQtYmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3LXRh\ncDI2NWJhYjdiLTkzK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_onos_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000004-bde67a22-7579-4097-9406-c15eb2b9ae27-tap6d838c10-05", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap6d838c10-05", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDQtYmRlNjdhMjItNzU3OS00MDk3LTk0MDYtYzE1ZWIyYjlhZTI3LXRh\ncDZkODM4YzEwLTA1K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "7c918e6765c24ee281f3ee8692fd102c", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tap5ef062b7-1d", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap5ef062b7-1d", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncDVlZjA2MmI3LTFkK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tap905990b8-db", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap905990b8-db", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncDkwNTk5MGI4LWRiK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tapa216d1f0-3e", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapa216d1f0-3e", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncGEyMTZkMWYwLTNlK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_volt", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000001-0a802169-5918-4c28-9014-635ae6602cdb-tapd80be99a-b6", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapd80be99a-b6", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDEtMGE4MDIxNjktNTkxOC00YzI4LTkwMTQtNjM1YWU2NjAyY2RiLXRh\ncGQ4MGJlOTlhLWI2K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f506380a49a24389ae0d8469274e3279", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tap5afd137f-19", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap5afd137f-19", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncDVhZmQxMzdmLTE5K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tap9a6306b4-7e", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap9a6306b4-7e", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncDlhNjMwNmI0LTdlK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tapc59abc32-a4", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapc59abc32-a4", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncGM1OWFiYzMyLWE0K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vcpe", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-00000006-f71e7c55-2435-45a4-aa9a-073f97ceccbc-tapf1e00a14-22", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapf1e00a14-22", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDYtZjcxZTdjNTUtMjQzNS00NWE0LWFhOWEtMDczZjk3Y2VjY2JjLXRh\ncGYxZTAwYTE0LTIyK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "61a5d4b37b5d43718854916079760c0d", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tapabf29bde-bc", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapabf29bde-bc", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGFiZjI5YmRlLWJjK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tapbc16b000-82", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapbc16b000-82", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGJjMTZiMDAwLTgyK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tape44bc1cc-46", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tape44bc1cc-46", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGU0NGJjMWNjLTQ2K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_vbng", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000007-98535996-e184-4996-a28e-61647e5d31d0-tape4f20024-47", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tape4f20024-47", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDctOTg1MzU5OTYtZTE4NC00OTk2LWEyOGUtNjE2NDdlNWQzMWQwLXRh\ncGU0ZjIwMDI0LTQ3K25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "c92cf450df4640d6952c0276730e5048", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000003-f5c71396-9092-42da-91ec-434259bde2ef-tap3518d7f8-9f", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap3518d7f8-9f", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDMtZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmLXRh\ncDM1MThkN2Y4LTlmK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000003-f5c71396-9092-42da-91ec-434259bde2ef-tap7409a9c5-e0", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap7409a9c5-e0", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDMtZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmLXRh\ncDc0MDlhOWM1LWUwK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_clients", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "Other", 
+        "resource_id": "instance-00000003-f5c71396-9092-42da-91ec-434259bde2ef-tapde69764f-3d", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapde69764f-3d", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDMtZjVjNzEzOTYtOTA5Mi00MmRhLTkxZWMtNDM0MjU5YmRlMmVmLXRh\ncGRlNjk3NjRmLTNkK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "f884c440474b40808a8adcdece5f45ef", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-00000005-bdb0ff14-e848-446c-acb4-63e232487dc0-tap8d13e0d5-d2", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tap8d13e0d5-d2", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDUtYmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwLXRh\ncDhkMTNlMGQ1LWQyK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-00000005-bdb0ff14-e848-446c-acb4-63e232487dc0-tapa5d252a8-ae", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapa5d252a8-ae", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDUtYmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwLXRh\ncGE1ZDI1MmE4LWFlK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "category": "Nova", 
+        "slice": "mysite_ceilometer", 
+        "user_id": "36e376b1072443758a0314f62fa8a414", 
+        "name": "network.outgoing.bytes.rate", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-00000005-bdb0ff14-e848-446c-acb4-63e232487dc0-tapb06a526b-03", 
+        "label": "", 
+        "source": "openstack", 
+        "resource_name": "tapb06a526b-03", 
+        "meter_id": "aW5zdGFuY2UtMDAwMDAwMDUtYmRiMGZmMTQtZTg0OC00NDZjLWFjYjQtNjNlMjMyNDg3ZGMwLXRh\ncGIwNmE1MjZiLTAzK25ldHdvcmsub3V0Z29pbmcuYnl0ZXMucmF0ZQ==\n", 
+        "project_id": "920d70bc63574552bbb3c3fb262ee1bc", 
+        "type": "gauge", 
+        "unit": "B/s", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }
+]
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/stats_mock.json b/gui/ngXosViews/ceilometerDashboard/src/stats_mock.json
new file mode 100644
index 0000000..5dd083a
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/stats_mock.json
@@ -0,0 +1,950 @@
+[
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "c7f44959-490b-4d24-8043-66a096c7cae0", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "afac5cb6-72c7-4c25-b281-7a442835b395", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "9ec8c981-feb8-46c1-a1f6-3438702ee170", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "274134cc-700a-4392-8226-447a2f35cc1e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "e66d524e-9ce1-4ec2-81bb-c95043fb8e4f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "a8214ed9-e222-484b-93c2-9245e4712a99", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 1.0, 
+        "unit": "instance", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "7d483484-a660-4307-b081-af1e4dd07eae", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "instance", 
+        "description": "Existence of instance"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "c7f44959-490b-4d24-8043-66a096c7cae0", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "afac5cb6-72c7-4c25-b281-7a442835b395", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "9ec8c981-feb8-46c1-a1f6-3438702ee170", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "274134cc-700a-4392-8226-447a2f35cc1e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "e66d524e-9ce1-4ec2-81bb-c95043fb8e4f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "a8214ed9-e222-484b-93c2-9245e4712a99", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 2048.0, 
+        "unit": "MB", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "7d483484-a660-4307-b081-af1e4dd07eae", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory", 
+        "description": "Volume of RAM"
+    }, 
+    {
+        "value": 1507.9379310344827, 
+        "unit": "MB", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "c7f44959-490b-4d24-8043-66a096c7cae0", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 374.6965517241379, 
+        "unit": "MB", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "afac5cb6-72c7-4c25-b281-7a442835b395", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 375.1655172413793, 
+        "unit": "MB", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "9ec8c981-feb8-46c1-a1f6-3438702ee170", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 1786.7310344827586, 
+        "unit": "MB", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "274134cc-700a-4392-8226-447a2f35cc1e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 1797.2413793103449, 
+        "unit": "MB", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "e66d524e-9ce1-4ec2-81bb-c95043fb8e4f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 376.36551724137934, 
+        "unit": "MB", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "a8214ed9-e222-484b-93c2-9245e4712a99", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 373.5448275862069, 
+        "unit": "MB", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "7d483484-a660-4307-b081-af1e4dd07eae", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "memory.usage", 
+        "description": "Volume of RAM used"
+    }, 
+    {
+        "value": 194620344827.5862, 
+        "unit": "ns", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "c7f44959-490b-4d24-8043-66a096c7cae0", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 93601310344.82759, 
+        "unit": "ns", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "afac5cb6-72c7-4c25-b281-7a442835b395", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 93402206896.55173, 
+        "unit": "ns", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "9ec8c981-feb8-46c1-a1f6-3438702ee170", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 4394690965517.241, 
+        "unit": "ns", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "274134cc-700a-4392-8226-447a2f35cc1e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 4025309517241.3794, 
+        "unit": "ns", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "e66d524e-9ce1-4ec2-81bb-c95043fb8e4f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 90704896551.72414, 
+        "unit": "ns", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "a8214ed9-e222-484b-93c2-9245e4712a99", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 93930827586.2069, 
+        "unit": "ns", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "7d483484-a660-4307-b081-af1e4dd07eae", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu", 
+        "description": "CPU time used"
+    }, 
+    {
+        "value": 0.2539938837459742, 
+        "unit": "%", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "c7f44959-490b-4d24-8043-66a096c7cae0", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 0.1430115727449207, 
+        "unit": "%", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "afac5cb6-72c7-4c25-b281-7a442835b395", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 0.14234621932639643, 
+        "unit": "%", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "9ec8c981-feb8-46c1-a1f6-3438702ee170", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 9.501434897077173, 
+        "unit": "%", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "274134cc-700a-4392-8226-447a2f35cc1e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 8.59252727701459, 
+        "unit": "%", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "e66d524e-9ce1-4ec2-81bb-c95043fb8e4f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 0.13846207922030151, 
+        "unit": "%", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "a8214ed9-e222-484b-93c2-9245e4712a99", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 0.14287395279840676, 
+        "unit": "%", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "7d483484-a660-4307-b081-af1e4dd07eae", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "cpu_util", 
+        "description": "Average CPU utilization"
+    }, 
+    {
+        "value": 88.53419771575258, 
+        "unit": "B/s", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-0000001b-c7f44959-490b-4d24-8043-66a096c7cae0-tapcadfbd73-5b", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009455996028375395, 
+        "unit": "B/s", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-0000001b-c7f44959-490b-4d24-8043-66a096c7cae0-tap972eb016-96", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009455996028375395, 
+        "unit": "B/s", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-0000001b-c7f44959-490b-4d24-8043-66a096c7cae0-tapf56382ad-45", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 124.74842906323501, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap79d13f74-62", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.017425896307365425, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap25ae020a-23", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.0174337765740103, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap8382609c-7c", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009424851354967827, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap7bbe02e0-09", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 127.2159155680703, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tap308ba38c-64", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 1.996809016615307, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tap2aadc958-57", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.00944055944055944, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tap0b518c8d-01", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.017428347945877158, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tapaf0c7436-e8", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009471769187962845, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000017-274134cc-700a-4392-8226-447a2f35cc1e-tap4b98f4d2-7e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 33.618374055863, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000017-274134cc-700a-4392-8226-447a2f35cc1e-tap35a9b09a-29", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009448122592881327, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000019-e66d524e-9ce1-4ec2-81bb-c95043fb8e4f-tap6717e37b-5a", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 33.6291738301644, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000019-e66d524e-9ce1-4ec2-81bb-c95043fb8e4f-tap35b38817-7f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009463869463869463, 
+        "unit": "B/s", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-00000018-a8214ed9-e222-484b-93c2-9245e4712a99-tapaf9418d8-68", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.017437164857185466, 
+        "unit": "B/s", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-00000018-a8214ed9-e222-484b-93c2-9245e4712a99-tap56d0c6f9-27", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 124.61289583768621, 
+        "unit": "B/s", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-00000018-a8214ed9-e222-484b-93c2-9245e4712a99-tap31f27f17-47", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 123.65339047759299, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tap4894ed8a-51", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.009440585664408507, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tap31c8ec21-34", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.01743467844779237, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tap2605ab77-0a", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.013442333959863174, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tapeea51a4b-f3", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.incoming.bytes.rate", 
+        "description": "Average rate per sec of incoming bytes on a VM network interface"
+    }, 
+    {
+        "value": 22.145300578664518, 
+        "unit": "B/s", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-0000001b-c7f44959-490b-4d24-8043-66a096c7cae0-tapcadfbd73-5b", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-0000001b-c7f44959-490b-4d24-8043-66a096c7cae0-tap972eb016-96", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_ceilometer", 
+        "name": "none", 
+        "service": "service_ceilometer", 
+        "resource_id": "instance-0000001b-c7f44959-490b-4d24-8043-66a096c7cae0-tapf56382ad-45", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 1.3187296037296037, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap79d13f74-62", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap25ae020a-23", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap8382609c-7c", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_vcpe", 
+        "name": "none", 
+        "service": "service_vcpe", 
+        "resource_id": "instance-0000001a-afac5cb6-72c7-4c25-b281-7a442835b395-tap7bbe02e0-09", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 3.087960372960373, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tap308ba38c-64", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tap2aadc958-57", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tap0b518c8d-01", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_vbng", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001c-9ec8c981-feb8-46c1-a1f6-3438702ee170-tapaf0c7436-e8", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000017-274134cc-700a-4392-8226-447a2f35cc1e-tap4b98f4d2-7e", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.68399416060279, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_volt", 
+        "name": "none", 
+        "service": "service_ONOS_vOLT", 
+        "resource_id": "instance-00000017-274134cc-700a-4392-8226-447a2f35cc1e-tap35a9b09a-29", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000019-e66d524e-9ce1-4ec2-81bb-c95043fb8e4f-tap6717e37b-5a", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.5502331002331002, 
+        "unit": "B/s", 
+        "slice": "mysite_onos_vbng", 
+        "name": "none", 
+        "service": "service_ONOS_vBNG", 
+        "resource_id": "instance-00000019-e66d524e-9ce1-4ec2-81bb-c95043fb8e4f-tap35b38817-7f", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-00000018-a8214ed9-e222-484b-93c2-9245e4712a99-tapaf9418d8-68", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-00000018-a8214ed9-e222-484b-93c2-9245e4712a99-tap56d0c6f9-27", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 1.2715034965034964, 
+        "unit": "B/s", 
+        "slice": "mysite_clients", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-00000018-a8214ed9-e222-484b-93c2-9245e4712a99-tap31f27f17-47", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.441946386946387, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tap4894ed8a-51", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tap31c8ec21-34", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tap2605ab77-0a", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }, 
+    {
+        "value": 0.008951048951048951, 
+        "unit": "B/s", 
+        "slice": "mysite_volt", 
+        "name": "none", 
+        "service": "Other", 
+        "resource_id": "instance-0000001d-7d483484-a660-4307-b081-af1e4dd07eae-tapeea51a4b-f3", 
+        "time": "2015-12-10T00:44:10", 
+        "type": "Nova", 
+        "meter": "network.outgoing.bytes.rate", 
+        "description": "Average rate per sec of outgoing bytes on a VM network interface"
+    }
+]
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html b/gui/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html
new file mode 100644
index 0000000..069141d
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/templates/accordion-group.html
@@ -0,0 +1,10 @@
+<div class="panel {{panelClass || 'panel-default'}}">
+  <div class="panel-heading" ng-keypress="toggleOpen($event)">
+    <h3>
+      <a href tabindex="0" class="accordion-toggle" ng-click="toggleOpen()" uib-accordion-transclude="heading"><span ng-class="{'text-muted': isDisabled}">{{heading}}</span></a>
+    </h3>
+  </div>
+  <div class="panel-collapse collapse" uib-collapse="!isOpen">
+	  <div class="panel-body" ng-transclude></div>
+  </div>
+</div>
diff --git a/gui/ngXosViews/ceilometerDashboard/src/templates/accordion.html b/gui/ngXosViews/ceilometerDashboard/src/templates/accordion.html
new file mode 100644
index 0000000..ba428f3
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/templates/accordion.html
@@ -0,0 +1 @@
+<div class="panel-group" ng-transclude></div>
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html
new file mode 100644
index 0000000..f04a974
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-dashboard.tpl.html
@@ -0,0 +1,114 @@
+<div class="row">
+  <div class="col-sm-10">
+    <h1>XOS Monitoring Statistics</h1>
+  </div>
+  <div class="col-xs-2 text-right">
+    <a href="" class="btn btn-default" 
+      ng-show="vm.selectedResources && !vm.showStats"
+      ng-click="vm.showStats = true">
+      <i class="glyphicon glyphicon-transfer"></i>
+    </a>
+    <a href="" class="btn btn-default" 
+      ng-show="vm.selectedResources && vm.showStats"
+      ng-click="vm.showStats = false">
+      <i class="glyphicon glyphicon-transfer"></i>
+    </a>
+  </div>
+</div>
+
+<div class="row" ng-show="vm.loader">
+  <div class="col-xs-12">
+    <div class="loader">Loading</div>
+  </div>
+</div>
+
+<section ng-hide="vm.loader" ng-class="{animate: !vm.loader}">
+  <div class="row">
+    <div class="col-sm-3 service-list">
+        <h3>XOS Service: </h3>
+        <uib-accordion close-others="true" template-url="templates/accordion.html">
+          <uib-accordion-group
+            ng-repeat="(service, slices) in vm.projects | orderObjectByKey"
+            template-url="templates/accordion-group.html"
+            is-open="vm.accordion.open[service]"
+            heading="{{service}}">
+            <h4>Slices:</h4>
+            <a ng-repeat="(slice, resources) in slices" 
+              ng-class="{active: slice === vm.selectedSlice}"
+              ng-click="vm.selectResources(resources, slice, service)"
+              href="#" class="list-group-item" >
+              {{slice}} <i class="glyphicon glyphicon-chevron-right pull-right"></i>
+            </a>
+          </uib-accordion-group>
+        </uib-accordion>
+    </div>
+    <section class="side-container col-sm-9">
+      <div class="row">
+        <article ng-hide="!vm.showStats" class="stats animate-slide-left">
+          <div class="col-xs-12">
+            <div class="list-group">
+              <div class="list-group-item">
+                <h3>Stats</h3>
+              </div>
+              <div class="list-group-item">
+                <ceilometer-stats ng-if="vm.selectedSlice" name="vm.selectedSlice"></ceilometer-stats>
+              </div>
+            </div>
+          </div>
+        </article>
+        <article ng-hide="vm.showStats" class="meters animate-slide-left">
+          <div class="col-sm-4 animate-slide-left" ng-hide="!vm.selectedResources">
+            <div class="list-group">
+              <div class="list-group-item">
+                <h3>Resources</h3>
+              </div>
+              <a href="#" 
+                ng-click="vm.selectMeters(meters, resource)" 
+                class="list-group-item" 
+                ng-repeat="(resource, meters) in vm.selectedResources" 
+                ng-class="{active: resource === vm.selectedResource}">
+                {{resource}} <i class="glyphicon glyphicon-chevron-right pull-right"></i>
+              </a>
+            </div>
+          </div>
+          <div class="col-sm-8 animate-slide-left" ng-hide="!vm.selectedMeters">
+            <div class="list-group">
+              <div class="list-group-item">
+                <h3>Meters</h3>
+              </div>
+              <div class="list-group-item">
+                <div class="row">
+                  <div class="col-xs-6">
+                    <label>Name:</label>
+                  </div>
+                  <div class="col-xs-3">
+                    <label>Unit:</label>
+                  </div>
+                  <div class="col-xs-3"></div>
+                </div>
+                <div class="row" ng-repeat="meter in vm.selectedMeters" style="margin-bottom: 10px;">
+                  <div class="col-xs-6">
+                    {{meter.name}}
+                  </div>
+                  <div class="col-xs-3">
+                    {{meter.unit}}
+                  </div>
+                  <div class="col-xs-3">
+                    <a ui-sref="samples({name: meter.name, tenant: meter.project_id})" class="btn btn-primary">
+                      <i class="glyphicon glyphicon-search"></i>
+                    </a>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </article>
+      </div>
+    </section>
+  </div>
+</section>
+<section ng-if="!vm.loader && vm.error">
+  <div class="alert alert-danger">
+    {{vm.error}}
+  </div>
+</section>
diff --git a/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html
new file mode 100644
index 0000000..b279123
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-samples.tpl.html
@@ -0,0 +1,54 @@
+<!-- <pre>{{ vm | json}}</pre> -->
+
+<div class="row">
+  <div class="col-xs-10">
+    <h1>{{vm.name | uppercase}}</h1>
+  </div>
+  <div class="col-xs-2">
+    <a ui-sref="ceilometerDashboard" class="btn btn-primary pull-right">
+      <i class="glyphicon glyphicon-arrow-left"></i> Back to list
+    </a>
+  </div>
+</div>
+<div class="row" ng-show="vm.loader">
+  <div class="col-xs-12">
+    <div class="loader">Loading</div>
+  </div>
+</div>
+<section ng-if="!vm.loader && !vm.error">
+  <div class="row">
+    <form class="form-inline col-xs-8" ng-submit="vm.addMeterToChart(vm.addMeterValue)">
+      <select ng-model="vm.addMeterValue" class="form-control" ng-options="resource.id as resource.name for resource in vm.sampleLabels"></select>
+      <button class="btn btn-success"> 
+        <i class="glyphicon glyphicon-plus"></i> Add
+      </button>
+    </form>
+    <div class="col-xs-4 text-right">
+      <a ng-click="vm.chartType = 'line'" class="btn" ng-class="{'btn-default': vm.chartType != 'bar', 'btn-primary': vm.chartType == 'line'}">Lines</a>
+      <a ng-click="vm.chartType = 'bar'" class="btn" ng-class="{'btn-default': vm.chartType != 'line', 'btn-primary': vm.chartType == 'bar'}">Bars</a>
+    </div>
+  </div>
+  <div class="row" ng-if="!vm.loader">
+    <div class="col-xs-12">
+      <canvas ng-if="vm.chartType === 'line'" id="line" class="chart chart-line" chart-data="vm.chart.data" chart-options="{datasetFill: false}"
+        chart-labels="vm.chart.labels" chart-legend="false" chart-series="vm.chart.series">
+      </canvas>
+      <canvas ng-if="vm.chartType === 'bar'" id="bar" class="chart chart-bar" chart-data="vm.chart.data"
+        chart-labels="vm.chart.labels" chart-legend="false" chart-series="vm.chart.series">
+      </canvas>
+      <!-- <pre>{{vm.chartMeters | json}}</pre> -->
+    </div>
+  </div>
+  <div class="row" ng-if="!vm.loader">
+    <div class="col-xs-12">
+      <a ng-click="vm.removeFromChart(meter)" class="btn btn-chart" ng-style="{'background-color': vm.chartColors[$index]}" ng-repeat="meter in vm.chartMeters">
+        {{meter.resource_name || meter.resource_id}}
+      </a>
+    </div>
+  </div>
+</section>
+<section ng-if="!vm.loader && vm.error">
+  <div class="alert alert-danger">
+    {{vm.error}}
+  </div>
+</section>
\ No newline at end of file
diff --git a/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html
new file mode 100644
index 0000000..531f0cf
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/src/templates/ceilometer-stats.tpl.html
@@ -0,0 +1,58 @@
+<div ng-show="vm.loader" class="loader">Loading</div>
+
+<section ng-if="!vm.loader && !vm.error">
+
+  <div class="alert alert-danger" ng-if="vm.stats.length == 0">
+    No result
+  </div>  
+
+  <table class="table" ng-if="vm.stats.length > 0">
+    <tr>
+      <th>
+        <a ng-click="order = 'category'">Type:</a>
+      </th>
+      <th>
+        <a ng-click="order = 'resource_name'">Resource:</a>
+      </th>
+      <th>
+        <a ng-click="order = 'meter'">Meter:</a>
+      </th>
+      <th>
+        Unit:
+      </th>
+      <th>
+        Value:
+      </th>
+    </tr>
+    <!-- <tr>
+      <td>
+        <input type="text" ng-model="query.category">
+      </td>
+      <td>
+        <input type="text" ng-model="query.resource_name">
+      </td>
+      <td>
+        <input type="text" ng-model="query.meter">
+      </td>
+      <td>
+        <input type="text" ng-model="query.unit">
+      </td>
+      <td>
+        <input type="text" ng-model="query.value">
+      </td>
+    </tr> -->
+    <tr ng-repeat="item in vm.stats | orderBy:order">
+      <td>{{item.category}}</td>
+      <td>{{item.resource_name}}</td>
+      <td>{{item.meter}}</td>
+      <td>{{item.unit}}</td>
+      <td>{{item.value}}</td>
+    </tr>
+  </table>
+</section>
+
+<section ng-if="!vm.loader && vm.error">
+  <div class="alert alert-danger">
+    {{vm.error}}
+  </div>
+</section>
diff --git a/gui/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us b/gui/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us
new file mode 100644
index 0000000..8e990a2
--- /dev/null
+++ b/gui/ngXosViews/ceilometerDashboard/teone@clnode015.clemson.cloudlab.us
@@ -0,0 +1,20 @@
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta name="viewport" content="width=device-width, initial-scale=1, max-scale=1">
+<!-- browserSync -->
+
+<!-- inject:css -->
+<link rel="stylesheet" href="/css/ceilometerDashboard.css">
+<link rel="stylesheet" href="/css/dev.css">
+<!-- endinject -->
+<link rel="stylesheet" href="css/ceilometerDashboard.css">
+<div id="xosCeilometerDashboard">
+  <div ui-view ng-class="stateName"></div>
+</div>
+
+
+<script src="vendor/ui.bootstrap/src/collapse/collapse.js"></script>
+<script src="vendor/ui.bootstrap/src/accordion/accordion.js"></script>
+<!-- inject:js -->
+<script src="/../../static/js/vendor/xosCeilometerDashboardVendor.js"></script>
+<script src="/../../static/js/xosCeilometerDashboard.js"></script>
+<!-- endinject -->
diff --git a/gui/ngXosViews/contentProvider/.bowerrc b/gui/ngXosViews/contentProvider/.bowerrc
new file mode 100644
index 0000000..e491038
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/.bowerrc
@@ -0,0 +1,3 @@
+{
+  "directory": "src/vendor/"
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/.eslintrc b/gui/ngXosViews/contentProvider/.eslintrc
new file mode 100644
index 0000000..c852748
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/.eslintrc
@@ -0,0 +1,42 @@
+{
+    "ecmaFeatures": {
+        "blockBindings": true,
+        "forOf": true,
+        "destructuring": true,
+        "arrowFunctions": true,
+        "templateStrings": true
+    },
+    "env": { 
+        "browser": true,
+        "node": true,
+        "es6": true
+    },
+    "plugins": [
+        //"angular"
+    ],
+    "rules": {
+        "quotes": [2, "single"],
+        "camelcase": [1, {"properties": "always"}],
+        "no-underscore-dangle": 1,
+        "eqeqeq": [2, "smart"],
+        "no-alert": 1,
+        "key-spacing": [1, { "beforeColon": false, "afterColon": true }],
+        "indent": [2, 2],
+        "no-irregular-whitespace": 1,
+        "eol-last": 0,
+        "max-nested-callbacks": [2, 4],
+        "comma-spacing": [1, {"before": false, "after": true}],
+        "no-trailing-spaces": [1, { skipBlankLines: true }],
+        "no-unused-vars": [1, {"vars": "all", "args": "after-used"}],
+        "new-cap": 0,
+
+        //"angular/ng_module_name": [2, '/^xos\.*[a-z]*$/'],
+        //"angular/ng_controller_name": [2, '/^[a-z].*Ctrl$/'],
+        //"angular/ng_service_name": [2, '/^[A-Z].*Service$/'],
+        //"angular/ng_directive_name": [2, '/^[a-z]+[[A-Z].*]*$/'],
+        //"angular/ng_di": [0, "function or array"]
+    },
+    "globals" :{
+        "angular": true
+    } 
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/.gitignore b/gui/ngXosViews/contentProvider/.gitignore
new file mode 100644
index 0000000..567aee4
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/.gitignore
@@ -0,0 +1,6 @@
+dist/
+src/vendor
+.tmp
+node_modules
+npm-debug.log
+dist/
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/bower.json b/gui/ngXosViews/contentProvider/bower.json
new file mode 100644
index 0000000..9c85e88
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/bower.json
@@ -0,0 +1,29 @@
+{
+  "name": "xos-contentProvider",
+  "version": "0.0.0",
+  "authors": [
+    "Matteo Scandolo <matteo.scandolo@link-me.it>"
+  ],
+  "description": "The contentProvider view",
+  "license": "MIT",
+  "ignore": [
+    "**/.*",
+    "node_modules",
+    "bower_components",
+    "static/js/vendor/",
+    "test",
+    "tests"
+  ],
+  "dependencies": {
+  },
+  "devDependencies": {
+    "jquery": "~2.1.4",
+    "angular-mocks": "~1.4.7",
+    "angular": "~1.4.7",
+    "angular-ui-router": "~0.2.15",
+    "angular-cookies": "~1.4.7",
+    "angular-resource": "~1.4.7",
+    "ng-lodash": "~0.3.0",
+    "bootstrap-css": "2.3.2"
+  }
+}
diff --git a/gui/ngXosViews/contentProvider/gulp/build.js b/gui/ngXosViews/contentProvider/gulp/build.js
new file mode 100644
index 0000000..9af8074
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/gulp/build.js
@@ -0,0 +1,118 @@
+'use strict';
+
+// BUILD
+//
+// The only purpose of this gulpfile is to build a XOS view and copy the correct files into
+// .html => dashboards
+// .js (minified and concat) => static/js
+//
+// The template are parsed and added to js with angular $templateCache
+
+var gulp = require('gulp');
+var ngAnnotate = require('gulp-ng-annotate');
+var uglify = require('gulp-uglify');
+var templateCache = require('gulp-angular-templatecache');
+var runSequence = require('run-sequence');
+var concat = require('gulp-concat');
+var del = require('del');
+var wiredep = require('wiredep');
+var angularFilesort = require('gulp-angular-filesort');
+var _ = require('lodash');
+var eslint = require('gulp-eslint');
+var inject = require('gulp-inject');
+var rename = require('gulp-rename');
+var replace = require('gulp-replace');
+
+var TEMPLATE_FOOTER = `}]);
+angular.module('xos.contentProvider').run(function($location){$location.path('/')});
+angular.bootstrap(angular.element('#xosContentProvider'), ['xos.contentProvider']);`;
+
+module.exports = function(options){
+  
+  // delete previous builded file
+  gulp.task('clean', function(){
+    return del(
+      [options.dashboards + 'xosContentProvider.html'],
+      {force: true}
+    );
+  });
+
+  // compile and minify scripts
+  gulp.task('scripts', function() {
+    return gulp.src([
+      options.tmp + '**/*.js'
+    ])
+    .pipe(ngAnnotate())
+    .pipe(angularFilesort())
+    .pipe(concat('xosContentProvider.js'))
+    .pipe(uglify())
+    .pipe(gulp.dest(options.static + 'js/'));
+  });
+
+  // set templates in cache
+  gulp.task('templates', function(){
+    return gulp.src('./src/templates/*.html')
+      .pipe(templateCache({
+        module: 'xos.contentProvider',
+        root: 'templates/',
+        templateFooter: TEMPLATE_FOOTER
+      }))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  // copy html index to Django Folder
+  gulp.task('copyHtml', ['clean'], function(){
+    return gulp.src(options.src + 'index.html')
+      // remove dev dependencies from html
+      .pipe(replace(/<!-- bower:css -->(\n.*)*\n<!-- endbower --><!-- endcss -->/, ''))
+      .pipe(replace(/<!-- bower:js -->(\n.*)*\n<!-- endbower --><!-- endjs -->/, ''))
+      .pipe(replace(/ng-app=".*"\s/, ''))
+      // injecting minified files
+      .pipe(
+        inject(
+          gulp.src([
+            options.static + 'js/vendor/xosContentProviderVendor.js',
+            options.static + 'js/xosContentProvider.js'
+          ])
+        )
+      )
+      .pipe(rename('xosContentProvider.html'))
+      .pipe(gulp.dest(options.dashboards));
+  });
+
+  // minify vendor js files
+  gulp.task('wiredep', function(){
+    var bowerDeps = wiredep().js;
+    if(!bowerDeps){
+      return;
+    }
+
+    // remove angular (it's already loaded)
+    _.remove(bowerDeps, function(dep){
+      return dep.indexOf('angular/angular.js') !== -1;
+    });
+
+    return gulp.src(bowerDeps)
+      .pipe(concat('xosContentProviderVendor.js'))
+      .pipe(uglify())
+      .pipe(gulp.dest(options.static + 'js/vendor/'));
+  });
+
+  gulp.task('lint', function () {
+    return gulp.src(['src/js/**/*.js'])
+      .pipe(eslint())
+      .pipe(eslint.format())
+      .pipe(eslint.failAfterError());
+  });
+
+  gulp.task('build', function() {
+    runSequence(
+      'templates',
+      'babel',
+      'scripts',
+      'wiredep',
+      'copyHtml',
+      'cleanTmp'
+    );
+  });
+};
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/gulp/server.js b/gui/ngXosViews/contentProvider/gulp/server.js
new file mode 100644
index 0000000..8eab1bf
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/gulp/server.js
@@ -0,0 +1,133 @@
+'use strict';
+
+var gulp = require('gulp');
+var browserSync = require('browser-sync').create();
+var inject = require('gulp-inject');
+var runSequence = require('run-sequence');
+var angularFilesort = require('gulp-angular-filesort');
+var babel = require('gulp-babel');
+var wiredep = require('wiredep').stream;
+var httpProxy = require('http-proxy');
+var del = require('del');
+
+var proxy = httpProxy.createProxyServer({
+  target: 'http://0.0.0.0:9999'
+});
+
+
+proxy.on('error', function(error, req, res) {
+  res.writeHead(500, {
+    'Content-Type': 'text/plain'
+  });
+
+  console.error('[Proxy]', error);
+});
+
+module.exports = function(options){
+
+  // open in browser with sync and proxy to 0.0.0.0
+  gulp.task('browser', function() {
+    browserSync.init({
+      // reloadDelay: 500,
+      // logLevel: 'debug',
+      // logConnections: true,
+      startPath: '#/',
+      snippetOptions: {
+        rule: {
+          match: /<!-- browserSync -->/i
+        }
+      },
+      server: {
+        baseDir: options.src,
+        routes: {
+          '/api': options.api,
+          '/xosHelpers/src': options.helpers
+        },
+        middleware: function(req, res, next){
+          if(
+            req.url.indexOf('/xos/') !== -1 ||
+            req.url.indexOf('/xoslib/') !== -1 ||
+            req.url.indexOf('/hpcapi/') !== -1
+          ){
+            proxy.web(req, res);
+          }
+          else{
+            next();
+          }
+        }
+      }
+    });
+
+    gulp.watch(options.src + 'js/**/*.js', ['js-watch']);
+    gulp.watch(options.src + 'vendor/**/*.js', ['bower'], function(){
+      browserSync.reload();
+    });
+    gulp.watch(options.src + '**/*.html', function(){
+      browserSync.reload();
+    });
+  });
+
+  // transpile js with sourceMaps
+  gulp.task('babel', function(){
+    return gulp.src(options.scripts + '**/*.js')
+      .pipe(babel({sourceMaps: true}))
+      .pipe(gulp.dest(options.tmp));
+  });
+
+  // inject scripts
+  gulp.task('injectScript', ['cleanTmp', 'babel'], function(){
+    return gulp.src(options.src + 'index.html')
+      .pipe(
+        inject(
+          gulp.src([
+            options.tmp + '**/*.js',
+            options.api + '*.js',
+            options.helpers + '**/*.js'
+          ])
+          .pipe(angularFilesort()),
+          {
+            ignorePath: [options.src, '/../../ngXosLib']
+          }
+        )
+      )
+      .pipe(gulp.dest(options.src));
+  });
+
+  // inject CSS
+  gulp.task('injectCss', function(){
+    return gulp.src(options.src + 'index.html')
+      .pipe(
+        inject(
+          gulp.src(options.src + 'css/*.css'),
+          {
+            ignorePath: [options.src]
+          }
+          )
+        )
+      .pipe(gulp.dest(options.src));
+  });
+
+  // inject bower dependencies with wiredep
+  gulp.task('bower', function () {
+    return gulp.src(options.src + 'index.html')
+    .pipe(wiredep({devDependencies: true}))
+    .pipe(gulp.dest(options.src));
+  });
+
+  gulp.task('js-watch', ['injectScript'], function(){
+    browserSync.reload();
+  });
+
+  gulp.task('cleanTmp', function(){
+    return del([options.tmp + '**/*']);
+  });
+
+  gulp.task('serve', function() {
+    runSequence(
+      'bower',
+      'injectScript',
+      'injectCss',
+      ['browser']
+    );
+  });
+};
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/gulpfile.js b/gui/ngXosViews/contentProvider/gulpfile.js
new file mode 100644
index 0000000..b2cdab8
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/gulpfile.js
@@ -0,0 +1,24 @@
+'use strict';
+
+var gulp = require('gulp');
+var wrench = require('wrench');
+
+var options = {
+  src: 'src/',
+  scripts: 'src/js/',
+  tmp: 'src/.tmp',
+  dist: 'dist/',
+  api: '../../ngXosLib/api/',
+  helpers: '../../ngXosLib/xosHelpers/src/',
+  static: '../../../xos/core/xoslib/static/', // this is the django static folder
+  dashboards: '../../../xos/core/xoslib/dashboards/' // this is the django html folder
+};
+
+wrench.readdirSyncRecursive('./gulp')
+.map(function(file) {
+  require('./gulp/' + file)(options);
+});
+
+gulp.task('default', function () {
+  gulp.start('build');
+});
diff --git a/gui/ngXosViews/contentProvider/karma.conf.js b/gui/ngXosViews/contentProvider/karma.conf.js
new file mode 100644
index 0000000..83d3f63
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/karma.conf.js
@@ -0,0 +1,88 @@
+// Karma configuration
+// Generated on Tue Oct 06 2015 09:27:10 GMT+0000 (UTC)
+
+/* eslint indent: [2,2], quotes: [2, "single"]*/
+
+/*eslint-disable*/
+var wiredep = require('wiredep');
+var path = require('path');
+
+var bowerComponents = wiredep( {devDependencies: true} )[ 'js' ].map(function( file ){
+  return path.relative(process.cwd(), file);
+});
+
+module.exports = function(config) {
+/*eslint-enable*/
+  config.set({
+
+    // base path that will be used to resolve all patterns (eg. files, exclude)
+    basePath: '',
+
+
+    // frameworks to use
+    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
+    frameworks: ['jasmine'],
+
+
+    // list of files / patterns to load in the browser
+    files: bowerComponents.concat([
+      '../../static/js/xosApi.js',
+      '../../static/js/vendor/ngXosHelpers.js',
+      'src/js/**/*.js',
+      'spec/**/*.mock.js',
+      'spec/**/*.test.js',
+      'src/**/*.html'
+    ]),
+
+
+    // list of files to exclude
+    exclude: [
+    ],
+
+
+    // preprocess matching files before serving them to the browser
+    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
+    preprocessors: {
+      'src/js/**/*.js': ['babel'],
+      'spec/**/*.test.js': ['babel'],
+      'src/**/*.html': ['ng-html2js']
+    },
+
+    ngHtml2JsPreprocessor: {
+      stripPrefix: 'src/', //strip the src path from template url (http://stackoverflow.com/questions/22869668/karma-unexpected-request-when-testing-angular-directive-even-with-ng-html2js)
+      moduleName: 'templates' // define the template module name
+    },
+
+    // test results reporter to use
+    // possible values: 'dots', 'progress'
+    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
+    reporters: ['mocha'],
+
+
+    // web server port
+    port: 9876,
+
+
+    // enable / disable colors in the output (reporters and logs)
+    colors: true,
+
+
+    // level of logging
+    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG
+    logLevel: config.LOG_INFO,
+
+
+    // enable / disable watching file and executing tests whenever any file changes
+    autoWatch: true,
+
+
+    // start these browsers
+    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
+    browsers: ['PhantomJS'],
+
+
+    // Continuous Integration mode
+    // if true, Karma captures browsers, runs the tests and exits
+    singleRun: false
+  });
+};
diff --git a/gui/ngXosViews/contentProvider/package.json b/gui/ngXosViews/contentProvider/package.json
new file mode 100644
index 0000000..80d34f9
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/package.json
@@ -0,0 +1,45 @@
+{
+  "name": "xos-contentProvider",
+  "version": "1.0.0",
+  "description": "Angular Application for XOS, created with generator-xos",
+  "scripts": {
+    "prestart": "npm install && bower install",
+    "start": "gulp serve",
+    "prebuild": "npm install && bower install",
+    "build": "gulp",
+    "test": "karma start",
+    "lint": "eslint src/js/"
+  },
+  "keywords": [
+    "XOS",
+    "Angular",
+    "XOSlib"
+  ],
+  "author": "Matteo Scandolo",
+  "license": "MIT",
+  "dependencies": {},
+  "devDependencies": {
+    "browser-sync": "^2.9.11",
+    "del": "^2.0.2",
+    "gulp": "^3.9.0",
+    "gulp-angular-filesort": "^1.1.1",
+    "gulp-angular-templatecache": "^1.8.0",
+    "gulp-babel": "^5.3.0",
+    "gulp-concat": "^2.6.0",
+    "gulp-inject": "^3.0.0",
+    "gulp-minify-html": "^1.0.4",
+    "gulp-rename": "^1.2.2",
+    "gulp-replace": "^0.5.4",
+    "gulp-uglify": "^1.4.2",
+    "http-proxy": "^1.12.0",
+    "proxy-middleware": "^0.15.0",
+    "run-sequence": "^1.1.4",
+    "wiredep": "^3.0.0-beta",
+    "wrench": "^1.5.8",
+    "gulp-ng-annotate": "^1.1.0",
+    "lodash": "^3.10.1",
+    "eslint": "^1.8.0",
+    "eslint-plugin-angular": "linkmesrl/eslint-plugin-angular",
+    "gulp-eslint": "^1.0.0"
+  }
+}
diff --git a/gui/ngXosViews/contentProvider/spec/contentprovider.test.js b/gui/ngXosViews/contentProvider/spec/contentprovider.test.js
new file mode 100644
index 0000000..b19ce0c
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/spec/contentprovider.test.js
@@ -0,0 +1,247 @@
+'use strict';
+
+describe('The Content Provider SPA', () => {
+
+  var scope, element, isolatedScope, httpBackend, mockLocation, httpProvider;
+
+  var token = 'fakeToken';
+
+  // injecting main module
+  beforeEach(module('xos.contentProvider'));
+
+  beforeEach(module('templates'));
+
+  beforeEach(function(){
+    module(function($provide, $httpProvider){
+
+      httpProvider = $httpProvider;
+
+      // mocking stateParams to pass 1 as id
+      $provide.provider('$stateParams', function(){
+        /* eslint-disable no-invalid-this*/
+        this.$get = function(){
+          return {id: 1};
+        };
+        /* eslint-enable no-invalid-this*/
+      });
+
+      //mock $cookie to return a fake xoscsrftoken
+      $provide.service('$cookies', function(){
+        /* eslint-disable no-invalid-this*/
+        this.get = () => {
+          return token;
+        };
+        /* eslint-enable no-invalid-this*/
+      });
+    });
+  });
+
+  beforeEach(inject(function(_$location_, $httpBackend){
+    spyOn(_$location_, 'url');
+    mockLocation = _$location_;
+    httpBackend = $httpBackend;
+    // Setting up mock request
+    $httpBackend.whenGET('/hpcapi/contentproviders/?no_hyperlinks=1').respond(CPmock.CPlist);
+    $httpBackend.whenGET('/hpcapi/serviceproviders/?no_hyperlinks=1').respond(CPmock.SPlist);
+    $httpBackend.whenDELETE('/hpcapi/contentproviders/1/?no_hyperlinks=1').respond();
+  }));
+
+  it('should set the $http interceptor', () => {
+    expect(httpProvider.interceptors).toContain('SetCSRFToken');
+  });
+
+  it('should add no_hyperlink param', inject(($http, $httpBackend) => {
+    $http.get('www.example.com');
+    $httpBackend.expectGET('www.example.com?no_hyperlinks=1').respond(200);
+    $httpBackend.flush();
+  }));
+
+  it('should set token in the headers', inject(($http, $httpBackend) => {
+    $http.post('http://example.com');
+    $httpBackend.expectPOST('http://example.com?no_hyperlinks=1', undefined, function(headers){
+      // if this condition is false the httpBackend expectation fail
+      return headers['X-CSRFToken'] === token;
+    }).respond(200, {name: 'example'});
+    httpBackend.flush();
+  }));
+
+  describe('the action directive', () => {
+    beforeEach(inject(function($compile, $rootScope){
+      scope = $rootScope.$new();
+
+      element = angular.element('<cp-actions id="\'1\'"></cp-actions>');
+      $compile(element)(scope);
+      scope.$digest();
+      isolatedScope = element.isolateScope().vm;
+    }));
+
+    it('should delete an element and redirect to list', () => {
+      isolatedScope.deleteCp(1);
+      httpBackend.flush();
+      expect(mockLocation.url).toHaveBeenCalled();
+    });
+  });
+
+  describe('the contentProvider list', () => {
+    beforeEach(inject(function($compile, $rootScope){
+      scope = $rootScope.$new();
+
+      element = angular.element('<content-provider-list></content-provider-list>');
+      $compile(element)(scope);
+      scope.$digest();
+      httpBackend.flush();
+      isolatedScope = element.isolateScope().vm;
+    }));
+
+
+    it('should load 2 contentProvider', () => {
+      expect(isolatedScope.contentProviderList.length).toBe(2);
+    });
+
+    it('should delete a contentProvider', () => {
+      isolatedScope.deleteCp(1);
+      httpBackend.flush();
+      expect(isolatedScope.contentProviderList.length).toBe(1);
+    });
+  });
+
+  describe('the contentProviderDetail directive', () => {
+
+    beforeEach(inject(function($compile, $rootScope){
+      scope = $rootScope.$new();
+      element = angular.element('<content-provider-detail></content-provider-detail>');
+      $compile(element)(scope);
+      httpBackend.expectGET('/hpcapi/contentproviders/1/?no_hyperlinks=1').respond(CPmock.CPlist[0]);
+      scope.$digest();
+      httpBackend.flush();
+      isolatedScope = element.isolateScope().vm;
+    }));
+
+    describe('when an id is set in the route', () => {
+
+      beforeEach(() => {
+        // spy the instance update method
+        spyOn(isolatedScope.cp, '$update').and.callThrough();
+      });
+
+      it('should request the correct contentProvider', () => {
+        expect(isolatedScope.cp.name).toEqual(CPmock.CPlist[0].name);
+      });
+
+      it('should update a contentProvider', () => {
+        isolatedScope.cp.name = 'new name';
+        isolatedScope.saveContentProvider(isolatedScope.cp);
+        expect(isolatedScope.cp.$update).toHaveBeenCalled();
+      });
+    });
+  });
+
+  describe('the contentProviderCdn directive', () => {
+    beforeEach(inject(($compile, $rootScope) => {
+      scope = $rootScope.$new();
+      element = angular.element('<content-provider-cdn></content-provider-cdn>');
+      $compile(element)(scope);
+      httpBackend.expectGET('/hpcapi/contentproviders/1/?no_hyperlinks=1').respond(CPmock.CPlist[0]);
+      // httpBackend.expectGET('/hpcapi/cdnprefixs/?no_hyperlinks=1&contentProvider=1').respond([CPmock.CDNlist[0]]);
+      httpBackend.expectGET('/hpcapi/cdnprefixs/?no_hyperlinks=1').respond(CPmock.CDNlist);
+      httpBackend.whenPOST('/hpcapi/cdnprefixs/?no_hyperlinks=1').respond(CPmock.CDNlist[0]);
+      httpBackend.whenDELETE('/hpcapi/cdnprefixs/5/?no_hyperlinks=1').respond();
+      scope.$digest();
+      httpBackend.flush();
+      isolatedScope = element.isolateScope().vm;
+    }));
+
+    it('should load associated CDN prefix', () => {
+      expect(isolatedScope.cp_prf.length).toBe(1);
+      expect(isolatedScope.prf.length).toBe(2);
+    });
+
+    it('should add a CDN Prefix', () => {
+      isolatedScope.addPrefix({prefix: 'test.io', defaultOriginServer: '/hpcapi/originservers/2/'});
+      httpBackend.flush();
+      expect(isolatedScope.cp_prf.length).toBe(2);
+    });
+
+    it('should remove a CDN Prefix', () => {
+      isolatedScope.removePrefix(isolatedScope.cp_prf[0]);
+      httpBackend.flush();
+      expect(isolatedScope.cp_prf.length).toBe(0);
+    });
+  });
+
+  describe('the contentProviderServer directive', () => {
+    beforeEach(inject(($compile, $rootScope) => {
+      scope = $rootScope.$new();
+      element = angular.element('<content-provider-server></content-provider-server>');
+      $compile(element)(scope);
+      httpBackend.expectGET('/hpcapi/contentproviders/1/?no_hyperlinks=1').respond(CPmock.CPlist[0]);
+      httpBackend.expectGET('/hpcapi/originservers/?no_hyperlinks=1&contentProvider=1').respond(CPmock.OSlist);
+      httpBackend.whenPOST('/hpcapi/originservers/?no_hyperlinks=1').respond(CPmock.OSlist[0]);
+      httpBackend.whenDELETE('/hpcapi/originservers/8/?no_hyperlinks=1').respond();
+      scope.$digest();
+      httpBackend.flush();
+      isolatedScope = element.isolateScope().vm;
+    }));
+
+    it('should load associated OriginServer', () => {
+      expect(isolatedScope.cp_os.length).toBe(4);
+    });
+
+    it('should add a OriginServer', () => {
+      isolatedScope.addOrigin({protocol: 'http', url: 'test.io'});
+      httpBackend.flush();
+      expect(isolatedScope.cp_os.length).toBe(5);
+    });
+
+    it('should remove a OriginServer', () => {
+      isolatedScope.removeOrigin(isolatedScope.cp_os[0]);
+      httpBackend.flush();
+      expect(isolatedScope.cp_os.length).toBe(3);
+    });
+  });
+
+  describe('the contentProviderUsers directive', () => {
+    beforeEach(inject(($compile, $rootScope) => {
+      scope = $rootScope.$new();
+      element = angular.element('<content-provider-users></content-provider-users>');
+      $compile(element)(scope);
+      httpBackend.expectGET('/xos/users/?no_hyperlinks=1').respond(CPmock.UserList);
+      httpBackend.expectGET('/hpcapi/contentproviders/1/?no_hyperlinks=1').respond(CPmock.CPlist[0]);
+      httpBackend.whenPUT('/hpcapi/contentproviders/1/?no_hyperlinks=1').respond(CPmock.CPlist[0]);
+      scope.$digest();
+      httpBackend.flush();
+      isolatedScope = element.isolateScope().vm;
+    }));
+
+    it('should render one user', () => {
+      expect(isolatedScope.cp.users.length).toBe(1);
+      expect(typeof isolatedScope.cp.users[0]).toEqual('object');
+    });
+
+    it('should add a user', () => {
+      isolatedScope.addUserToCp({name: 'teo'});
+      expect(isolatedScope.cp.users.length).toBe(2);
+    });
+
+    it('should remove a user', () => {
+      isolatedScope.addUserToCp({name: 'teo'});
+      expect(isolatedScope.cp.users.length).toBe(2);
+      isolatedScope.removeUserFromCp({name: 'teo'});
+      expect(isolatedScope.cp.users.length).toBe(1);
+    });
+
+    it('should save and reformat users', () => {
+      // add a user
+      isolatedScope.cp.users.push(1);
+
+      //trigger save
+      isolatedScope.saveContentProvider(isolatedScope.cp);
+
+      httpBackend.flush();
+
+      // I'll get one as the BE is mocked, the important is to check the conversion
+      expect(isolatedScope.cp.users.length).toBe(1);
+      expect(typeof isolatedScope.cp.users[0]).toEqual('object');
+    });
+  });
+});
diff --git a/gui/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js b/gui/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js
new file mode 100644
index 0000000..46a0b0e
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/spec/mocks/contentProvider.mock.js
@@ -0,0 +1,910 @@
+/* eslint-disable key-spacing, no-unused-vars */
+
+var CPmock = {
+  CPlist: [
+    {
+      'humanReadableName':'on_lab_content',
+      'validators':{
+        'updated':[
+
+        ],
+        'policed':[
+
+        ],
+        'name':[
+          'notBlank'
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'serviceProvider':[
+          'notBlank'
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'content_provider_id':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':1,
+      'created':'2015-10-22T19:33:55.078Z',
+      'updated':'2015-10-22T19:33:55.078Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'content_provider_id':null,
+      'name':'on_lab_content',
+      'enabled':true,
+      'description':null,
+      users: [2],
+      'serviceProvider':'http://0.0.0.0:9000/hpcapi/serviceproviders/1/'
+    },
+    {
+      'humanReadableName':'test',
+      'validators':{
+        'updated':[
+
+        ],
+        'policed':[
+
+        ],
+        'name':[
+          'notBlank'
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'serviceProvider':[
+          'notBlank'
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'content_provider_id':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':2,
+      'created':'2015-10-23T10:50:37.482Z',
+      'updated':'2015-10-23T10:52:56.232Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'content_provider_id':null,
+      'name':'test',
+      'enabled':true,
+      'description':'',
+      'serviceProvider':'http://0.0.0.0:9000/hpcapi/serviceproviders/1/'
+    }
+  ],
+  SPlist: [
+    {
+      'humanReadableName':'main_service_provider',
+      'validators':{
+        'updated':[
+
+        ],
+        'policed':[
+
+        ],
+        'name':[
+          'notBlank'
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'hpcService':[
+          'notBlank'
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'service_provider_id':[
+
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':1,
+      'created':'2015-10-22T19:33:55.048Z',
+      'updated':'2015-10-22T19:33:55.048Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'hpcService':'http://0.0.0.0:9000/hpcapi/hpcservices/1/',
+      'service_provider_id':null,
+      'name':'main_service_provider',
+      'description':null,
+      'enabled':true
+    }
+  ],
+  CDNlist: [
+    {
+      'humanReadableName':'onlab.vicci.org',
+      'validators':{
+        'updated':[
+
+        ],
+        'contentProvider':[
+          'notBlank'
+        ],
+        'policed':[
+
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'cdn_prefix_id':[
+
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'prefix':[
+          'notBlank'
+        ],
+        'defaultOriginServer':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':5,
+      'created':'2015-10-26T13:09:44.343Z',
+      'updated':'2015-10-26T13:09:44.343Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'cdn_prefix_id':null,
+      'prefix':'onlab.vicci.org',
+      'contentProvider':1,
+      'description':null,
+      'defaultOriginServer':'http://0.0.0.0:9000/hpcapi/originservers/2/',
+      'enabled':true
+    },
+    {
+      'humanReadableName':'downloads.onosproject.org',
+      'validators':{
+        'updated':[
+
+        ],
+        'contentProvider':[
+          'notBlank'
+        ],
+        'policed':[
+
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'cdn_prefix_id':[
+
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'prefix':[
+          'notBlank'
+        ],
+        'defaultOriginServer':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':1,
+      'created':'2015-10-26T13:09:44.196Z',
+      'updated':'2015-10-26T13:09:44.196Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'cdn_prefix_id':null,
+      'prefix':'downloads.onosproject.org',
+      'contentProvider':2,
+      'description':null,
+      'defaultOriginServer':'http://0.0.0.0:9000/hpcapi/originservers/1/',
+      'enabled':true
+    }
+  ],
+  OSlist: [
+    {
+      'humanReadableName':'another.it',
+      'validators':{
+        'updated':[
+
+        ],
+        'contentProvider':[
+          'notBlank'
+        ],
+        'origin_server_id':[
+
+        ],
+        'policed':[
+
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'redirects':[
+
+        ],
+        'protocol':[
+          'notBlank'
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'url':[
+          'notBlank'
+        ],
+        'authenticated':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':8,
+      'created':'2015-10-26T13:40:36.878Z',
+      'updated':'2015-10-26T13:40:36.878Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'origin_server_id':null,
+      'url':'another.it',
+      'contentProvider':'http://0.0.0.0:9000/hpcapi/contentproviders/1/',
+      'authenticated':false,
+      'enabled':true,
+      'protocol':'http',
+      'redirects':true,
+      'description':null
+    },
+    {
+      'humanReadableName':'test.it',
+      'validators':{
+        'updated':[
+
+        ],
+        'contentProvider':[
+          'notBlank'
+        ],
+        'origin_server_id':[
+
+        ],
+        'policed':[
+
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'redirects':[
+
+        ],
+        'protocol':[
+          'notBlank'
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'url':[
+          'notBlank'
+        ],
+        'authenticated':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':7,
+      'created':'2015-10-26T13:36:42.567Z',
+      'updated':'2015-10-26T13:36:42.567Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'origin_server_id':null,
+      'url':'test.it',
+      'contentProvider':'http://0.0.0.0:9000/hpcapi/contentproviders/1/',
+      'authenticated':false,
+      'enabled':true,
+      'protocol':'http',
+      'redirects':true,
+      'description':null
+    },
+    {
+      'humanReadableName':'onlab.vicci.org',
+      'validators':{
+        'updated':[
+
+        ],
+        'contentProvider':[
+          'notBlank'
+        ],
+        'origin_server_id':[
+
+        ],
+        'policed':[
+
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'redirects':[
+
+        ],
+        'protocol':[
+          'notBlank'
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'url':[
+          'notBlank'
+        ],
+        'authenticated':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':2,
+      'created':'2015-10-26T13:09:44.286Z',
+      'updated':'2015-10-26T13:09:44.286Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'origin_server_id':null,
+      'url':'onlab.vicci.org',
+      'contentProvider':'http://0.0.0.0:9000/hpcapi/contentproviders/1/',
+      'authenticated':false,
+      'enabled':true,
+      'protocol':'HTTP',
+      'redirects':true,
+      'description':null
+    },
+    {
+      'humanReadableName':'downloads.onosproject.org',
+      'validators':{
+        'updated':[
+
+        ],
+        'contentProvider':[
+          'notBlank'
+        ],
+        'origin_server_id':[
+
+        ],
+        'policed':[
+
+        ],
+        'created':[
+
+        ],
+        'deleted':[
+
+        ],
+        'description':[
+
+        ],
+        'enabled':[
+
+        ],
+        'redirects':[
+
+        ],
+        'protocol':[
+          'notBlank'
+        ],
+        'lazy_blocked':[
+
+        ],
+        'backend_register':[
+          'notBlank'
+        ],
+        'write_protect':[
+
+        ],
+        'url':[
+          'notBlank'
+        ],
+        'authenticated':[
+
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'no_sync':[
+
+        ],
+        'enacted':[
+
+        ]
+      },
+      'id':1,
+      'created':'2015-10-26T13:09:44.182Z',
+      'updated':'2015-10-26T13:09:44.182Z',
+      'enacted':null,
+      'policed':null,
+      'backend_register':'{}',
+      'backend_status':'0 - Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'lazy_blocked':false,
+      'no_sync':false,
+      'origin_server_id':null,
+      'url':'downloads.onosproject.org',
+      'contentProvider':'http://0.0.0.0:9000/hpcapi/contentproviders/1/',
+      'authenticated':false,
+      'enabled':true,
+      'protocol':'HTTP',
+      'redirects':true,
+      'description':null
+    }
+  ],
+  UserList: [
+    {
+      'humanReadableName':'teo@onlab.us',
+      'validators':{
+        'policed':[
+          'notBlank'
+        ],
+        'site':[
+          'notBlank'
+        ],
+        'is_appuser':[
+
+        ],
+        'is_staff':[
+
+        ],
+        'timezone':[
+          'notBlank'
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'is_registering':[
+
+        ],
+        'last_login':[
+          'notBlank'
+        ],
+        'email':[
+          'notBlank'
+        ],
+        'username':[
+          'notBlank'
+        ],
+        'updated':[
+
+        ],
+        'login_page':[
+
+        ],
+        'firstname':[
+          'notBlank'
+        ],
+        'user_url':[
+          'url'
+        ],
+        'deleted':[
+
+        ],
+        'lastname':[
+          'notBlank'
+        ],
+        'is_active':[
+
+        ],
+        'phone':[
+
+        ],
+        'is_admin':[
+
+        ],
+        'password':[
+          'notBlank'
+        ],
+        'enacted':[
+          'notBlank'
+        ],
+        'public_key':[
+
+        ],
+        'is_readonly':[
+
+        ],
+        'created':[
+
+        ],
+        'write_protect':[
+
+        ]
+      },
+      'id':2,
+      'password':'pbkdf2_sha256$12000$2Uzp1YCyjEBO$uU2irK//ZpEZYOIgLzanuApFoPnwfG1jNol2jD273wQ=',
+      'last_login':'2015-10-26T14:11:27.625Z',
+      'email':'teo@onlab.us',
+      'username':'teo@onlab.us',
+      'firstname':'Matteo',
+      'lastname':'Scandolo',
+      'phone':'',
+      'user_url':null,
+      'site':1,
+      'public_key':'',
+      'is_active':true,
+      'is_admin':false,
+      'is_staff':true,
+      'is_readonly':false,
+      'is_registering':false,
+      'is_appuser':false,
+      'login_page':null,
+      'created':'2015-10-26T14:11:27.699Z',
+      'updated':'2015-10-26T14:11:27.699Z',
+      'enacted':null,
+      'policed':null,
+      'backend_status':'Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'timezone':'America/New_York'
+    },
+    {
+      'humanReadableName':'padmin@vicci.org',
+      'validators':{
+        'policed':[
+          'notBlank'
+        ],
+        'site':[
+          'notBlank'
+        ],
+        'is_appuser':[
+
+        ],
+        'is_staff':[
+
+        ],
+        'timezone':[
+          'notBlank'
+        ],
+        'backend_status':[
+          'notBlank'
+        ],
+        'id':[
+
+        ],
+        'is_registering':[
+
+        ],
+        'last_login':[
+          'notBlank'
+        ],
+        'email':[
+          'notBlank'
+        ],
+        'username':[
+          'notBlank'
+        ],
+        'updated':[
+
+        ],
+        'login_page':[
+
+        ],
+        'firstname':[
+          'notBlank'
+        ],
+        'user_url':[
+          'url'
+        ],
+        'deleted':[
+
+        ],
+        'lastname':[
+          'notBlank'
+        ],
+        'is_active':[
+
+        ],
+        'phone':[
+
+        ],
+        'is_admin':[
+
+        ],
+        'password':[
+          'notBlank'
+        ],
+        'enacted':[
+          'notBlank'
+        ],
+        'public_key':[
+
+        ],
+        'is_readonly':[
+
+        ],
+        'created':[
+
+        ],
+        'write_protect':[
+
+        ]
+      },
+      'id':1,
+      'password':'pbkdf2_sha256$12000$Qufx9iqtaYma$xs0YurPOcj9qYQna/Qrb3K+im9Yr2XEVr0J4Kqek7AE=',
+      'last_login':'2015-10-27T10:07:09.065Z',
+      'email':'padmin@vicci.org',
+      'username':'padmin@vicci.org',
+      'firstname':'XOS',
+      'lastname':'admin',
+      'phone':null,
+      'user_url':null,
+      'site':1,
+      'public_key':null,
+      'is_active':true,
+      'is_admin':true,
+      'is_staff':true,
+      'is_readonly':false,
+      'is_registering':false,
+      'is_appuser':false,
+      'login_page':null,
+      'created':'2015-02-17T22:06:38.059Z',
+      'updated':'2015-10-27T09:00:44.672Z',
+      'enacted':null,
+      'policed':null,
+      'backend_status':'Provisioning in progress',
+      'deleted':false,
+      'write_protect':false,
+      'timezone':'America/New_York'
+    }
+  ]
+};
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/spec/sample.test.js b/gui/ngXosViews/contentProvider/spec/sample.test.js
new file mode 100644
index 0000000..177bc7d
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/spec/sample.test.js
@@ -0,0 +1,37 @@
+'use strict';
+
+describe('The User List', () => {
+  
+  var scope, element, isolatedScope, httpBackend;
+
+  beforeEach(module('xos.contentProvider'));
+  beforeEach(module('templates'));
+
+  beforeEach(inject(function($httpBackend, $compile, $rootScope){
+    
+    httpBackend = $httpBackend;
+    // Setting up mock request
+    $httpBackend.expectGET('/xos/users/?no_hyperlinks=1').respond([
+      {
+        email: 'matteo.scandolo@link-me.it',
+        firstname: 'Matteo',
+        lastname: 'Scandolo' 
+      }
+    ]);
+  
+    scope = $rootScope.$new();
+    element = angular.element('<users-list></users-list>');
+    $compile(element)(scope);
+    scope.$digest();
+    isolatedScope = element.isolateScope().vm;
+  }));
+
+  it('should load 1 users', () => {
+    httpBackend.flush();
+    expect(isolatedScope.users.length).toBe(1);
+    expect(isolatedScope.users[0].email).toEqual('matteo.scandolo@link-me.it');
+    expect(isolatedScope.users[0].firstname).toEqual('Matteo');
+    expect(isolatedScope.users[0].lastname).toEqual('Scandolo');
+  });
+
+});
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/css/dev.css b/gui/ngXosViews/contentProvider/src/css/dev.css
new file mode 100644
index 0000000..1457e38
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/css/dev.css
@@ -0,0 +1,5 @@
+#xosContentProvider{
+  position: absolute;
+  top: 100px;
+  left: 200px;
+}
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/index.html b/gui/ngXosViews/contentProvider/src/index.html
new file mode 100644
index 0000000..b203c67
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/index.html
@@ -0,0 +1,32 @@
+<!-- browserSync -->
+<!-- bower:css -->
+<link rel="stylesheet" href="vendor/bootstrap-css/css/bootstrap.css" />
+<!-- endbower --><!-- endcss -->
+<!-- inject:css -->
+<link rel="stylesheet" href="/css/dev.css">
+<!-- endinject -->
+
+<div ng-app="xos.contentProvider" id="xosContentProvider">
+    <div ui-view></div>
+</div>
+
+<!-- bower:js -->
+<script src="vendor/jquery/dist/jquery.js"></script>
+<script src="vendor/angular/angular.js"></script>
+<script src="vendor/angular-mocks/angular-mocks.js"></script>
+<script src="vendor/angular-ui-router/release/angular-ui-router.js"></script>
+<script src="vendor/angular-cookies/angular-cookies.js"></script>
+<script src="vendor/angular-resource/angular-resource.js"></script>
+<script src="vendor/ng-lodash/build/ng-lodash.js"></script>
+<script src="vendor/bootstrap-css/js/bootstrap.js"></script>
+<!-- endbower --><!-- endjs -->
+<!-- inject:js -->
+<script src="/xosHelpers/src/xosHelpers.module.js"></script>
+<script src="/xosHelpers/src/services/noHyperlinks.interceptor.js"></script>
+<script src="/xosHelpers/src/services/csrfToken.interceptor.js"></script>
+<script src="/xosHelpers/src/services/api.services.js"></script>
+<script src="/api/ng-xoslib.js"></script>
+<script src="/api/ng-xos.js"></script>
+<script src="/api/ng-hpcapi.js"></script>
+<script src="/.tmp/main.js"></script>
+<!-- endinject -->
diff --git a/gui/ngXosViews/contentProvider/src/js/main.js b/gui/ngXosViews/contentProvider/src/js/main.js
new file mode 100644
index 0000000..6f93c0a
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/js/main.js
@@ -0,0 +1,369 @@
+'use strict';
+
+angular.module('xos.contentProvider', [
+  'ngResource',
+  'ngCookies',
+  'ngLodash',
+  'xos.helpers',
+  'ui.router',
+  'xos.xos'
+])
+.config(($stateProvider, $urlRouterProvider) => {
+
+  $stateProvider
+  .state('list', {
+    url: '/',
+    template: '<content-provider-list></content-provider-list>',
+  })
+  .state('details', {
+    url: '/contentProvider/:id',
+    template: '<content-provider-detail></content-provider-detail>'
+  })
+  .state('cdn', {
+    url: '/contentProvider/:id/cdn_prefix',
+    template: '<content-provider-cdn></content-provider-cdn>'
+  })
+  .state('server', {
+    url: '/contentProvider/:id/origin_server',
+    template: '<content-provider-server></content-provider-server>'
+  })
+  .state('users', {
+    url: '/contentProvider/:id/users',
+    template: '<content-provider-users></content-provider-users>'
+  });
+})
+.config(function($httpProvider){
+  // add X-CSRFToken header for update, create, delete (!GET)
+  $httpProvider.interceptors.push('SetCSRFToken');
+  $httpProvider.interceptors.push('NoHyperlinks');
+})
+.service('ContentProvider', function($resource){
+  return $resource('/hpcapi/contentproviders/:id/', {id: '@id'}, {
+    'update': {method: 'PUT'}
+  });
+})
+.service('ServiceProvider', function($resource){
+  return $resource('/hpcapi/serviceproviders/:id/', {id: '@id'});
+})
+.service('CdnPrefix', function($resource){
+  return $resource('/hpcapi/cdnprefixs/:id/', {id: '@id'});
+})
+.service('OriginServer', function($resource){
+  return $resource('/hpcapi/originservers/:id/', {id: '@id'});
+})
+.service('User', function($resource){
+  return $resource('/xos/users/:id/', {id: '@id'});
+})
+.directive('cpActions', function(ContentProvider, $location){
+  return {
+    restrict: 'E',
+    scope: {
+      id: '=id',
+    },
+    bindToController: true,
+    controllerAs: 'vm',
+    templateUrl: 'templates/cp_actions.html',
+    controller: function(){
+      this.deleteCp = function(id){
+        ContentProvider.delete({id: id}).$promise
+        .then(function(){
+          $location.url('/');
+        });
+      };
+    }
+  };
+})
+.directive('contentProviderList', function(ContentProvider, lodash){
+  return {
+    restrict: 'E',
+    controllerAs: 'vm',
+    scope: {},
+    templateUrl: 'templates/cp_list.html',
+    controller: function(){
+      var self = this;
+
+      ContentProvider.query().$promise
+      .then(function(cp){
+        self.contentProviderList = cp;
+      })
+      .catch(function(e){
+        throw new Error(e);
+      });
+
+      this.deleteCp = function(id){
+        ContentProvider.delete({id: id}).$promise
+        .then(function(){
+          lodash.remove(self.contentProviderList, {id: id});
+        });
+      };
+    }
+  };
+})
+.directive('contentProviderDetail', function(ContentProvider, ServiceProvider, $stateParams, $location){
+  return {
+    restrict: 'E',
+    controllerAs: 'vm',
+    scope: {},
+    templateUrl: 'templates/cp_detail.html',
+    controller: function(){
+      this.pageName = 'detail';
+      var self = this;
+
+      if($stateParams.id){
+        ContentProvider.get({id: $stateParams.id}).$promise
+        .then(function(cp){
+          self.cp = cp;
+        }).catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      }
+      else{
+        self.cp = new ContentProvider();
+      }
+
+      ServiceProvider.query().$promise
+      .then(function(sp){
+        self.sp = sp;
+      });
+
+      this.saveContentProvider = function(cp){
+        var p, isNew = false;
+
+        if(cp.id){
+          p = cp.$update();
+        }
+        else{
+          isNew = true;
+          cp.name = cp.humanReadableName;
+          p = cp.$save();
+        }
+
+        p.then(function(res){
+          self.result = {
+            status: 1,
+            msg: 'Content Provider Saved'
+          };
+          if(isNew){
+            $location.url('contentProvider/' + res.id + '/');
+          }
+        })
+        .catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      };
+    }
+  };
+})
+.directive('contentProviderCdn', function($stateParams, CdnPrefix, ContentProvider, lodash){
+  return{
+    restrict: 'E',
+    controllerAs: 'vm',
+    scope: {},
+    templateUrl: 'templates/cp_cdn_prefix.html',
+    controller: function(){
+      var self = this;
+
+      this.pageName = 'cdn';
+
+      if($stateParams.id){
+        ContentProvider.get({id: $stateParams.id}).$promise
+        .then(function(cp){
+          self.cp = cp;
+        }).catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      }
+
+      CdnPrefix.query().$promise
+      .then(function(prf){
+        self.prf = prf;
+        // set the active CdnPrefix for this contentProvider
+        self.cp_prf = lodash.where(prf, {contentProvider: parseInt($stateParams.id)});
+      }).catch(function(e){
+        self.result = {
+          status: 0,
+          msg: e.data.detail
+        };
+      });
+
+      this.addPrefix = function(prf){
+        prf.contentProvider = $stateParams.id;
+
+        var item = new CdnPrefix(prf);
+
+        item.$save()
+        .then(function(res){
+          self.cp_prf.push(res);
+        })
+        .catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      };
+
+      this.removePrefix = function(item){
+        item.$delete()
+        .then(function(){
+          lodash.remove(self.cp_prf, item);
+        })
+        .catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      };
+    }
+  };
+})
+.directive('contentProviderServer', function($stateParams, OriginServer, ContentProvider, lodash){
+  return{
+    restrict: 'E',
+    controllerAs: 'vm',
+    scope: {},
+    templateUrl: 'templates/cp_origin_server.html',
+    controller: function(){
+      this.pageName = 'server';
+      this.protocols = {'http': 'HTTP', 'rtmp': 'RTMP', 'rtp': 'RTP', 'shout': 'SHOUTcast'};
+
+      var self = this;
+
+      if($stateParams.id){
+        ContentProvider.get({id: $stateParams.id}).$promise
+        .then(function(cp){
+          self.cp = cp;
+        }).catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      }
+
+      OriginServer.query({contentProvider: $stateParams.id}).$promise
+      .then(function(cp_os){
+        self.cp_os = cp_os;
+      }).catch(function(e){
+        self.result = {
+          status: 0,
+          msg: e.data.detail
+        };
+      });
+
+      this.addOrigin = function(os){
+        os.contentProvider = $stateParams.id;
+
+        var item = new OriginServer(os);
+
+        item.$save()
+        .then(function(res){
+          self.cp_os.push(res);
+        })
+        .catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      };
+
+      this.removeOrigin = function(item){
+        item.$delete()
+        .then(function(){
+          lodash.remove(self.cp_os, item);
+        })
+        .catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      };
+    }
+  };
+})
+.directive('contentProviderUsers', function($stateParams, ContentProvider, User, lodash){
+  return{
+    restrict: 'E',
+    controllerAs: 'vm',
+    scope: {},
+    templateUrl: 'templates/cp_user.html',
+    controller: function(){
+      var self = this;
+
+      this.pageName = 'user';
+
+      this.cp_users = [];
+
+      if($stateParams.id){
+        User.query().$promise
+        .then(function(users){
+          self.users = users;
+          return ContentProvider.get({id: $stateParams.id}).$promise;
+        })
+        .then(function(res){
+          res.users = self.populateUser(res.users, self.users);
+          return res;
+        })
+        .then(function(cp){
+          self.cp = cp;
+        }).catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      }
+
+      this.populateUser = function(ids, list){
+        for(var i = 0; i < ids.length; i++){
+          ids[i] = lodash.find(list, {id: ids[i]});
+        }
+        return ids;
+      };
+
+      this.addUserToCp = function(user){
+        self.cp.users.push(user);
+      };
+
+      this.removeUserFromCp = function(user){
+        lodash.remove(self.cp.users, user);
+      };
+
+      this.saveContentProvider = function(cp){
+
+        // flatten the user to id of array
+        cp.users = lodash.pluck(cp.users, 'id');
+
+        cp.$update()
+        .then(function(res){
+
+          self.cp.users = self.populateUser(res.users, self.users);
+
+          self.result = {
+            status: 1,
+            msg: 'Content Provider Saved'
+          };
+
+        })
+        .catch(function(e){
+          self.result = {
+            status: 0,
+            msg: e.data.detail
+          };
+        });
+      };
+    }
+  };
+});
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_actions.html b/gui/ngXosViews/contentProvider/src/templates/cp_actions.html
new file mode 100644
index 0000000..8c6ae97
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_actions.html
@@ -0,0 +1,9 @@
+<a href="#/" class="btn btn-default">
+  <i class="icon icon-arrow-left"></i>Back
+</a>
+<a href="#/contentProvider/" class="btn btn-success">
+  <i class="icon icon-plus"></i>Create
+</a>
+<a ng-click="vm.deleteCp(vm.id)" class="btn btn-danger">
+  <i class="icon icon-remove"></i>Remove
+</a>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html b/gui/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html
new file mode 100644
index 0000000..8532e6a
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_cdn_prefix.html
@@ -0,0 +1,55 @@
+<div class="row-fluid">
+  <div class="span6">
+    <h1>{$ vm.cp.humanReadableName $}</h1>
+  </div>
+  <div class="span6 text-right">
+    <cp-actions id="vm.cp.id"></cp-actions>
+  </div>
+</div>
+<hr>
+<div class="row-fluid">
+  <div class="span2">
+    <div ng-include="'templates/cp_side_nav.html'"></div>
+  </div>
+  <div class="span10">
+    <div ng-repeat="item in vm.cp_prf" class="well">
+      <div class="row-fluid">
+        <div class="span4">
+          {{item.humanReadableName}}
+        </div>
+        <div class="span6">
+          <!-- TODO show the name instead that id -->
+          {{item.defaultOriginServer}}
+        </div>
+        <div class="span2">
+          <a ng-click="vm.removePrefix(item)" class="btn btn-danger pull-right">
+            <i class="icon icon-remove"></i>
+          </a>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <form ng-submit="vm.addPrefix(vm.new_prf)">
+      <div class="row-fluid">
+        <div class="span4">
+          <label>Prefix</label>
+          <input type="text" ng-model="vm.new_prf.prefix" required style="max-width: 90%">
+        </div>
+        <div class="span6">
+          <label>Default Origin Server</label>
+          <select ng-model="vm.new_prf.defaultOriginServer" style="max-width: 100%">
+            <option ng-repeat="prf in vm.prf" ng-value="prf.id">{$ prf.humanReadableName $}</option>
+          </select>
+        </div>
+        <div class="span2 text-right">
+          <button class="btn btn-success margin-wells">
+            <i class="icon icon-plus"></i>
+          </button>
+        </div>
+      </div>
+    </form>
+    <div class="alert" ng-show="vm.result" ng-class="{'alert-success': vm.result.status === 1,'alert-error': vm.result.status === 0}">
+      {$ vm.result.msg $}
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_detail.html b/gui/ngXosViews/contentProvider/src/templates/cp_detail.html
new file mode 100644
index 0000000..89d8daf
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_detail.html
@@ -0,0 +1,55 @@
+<div class="row-fluid">
+  <div class="span6">
+    <h1>{$ vm.cp.humanReadableName $}</h1>
+  </div>
+  <div class="span6 text-right">
+    <cp-actions id="vm.cp.id"></cp-actions>
+  </div>
+</div>
+<hr>
+<div class="row-fluid">
+  <div ng-show="vm.cp.id" class="span2">
+    <div ng-include="'templates/cp_side_nav.html'"></div>
+  </div>
+  <div ng-class="{span10: vm.cp.id, span12: !vm.cp.id}">
+  <!-- TODO hide form on not found -->
+    <form ng-submit="vm.saveContentProvider(vm.cp)">
+      <fieldset>
+        <div class="row-fluid">
+          <div class="span6">
+            <label>Name:</label>
+            <input type="text" ng-model="vm.cp.humanReadableName" required/>
+          </div>
+          <div class="span6">
+            <label class="checkbox">
+              <input type="checkbox" ng-model="vm.cp.enabled" /> Enabled
+            </label>
+          </div>
+        </div>
+        <div class="row-fluid">
+          <div class="span12">
+            <label>Description</label>
+            <textarea style="width: 100%" ng-model="vm.cp.description"></textarea>
+          </div>
+        </div>
+        <div class="row-fluid">
+          <div class="span12">
+            <label>Service provider</label>
+            <select required ng-model="vm.cp.serviceProvider" ng-options="sp.id as sp.humanReadableName for sp in vm.sp"></select>
+          </div>
+        </div>
+        <div class="row-fluid">
+          <div class="span12">
+            <button class="btn btn-success">
+              <span ng-show="vm.cp.id">Save</span>
+              <span ng-show="!vm.cp.id">Create</span>
+            </button>
+          </div>
+        </div>
+      </fieldset>
+    </form>
+    <div class="alert" ng-show="vm.result" ng-class="{'alert-success': vm.result.status === 1,'alert-error': vm.result.status === 0}">
+      {$ vm.result.msg $}
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_list.html b/gui/ngXosViews/contentProvider/src/templates/cp_list.html
new file mode 100644
index 0000000..e54ebe6
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_list.html
@@ -0,0 +1,34 @@
+<table class="table table-striped" ng-show="vm.contentProviderList.length > 0">
+  <thead>
+    <tr>
+      <th>
+        Name
+      </th>
+      <th>Description</th>
+      <th>Status</th>
+      <th></th>
+    </tr>
+  </thead>
+  <tr ng-repeat="item in vm.contentProviderList">
+    <td>
+      <a ui-sref="details({ id: item.id })">{$ item.humanReadableName $}</a>
+    </td>
+    <td>
+      {$ item.description $}
+    </td>
+    <td>
+      {$ item.enabled $}
+    </td>
+    <td class="text-right">
+      <a ng-click="vm.deleteCp(item.id)" class="btn btn-danger"><i class="icon icon-remove"></i></a></td>
+  </tr>
+</table>
+<div class="alert alert-error" ng-show="vm.contentProviderList.length == 0">
+  No Content Provider defined
+</div>
+
+<div class="row">
+  <div class="span12 text-right">
+    <a class="btn btn-success"href="#/contentProvider/">Create</a>
+  </div>
+</div>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_origin_server.html b/gui/ngXosViews/contentProvider/src/templates/cp_origin_server.html
new file mode 100644
index 0000000..49cd175
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_origin_server.html
@@ -0,0 +1,53 @@
+<div class="row-fluid">
+  <div class="span6">
+    <h1>{$ vm.cp.humanReadableName $}</h1>
+  </div>
+  <div class="span6 text-right">
+    <cp-actions id="vm.cp.id"></cp-actions>
+  </div>
+</div>
+<hr>
+<div class="row-fluid">
+  <div class="span2">
+    <div ng-include="'templates/cp_side_nav.html'"></div>
+  </div>
+  <div class="span10">
+    <div ng-repeat="item in vm.cp_os" class="well">
+      <div class="row-fluid">
+        <div class="span4">
+          {{item.humanReadableName}}
+        </div>
+        <div class="span6">
+          <!-- TODO shoe the name instead that url -->
+          {{item.defaultOriginServer}}
+        </div>
+        <div class="span2">
+          <a ng-click="vm.removeOrigin(item)" class="btn btn-danger pull-right">
+            <i class="icon icon-remove"></i>
+          </a>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <form ng-submit="vm.addOrigin(vm.new_os)">
+      <div class="row-fluid">
+        <div class="span4">
+          <label>Protocol</label>
+          <select ng-model="vm.new_os.protocol" ng-options="k as v for (k,v) in vm.protocols" style="max-width: 100%;"></select>
+        </div>
+        <div class="span6">
+          <label>Url</label>
+          <input type="text" ng-model="vm.new_os.url" required>
+        </div>
+        <div class="span2 text-right">
+          <button class="btn btn-success margin-wells">
+            <i class="icon icon-plus"></i>
+          </button>
+        </div>
+      </div>
+    </form>
+    <div class="alert" ng-show="vm.result" ng-class="{'alert-success': vm.result.status === 1,'alert-error': vm.result.status === 0}">
+      {$ vm.result.msg $}
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_side_nav.html b/gui/ngXosViews/contentProvider/src/templates/cp_side_nav.html
new file mode 100644
index 0000000..a2c8633
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_side_nav.html
@@ -0,0 +1,14 @@
+<ul class="nav nav-list">
+  <li>
+    <a class="btn" ng-class="{'btn-primary': vm.pageName == 'detail'}" href="#/contentProvider/{$ vm.cp.id $}">Details</a>
+  </li>
+  <li>
+    <a class="btn" ng-class="{'btn-primary': vm.pageName == 'cdn'}" href="#/contentProvider/{$ vm.cp.id $}/cdn_prefix">Cdn Prexix</a>
+  </li>
+  <li>
+    <a class="btn" ng-class="{'btn-primary': vm.pageName == 'server'}" href="#/contentProvider/{$ vm.cp.id $}/origin_server">Origin Server</a>
+  </li>
+  <li>
+    <a class="btn" ng-class="{'btn-primary': vm.pageName == 'user'}" href="#/contentProvider/{$ vm.cp.id $}/users">Users</a>
+  </li>
+</ul>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/cp_user.html b/gui/ngXosViews/contentProvider/src/templates/cp_user.html
new file mode 100644
index 0000000..2b82e1c
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/cp_user.html
@@ -0,0 +1,51 @@
+<div class="row-fluid">
+  <div class="span6">
+    <h1>{$ vm.cp.humanReadableName $}</h1>
+  </div>
+  <div class="span6 text-right">
+    <cp-actions id="vm.cp.id"></cp-actions>
+  </div>
+</div>
+<hr>
+<div class="row-fluid">
+  <div class="span2">
+    <div ng-include="'templates/cp_side_nav.html'"></div>
+  </div>
+  <div class="span10">
+    <div ng-repeat="item in vm.cp.users" class="well">
+      <div class="row-fluid">
+        <div class="span3">
+          {{item.firstname}}
+        </div>
+        <div class="span3">
+          {{item.lastname}}
+        </div>
+        <div class="span4">
+          {{item.email}}
+        </div>
+        <div class="span2">
+          <a ng-click="vm.removeUserFromCp(item)" class="btn btn-danger pull-right">
+            <i class="icon icon-remove"></i>
+          </a>
+        </div>
+      </div>
+    </div>
+    <hr>
+    <form ng-submit="vm.saveContentProvider(vm.cp)">
+      <div class="row-fluid">
+        <div class="span8">
+          <label>Select user:</label>
+          <select ng-model="vm.user" ng-options="u as u.username for u in vm.users" ng-change="vm.addUserToCp(vm.user)"></select>
+        </div>  
+        <div class="span4 text-right">
+          <button class="btn btn-success margin-wells">
+            Save
+          </button>
+        </div>
+      </div>
+    </form>
+    <div class="alert" ng-show="vm.result" ng-class="{'alert-success': vm.result.status === 1,'alert-error': vm.result.status === 0}">
+      {$ vm.result.msg $}
+    </div>
+  </div>
+</div>
\ No newline at end of file
diff --git a/gui/ngXosViews/contentProvider/src/templates/users-list.tpl.html b/gui/ngXosViews/contentProvider/src/templates/users-list.tpl.html
new file mode 100644
index 0000000..2983ad0
--- /dev/null
+++ b/gui/ngXosViews/contentProvider/src/templates/users-list.tpl.html
@@ -0,0 +1,14 @@
+<div class="row">
+  <h1>Users List</h1>
+  <p>This is only an example view.</p>
+</div>
+<div class="row">
+  <div class="span4">Email</div>
+  <div class="span4">First Name</div>
+  <div class="span4">Last Name</div>
+</div>  
+<div class="row" ng-repeat="user in vm.users">
+  <div class="span4">{{user.email}}</div>
+  <div class="span4">{{user.firstname}}</div>
+  <div class="span4">{{user.lastname}}</div>
+</div>  
\ No newline at end of file
