diff --git a/consul/consul-tests.ts b/consul/consul-tests.ts
new file mode 100644
index 000000000..2a8619aca
--- /dev/null
+++ b/consul/consul-tests.ts
@@ -0,0 +1,799 @@
+///
+
+import * as Consul from "consul";
+
+let ConsulStatic: Consul.ConsulStatic;
+let AclStatic: Consul.AclStatic = ConsulStatic.Acl;
+let AgentStatic: Consul.AgentStatic = ConsulStatic.Agent;
+let AgentCheckStatic: Consul.Agent.CheckStatic = ConsulStatic.Agent.Check;
+let AgentServiceStatic: Consul.Agent.ServiceStatic = ConsulStatic.Agent.Service;
+let CatalogStatic: Consul.CatalogStatic = ConsulStatic.Catalog;
+let CatalogNodeStatic: Consul.Catalog.NodeStatic = ConsulStatic.Catalog.Node;
+let CatalogServiceStatic: Consul.Catalog.ServiceStatic = ConsulStatic.Catalog.Service;
+let EventStatic: Consul.EventStatic = ConsulStatic.Event;
+let HealthStatic: Consul.HealthStatic = ConsulStatic.Health;
+let KvStatic: Consul.KvStatic = ConsulStatic.Kv;
+let LockStatic: Consul.LockStatic = ConsulStatic.Lock;
+let SessionStatic: Consul.SessionStatic = ConsulStatic.Session;
+let StatusStatic: Consul.StatusStatic = ConsulStatic.Status;
+let WatchStatic: Consul.WatchStatic = ConsulStatic.Watch;
+
+let consul: Consul.Consul;
+
+consul = Consul();
+consul = new Consul();
+
+
+// Consul.Acl
+{
+ let acl: Consul.Acl = consul.acl;
+
+ acl = new AclStatic(consul);
+ consul = acl.consul;
+
+ {
+ let opts: Consul.Acl.CreateOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ acl.create(opts, callback);
+ acl.create(callback);
+
+ result = acl.create(opts);
+ result = acl.create();
+ }
+
+ {
+ let opts: Consul.Acl.UpdateOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ acl.update(opts, callback);
+
+ result = acl.update(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Acl.DestroyOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ acl.destroy(id, callback);
+ acl.destroy(opts, callback);
+
+ result = acl.destroy(id);
+ result = acl.destroy(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Acl.InfoOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ acl.info(id, callback);
+ acl.info(opts, callback);
+
+ result = acl.info(id);
+ result = acl.info(opts);
+
+ acl.get(id, callback);
+ acl.get(opts, callback);
+
+ result = acl.get(id);
+ result = acl.get(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Acl.CloneOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ acl.clone(id, callback);
+ acl.clone(opts, callback);
+
+ result = acl.clone(id);
+ result = acl.clone(opts);
+ }
+
+ {
+ let opts: Consul.Acl.ListOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ acl.list(opts, callback);
+ acl.list(callback);
+
+ result = acl.list(opts);
+ result = acl.list();
+ }
+}
+
+
+// Consul.Agent
+{
+ let agent: Consul.Agent = consul.agent;
+
+ agent = new AgentStatic(consul);
+ consul = agent.consul;
+
+ {
+ let opts: Consul.Agent.ChecksOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.checks(opts, callback);
+ agent.checks(callback);
+
+ result = agent.checks(opts);
+ result = agent.checks();
+ }
+
+ {
+ let opts: Consul.Agent.ServicesOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.services(opts, callback);
+ agent.services(callback);
+
+ result = agent.services(opts);
+ result = agent.services();
+ }
+
+ {
+ let opts: Consul.Agent.MembersOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.members(opts, callback);
+ agent.members(callback);
+
+ result = agent.members(opts);
+ result = agent.members();
+ }
+
+ {
+ let opts: Consul.Agent.SelfOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.self(opts, callback);
+ agent.self(callback);
+
+ result = agent.self(opts);
+ result = agent.self();
+ }
+
+ {
+ let enable: boolean;
+ let opts: Consul.Agent.MaintenanceOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.maintenance(enable, callback);
+ agent.maintenance(opts, callback);
+
+ result = agent.maintenance(enable);
+ result = agent.maintenance(opts);
+ }
+
+ {
+ let address: string;
+ let opts: Consul.Agent.JoinOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.join(address, callback);
+ agent.join(opts, callback);
+
+ result = agent.join(address);
+ result = agent.join(opts);
+ }
+
+ {
+ let node: string;
+ let opts: Consul.Agent.ForceLeaveOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ agent.forceLeave(node, callback);
+ agent.forceLeave(opts, callback);
+
+ result = agent.forceLeave(node);
+ result = agent.forceLeave(opts);
+ }
+
+
+ // Consul.Agent.Check
+ {
+ let check: Consul.Agent.Check = consul.agent.check;
+
+ check = new AgentCheckStatic(consul);
+ consul = check.consul;
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Check.ListOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ check.list(opts, callback);
+ check.list(callback);
+
+ result = check.list(opts);
+ result = check.list();
+ }
+
+ {
+ let opts: Consul.Agent.Check.RegisterOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ check.register(opts, callback);
+
+ result = check.register(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Check.DeregisterOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ check.deregister(id, callback);
+ check.deregister(opts, callback);
+
+ result = check.deregister(id);
+ result = check.deregister(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Check.PassOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ check.pass(id, callback);
+ check.pass(opts, callback);
+
+ result = check.pass(id);
+ result = check.pass(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Check.WarnOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ check.warn(id, callback);
+ check.warn(opts, callback);
+
+ result = check.warn(id);
+ result = check.warn(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Check.WarnOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ check.fail(id, callback);
+ check.fail(opts, callback);
+
+ result = check.fail(id);
+ result = check.fail(opts);
+ }
+ }
+
+
+ // Consul.Agent.Service
+ {
+ let service: Consul.Agent.Service = consul.agent.service;
+
+ service = new AgentServiceStatic(consul);
+ consul = service.consul;
+
+ {
+ let opts: Consul.Agent.Service.ListOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ service.list(opts, callback);
+ service.list(callback);
+
+ result = service.list(opts);
+ result = service.list();
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Service.RegisterOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ service.register(id, callback);
+ service.register(opts, callback);
+
+ result = service.register(id);
+ result = service.register(opts);
+ }
+
+ {
+ let id: string;
+ let opts: Consul.Agent.Service.DeregisterOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ service.deregister(id, callback);
+ service.deregister(opts, callback);
+
+ result = service.deregister(id);
+ result = service.deregister(opts);
+ }
+
+ {
+ let opts: Consul.Agent.Service.MaintenanceOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ service.maintenance(opts, callback);
+
+ result = service.maintenance(opts);
+ }
+ }
+}
+
+// Consul.Catalog
+{
+ let catalog: Consul.Catalog = consul.catalog;
+
+ catalog = new CatalogStatic(consul);
+ consul = catalog.consul;
+
+ {
+ let opts: Consul.Catalog.DatacentersOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ catalog.datacenters(opts, callback);
+ catalog.datacenters(callback);
+
+ result = catalog.datacenters(opts);
+ result = catalog.datacenters();
+ }
+
+ {
+ let dc: string;
+ let opts: Consul.Catalog.NodesOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ catalog.nodes(dc, callback);
+ catalog.nodes(opts, callback);
+ catalog.nodes(callback);
+
+ result = catalog.nodes(dc);
+ result = catalog.nodes(opts);
+ result = catalog.nodes();
+ }
+
+ {
+ let dc: string;
+ let opts: Consul.Catalog.ServicesOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ catalog.services(dc, callback);
+ catalog.services(opts, callback);
+ catalog.services(callback);
+
+ result = catalog.services(dc);
+ result = catalog.services(opts);
+ result = catalog.services();
+ }
+
+
+ // Consul.Catalog.Node
+ {
+ let node: Consul.Catalog.Node = consul.catalog.node;
+
+ node = new CatalogNodeStatic(consul);
+ consul = node.consul;
+
+ {
+ let dc: string;
+ let opts: Consul.Catalog.Node.ListOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ node.list(dc, callback);
+ node.list(opts, callback);
+ node.list(callback);
+
+ result = node.list(dc);
+ result = node.list(opts);
+ result = node.list();
+ }
+
+ {
+ let nodeOption: string;
+ let opts: Consul.Catalog.Node.ServicesOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ node.services(nodeOption, callback);
+ node.services(opts, callback);
+
+ result = node.services(nodeOption);
+ result = node.services(opts);
+ }
+ }
+
+ // Consul.Catalog.Service
+ {
+ let service: Consul.Catalog.Service = consul.catalog.service;
+
+ service = new CatalogServiceStatic(consul);
+ consul = service.consul;
+
+ {
+ let dc: string;
+ let opts: Consul.Catalog.Service.ListOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ service.list(dc, callback);
+ service.list(opts, callback);
+ service.list(callback);
+
+ result = service.list(dc);
+ result = service.list(opts);
+ result = service.list();
+ }
+
+ {
+ let serviceOption: string;
+ let opts: Consul.Catalog.Service.NodesOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ service.nodes(serviceOption, callback);
+ service.nodes(opts, callback);
+
+ result = service.nodes(serviceOption);
+ result = service.nodes(opts);
+ }
+ }
+}
+
+// Consul.Event
+{
+ let event: Consul.Event = consul.event;
+
+ event = new EventStatic(consul);
+ consul = event.consul;
+
+ {
+ let name: string;
+ let payload: string|Buffer;
+ let opts: Consul.Event.FireOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ event.fire(name, payload, callback);
+ event.fire(name, callback);
+ event.fire(opts, callback);
+
+ result = event.fire(name, payload);
+ result = event.fire(name);
+ result = event.fire(opts);
+ }
+
+ {
+ let name: string;
+ let opts: Consul.Event.ListOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ event.list(name, callback);
+ event.list(opts, callback);
+ event.list(callback);
+
+ result = event.list(name);
+ result = event.list(opts);
+ result = event.list();
+ }
+}
+
+// Consul.Health
+{
+ let health: Consul.Health = consul.health;
+
+ health = new HealthStatic(consul);
+ consul = health.consul;
+
+ {
+ let node: string;
+ let opts: Consul.Health.NodeOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ health.node(name, callback);
+ health.node(opts, callback);
+
+ result = health.node(name);
+ result = health.node(opts);
+ }
+
+ {
+ let service: string;
+ let opts: Consul.Health.ChecksOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ health.checks(service, callback);
+ health.checks(opts, callback);
+
+ result = health.checks(service);
+ result = health.checks(opts);
+ }
+
+ {
+ let service: string;
+ let opts: Consul.Health.ServiceOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ health.service(service, callback);
+ health.service(opts, callback);
+
+ result = health.service(service);
+ result = health.service(opts);
+ }
+
+ {
+ let state: string;
+ let opts: Consul.Health.StateOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ health.state(state, callback);
+ health.state(opts, callback);
+
+ result = health.state(state);
+ result = health.state(opts);
+ }
+}
+
+
+// Consul.Kv
+{
+ let kv: Consul.Kv = consul.kv;
+
+ kv = new KvStatic(consul);
+ consul = kv.consul;
+
+ {
+ let key: string;
+ let opts: Consul.Kv.GetOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ kv.get(key, callback);
+ kv.get(opts, callback);
+
+ result = kv.get(key);
+ result = kv.get(opts);
+ }
+
+ {
+ let key: string;
+ let opts: Consul.Kv.KeysOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ kv.keys(key, callback);
+ kv.keys(opts, callback);
+ kv.keys(callback);
+
+ result = kv.keys(key);
+ result = kv.keys(opts);
+ result = kv.keys();
+ }
+
+ {
+ let key: string;
+ let value: string|Buffer;
+ let opts: Consul.Kv.SetOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ kv.set(key, value, opts, callback);
+ kv.set(key, value, callback);
+ kv.set(opts, callback);
+
+ result = kv.set(key, value, opts);
+ result = kv.set(key, value);
+ result = kv.set(opts);
+ }
+
+ {
+ let key: string;
+ let opts: Consul.Kv.DelOptions;
+ let callback: Consul.Callback;
+ let result: Consul.Thenable;
+
+ kv.del(key, callback);
+ kv.del(opts, callback);
+
+ result = kv.del(key);
+ result = kv.del(opts);
+
+ kv.delete