[kubernetes] Bump to upstream df0981bc01c5782ad30fc45cb6f510f365737fc1

Eric Paris eparis at fedoraproject.org
Tue Nov 18 20:46:43 UTC 2014


commit 64689e532a0414e63e0ebba73ca3d490769346ee
Author: Eric Paris <eparis at redhat.com>
Date:   Tue Nov 18 15:46:34 2014 -0500

    Bump to upstream df0981bc01c5782ad30fc45cb6f510f365737fc1

 .gitignore                                 |    1 +
 0001-remove-all-third-party-software.patch |19598 +++++++++++++++++++++++-----
 getsource.sh                               |    5 +-
 kubernetes.spec                            |   27 +-
 sources                                    |    2 +-
 5 files changed, 16377 insertions(+), 3256 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index 55900d0..961932a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@
 /kubernetes-b695650.tar.gz
 /kubernetes-6c70227.tar.gz
 /kubernetes-30fcf24.tar.gz
+/kubernetes-df0981b.tar.gz
diff --git a/0001-remove-all-third-party-software.patch b/0001-remove-all-third-party-software.patch
index 5adf347..9643a8b 100644
--- a/0001-remove-all-third-party-software.patch
+++ b/0001-remove-all-third-party-software.patch
@@ -1,10 +1,10 @@
-From b819e8f38fa46829e4aeb8588d2484683e52608b Mon Sep 17 00:00:00 2001
+From 109161045357de04185fb88b3ae9fcd38b401872 Mon Sep 17 00:00:00 2001
 From: Eric Paris <eparis at redhat.com>
 Date: Thu, 21 Aug 2014 13:55:27 -0400
 Subject: [PATCH] remove all third party software
 
 ---
- Godeps/Godeps.json                                 |   148 -
+ Godeps/Godeps.json                                 |   158 -
  Godeps/Readme                                      |     5 -
  Godeps/_workspace/.gitignore                       |     2 -
  .../_workspace/src/code.google.com/p/gcfg/LICENSE  |    57 -
@@ -152,10 +152,22 @@ Subject: [PATCH] remove all third party software
  .../p/goauth2/oauth/jwt/jwt_test.go                |   486 -
  .../src/code.google.com/p/goauth2/oauth/oauth.go   |   405 -
  .../code.google.com/p/goauth2/oauth/oauth_test.go  |   214 -
- .../compute/v1/compute-api.json                    |  9229 ------------
- .../google-api-go-client/compute/v1/compute-gen.go | 15027 -------------------
- .../p/google-api-go-client/googleapi/googleapi.go  |   377 -
- .../googleapi/googleapi_test.go                    |   351 -
+ .../code.google.com/p/google-api-go-client/AUTHORS |    10 -
+ .../p/google-api-go-client/CONTRIBUTORS            |    46 -
+ .../code.google.com/p/google-api-go-client/LICENSE |    27 -
+ .../p/google-api-go-client/Makefile                |     9 -
+ .../code.google.com/p/google-api-go-client/NOTES   |    13 -
+ .../code.google.com/p/google-api-go-client/README  |    10 -
+ .../code.google.com/p/google-api-go-client/TODO    |     2 -
+ .../compute/v1/compute-api.json                    |  9526 -----------
+ .../google-api-go-client/compute/v1/compute-gen.go | 16952 -------------------
+ .../container/v1beta1/container-api.json           |   579 -
+ .../container/v1beta1/container-gen.go             |  1007 --
+ .../p/google-api-go-client/googleapi/googleapi.go  |   401 -
+ .../googleapi/googleapi_test.go                    |   361 -
+ .../googleapi/internal/uritemplates/LICENSE        |    18 -
+ .../internal/uritemplates/uritemplates.go          |   359 -
+ .../googleapi/internal/uritemplates/utils.go       |    13 -
  .../googleapi/transport/apikey.go                  |    38 -
  .../p/google-api-go-client/googleapi/types.go      |   150 -
  .../p/google-api-go-client/googleapi/types_test.go |    44 -
@@ -188,6 +200,87 @@ Subject: [PATCH] remove all third party software
  .../elazarl/go-bindata-assetfs/README.md           |    18 -
  .../elazarl/go-bindata-assetfs/assetfs.go          |   141 -
  .../github.com/elazarl/go-bindata-assetfs/doc.go   |    13 -
+ .../src/github.com/emicklei/go-restful/.gitignore  |    70 -
+ .../src/github.com/emicklei/go-restful/CHANGES.md  |   121 -
+ .../src/github.com/emicklei/go-restful/LICENSE     |    22 -
+ .../src/github.com/emicklei/go-restful/README.md   |    70 -
+ .../src/github.com/emicklei/go-restful/Srcfile     |     1 -
+ .../emicklei/go-restful/bench_curly_test.go        |    51 -
+ .../github.com/emicklei/go-restful/bench_test.go   |    43 -
+ .../github.com/emicklei/go-restful/bench_test.sh   |    10 -
+ .../src/github.com/emicklei/go-restful/compress.go |    89 -
+ .../emicklei/go-restful/compress_test.go           |    53 -
+ .../github.com/emicklei/go-restful/constants.go    |    29 -
+ .../github.com/emicklei/go-restful/container.go    |   257 -
+ .../github.com/emicklei/go-restful/cors_filter.go  |   170 -
+ .../emicklei/go-restful/cors_filter_test.go        |   125 -
+ .../src/github.com/emicklei/go-restful/coverage.sh |     2 -
+ .../src/github.com/emicklei/go-restful/curly.go    |   162 -
+ .../github.com/emicklei/go-restful/curly_route.go  |    54 -
+ .../github.com/emicklei/go-restful/curly_test.go   |   228 -
+ .../src/github.com/emicklei/go-restful/doc.go      |   184 -
+ .../emicklei/go-restful/doc_examples_test.go       |    35 -
+ .../emicklei/go-restful/examples/.goconvey         |     1 -
+ .../examples/google_app_engine/.goconvey           |     1 -
+ .../go-restful/examples/google_app_engine/app.yaml |    20 -
+ .../examples/google_app_engine/datastore/.goconvey |     1 -
+ .../examples/google_app_engine/datastore/app.yaml  |    18 -
+ .../examples/google_app_engine/datastore/main.go   |   266 -
+ .../restful-appstats-integration.go                |    13 -
+ .../google_app_engine/restful-user-service.go      |   161 -
+ .../emicklei/go-restful/examples/home.html         |     7 -
+ .../go-restful/examples/restful-CORS-filter.go     |    67 -
+ .../go-restful/examples/restful-NCSA-logging.go    |    54 -
+ .../examples/restful-basic-authentication.go       |    35 -
+ .../examples/restful-cpuprofiler-service.go        |    65 -
+ .../go-restful/examples/restful-curly-router.go    |   107 -
+ .../go-restful/examples/restful-encoding-filter.go |    61 -
+ .../go-restful/examples/restful-filters.go         |   114 -
+ .../go-restful/examples/restful-form-handling.go   |    62 -
+ .../go-restful/examples/restful-hello-world.go     |    22 -
+ .../go-restful/examples/restful-html-template.go   |    35 -
+ .../examples/restful-multi-containers.go           |    43 -
+ .../go-restful/examples/restful-options-filter.go  |    51 -
+ .../go-restful/examples/restful-path-tail.go       |    26 -
+ .../examples/restful-pre-post-filters.go           |    98 -
+ .../examples/restful-resource-functions.go         |    63 -
+ .../go-restful/examples/restful-route_test.go      |    39 -
+ .../examples/restful-routefunction_test.go         |    29 -
+ .../go-restful/examples/restful-serve-static.go    |    47 -
+ .../go-restful/examples/restful-user-resource.go   |   153 -
+ .../go-restful/examples/restful-user-service.go    |   138 -
+ .../src/github.com/emicklei/go-restful/filter.go   |    26 -
+ .../github.com/emicklei/go-restful/filter_test.go  |   141 -
+ .../src/github.com/emicklei/go-restful/install.sh  |     9 -
+ .../src/github.com/emicklei/go-restful/jsr311.go   |   248 -
+ .../github.com/emicklei/go-restful/jsr311_test.go  |   231 -
+ .../src/github.com/emicklei/go-restful/logger.go   |    16 -
+ .../emicklei/go-restful/options_filter.go          |    24 -
+ .../emicklei/go-restful/options_filter_test.go     |    34 -
+ .../github.com/emicklei/go-restful/parameter.go    |    95 -
+ .../emicklei/go-restful/path_expression.go         |    56 -
+ .../src/github.com/emicklei/go-restful/request.go  |   135 -
+ .../github.com/emicklei/go-restful/request_test.go |   204 -
+ .../src/github.com/emicklei/go-restful/response.go |   233 -
+ .../emicklei/go-restful/response_test.go           |   137 -
+ .../src/github.com/emicklei/go-restful/route.go    |   166 -
+ .../emicklei/go-restful/route_builder.go           |   208 -
+ .../emicklei/go-restful/route_builder_test.go      |    55 -
+ .../github.com/emicklei/go-restful/route_test.go   |   108 -
+ .../src/github.com/emicklei/go-restful/router.go   |    18 -
+ .../emicklei/go-restful/service_error.go           |    23 -
+ .../emicklei/go-restful/swagger/CHANGES.md         |    19 -
+ .../emicklei/go-restful/swagger/README.md          |    28 -
+ .../emicklei/go-restful/swagger/config.go          |    25 -
+ .../emicklei/go-restful/swagger/model_builder.go   |   265 -
+ .../go-restful/swagger/model_builder_test.go       |   716 -
+ .../emicklei/go-restful/swagger/swagger.go         |   184 -
+ .../emicklei/go-restful/swagger/swagger_test.go    |   115 -
+ .../go-restful/swagger/swagger_webservice.go       |   349 -
+ .../emicklei/go-restful/swagger/utils_test.go      |    70 -
+ .../github.com/emicklei/go-restful/web_service.go  |   184 -
+ .../emicklei/go-restful/web_service_container.go   |    39 -
+ .../emicklei/go-restful/web_service_test.go        |   115 -
  .../github.com/fsouza/go-dockerclient/.travis.yml  |    13 -
  .../src/github.com/fsouza/go-dockerclient/AUTHORS  |    44 -
  .../fsouza/go-dockerclient/DOCKER-LICENSE          |     6 -
@@ -207,7 +300,7 @@ Subject: [PATCH] remove all third party software
  .../src/github.com/fsouza/go-dockerclient/exec.go  |   126 -
  .../github.com/fsouza/go-dockerclient/exec_test.go |   128 -
  .../src/github.com/fsouza/go-dockerclient/image.go |   417 -
- .../fsouza/go-dockerclient/image_test.go           |   861 --
+ .../fsouza/go-dockerclient/image_test.go           |   861 -
  .../src/github.com/fsouza/go-dockerclient/misc.go  |    59 -
  .../github.com/fsouza/go-dockerclient/misc_test.go |   159 -
  .../github.com/fsouza/go-dockerclient/signal.go    |    49 -
@@ -224,12 +317,13 @@ Subject: [PATCH] remove all third party software
  .../_workspace/src/github.com/golang/glog/glog.go  |  1177 --
  .../src/github.com/golang/glog/glog_file.go        |   124 -
  .../src/github.com/golang/glog/glog_test.go        |   415 -
- .../github.com/google/cadvisor/client/client.go    |   106 -
- .../google/cadvisor/client/client_test.go          |   113 -
+ .../github.com/google/cadvisor/client/README.md    |    54 -
+ .../github.com/google/cadvisor/client/client.go    |   123 -
+ .../google/cadvisor/client/client_test.go          |   154 -
  .../src/github.com/google/cadvisor/info/advice.go  |    34 -
- .../github.com/google/cadvisor/info/container.go   |   312 -
+ .../github.com/google/cadvisor/info/container.go   |   346 -
  .../google/cadvisor/info/container_test.go         |   101 -
- .../src/github.com/google/cadvisor/info/machine.go |    42 -
+ .../src/github.com/google/cadvisor/info/machine.go |    53 -
  .../google/cadvisor/info/test/datagen.go           |    78 -
  .../src/github.com/google/cadvisor/info/version.go |    18 -
  .../src/github.com/google/gofuzz/.travis.yml       |    12 -
@@ -258,14 +352,14 @@ Subject: [PATCH] remove all third party software
  .../src/github.com/mitchellh/goamz/aws/aws_test.go |   203 -
  .../src/github.com/mitchellh/goamz/aws/client.go   |   125 -
  .../github.com/mitchellh/goamz/aws/client_test.go  |   121 -
- .../src/github.com/mitchellh/goamz/ec2/ec2.go      |  2599 ----
+ .../src/github.com/mitchellh/goamz/ec2/ec2.go      |  2599 ---
  .../src/github.com/mitchellh/goamz/ec2/ec2_test.go |  1243 --
  .../github.com/mitchellh/goamz/ec2/ec2i_test.go    |   203 -
  .../github.com/mitchellh/goamz/ec2/ec2t_test.go    |   580 -
  .../mitchellh/goamz/ec2/ec2test/filter.go          |    84 -
  .../mitchellh/goamz/ec2/ec2test/server.go          |   993 --
  .../github.com/mitchellh/goamz/ec2/export_test.go  |    22 -
- .../mitchellh/goamz/ec2/responses_test.go          |   854 --
+ .../mitchellh/goamz/ec2/responses_test.go          |   854 -
  .../src/github.com/mitchellh/goamz/ec2/sign.go     |    45 -
  .../github.com/mitchellh/goamz/ec2/sign_test.go    |    68 -
  .../src/github.com/mitchellh/mapstructure/LICENSE  |    21 -
@@ -433,20 +527,20 @@ Subject: [PATCH] remove all third party software
  Godeps/_workspace/src/gopkg.in/v1/yaml/apic.go     |   742 -
  Godeps/_workspace/src/gopkg.in/v1/yaml/decode.go   |   538 -
  .../_workspace/src/gopkg.in/v1/yaml/decode_test.go |   648 -
- Godeps/_workspace/src/gopkg.in/v1/yaml/emitterc.go |  1682 ---
+ Godeps/_workspace/src/gopkg.in/v1/yaml/emitterc.go |  1682 --
  Godeps/_workspace/src/gopkg.in/v1/yaml/encode.go   |   226 -
  .../_workspace/src/gopkg.in/v1/yaml/encode_test.go |   386 -
  Godeps/_workspace/src/gopkg.in/v1/yaml/parserc.go  |  1096 --
  Godeps/_workspace/src/gopkg.in/v1/yaml/readerc.go  |   391 -
  Godeps/_workspace/src/gopkg.in/v1/yaml/resolve.go  |   148 -
- Godeps/_workspace/src/gopkg.in/v1/yaml/scannerc.go |  2710 ----
+ Godeps/_workspace/src/gopkg.in/v1/yaml/scannerc.go |  2710 ---
  Godeps/_workspace/src/gopkg.in/v1/yaml/sorter.go   |   104 -
  .../_workspace/src/gopkg.in/v1/yaml/suite_test.go  |    12 -
  Godeps/_workspace/src/gopkg.in/v1/yaml/writerc.go  |    89 -
  Godeps/_workspace/src/gopkg.in/v1/yaml/yaml.go     |   306 -
  Godeps/_workspace/src/gopkg.in/v1/yaml/yamlh.go    |   712 -
  .../src/gopkg.in/v1/yaml/yamlprivateh.go           |   173 -
- 442 files changed, 122054 deletions(-)
+ 536 files changed, 134419 deletions(-)
  delete mode 100644 Godeps/Godeps.json
  delete mode 100644 Godeps/Readme
  delete mode 100644 Godeps/_workspace/.gitignore
@@ -595,10 +689,22 @@ Subject: [PATCH] remove all third party software
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/goauth2/oauth/jwt/jwt_test.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/goauth2/oauth/oauth.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/goauth2/oauth/oauth_test.go
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/AUTHORS
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/CONTRIBUTORS
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/LICENSE
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/Makefile
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/NOTES
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/README
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/TODO
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-api.json
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-gen.go
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-api.json
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-gen.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/LICENSE
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/uritemplates.go
+ delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/utils.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go
  delete mode 100644 Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go
@@ -631,6 +737,87 @@ Subject: [PATCH] remove all third party software
  delete mode 100644 Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md
  delete mode 100644 Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go
  delete mode 100644 Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/.gitignore
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/CHANGES.md
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/LICENSE
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/README.md
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/Srcfile
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.sh
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/compress.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/constants.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/container.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/coverage.sh
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/curly.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/curly_route.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/doc.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/filter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/install.sh
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/logger.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/parameter.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/request.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/response.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/route.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/router.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/service_error.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/CHANGES.md
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/README.md
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/config.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_webservice.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/web_service.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_container.go
+ delete mode 100644 Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go
  delete mode 100644 Godeps/_workspace/src/github.com/fsouza/go-dockerclient/.travis.yml
  delete mode 100644 Godeps/_workspace/src/github.com/fsouza/go-dockerclient/AUTHORS
  delete mode 100644 Godeps/_workspace/src/github.com/fsouza/go-dockerclient/DOCKER-LICENSE
@@ -667,6 +854,7 @@ Subject: [PATCH] remove all third party software
  delete mode 100644 Godeps/_workspace/src/github.com/golang/glog/glog.go
  delete mode 100644 Godeps/_workspace/src/github.com/golang/glog/glog_file.go
  delete mode 100644 Godeps/_workspace/src/github.com/golang/glog/glog_test.go
+ delete mode 100644 Godeps/_workspace/src/github.com/google/cadvisor/client/README.md
  delete mode 100644 Godeps/_workspace/src/github.com/google/cadvisor/client/client.go
  delete mode 100644 Godeps/_workspace/src/github.com/google/cadvisor/client/client_test.go
  delete mode 100644 Godeps/_workspace/src/github.com/google/cadvisor/info/advice.go
@@ -892,13 +1080,13 @@ Subject: [PATCH] remove all third party software
 
 diff --git a/Godeps/Godeps.json b/Godeps/Godeps.json
 deleted file mode 100644
-index 2be803e..0000000
+index 4c6c51a..0000000
 --- a/Godeps/Godeps.json
 +++ /dev/null
-@@ -1,148 +0,0 @@
+@@ -1,158 +0,0 @@
 -{
 -	"ImportPath": "github.com/GoogleCloudPlatform/kubernetes",
--	"GoVersion": "go1.3.1",
+-	"GoVersion": "go1.3",
 -	"Packages": [
 -		"./..."
 -	],
@@ -940,12 +1128,17 @@ index 2be803e..0000000
 -		{
 -			"ImportPath": "code.google.com/p/google-api-go-client/compute/v1",
 -			"Comment": "release-96",
--			"Rev": "0923cdda5b82a7dd0dd5c689f824ca5e7d9b60de"
+-			"Rev": "98c78185197025f935947caac56a7b6d022f89d2"
+-		},
+-		{
+-			"ImportPath": "code.google.com/p/google-api-go-client/container/v1beta1",
+-			"Comment": "release-105",
+-			"Rev": "98c78185197025f935947caac56a7b6d022f89d2"
 -		},
 -		{
 -			"ImportPath": "code.google.com/p/google-api-go-client/googleapi",
 -			"Comment": "release-96",
--			"Rev": "0923cdda5b82a7dd0dd5c689f824ca5e7d9b60de"
+-			"Rev": "98c78185197025f935947caac56a7b6d022f89d2"
 -		},
 -		{
 -			"ImportPath": "github.com/coreos/go-etcd/etcd",
@@ -957,6 +1150,11 @@ index 2be803e..0000000
 -			"Rev": "ae4665cf2d188c65764c73fe4af5378acc549510"
 -		},
 -		{
+-			"ImportPath": "github.com/emicklei/go-restful",
+-			"Comment": "v1.1.2-34-gcb26ade",
+-			"Rev": "cb26adeb9644200cb4ec7b32be31e024696e8d00"
+-		},
+-		{
 -			"ImportPath": "github.com/fsouza/go-dockerclient",
 -			"Comment": "0.2.1-267-g15d2c6e",
 -			"Rev": "15d2c6e3eb670c545d0af0604d7f9aff3871af04"
@@ -967,13 +1165,13 @@ index 2be803e..0000000
 -		},
 -		{
 -			"ImportPath": "github.com/google/cadvisor/client",
--			"Comment": "0.4.0",
--			"Rev": "5a6d06c02600b1e57e55a9d9f71dbac1bfc9fe6c"
+-			"Comment": "0.5.0",
+-			"Rev": "8c4f650e62f096710da794e536de86e34447fca9"
 -		},
 -		{
 -			"ImportPath": "github.com/google/cadvisor/info",
--			"Comment": "0.4.0",
--			"Rev": "5a6d06c02600b1e57e55a9d9f71dbac1bfc9fe6c"
+-			"Comment": "0.5.0",
+-			"Rev": "8c4f650e62f096710da794e536de86e34447fca9"
 -		},
 -		{
 -			"ImportPath": "github.com/google/gofuzz",
@@ -41785,27 +41983,186 @@ index b903c16..0000000
 -		t.Errorf("Created cache file has mode %#o, want non-accessible to group+other", fi.Mode())
 -	}
 -}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/AUTHORS b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/AUTHORS
+deleted file mode 100644
+index f73b725..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/AUTHORS
++++ /dev/null
+@@ -1,10 +0,0 @@
+-# This is the official list of authors for copyright purposes.
+-# This file is distinct from the CONTRIBUTORS files.
+-# See the latter for an explanation.
+-
+-# Names should be added to this file as
+-#	Name or Organization <email address>
+-# The email address is not required for organizations.
+-
+-# Please keep the list sorted.
+-Google Inc.
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/CONTRIBUTORS b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/CONTRIBUTORS
+deleted file mode 100644
+index 4af9298..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/CONTRIBUTORS
++++ /dev/null
+@@ -1,46 +0,0 @@
+-# This is the official list of people who can contribute
+-# (and typically have contributed) code to the repository.
+-# The AUTHORS file lists the copyright holders; this file
+-# lists people.  For example, Google employees are listed here
+-# but not in AUTHORS, because Google holds the copyright.
+-#
+-# The submission process automatically checks to make sure
+-# that people submitting code are listed in this file (by email address).
+-#
+-# Names should be added to this file only after verifying that
+-# the individual or the individual's organization has agreed to
+-# the appropriate Contributor License Agreement, found here:
+-#
+-#     http://code.google.com/legal/individual-cla-v1.0.html
+-#     http://code.google.com/legal/corporate-cla-v1.0.html
+-#
+-# The agreement for individuals can be filled out on the web.
+-#
+-# When adding J Random Contributor's name to this file,
+-# either J's name or J's organization's name should be
+-# added to the AUTHORS file, depending on whether the
+-# individual or corporate CLA was used.
+-
+-# Names should be added to this file like so:
+-#     Name <email address>
+-#
+-# An entry with two email addresses specifies that the
+-# first address should be used in the submit logs and
+-# that the second address should be recognized as the
+-# same person when interacting with Rietveld.
+-
+-# Please keep the list sorted.
+-
+-Alain Vongsouvanhalainv <alainv at google.com>
+-Andrew Gerrand <adg at golang.org>
+-Brad Fitzpatrick <bradfitz at golang.org>
+-Francesc Campoy <campoy at golang.org>
+-Garrick Evans <garrick at google.com>
+-Glenn Lewis <gmlewis at google.com>
+-Ivan Krasin <krasin at golang.org>
+-Jason Hall <jasonhall at google.com>
+-Johan Euphrosine <proppy at google.com>
+-Kostik Shtoyk <kostik at google.com>
+-Nick Craig-Wood <nickcw at gmail.com>
+-Scott Van Woudenberg <scottvw at google.com>
+-Takashi Matsuo <tmatsuo at google.com>
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/LICENSE b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/LICENSE
+deleted file mode 100644
+index 263aa7a..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/LICENSE
++++ /dev/null
+@@ -1,27 +0,0 @@
+-Copyright (c) 2011 Google Inc. All rights reserved.
+-
+-Redistribution and use in source and binary forms, with or without
+-modification, are permitted provided that the following conditions are
+-met:
+-
+-   * Redistributions of source code must retain the above copyright
+-notice, this list of conditions and the following disclaimer.
+-   * Redistributions in binary form must reproduce the above
+-copyright notice, this list of conditions and the following disclaimer
+-in the documentation and/or other materials provided with the
+-distribution.
+-   * Neither the name of Google Inc. nor the names of its
+-contributors may be used to endorse or promote products derived from
+-this software without specific prior written permission.
+-
+-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/Makefile b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/Makefile
+deleted file mode 100644
+index 20ce8a5..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/Makefile
++++ /dev/null
+@@ -1,9 +0,0 @@
+-all:
+-	go install code.google.com/p/google-api-go-client/googleapi
+-	go install code.google.com/p/google-api-go-client/google-api-go-generator
+-	$(GOPATH)/bin/google-api-go-generator -cache=false -install -api=*
+-
+-cached:
+-	go install code.google.com/p/google-api-go-client/googleapi
+-	go install code.google.com/p/google-api-go-client/google-api-go-generator
+-	$(GOPATH)/bin/google-api-go-generator -cache=true -install -api=*
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/NOTES b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/NOTES
+deleted file mode 100644
+index 3b10889..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/NOTES
++++ /dev/null
+@@ -1,13 +0,0 @@
+-Discovery Service:
+-http://code.google.com/apis/discovery/
+-http://code.google.com/apis/discovery/v1/reference.html
+-
+-The "type" key:
+-http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.1
+-
+-The "format" key:
+-http://tools.ietf.org/html/draft-zyp-json-schema-03#section-5.23
+-http://code.google.com/apis/discovery/v1/reference.html#parameter-format-summary
+-
+-Google JSON format docs:
+-http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/README b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/README
+deleted file mode 100644
+index 9aca57b..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/README
++++ /dev/null
+@@ -1,10 +0,0 @@
+-Most of this project is auto-generated.
+-
+-The notable directories which are not auto-generated:
+-
+-   google-api-go-generator/ -- the generator itself
+-   google-api/              -- shared common code, used by auto-generated code
+-   examples/                -- sample code
+-
+-When changing the generator, re-compile all APIs and submit the
+-modified APIs in the same CL as the generator changes itself.
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/TODO b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/TODO
+deleted file mode 100644
+index af55f14..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/TODO
++++ /dev/null
+@@ -1,2 +0,0 @@
+-Moved to:
+-http://code.google.com/p/google-api-go-client/issues/
 diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-api.json b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-api.json
 deleted file mode 100644
-index ec71edb..0000000
+index 726a0ac..0000000
 --- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-api.json
 +++ /dev/null
-@@ -1,9229 +0,0 @@
+@@ -1,9526 +0,0 @@
 -{
 - "kind": "discovery#restDescription",
-- "etag": "\"FrPV2U6xXFUq8eRv_PO3IoAURkc/Qrs2SriggaSYO28pp7DFm8wFPbo\"",
+- "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/qp3DHGvWPpREzEdWk7WwxnpgC9w\"",
 - "discoveryVersion": "v1",
 - "id": "compute:v1",
 - "name": "compute",
 - "version": "v1",
-- "revision": "20140625",
+- "revision": "20141014",
 - "title": "Compute Engine API",
 - "description": "API for the Google Compute Engine service.",
 - "ownerDomain": "google.com",
 - "ownerName": "Google",
 - "icons": {
--  "x16": "http://www.google.com/images/icons/product/compute_engine-16.png",
--  "x32": "http://www.google.com/images/icons/product/compute_engine-32.png"
+-  "x16": "https://www.google.com/images/icons/product/compute_engine-16.png",
+-  "x32": "https://www.google.com/images/icons/product/compute_engine-32.png"
 - },
 - "documentationLink": "https://developers.google.com/compute/docs/reference/latest/",
 - "protocol": "rest",
@@ -42138,6 +42495,17 @@ index ec71edb..0000000
 -     "$ref": "AttachedDiskInitializeParams",
 -     "description": "Initialization parameters."
 -    },
+-    "interface": {
+-     "type": "string",
+-     "enum": [
+-      "NVME",
+-      "SCSI"
+-     ],
+-     "enumDescriptions": [
+-      "",
+-      ""
+-     ]
+-    },
 -    "kind": {
 -     "type": "string",
 -     "description": "Type of the resource.",
@@ -42188,7 +42556,7 @@ index ec71edb..0000000
 -  "AttachedDiskInitializeParams": {
 -   "id": "AttachedDiskInitializeParams",
 -   "type": "object",
--   "description": "Initialization parameters for the new disk (Mutually exclusive with 'source', can currently only be specified on the boot disk).",
+-   "description": "Initialization parameters for the new disk (input-only). Can only be specified on the boot disk or local SSDs. Mutually exclusive with 'source'.",
 -   "properties": {
 -    "diskName": {
 -     "type": "string",
@@ -42237,7 +42605,7 @@ index ec71edb..0000000
 -    },
 -    "group": {
 -     "type": "string",
--     "description": "URL of a zonal Cloud Resource View resource. This resoure view defines the list of instances that serve traffic. Member virtual machine instances from each resource view must live in the same zone as the resource view itself."
+-     "description": "URL of a zonal Cloud Resource View resource. This resource view defines the list of instances that serve traffic. Member virtual machine instances from each resource view must live in the same zone as the resource view itself. No two backends in a backend service are allowed to use same Resource View resource."
 -    },
 -    "maxRate": {
 -     "type": "integer",
@@ -42305,9 +42673,13 @@ index ec71edb..0000000
 -    },
 -    "port": {
 -     "type": "integer",
--     "description": "The TCP port to connect on the backend. The default value is 80.",
+-     "description": "Deprecated in favor of port_name. The TCP port to connect on the backend. The default value is 80.",
 -     "format": "int32"
 -    },
+-    "portName": {
+-     "type": "string",
+-     "description": "Name of backend port. The same name should appear in the resource views referenced by this service. Required."
+-    },
 -    "protocol": {
 -     "type": "string",
 -     "enum": [
@@ -42468,7 +42840,7 @@ index ec71edb..0000000
 -    },
 -    "sourceImage": {
 -     "type": "string",
--     "description": "The source image used to create this disk. Once the source image has been deleted from the system, this field will not be set, even if an image with the same name has been re-created."
+-     "description": "The source image used to create this disk."
 -    },
 -    "sourceImageId": {
 -     "type": "string",
@@ -42476,7 +42848,7 @@ index ec71edb..0000000
 -    },
 -    "sourceSnapshot": {
 -     "type": "string",
--     "description": "The source snapshot used to create this disk. Once the source snapshot has been deleted from the system, this field will be cleared, and will not be set even if a snapshot with the same name has been re-created."
+-     "description": "The source snapshot used to create this disk."
 -    },
 -    "sourceSnapshotId": {
 -     "type": "string",
@@ -42579,6 +42951,11 @@ index ec71edb..0000000
 -     "type": "string",
 -     "description": "Creation timestamp in RFC3339 text format (output only)."
 -    },
+-    "defaultDiskSizeGb": {
+-     "type": "string",
+-     "description": "Server defined default disk size in gb (output only).",
+-     "format": "int64"
+-    },
 -    "deprecated": {
 -     "$ref": "DeprecationStatus",
 -     "description": "The deprecation status associated with this disk type."
@@ -42878,13 +43255,7 @@ index ec71edb..0000000
 -    },
 -    "network": {
 -     "type": "string",
--     "description": "URL of the network to which this firewall is applied; provided by the client when the firewall is created.",
--     "annotations": {
--      "required": [
--       "compute.firewalls.insert",
--       "compute.firewalls.patch"
--      ]
--     }
+-     "description": "URL of the network to which this firewall is applied; provided by the client when the firewall is created."
 -    },
 -    "selfLink": {
 -     "type": "string",
@@ -42955,7 +43326,7 @@ index ec71edb..0000000
 -    },
 -    "IPProtocol": {
 -     "type": "string",
--     "description": "The IP protocol to which this rule applies, valid options are 'TCP', 'UDP', 'ESP', 'AH' or 'SCTP'",
+-     "description": "The IP protocol to which this rule applies, valid options are 'TCP', 'UDP', 'ESP', 'AH' or 'SCTP'.",
 -     "enum": [
 -      "AH",
 -      "ESP",
@@ -42996,7 +43367,7 @@ index ec71edb..0000000
 -    },
 -    "portRange": {
 -     "type": "string",
--     "description": "Applicable only when 'IPProtocol' is 'TCP', 'UDP' or 'SCTP', only packets addressed to ports in the specified range will be forwarded to 'target'. If 'portRange' is left empty (default value), all ports are forwarded. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges. @pattern: \\d+(?:-\\d+)?"
+-     "description": "Applicable only when 'IPProtocol' is 'TCP', 'UDP' or 'SCTP', only packets addressed to ports in the specified range will be forwarded to 'target'. If 'portRange' is left empty (default value), all ports are forwarded. Forwarding rules with the same [IPAddress, IPProtocol] pair must have disjoint port ranges."
 -    },
 -    "region": {
 -     "type": "string",
@@ -43178,6 +43549,11 @@ index ec71edb..0000000
 -    "ipAddress": {
 -     "type": "string",
 -     "description": "The IP address represented by this resource."
+-    },
+-    "port": {
+-     "type": "integer",
+-     "description": "The port on the instance.",
+-     "format": "int32"
 -    }
 -   }
 -  },
@@ -43191,7 +43567,7 @@ index ec71edb..0000000
 -    },
 -    "hosts": {
 -     "type": "array",
--     "description": "The list of host patterns to match. They must be FQDN except that it may start with ?*.? or ?*-?. The ?*? acts like a glob and will match any string of atoms (separated by .?s and -?s) to the left.",
+-     "description": "The list of host patterns to match. They must be valid hostnames except that they may start with *. or *-. The * acts like a glob and will match any string of atoms (separated by .s and -s) to the left.",
 -     "items": {
 -      "type": "string"
 -     }
@@ -43390,7 +43766,7 @@ index ec71edb..0000000
 -    },
 -    "sourceDisk": {
 -     "type": "string",
--     "description": "The source disk used to create this image. Once the source disk has been deleted from the system, this field will be cleared, and will not be set even if a disk with the same name has been re-created."
+-     "description": "The source disk used to create this image."
 -    },
 -    "sourceDiskId": {
 -     "type": "string",
@@ -43629,6 +44005,63 @@ index ec71edb..0000000
 -    }
 -   }
 -  },
+-  "InstanceProperties": {
+-   "id": "InstanceProperties",
+-   "type": "object",
+-   "description": "",
+-   "properties": {
+-    "canIpForward": {
+-     "type": "boolean",
+-     "description": "Allows instances created based on this template to send packets with source IP addresses other than their own and receive packets with destination IP addresses other than their own. If these instances will be used as an IP gateway or it will be set as the next-hop in a Route resource, say true. If unsure, leave this set to false."
+-    },
+-    "description": {
+-     "type": "string",
+-     "description": "An optional textual description for the instances created based on the instance template resource; provided by the client when the template is created."
+-    },
+-    "disks": {
+-     "type": "array",
+-     "description": "Array of disks associated with instance created based on this template.",
+-     "items": {
+-      "$ref": "AttachedDisk"
+-     }
+-    },
+-    "machineType": {
+-     "type": "string",
+-     "description": "Name of the machine type resource describing which machine type to use to host the instances created based on this template; provided by the client when the instance template is created.",
+-     "annotations": {
+-      "required": [
+-       "compute.instanceTemplates.insert"
+-      ]
+-     }
+-    },
+-    "metadata": {
+-     "$ref": "Metadata",
+-     "description": "Metadata key/value pairs assigned to instances created based on this template. Consists of custom metadata or predefined keys; see Instance documentation for more information."
+-    },
+-    "networkInterfaces": {
+-     "type": "array",
+-     "description": "Array of configurations for this interface. This specifies how this interface is configured to interact with other network services, such as connecting to the internet. Currently, ONE_TO_ONE_NAT is the only access config supported. If there are no accessConfigs specified, then this instances created based based on this template will have no external internet access.",
+-     "items": {
+-      "$ref": "NetworkInterface"
+-     }
+-    },
+-    "scheduling": {
+-     "$ref": "Scheduling",
+-     "description": "Scheduling options for the instances created based on this template."
+-    },
+-    "serviceAccounts": {
+-     "type": "array",
+-     "description": "A list of service accounts each with specified scopes, for which access tokens are to be made available to the instances created based on this template, through metadata queries.",
+-     "items": {
+-      "$ref": "ServiceAccount"
+-     }
+-    },
+-    "tags": {
+-     "$ref": "Tags",
+-     "description": "A list of tags to be applied to the instances created based on this template used to identify valid sources or targets for network firewalls. Provided by the client on instance creation. The tags can be later modified by the setTags method. Each tag within the list must comply with RFC1035."
+-    }
+-   }
+-  },
 -  "InstanceReference": {
 -   "id": "InstanceReference",
 -   "type": "object",
@@ -43638,6 +44071,80 @@ index ec71edb..0000000
 -    }
 -   }
 -  },
+-  "InstanceTemplate": {
+-   "id": "InstanceTemplate",
+-   "type": "object",
+-   "description": "An Instance Template resource.",
+-   "properties": {
+-    "creationTimestamp": {
+-     "type": "string",
+-     "description": "Creation timestamp in RFC3339 text format (output only)."
+-    },
+-    "description": {
+-     "type": "string",
+-     "description": "An optional textual description of the instance template resource; provided by the client when the resource is created."
+-    },
+-    "id": {
+-     "type": "string",
+-     "description": "Unique identifier for the resource; defined by the server (output only).",
+-     "format": "uint64"
+-    },
+-    "kind": {
+-     "type": "string",
+-     "description": "Type of the resource.",
+-     "default": "compute#instanceTemplate"
+-    },
+-    "name": {
+-     "type": "string",
+-     "description": "Name of the instance template resource; provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035",
+-     "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-     "annotations": {
+-      "required": [
+-       "compute.instanceTemplates.insert"
+-      ]
+-     }
+-    },
+-    "properties": {
+-     "$ref": "InstanceProperties",
+-     "description": "The instance properties portion of this instance template resource."
+-    },
+-    "selfLink": {
+-     "type": "string",
+-     "description": "Server defined URL for the resource (output only)."
+-    }
+-   }
+-  },
+-  "InstanceTemplateList": {
+-   "id": "InstanceTemplateList",
+-   "type": "object",
+-   "description": "Contains a list of instance template resources.",
+-   "properties": {
+-    "id": {
+-     "type": "string",
+-     "description": "Unique identifier for the resource; defined by the server (output only)."
+-    },
+-    "items": {
+-     "type": "array",
+-     "description": "A list of instance template resources.",
+-     "items": {
+-      "$ref": "InstanceTemplate"
+-     }
+-    },
+-    "kind": {
+-     "type": "string",
+-     "description": "Type of resource.",
+-     "default": "compute#instanceTemplateList"
+-    },
+-    "nextPageToken": {
+-     "type": "string",
+-     "description": "A token used to continue a truncated list request (output only)."
+-    },
+-    "selfLink": {
+-     "type": "string",
+-     "description": "Server defined URL for this resource (output only)."
+-    }
+-   }
+-  },
 -  "InstancesScopedList": {
 -   "id": "InstancesScopedList",
 -   "type": "object",
@@ -43715,9 +44222,13 @@ index ec71edb..0000000
 -   "type": "object",
 -   "description": "A license resource.",
 -   "properties": {
+-    "chargesUseFee": {
+-     "type": "boolean",
+-     "description": "If true, the customer will be charged license fee for running software that contains this license on an instance."
+-    },
 -    "kind": {
 -     "type": "string",
--     "description": "Identifies what kind of resource this is. Value: the fixed string \"compute#license\".",
+-     "description": "Type of resource.",
 -     "default": "compute#license"
 -    },
 -    "name": {
@@ -44471,7 +44982,7 @@ index ec71edb..0000000
 -   "properties": {
 -    "paths": {
 -     "type": "array",
--     "description": "The list of path patterns to match. Each must start with ?/\" and the only place a \"*\" is allowed is at the end following a \"/\". The string fed to the path matcher does not include any text after the first \"?\" or \"#\", and those chars are not allowed here.",
+-     "description": "The list of path patterns to match. Each must start with / and the only place a * is allowed is at the end following a /. The string fed to the path matcher does not include any text after the first ? or #, and those chars are not allowed here.",
 -     "items": {
 -      "type": "string"
 -     }
@@ -44558,6 +45069,7 @@ index ec71edb..0000000
 -      "IN_USE_ADDRESSES",
 -      "KERNELS",
 -      "KERNELS_TOTAL_GB",
+-      "LOCAL_SSD_TOTAL_GB",
 -      "NETWORKS",
 -      "OPERATIONS",
 -      "ROUTES",
@@ -44593,6 +45105,7 @@ index ec71edb..0000000
 -      "",
 -      "",
 -      "",
+-      "",
 -      ""
 -     ]
 -    },
@@ -44702,7 +45215,8 @@ index ec71edb..0000000
 -   "type": "object",
 -   "properties": {
 -    "group": {
--     "type": "string"
+-     "type": "string",
+-     "description": "A URI referencing one of the resource views listed in the backend service."
 -    }
 -   }
 -  },
@@ -45001,7 +45515,7 @@ index ec71edb..0000000
 -    },
 -    "sourceDisk": {
 -     "type": "string",
--     "description": "The source disk used to create this snapshot. Once the source disk has been deleted from the system, this field will be cleared, and will not be set even if a disk with the same name has been re-created (output only)."
+-     "description": "The source disk used to create this snapshot."
 -    },
 -    "sourceDiskId": {
 -     "type": "string",
@@ -48144,50 +48658,92 @@ index ec71edb..0000000
 -    }
 -   }
 -  },
--  "instances": {
+-  "instanceTemplates": {
 -   "methods": {
--    "addAccessConfig": {
--     "id": "compute.instances.addAccessConfig",
--     "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig",
--     "httpMethod": "POST",
--     "description": "Adds an access config to an instance's network interface.",
+-    "delete": {
+-     "id": "compute.instanceTemplates.delete",
+-     "path": "{project}/global/instanceTemplates/{instanceTemplate}",
+-     "httpMethod": "DELETE",
+-     "description": "Deletes the specified instance template resource.",
 -     "parameters": {
--      "instance": {
+-      "instanceTemplate": {
 -       "type": "string",
--       "description": "Instance name.",
+-       "description": "Name of the instance template resource to delete.",
 -       "required": true,
 -       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 -       "location": "path"
 -      },
--      "networkInterface": {
+-      "project": {
 -       "type": "string",
--       "description": "Network interface name.",
+-       "description": "Name of the project scoping this request.",
 -       "required": true,
--       "location": "query"
+-       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-       "location": "path"
+-      }
+-     },
+-     "parameterOrder": [
+-      "project",
+-      "instanceTemplate"
+-     ],
+-     "response": {
+-      "$ref": "Operation"
+-     },
+-     "scopes": [
+-      "https://www.googleapis.com/auth/compute"
+-     ]
+-    },
+-    "get": {
+-     "id": "compute.instanceTemplates.get",
+-     "path": "{project}/global/instanceTemplates/{instanceTemplate}",
+-     "httpMethod": "GET",
+-     "description": "Returns the specified instance template resource.",
+-     "parameters": {
+-      "instanceTemplate": {
+-       "type": "string",
+-       "description": "Name of the instance template resource to return.",
+-       "required": true,
+-       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-       "location": "path"
 -      },
 -      "project": {
 -       "type": "string",
--       "description": "Project name.",
+-       "description": "Name of the project scoping this request.",
 -       "required": true,
 -       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
 -       "location": "path"
--      },
--      "zone": {
+-      }
+-     },
+-     "parameterOrder": [
+-      "project",
+-      "instanceTemplate"
+-     ],
+-     "response": {
+-      "$ref": "InstanceTemplate"
+-     },
+-     "scopes": [
+-      "https://www.googleapis.com/auth/compute",
+-      "https://www.googleapis.com/auth/compute.readonly"
+-     ]
+-    },
+-    "insert": {
+-     "id": "compute.instanceTemplates.insert",
+-     "path": "{project}/global/instanceTemplates",
+-     "httpMethod": "POST",
+-     "description": "Creates an instance template resource in the specified project using the data included in the request.",
+-     "parameters": {
+-      "project": {
 -       "type": "string",
--       "description": "Name of the zone scoping this request.",
+-       "description": "Name of the project scoping this request.",
 -       "required": true,
--       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
 -       "location": "path"
 -      }
 -     },
 -     "parameterOrder": [
--      "project",
--      "zone",
--      "instance",
--      "networkInterface"
+-      "project"
 -     ],
 -     "request": {
--      "$ref": "AccessConfig"
+-      "$ref": "InstanceTemplate"
 -     },
 -     "response": {
 -      "$ref": "Operation"
@@ -48196,9 +48752,107 @@ index ec71edb..0000000
 -      "https://www.googleapis.com/auth/compute"
 -     ]
 -    },
--    "aggregatedList": {
--     "id": "compute.instances.aggregatedList",
--     "path": "{project}/aggregated/instances",
+-    "list": {
+-     "id": "compute.instanceTemplates.list",
+-     "path": "{project}/global/instanceTemplates",
+-     "httpMethod": "GET",
+-     "description": "Retrieves the list of instance template resources contained within the specified project.",
+-     "parameters": {
+-      "filter": {
+-       "type": "string",
+-       "description": "Optional. Filter expression for filtering listed resources.",
+-       "location": "query"
+-      },
+-      "maxResults": {
+-       "type": "integer",
+-       "description": "Optional. Maximum count of results to be returned. Maximum value is 500 and default value is 500.",
+-       "default": "500",
+-       "format": "uint32",
+-       "minimum": "0",
+-       "maximum": "500",
+-       "location": "query"
+-      },
+-      "pageToken": {
+-       "type": "string",
+-       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+-       "location": "query"
+-      },
+-      "project": {
+-       "type": "string",
+-       "description": "Name of the project scoping this request.",
+-       "required": true,
+-       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-       "location": "path"
+-      }
+-     },
+-     "parameterOrder": [
+-      "project"
+-     ],
+-     "response": {
+-      "$ref": "InstanceTemplateList"
+-     },
+-     "scopes": [
+-      "https://www.googleapis.com/auth/compute",
+-      "https://www.googleapis.com/auth/compute.readonly"
+-     ]
+-    }
+-   }
+-  },
+-  "instances": {
+-   "methods": {
+-    "addAccessConfig": {
+-     "id": "compute.instances.addAccessConfig",
+-     "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig",
+-     "httpMethod": "POST",
+-     "description": "Adds an access config to an instance's network interface.",
+-     "parameters": {
+-      "instance": {
+-       "type": "string",
+-       "description": "Instance name.",
+-       "required": true,
+-       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-       "location": "path"
+-      },
+-      "networkInterface": {
+-       "type": "string",
+-       "description": "Network interface name.",
+-       "required": true,
+-       "location": "query"
+-      },
+-      "project": {
+-       "type": "string",
+-       "description": "Project name.",
+-       "required": true,
+-       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-       "location": "path"
+-      },
+-      "zone": {
+-       "type": "string",
+-       "description": "Name of the zone scoping this request.",
+-       "required": true,
+-       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-       "location": "path"
+-      }
+-     },
+-     "parameterOrder": [
+-      "project",
+-      "zone",
+-      "instance",
+-      "networkInterface"
+-     ],
+-     "request": {
+-      "$ref": "AccessConfig"
+-     },
+-     "response": {
+-      "$ref": "Operation"
+-     },
+-     "scopes": [
+-      "https://www.googleapis.com/auth/compute"
+-     ]
+-    },
+-    "aggregatedList": {
+-     "id": "compute.instances.aggregatedList",
+-     "path": "{project}/aggregated/instances",
 -     "httpMethod": "GET",
 -     "parameters": {
 -      "filter": {
@@ -51022,10 +51676,10 @@ index ec71edb..0000000
 -}
 diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-gen.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-gen.go
 deleted file mode 100644
-index 294df37..0000000
+index 7d193b5..0000000
 --- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/compute/v1/compute-gen.go
 +++ /dev/null
-@@ -1,15027 +0,0 @@
+@@ -1,16952 +0,0 @@
 -// Package compute provides access to the Compute Engine API.
 -//
 -// See https://developers.google.com/compute/docs/reference/latest/
@@ -51101,6 +51755,7 @@ index 294df37..0000000
 -	s.GlobalOperations = NewGlobalOperationsService(s)
 -	s.HttpHealthChecks = NewHttpHealthChecksService(s)
 -	s.Images = NewImagesService(s)
+-	s.InstanceTemplates = NewInstanceTemplatesService(s)
 -	s.Instances = NewInstancesService(s)
 -	s.Licenses = NewLicensesService(s)
 -	s.MachineTypes = NewMachineTypesService(s)
@@ -51145,6 +51800,8 @@ index 294df37..0000000
 -
 -	Images *ImagesService
 -
+-	InstanceTemplates *InstanceTemplatesService
+-
 -	Instances *InstancesService
 -
 -	Licenses *LicensesService
@@ -51275,6 +51932,15 @@ index 294df37..0000000
 -	s *Service
 -}
 -
+-func NewInstanceTemplatesService(s *Service) *InstanceTemplatesService {
+-	rs := &InstanceTemplatesService{s: s}
+-	return rs
+-}
+-
+-type InstanceTemplatesService struct {
+-	s *Service
+-}
+-
 -func NewInstancesService(s *Service) *InstancesService {
 -	rs := &InstancesService{s: s}
 -	return rs
@@ -51556,6 +52222,8 @@ index 294df37..0000000
 -	// InitializeParams: Initialization parameters.
 -	InitializeParams *AttachedDiskInitializeParams `json:"initializeParams,omitempty"`
 -
+-	Interface string `json:"interface,omitempty"`
+-
 -	// Kind: Type of the resource.
 -	Kind string `json:"kind,omitempty"`
 -
@@ -51607,10 +52275,11 @@ index 294df37..0000000
 -	// is provided by the client when the resource is created.
 -	Description string `json:"description,omitempty"`
 -
--	// Group: URL of a zonal Cloud Resource View resource. This resoure view
--	// defines the list of instances that serve traffic. Member virtual
+-	// Group: URL of a zonal Cloud Resource View resource. This resource
+-	// view defines the list of instances that serve traffic. Member virtual
 -	// machine instances from each resource view must live in the same zone
--	// as the resource view itself.
+-	// as the resource view itself. No two backends in a backend service are
+-	// allowed to use same Resource View resource.
 -	Group string `json:"group,omitempty"`
 -
 -	// MaxRate: The max RPS of the group. Can be used with either balancing
@@ -51665,10 +52334,14 @@ index 294df37..0000000
 -	// RFC1035.
 -	Name string `json:"name,omitempty"`
 -
--	// Port: The TCP port to connect on the backend. The default value is
--	// 80.
+-	// Port: Deprecated in favor of port_name. The TCP port to connect on
+-	// the backend. The default value is 80.
 -	Port int64 `json:"port,omitempty"`
 -
+-	// PortName: Name of backend port. The same name should appear in the
+-	// resource views referenced by this service. Required.
+-	PortName string `json:"portName,omitempty"`
+-
 -	Protocol string `json:"protocol,omitempty"`
 -
 -	// SelfLink: Server defined URL for the resource (output only).
@@ -51767,9 +52440,7 @@ index 294df37..0000000
 -	// otherwise it is required.
 -	SizeGb int64 `json:"sizeGb,omitempty,string"`
 -
--	// SourceImage: The source image used to create this disk. Once the
--	// source image has been deleted from the system, this field will not be
--	// set, even if an image with the same name has been re-created.
+-	// SourceImage: The source image used to create this disk.
 -	SourceImage string `json:"sourceImage,omitempty"`
 -
 -	// SourceImageId: The 'id' value of the image used to create this disk.
@@ -51777,10 +52448,7 @@ index 294df37..0000000
 -	// the current or a previous instance of a given image.
 -	SourceImageId string `json:"sourceImageId,omitempty"`
 -
--	// SourceSnapshot: The source snapshot used to create this disk. Once
--	// the source snapshot has been deleted from the system, this field will
--	// be cleared, and will not be set even if a snapshot with the same name
--	// has been re-created.
+-	// SourceSnapshot: The source snapshot used to create this disk.
 -	SourceSnapshot string `json:"sourceSnapshot,omitempty"`
 -
 -	// SourceSnapshotId: The 'id' value of the snapshot used to create this
@@ -51843,6 +52511,10 @@ index 294df37..0000000
 -	// only).
 -	CreationTimestamp string `json:"creationTimestamp,omitempty"`
 -
+-	// DefaultDiskSizeGb: Server defined default disk size in gb (output
+-	// only).
+-	DefaultDiskSizeGb int64 `json:"defaultDiskSizeGb,omitempty,string"`
+-
 -	// Deprecated: The deprecation status associated with this disk type.
 -	Deprecated *DeprecationStatus `json:"deprecated,omitempty"`
 -
@@ -52062,7 +52734,7 @@ index 294df37..0000000
 -	IPAddress string `json:"IPAddress,omitempty"`
 -
 -	// IPProtocol: The IP protocol to which this rule applies, valid options
--	// are 'TCP', 'UDP', 'ESP', 'AH' or 'SCTP'
+-	// are 'TCP', 'UDP', 'ESP', 'AH' or 'SCTP'.
 -	IPProtocol string `json:"IPProtocol,omitempty"`
 -
 -	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
@@ -52090,7 +52762,6 @@ index 294df37..0000000
 -	// be forwarded to 'target'. If 'portRange' is left empty (default
 -	// value), all ports are forwarded. Forwarding rules with the same
 -	// [IPAddress, IPProtocol] pair must have disjoint port ranges.
--	// @pattern: \d+(?:-\d+)?
 -	PortRange string `json:"portRange,omitempty"`
 -
 -	// Region: URL of the region where the regional forwarding rule resides
@@ -52187,15 +52858,18 @@ index 294df37..0000000
 -
 -	// IpAddress: The IP address represented by this resource.
 -	IpAddress string `json:"ipAddress,omitempty"`
+-
+-	// Port: The port on the instance.
+-	Port int64 `json:"port,omitempty"`
 -}
 -
 -type HostRule struct {
 -	Description string `json:"description,omitempty"`
 -
--	// Hosts: The list of host patterns to match. They must be FQDN except
--	// that it may start with ?*.? or ?*-?. The ?*? acts like a glob and
--	// will match any string of atoms (separated by .?s and -?s) to the
--	// left.
+-	// Hosts: The list of host patterns to match. They must be valid
+-	// hostnames except that they may start with *. or *-. The * acts like a
+-	// glob and will match any string of atoms (separated by .s and -s) to
+-	// the left.
 -	Hosts []string `json:"hosts,omitempty"`
 -
 -	// PathMatcher: The name of the PathMatcher to match the path portion of
@@ -52316,10 +52990,7 @@ index 294df37..0000000
 -	// SelfLink: Server defined URL for the resource (output only).
 -	SelfLink string `json:"selfLink,omitempty"`
 -
--	// SourceDisk: The source disk used to create this image. Once the
--	// source disk has been deleted from the system, this field will be
--	// cleared, and will not be set even if a disk with the same name has
--	// been re-created.
+-	// SourceDisk: The source disk used to create this image.
 -	SourceDisk string `json:"sourceDisk,omitempty"`
 -
 -	// SourceDiskId: The 'id' value of the disk used to create this image.
@@ -52493,10 +53164,112 @@ index 294df37..0000000
 -	SelfLink string `json:"selfLink,omitempty"`
 -}
 -
+-type InstanceProperties struct {
+-	// CanIpForward: Allows instances created based on this template to send
+-	// packets with source IP addresses other than their own and receive
+-	// packets with destination IP addresses other than their own. If these
+-	// instances will be used as an IP gateway or it will be set as the
+-	// next-hop in a Route resource, say true. If unsure, leave this set to
+-	// false.
+-	CanIpForward bool `json:"canIpForward,omitempty"`
+-
+-	// Description: An optional textual description for the instances
+-	// created based on the instance template resource; provided by the
+-	// client when the template is created.
+-	Description string `json:"description,omitempty"`
+-
+-	// Disks: Array of disks associated with instance created based on this
+-	// template.
+-	Disks []*AttachedDisk `json:"disks,omitempty"`
+-
+-	// MachineType: Name of the machine type resource describing which
+-	// machine type to use to host the instances created based on this
+-	// template; provided by the client when the instance template is
+-	// created.
+-	MachineType string `json:"machineType,omitempty"`
+-
+-	// Metadata: Metadata key/value pairs assigned to instances created
+-	// based on this template. Consists of custom metadata or predefined
+-	// keys; see Instance documentation for more information.
+-	Metadata *Metadata `json:"metadata,omitempty"`
+-
+-	// NetworkInterfaces: Array of configurations for this interface. This
+-	// specifies how this interface is configured to interact with other
+-	// network services, such as connecting to the internet. Currently,
+-	// ONE_TO_ONE_NAT is the only access config supported. If there are no
+-	// accessConfigs specified, then this instances created based based on
+-	// this template will have no external internet access.
+-	NetworkInterfaces []*NetworkInterface `json:"networkInterfaces,omitempty"`
+-
+-	// Scheduling: Scheduling options for the instances created based on
+-	// this template.
+-	Scheduling *Scheduling `json:"scheduling,omitempty"`
+-
+-	// ServiceAccounts: A list of service accounts each with specified
+-	// scopes, for which access tokens are to be made available to the
+-	// instances created based on this template, through metadata queries.
+-	ServiceAccounts []*ServiceAccount `json:"serviceAccounts,omitempty"`
+-
+-	// Tags: A list of tags to be applied to the instances created based on
+-	// this template used to identify valid sources or targets for network
+-	// firewalls. Provided by the client on instance creation. The tags can
+-	// be later modified by the setTags method. Each tag within the list
+-	// must comply with RFC1035.
+-	Tags *Tags `json:"tags,omitempty"`
+-}
+-
 -type InstanceReference struct {
 -	Instance string `json:"instance,omitempty"`
 -}
 -
+-type InstanceTemplate struct {
+-	// CreationTimestamp: Creation timestamp in RFC3339 text format (output
+-	// only).
+-	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+-
+-	// Description: An optional textual description of the instance template
+-	// resource; provided by the client when the resource is created.
+-	Description string `json:"description,omitempty"`
+-
+-	// Id: Unique identifier for the resource; defined by the server (output
+-	// only).
+-	Id uint64 `json:"id,omitempty,string"`
+-
+-	// Kind: Type of the resource.
+-	Kind string `json:"kind,omitempty"`
+-
+-	// Name: Name of the instance template resource; provided by the client
+-	// when the resource is created. The name must be 1-63 characters long,
+-	// and comply with RFC1035
+-	Name string `json:"name,omitempty"`
+-
+-	// Properties: The instance properties portion of this instance template
+-	// resource.
+-	Properties *InstanceProperties `json:"properties,omitempty"`
+-
+-	// SelfLink: Server defined URL for the resource (output only).
+-	SelfLink string `json:"selfLink,omitempty"`
+-}
+-
+-type InstanceTemplateList struct {
+-	// Id: Unique identifier for the resource; defined by the server (output
+-	// only).
+-	Id string `json:"id,omitempty"`
+-
+-	// Items: A list of instance template resources.
+-	Items []*InstanceTemplate `json:"items,omitempty"`
+-
+-	// Kind: Type of resource.
+-	Kind string `json:"kind,omitempty"`
+-
+-	// NextPageToken: A token used to continue a truncated list request
+-	// (output only).
+-	NextPageToken string `json:"nextPageToken,omitempty"`
+-
+-	// SelfLink: Server defined URL for this resource (output only).
+-	SelfLink string `json:"selfLink,omitempty"`
+-}
+-
 -type InstancesScopedList struct {
 -	// Instances: List of instances contained in this scope.
 -	Instances []*Instance `json:"instances,omitempty"`
@@ -52526,8 +53299,11 @@ index 294df37..0000000
 -}
 -
 -type License struct {
--	// Kind: Identifies what kind of resource this is. Value: the fixed
--	// string "compute#license".
+-	// ChargesUseFee: If true, the customer will be charged license fee for
+-	// running software that contains this license on an instance.
+-	ChargesUseFee bool `json:"chargesUseFee,omitempty"`
+-
+-	// Kind: Type of resource.
 -	Kind string `json:"kind,omitempty"`
 -
 -	// Name: Name of the resource; provided by the client when the resource
@@ -52972,10 +53748,10 @@ index 294df37..0000000
 -}
 -
 -type PathRule struct {
--	// Paths: The list of path patterns to match. Each must start with ?/"
--	// and the only place a "*" is allowed is at the end following a "/".
--	// The string fed to the path matcher does not include any text after
--	// the first "?" or "#", and those chars are not allowed here.
+-	// Paths: The list of path patterns to match. Each must start with / and
+-	// the only place a * is allowed is at the end following a /. The string
+-	// fed to the path matcher does not include any text after the first ?
+-	// or #, and those chars are not allowed here.
 -	Paths []string `json:"paths,omitempty"`
 -
 -	// Service: The URL of the BackendService resource if this rule is
@@ -53082,6 +53858,8 @@ index 294df37..0000000
 -}
 -
 -type ResourceGroupReference struct {
+-	// Group: A URI referencing one of the resource views listed in the
+-	// backend service.
 -	Group string `json:"group,omitempty"`
 -}
 -
@@ -53245,10 +54023,7 @@ index 294df37..0000000
 -	// SelfLink: Server defined URL for the resource (output only).
 -	SelfLink string `json:"selfLink,omitempty"`
 -
--	// SourceDisk: The source disk used to create this snapshot. Once the
--	// source disk has been deleted from the system, this field will be
--	// cleared, and will not be set even if a disk with the same name has
--	// been re-created (output only).
+-	// SourceDisk: The source disk used to create this snapshot.
 -	SourceDisk string `json:"sourceDisk,omitempty"`
 -
 -	// SourceDiskId: The 'id' value of the disk used to create this
@@ -53874,6 +54649,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *AddressesAggregatedListCall) Fields(s ...googleapi.Field) *AddressesAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *AddressesAggregatedListCall) Do() (*AddressAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -53887,6 +54670,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/addresses")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -53973,10 +54759,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *AddressesDeleteCall) Fields(s ...googleapi.Field) *AddressesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *AddressesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -54061,10 +54858,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *AddressesGetCall) Fields(s ...googleapi.Field) *AddressesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *AddressesGetCall) Do() (*Address, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses/{address}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -54151,6 +54959,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *AddressesInsertCall) Fields(s ...googleapi.Field) *AddressesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *AddressesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
@@ -54160,6 +54976,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -54261,6 +55080,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *AddressesListCall) Fields(s ...googleapi.Field) *AddressesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *AddressesListCall) Do() (*AddressList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -54274,6 +55101,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/addresses")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -54367,10 +55197,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesDeleteCall) Fields(s ...googleapi.Field) *BackendServicesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -54444,10 +55285,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesGetCall) Fields(s ...googleapi.Field) *BackendServicesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesGetCall) Do() (*BackendService, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -54525,6 +55377,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesGetHealthCall) Fields(s ...googleapi.Field) *BackendServicesGetHealthCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesGetHealthCall) Do() (*BackendServiceGroupHealth, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.resourcegroupreference)
@@ -54534,6 +55394,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}/getHealth")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -54612,6 +55475,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesInsertCall) Fields(s ...googleapi.Field) *BackendServicesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
@@ -54621,6 +55492,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -54711,6 +55585,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesListCall) Fields(s ...googleapi.Field) *BackendServicesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesListCall) Do() (*BackendServiceList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -54724,6 +55606,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -54811,6 +55696,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesPatchCall) Fields(s ...googleapi.Field) *BackendServicesPatchCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesPatchCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
@@ -54820,6 +55713,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PATCH", urls, body)
@@ -54899,6 +55795,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *BackendServicesUpdateCall) Fields(s ...googleapi.Field) *BackendServicesUpdateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *BackendServicesUpdateCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.backendservice)
@@ -54908,6 +55812,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/backendServices/{backendService}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PUT", urls, body)
@@ -55007,6 +55914,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DiskTypesAggregatedListCall) Fields(s ...googleapi.Field) *DiskTypesAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DiskTypesAggregatedListCall) Do() (*DiskTypeAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -55020,6 +55935,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/diskTypes")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -55106,10 +56024,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DiskTypesGetCall) Fields(s ...googleapi.Field) *DiskTypesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DiskTypesGetCall) Do() (*DiskType, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/diskTypes/{diskType}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -55217,6 +56146,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DiskTypesListCall) Fields(s ...googleapi.Field) *DiskTypesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DiskTypesListCall) Do() (*DiskTypeList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -55230,6 +56167,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/diskTypes")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -55344,6 +56284,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DisksAggregatedListCall) Fields(s ...googleapi.Field) *DisksAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DisksAggregatedListCall) Do() (*DiskAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -55357,6 +56305,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/disks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -55445,6 +56396,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DisksCreateSnapshotCall) Fields(s ...googleapi.Field) *DisksCreateSnapshotCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DisksCreateSnapshotCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.snapshot)
@@ -55454,6 +56413,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}/createSnapshot")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -55541,10 +56503,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DisksDeleteCall) Fields(s ...googleapi.Field) *DisksDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DisksDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -55629,10 +56602,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DisksGetCall) Fields(s ...googleapi.Field) *DisksGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DisksGetCall) Do() (*Disk, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks/{disk}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -55726,6 +56710,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DisksInsertCall) Fields(s ...googleapi.Field) *DisksInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DisksInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.disk)
@@ -55738,6 +56730,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["sourceImage"]; ok {
 -		params.Set("sourceImage", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -55844,6 +56839,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *DisksListCall) Fields(s ...googleapi.Field) *DisksListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *DisksListCall) Do() (*DiskList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -55857,6 +56860,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/disks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -55950,10 +56956,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *FirewallsDeleteCall) Fields(s ...googleapi.Field) *FirewallsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *FirewallsDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -56027,10 +57044,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *FirewallsGetCall) Fields(s ...googleapi.Field) *FirewallsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *FirewallsGetCall) Do() (*Firewall, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -56106,6 +57134,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *FirewallsInsertCall) Fields(s ...googleapi.Field) *FirewallsInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *FirewallsInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall)
@@ -56115,6 +57151,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -56205,6 +57244,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *FirewallsListCall) Fields(s ...googleapi.Field) *FirewallsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *FirewallsListCall) Do() (*FirewallList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -56218,6 +57265,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -56305,6 +57355,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *FirewallsPatchCall) Fields(s ...googleapi.Field) *FirewallsPatchCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *FirewallsPatchCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
@@ -56314,6 +57372,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PATCH", urls, body)
@@ -56394,6 +57455,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *FirewallsUpdateCall) Fields(s ...googleapi.Field) *FirewallsUpdateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *FirewallsUpdateCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.firewall2)
@@ -56403,6 +57472,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/firewalls/{firewall}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PUT", urls, body)
@@ -56502,6 +57574,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ForwardingRulesAggregatedListCall) Fields(s ...googleapi.Field) *ForwardingRulesAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ForwardingRulesAggregatedListCall) Do() (*ForwardingRuleAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -56515,6 +57595,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/forwardingRules")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -56601,10 +57684,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *ForwardingRulesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ForwardingRulesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -56689,10 +57783,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ForwardingRulesGetCall) Fields(s ...googleapi.Field) *ForwardingRulesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ForwardingRulesGetCall) Do() (*ForwardingRule, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -56779,6 +57884,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ForwardingRulesInsertCall) Fields(s ...googleapi.Field) *ForwardingRulesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ForwardingRulesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
@@ -56788,6 +57901,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -56889,6 +58005,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ForwardingRulesListCall) Fields(s ...googleapi.Field) *ForwardingRulesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ForwardingRulesListCall) Do() (*ForwardingRuleList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -56902,6 +58026,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -56999,6 +58126,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *ForwardingRulesSetTargetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ForwardingRulesSetTargetCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
@@ -57008,6 +58143,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/forwardingRules/{forwardingRule}/setTarget")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -57094,10 +58232,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalAddressesDeleteCall) Fields(s ...googleapi.Field) *GlobalAddressesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalAddressesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -57171,10 +58320,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalAddressesGetCall) Fields(s ...googleapi.Field) *GlobalAddressesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalAddressesGetCall) Do() (*Address, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses/{address}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -57250,6 +58410,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalAddressesInsertCall) Fields(s ...googleapi.Field) *GlobalAddressesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalAddressesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.address)
@@ -57259,6 +58427,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -57348,6 +58519,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalAddressesListCall) Fields(s ...googleapi.Field) *GlobalAddressesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalAddressesListCall) Do() (*AddressList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -57361,6 +58540,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/addresses")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -57445,10 +58627,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalForwardingRulesDeleteCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalForwardingRulesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -57522,10 +58715,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalForwardingRulesGetCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalForwardingRulesGetCall) Do() (*ForwardingRule, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -57601,6 +58805,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalForwardingRulesInsertCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalForwardingRulesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.forwardingrule)
@@ -57610,6 +58822,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -57700,6 +58915,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalForwardingRulesListCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalForwardingRulesListCall) Do() (*ForwardingRuleList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -57713,6 +58936,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -57799,6 +59025,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalForwardingRulesSetTargetCall) Fields(s ...googleapi.Field) *GlobalForwardingRulesSetTargetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalForwardingRulesSetTargetCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
@@ -57808,6 +59042,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/forwardingRules/{forwardingRule}/setTarget")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -57907,6 +59144,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalOperationsAggregatedListCall) Fields(s ...googleapi.Field) *GlobalOperationsAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalOperationsAggregatedListCall) Do() (*OperationAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -57920,6 +59165,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/operations")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -58004,10 +59252,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalOperationsDeleteCall) Fields(s ...googleapi.Field) *GlobalOperationsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalOperationsDeleteCall) Do() error {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -58074,10 +59333,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalOperationsGetCall) Fields(s ...googleapi.Field) *GlobalOperationsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalOperationsGetCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations/{operation}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -58174,6 +59444,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *GlobalOperationsListCall) Fields(s ...googleapi.Field) *GlobalOperationsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *GlobalOperationsListCall) Do() (*OperationList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -58187,6 +59465,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/operations")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -58271,10 +59552,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *HttpHealthChecksDeleteCall) Fields(s ...googleapi.Field) *HttpHealthChecksDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *HttpHealthChecksDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -58348,10 +59640,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *HttpHealthChecksGetCall) Fields(s ...googleapi.Field) *HttpHealthChecksGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *HttpHealthChecksGetCall) Do() (*HttpHealthCheck, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -58427,6 +59730,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *HttpHealthChecksInsertCall) Fields(s ...googleapi.Field) *HttpHealthChecksInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *HttpHealthChecksInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
@@ -58436,6 +59747,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -58526,6 +59840,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *HttpHealthChecksListCall) Fields(s ...googleapi.Field) *HttpHealthChecksListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *HttpHealthChecksListCall) Do() (*HttpHealthCheckList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -58539,6 +59861,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -58627,6 +59952,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *HttpHealthChecksPatchCall) Fields(s ...googleapi.Field) *HttpHealthChecksPatchCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *HttpHealthChecksPatchCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
@@ -58636,6 +59969,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PATCH", urls, body)
@@ -58716,6 +60052,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *HttpHealthChecksUpdateCall) Fields(s ...googleapi.Field) *HttpHealthChecksUpdateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *HttpHealthChecksUpdateCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.httphealthcheck)
@@ -58725,6 +60069,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/httpHealthChecks/{httpHealthCheck}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PUT", urls, body)
@@ -58802,10 +60149,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ImagesDeleteCall) Fields(s ...googleapi.Field) *ImagesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ImagesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -58882,6 +60240,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ImagesDeprecateCall) Fields(s ...googleapi.Field) *ImagesDeprecateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ImagesDeprecateCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.deprecationstatus)
@@ -58891,6 +60257,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}/deprecate")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -58968,10 +60337,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ImagesGetCall) Fields(s ...googleapi.Field) *ImagesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ImagesGetCall) Do() (*Image, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images/{image}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -59047,6 +60427,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ImagesInsertCall) Fields(s ...googleapi.Field) *ImagesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ImagesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.image)
@@ -59056,6 +60444,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -59149,6 +60540,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ImagesListCall) Fields(s ...googleapi.Field) *ImagesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ImagesListCall) Do() (*ImageList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -59162,6 +60561,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/images")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -59229,49 +60631,45 @@ index 294df37..0000000
 -
 -}
 -
--// method id "compute.instances.addAccessConfig":
+-// method id "compute.instanceTemplates.delete":
 -
--type InstancesAddAccessConfigCall struct {
+-type InstanceTemplatesDeleteCall struct {
 -	s                *Service
 -	project          string
--	zone             string
--	instance         string
--	networkInterface string
--	accessconfig     *AccessConfig
+-	instanceTemplate string
 -	opt_             map[string]interface{}
 -}
 -
--// AddAccessConfig: Adds an access config to an instance's network
--// interface.
--func (r *InstancesService) AddAccessConfig(project string, zone string, instance string, networkInterface string, accessconfig *AccessConfig) *InstancesAddAccessConfigCall {
--	c := &InstancesAddAccessConfigCall{s: r.s, opt_: make(map[string]interface{})}
+-// Delete: Deletes the specified instance template resource.
+-func (r *InstanceTemplatesService) Delete(project string, instanceTemplate string) *InstanceTemplatesDeleteCall {
+-	c := &InstanceTemplatesDeleteCall{s: r.s, opt_: make(map[string]interface{})}
 -	c.project = project
--	c.zone = zone
--	c.instance = instance
--	c.networkInterface = networkInterface
--	c.accessconfig = accessconfig
+-	c.instanceTemplate = instanceTemplate
 -	return c
 -}
 -
--func (c *InstancesAddAccessConfigCall) Do() (*Operation, error) {
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstanceTemplatesDeleteCall) Fields(s ...googleapi.Field) *InstanceTemplatesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *InstanceTemplatesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
--	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
--	if err != nil {
--		return nil, err
--	}
--	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
--	params.Set("networkInterface", fmt.Sprintf("%v", c.networkInterface))
--	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/addAccessConfig")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}")
 -	urls += "?" + params.Encode()
--	req, _ := http.NewRequest("POST", urls, body)
+-	req, _ := http.NewRequest("DELETE", urls, body)
 -	googleapi.Expand(req.URL, map[string]string{
--		"project":  c.project,
--		"zone":     c.zone,
--		"instance": c.instance,
+-		"project":          c.project,
+-		"instanceTemplate": c.instanceTemplate,
 -	})
--	req.Header.Set("Content-Type", ctype)
 -	req.Header.Set("User-Agent", "google-api-go-client/0.5")
 -	res, err := c.s.client.Do(req)
 -	if err != nil {
@@ -59287,47 +60685,207 @@ index 294df37..0000000
 -	}
 -	return ret, nil
 -	// {
--	//   "description": "Adds an access config to an instance's network interface.",
--	//   "httpMethod": "POST",
--	//   "id": "compute.instances.addAccessConfig",
+-	//   "description": "Deletes the specified instance template resource.",
+-	//   "httpMethod": "DELETE",
+-	//   "id": "compute.instanceTemplates.delete",
 -	//   "parameterOrder": [
 -	//     "project",
--	//     "zone",
--	//     "instance",
--	//     "networkInterface"
+-	//     "instanceTemplate"
 -	//   ],
 -	//   "parameters": {
--	//     "instance": {
--	//       "description": "Instance name.",
+-	//     "instanceTemplate": {
+-	//       "description": "Name of the instance template resource to delete.",
 -	//       "location": "path",
 -	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 -	//       "required": true,
 -	//       "type": "string"
 -	//     },
--	//     "networkInterface": {
--	//       "description": "Network interface name.",
--	//       "location": "query",
+-	//     "project": {
+-	//       "description": "Name of the project scoping this request.",
+-	//       "location": "path",
+-	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{project}/global/instanceTemplates/{instanceTemplate}",
+-	//   "response": {
+-	//     "$ref": "Operation"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/compute"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "compute.instanceTemplates.get":
+-
+-type InstanceTemplatesGetCall struct {
+-	s                *Service
+-	project          string
+-	instanceTemplate string
+-	opt_             map[string]interface{}
+-}
+-
+-// Get: Returns the specified instance template resource.
+-func (r *InstanceTemplatesService) Get(project string, instanceTemplate string) *InstanceTemplatesGetCall {
+-	c := &InstanceTemplatesGetCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.project = project
+-	c.instanceTemplate = instanceTemplate
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstanceTemplatesGetCall) Fields(s ...googleapi.Field) *InstanceTemplatesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *InstanceTemplatesGetCall) Do() (*InstanceTemplate, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates/{instanceTemplate}")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"project":          c.project,
+-		"instanceTemplate": c.instanceTemplate,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *InstanceTemplate
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Returns the specified instance template resource.",
+-	//   "httpMethod": "GET",
+-	//   "id": "compute.instanceTemplates.get",
+-	//   "parameterOrder": [
+-	//     "project",
+-	//     "instanceTemplate"
+-	//   ],
+-	//   "parameters": {
+-	//     "instanceTemplate": {
+-	//       "description": "Name of the instance template resource to return.",
+-	//       "location": "path",
+-	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
 -	//       "required": true,
 -	//       "type": "string"
 -	//     },
 -	//     "project": {
--	//       "description": "Project name.",
+-	//       "description": "Name of the project scoping this request.",
 -	//       "location": "path",
 -	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
 -	//       "required": true,
 -	//       "type": "string"
--	//     },
--	//     "zone": {
--	//       "description": "Name of the zone scoping this request.",
+-	//     }
+-	//   },
+-	//   "path": "{project}/global/instanceTemplates/{instanceTemplate}",
+-	//   "response": {
+-	//     "$ref": "InstanceTemplate"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/compute",
+-	//     "https://www.googleapis.com/auth/compute.readonly"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "compute.instanceTemplates.insert":
+-
+-type InstanceTemplatesInsertCall struct {
+-	s                *Service
+-	project          string
+-	instancetemplate *InstanceTemplate
+-	opt_             map[string]interface{}
+-}
+-
+-// Insert: Creates an instance template resource in the specified
+-// project using the data included in the request.
+-func (r *InstanceTemplatesService) Insert(project string, instancetemplate *InstanceTemplate) *InstanceTemplatesInsertCall {
+-	c := &InstanceTemplatesInsertCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.project = project
+-	c.instancetemplate = instancetemplate
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstanceTemplatesInsertCall) Fields(s ...googleapi.Field) *InstanceTemplatesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *InstanceTemplatesInsertCall) Do() (*Operation, error) {
+-	var body io.Reader = nil
+-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancetemplate)
+-	if err != nil {
+-		return nil, err
+-	}
+-	ctype := "application/json"
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("POST", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"project": c.project,
+-	})
+-	req.Header.Set("Content-Type", ctype)
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Operation
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Creates an instance template resource in the specified project using the data included in the request.",
+-	//   "httpMethod": "POST",
+-	//   "id": "compute.instanceTemplates.insert",
+-	//   "parameterOrder": [
+-	//     "project"
+-	//   ],
+-	//   "parameters": {
+-	//     "project": {
+-	//       "description": "Name of the project scoping this request.",
 -	//       "location": "path",
--	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
 -	//       "required": true,
 -	//       "type": "string"
 -	//     }
 -	//   },
--	//   "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig",
+-	//   "path": "{project}/global/instanceTemplates",
 -	//   "request": {
--	//     "$ref": "AccessConfig"
+-	//     "$ref": "InstanceTemplate"
 -	//   },
 -	//   "response": {
 -	//     "$ref": "Operation"
@@ -59339,24 +60897,25 @@ index 294df37..0000000
 -
 -}
 -
--// method id "compute.instances.aggregatedList":
+-// method id "compute.instanceTemplates.list":
 -
--type InstancesAggregatedListCall struct {
+-type InstanceTemplatesListCall struct {
 -	s       *Service
 -	project string
 -	opt_    map[string]interface{}
 -}
 -
--// AggregatedList:
--func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedListCall {
--	c := &InstancesAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+-// List: Retrieves the list of instance template resources contained
+-// within the specified project.
+-func (r *InstanceTemplatesService) List(project string) *InstanceTemplatesListCall {
+-	c := &InstanceTemplatesListCall{s: r.s, opt_: make(map[string]interface{})}
 -	c.project = project
 -	return c
 -}
 -
 -// Filter sets the optional parameter "filter": Filter expression for
 -// filtering listed resources.
--func (c *InstancesAggregatedListCall) Filter(filter string) *InstancesAggregatedListCall {
+-func (c *InstanceTemplatesListCall) Filter(filter string) *InstanceTemplatesListCall {
 -	c.opt_["filter"] = filter
 -	return c
 -}
@@ -59364,7 +60923,7 @@ index 294df37..0000000
 -// MaxResults sets the optional parameter "maxResults": Maximum count of
 -// results to be returned. Maximum value is 500 and default value is
 -// 500.
--func (c *InstancesAggregatedListCall) MaxResults(maxResults int64) *InstancesAggregatedListCall {
+-func (c *InstanceTemplatesListCall) MaxResults(maxResults int64) *InstanceTemplatesListCall {
 -	c.opt_["maxResults"] = maxResults
 -	return c
 -}
@@ -59372,12 +60931,20 @@ index 294df37..0000000
 -// PageToken sets the optional parameter "pageToken": Tag returned by a
 -// previous list request truncated by maxResults. Used to continue a
 -// previous list request.
--func (c *InstancesAggregatedListCall) PageToken(pageToken string) *InstancesAggregatedListCall {
+-func (c *InstanceTemplatesListCall) PageToken(pageToken string) *InstanceTemplatesListCall {
 -	c.opt_["pageToken"] = pageToken
 -	return c
 -}
 -
--func (c *InstancesAggregatedListCall) Do() (*InstanceAggregatedList, error) {
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstanceTemplatesListCall) Fields(s ...googleapi.Field) *InstanceTemplatesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *InstanceTemplatesListCall) Do() (*InstanceTemplateList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
@@ -59390,7 +60957,10 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
--	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instances")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/instanceTemplates")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
 -	googleapi.Expand(req.URL, map[string]string{
@@ -59405,14 +60975,264 @@ index 294df37..0000000
 -	if err := googleapi.CheckResponse(res); err != nil {
 -		return nil, err
 -	}
--	var ret *InstanceAggregatedList
+-	var ret *InstanceTemplateList
 -	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
 -		return nil, err
 -	}
 -	return ret, nil
 -	// {
+-	//   "description": "Retrieves the list of instance template resources contained within the specified project.",
 -	//   "httpMethod": "GET",
--	//   "id": "compute.instances.aggregatedList",
+-	//   "id": "compute.instanceTemplates.list",
+-	//   "parameterOrder": [
+-	//     "project"
+-	//   ],
+-	//   "parameters": {
+-	//     "filter": {
+-	//       "description": "Optional. Filter expression for filtering listed resources.",
+-	//       "location": "query",
+-	//       "type": "string"
+-	//     },
+-	//     "maxResults": {
+-	//       "default": "500",
+-	//       "description": "Optional. Maximum count of results to be returned. Maximum value is 500 and default value is 500.",
+-	//       "format": "uint32",
+-	//       "location": "query",
+-	//       "maximum": "500",
+-	//       "minimum": "0",
+-	//       "type": "integer"
+-	//     },
+-	//     "pageToken": {
+-	//       "description": "Optional. Tag returned by a previous list request truncated by maxResults. Used to continue a previous list request.",
+-	//       "location": "query",
+-	//       "type": "string"
+-	//     },
+-	//     "project": {
+-	//       "description": "Name of the project scoping this request.",
+-	//       "location": "path",
+-	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{project}/global/instanceTemplates",
+-	//   "response": {
+-	//     "$ref": "InstanceTemplateList"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/compute",
+-	//     "https://www.googleapis.com/auth/compute.readonly"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "compute.instances.addAccessConfig":
+-
+-type InstancesAddAccessConfigCall struct {
+-	s                *Service
+-	project          string
+-	zone             string
+-	instance         string
+-	networkInterface string
+-	accessconfig     *AccessConfig
+-	opt_             map[string]interface{}
+-}
+-
+-// AddAccessConfig: Adds an access config to an instance's network
+-// interface.
+-func (r *InstancesService) AddAccessConfig(project string, zone string, instance string, networkInterface string, accessconfig *AccessConfig) *InstancesAddAccessConfigCall {
+-	c := &InstancesAddAccessConfigCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.project = project
+-	c.zone = zone
+-	c.instance = instance
+-	c.networkInterface = networkInterface
+-	c.accessconfig = accessconfig
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesAddAccessConfigCall) Fields(s ...googleapi.Field) *InstancesAddAccessConfigCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *InstancesAddAccessConfigCall) Do() (*Operation, error) {
+-	var body io.Reader = nil
+-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.accessconfig)
+-	if err != nil {
+-		return nil, err
+-	}
+-	ctype := "application/json"
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	params.Set("networkInterface", fmt.Sprintf("%v", c.networkInterface))
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/addAccessConfig")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("POST", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"project":  c.project,
+-		"zone":     c.zone,
+-		"instance": c.instance,
+-	})
+-	req.Header.Set("Content-Type", ctype)
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Operation
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Adds an access config to an instance's network interface.",
+-	//   "httpMethod": "POST",
+-	//   "id": "compute.instances.addAccessConfig",
+-	//   "parameterOrder": [
+-	//     "project",
+-	//     "zone",
+-	//     "instance",
+-	//     "networkInterface"
+-	//   ],
+-	//   "parameters": {
+-	//     "instance": {
+-	//       "description": "Instance name.",
+-	//       "location": "path",
+-	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "networkInterface": {
+-	//       "description": "Network interface name.",
+-	//       "location": "query",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "project": {
+-	//       "description": "Project name.",
+-	//       "location": "path",
+-	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zone": {
+-	//       "description": "Name of the zone scoping this request.",
+-	//       "location": "path",
+-	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{project}/zones/{zone}/instances/{instance}/addAccessConfig",
+-	//   "request": {
+-	//     "$ref": "AccessConfig"
+-	//   },
+-	//   "response": {
+-	//     "$ref": "Operation"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/compute"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "compute.instances.aggregatedList":
+-
+-type InstancesAggregatedListCall struct {
+-	s       *Service
+-	project string
+-	opt_    map[string]interface{}
+-}
+-
+-// AggregatedList:
+-func (r *InstancesService) AggregatedList(project string) *InstancesAggregatedListCall {
+-	c := &InstancesAggregatedListCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.project = project
+-	return c
+-}
+-
+-// Filter sets the optional parameter "filter": Filter expression for
+-// filtering listed resources.
+-func (c *InstancesAggregatedListCall) Filter(filter string) *InstancesAggregatedListCall {
+-	c.opt_["filter"] = filter
+-	return c
+-}
+-
+-// MaxResults sets the optional parameter "maxResults": Maximum count of
+-// results to be returned. Maximum value is 500 and default value is
+-// 500.
+-func (c *InstancesAggregatedListCall) MaxResults(maxResults int64) *InstancesAggregatedListCall {
+-	c.opt_["maxResults"] = maxResults
+-	return c
+-}
+-
+-// PageToken sets the optional parameter "pageToken": Tag returned by a
+-// previous list request truncated by maxResults. Used to continue a
+-// previous list request.
+-func (c *InstancesAggregatedListCall) PageToken(pageToken string) *InstancesAggregatedListCall {
+-	c.opt_["pageToken"] = pageToken
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesAggregatedListCall) Fields(s ...googleapi.Field) *InstancesAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *InstancesAggregatedListCall) Do() (*InstanceAggregatedList, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["filter"]; ok {
+-		params.Set("filter", fmt.Sprintf("%v", v))
+-	}
+-	if v, ok := c.opt_["maxResults"]; ok {
+-		params.Set("maxResults", fmt.Sprintf("%v", v))
+-	}
+-	if v, ok := c.opt_["pageToken"]; ok {
+-		params.Set("pageToken", fmt.Sprintf("%v", v))
+-	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/instances")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"project": c.project,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *InstanceAggregatedList
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "httpMethod": "GET",
+-	//   "id": "compute.instances.aggregatedList",
 -	//   "parameterOrder": [
 -	//     "project"
 -	//   ],
@@ -59477,6 +61297,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesAttachDiskCall) Fields(s ...googleapi.Field) *InstancesAttachDiskCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesAttachDiskCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.attacheddisk)
@@ -59486,6 +61314,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/attachDisk")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -59574,10 +61405,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesDeleteCall) Fields(s ...googleapi.Field) *InstancesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -59667,12 +61509,23 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesDeleteAccessConfigCall) Fields(s ...googleapi.Field) *InstancesDeleteAccessConfigCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesDeleteAccessConfigCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
 -	params.Set("accessConfig", fmt.Sprintf("%v", c.accessConfig))
 -	params.Set("networkInterface", fmt.Sprintf("%v", c.networkInterface))
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/deleteAccessConfig")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -59773,11 +61626,22 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesDetachDiskCall) Fields(s ...googleapi.Field) *InstancesDetachDiskCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesDetachDiskCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
 -	params.Set("deviceName", fmt.Sprintf("%v", c.deviceName))
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/detachDisk")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -59870,10 +61734,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesGetCall) Fields(s ...googleapi.Field) *InstancesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesGetCall) Do() (*Instance, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -59960,10 +61835,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesGetSerialPortOutputCall) Fields(s ...googleapi.Field) *InstancesGetSerialPortOutputCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesGetSerialPortOutputCall) Do() (*SerialPortOutput, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/serialPort")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -60050,6 +61936,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesInsertCall) Fields(s ...googleapi.Field) *InstancesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instance)
@@ -60059,6 +61953,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -60160,6 +62057,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesListCall) Fields(s ...googleapi.Field) *InstancesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesListCall) Do() (*InstanceList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -60173,6 +62078,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -60268,10 +62176,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesResetCall) Fields(s ...googleapi.Field) *InstancesResetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesResetCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/reset")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -60361,12 +62280,23 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesSetDiskAutoDeleteCall) Fields(s ...googleapi.Field) *InstancesSetDiskAutoDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesSetDiskAutoDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
 -	params.Set("autoDelete", fmt.Sprintf("%v", c.autoDelete))
 -	params.Set("deviceName", fmt.Sprintf("%v", c.deviceName))
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setDiskAutoDelete")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -60469,6 +62399,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesSetMetadataCall) Fields(s ...googleapi.Field) *InstancesSetMetadataCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesSetMetadataCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
@@ -60478,6 +62416,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setMetadata")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -60568,6 +62509,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesSetSchedulingCall) Fields(s ...googleapi.Field) *InstancesSetSchedulingCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesSetSchedulingCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.scheduling)
@@ -60577,6 +62526,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setScheduling")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -60668,6 +62620,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *InstancesSetTagsCall) Fields(s ...googleapi.Field) *InstancesSetTagsCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *InstancesSetTagsCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.tags)
@@ -60677,6 +62637,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/instances/{instance}/setTags")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -60763,10 +62726,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *LicensesGetCall) Fields(s ...googleapi.Field) *LicensesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *LicensesGetCall) Do() (*License, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/licenses/{license}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -60863,6 +62837,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *MachineTypesAggregatedListCall) Fields(s ...googleapi.Field) *MachineTypesAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *MachineTypesAggregatedListCall) Do() (*MachineTypeAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -60876,6 +62858,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/machineTypes")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -60962,10 +62947,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *MachineTypesGetCall) Fields(s ...googleapi.Field) *MachineTypesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *MachineTypesGetCall) Do() (*MachineType, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/machineTypes/{machineType}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -61073,6 +63069,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *MachineTypesListCall) Fields(s ...googleapi.Field) *MachineTypesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *MachineTypesListCall) Do() (*MachineTypeList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -61086,6 +63090,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/machineTypes")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -61179,10 +63186,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *NetworksDeleteCall) Fields(s ...googleapi.Field) *NetworksDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *NetworksDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -61256,10 +63274,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *NetworksGetCall) Fields(s ...googleapi.Field) *NetworksGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *NetworksGetCall) Do() (*Network, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks/{network}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -61335,6 +63364,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *NetworksInsertCall) Fields(s ...googleapi.Field) *NetworksInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *NetworksInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.network)
@@ -61344,6 +63381,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -61434,6 +63474,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *NetworksListCall) Fields(s ...googleapi.Field) *NetworksListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *NetworksListCall) Do() (*NetworkList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -61447,6 +63495,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/networks")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -61529,10 +63580,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsGetCall) Fields(s ...googleapi.Field) *ProjectsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ProjectsGetCall) Do() (*Project, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -61599,6 +63661,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsSetCommonInstanceMetadataCall) Fields(s ...googleapi.Field) *ProjectsSetCommonInstanceMetadataCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ProjectsSetCommonInstanceMetadataCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.metadata)
@@ -61608,6 +63678,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/setCommonInstanceMetadata")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -61676,6 +63749,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsSetUsageExportBucketCall) Fields(s ...googleapi.Field) *ProjectsSetUsageExportBucketCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ProjectsSetUsageExportBucketCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.usageexportlocation)
@@ -61685,6 +63766,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/setUsageExportBucket")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -61758,10 +63842,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RegionOperationsDeleteCall) Fields(s ...googleapi.Field) *RegionOperationsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RegionOperationsDeleteCall) Do() error {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -61839,10 +63934,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RegionOperationsGetCall) Fields(s ...googleapi.Field) *RegionOperationsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RegionOperationsGetCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations/{operation}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -61950,6 +64056,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RegionOperationsListCall) Fields(s ...googleapi.Field) *RegionOperationsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RegionOperationsListCall) Do() (*OperationList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -61963,6 +64077,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/operations")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62056,10 +64173,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RegionsGetCall) Fields(s ...googleapi.Field) *RegionsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RegionsGetCall) Do() (*Region, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62156,6 +64284,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RegionsListCall) Fields(s ...googleapi.Field) *RegionsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RegionsListCall) Do() (*RegionList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -62169,6 +64305,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62253,10 +64392,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RoutesDeleteCall) Fields(s ...googleapi.Field) *RoutesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RoutesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -62330,10 +64480,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RoutesGetCall) Fields(s ...googleapi.Field) *RoutesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RoutesGetCall) Do() (*Route, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes/{route}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62409,6 +64570,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RoutesInsertCall) Fields(s ...googleapi.Field) *RoutesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RoutesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.route)
@@ -62418,6 +64587,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -62508,6 +64680,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *RoutesListCall) Fields(s ...googleapi.Field) *RoutesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *RoutesListCall) Do() (*RouteList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -62521,6 +64701,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/routes")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62605,10 +64788,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *SnapshotsDeleteCall) Fields(s ...googleapi.Field) *SnapshotsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *SnapshotsDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -62682,10 +64876,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *SnapshotsGetCall) Fields(s ...googleapi.Field) *SnapshotsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *SnapshotsGetCall) Do() (*Snapshot, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots/{snapshot}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62782,6 +64987,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *SnapshotsListCall) Fields(s ...googleapi.Field) *SnapshotsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *SnapshotsListCall) Do() (*SnapshotList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -62795,6 +65008,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/snapshots")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -62879,10 +65095,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetHttpProxiesDeleteCall) Fields(s ...googleapi.Field) *TargetHttpProxiesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetHttpProxiesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -62956,10 +65183,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetHttpProxiesGetCall) Fields(s ...googleapi.Field) *TargetHttpProxiesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetHttpProxiesGetCall) Do() (*TargetHttpProxy, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies/{targetHttpProxy}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -63035,6 +65273,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetHttpProxiesInsertCall) Fields(s ...googleapi.Field) *TargetHttpProxiesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetHttpProxiesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targethttpproxy)
@@ -63044,6 +65290,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -63134,6 +65383,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetHttpProxiesListCall) Fields(s ...googleapi.Field) *TargetHttpProxiesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetHttpProxiesListCall) Do() (*TargetHttpProxyList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -63147,6 +65404,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/targetHttpProxies")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -63233,6 +65493,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetHttpProxiesSetUrlMapCall) Fields(s ...googleapi.Field) *TargetHttpProxiesSetUrlMapCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetHttpProxiesSetUrlMapCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapreference)
@@ -63242,6 +65510,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/targetHttpProxies/{targetHttpProxy}/setUrlMap")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -63341,6 +65612,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetInstancesAggregatedListCall) Fields(s ...googleapi.Field) *TargetInstancesAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetInstancesAggregatedListCall) Do() (*TargetInstanceAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -63354,6 +65633,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/targetInstances")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -63440,10 +65722,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetInstancesDeleteCall) Fields(s ...googleapi.Field) *TargetInstancesDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetInstancesDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -63528,10 +65821,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetInstancesGetCall) Fields(s ...googleapi.Field) *TargetInstancesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetInstancesGetCall) Do() (*TargetInstance, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances/{targetInstance}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -63618,6 +65922,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetInstancesInsertCall) Fields(s ...googleapi.Field) *TargetInstancesInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetInstancesInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetinstance)
@@ -63627,6 +65939,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -63728,6 +66043,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetInstancesListCall) Fields(s ...googleapi.Field) *TargetInstancesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetInstancesListCall) Do() (*TargetInstanceList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -63741,6 +66064,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/targetInstances")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -63838,6 +66164,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsAddHealthCheckCall) Fields(s ...googleapi.Field) *TargetPoolsAddHealthCheckCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsAddHealthCheckCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddhealthcheckrequest)
@@ -63847,6 +66181,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/addHealthCheck")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -63936,6 +66273,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsAddInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsAddInstanceCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsAddInstanceCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsaddinstancerequest)
@@ -63945,6 +66290,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/addInstance")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -64051,6 +66399,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsAggregatedListCall) Fields(s ...googleapi.Field) *TargetPoolsAggregatedListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsAggregatedListCall) Do() (*TargetPoolAggregatedList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -64064,6 +66420,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/aggregated/targetPools")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -64150,10 +66509,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsDeleteCall) Fields(s ...googleapi.Field) *TargetPoolsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -64238,10 +66608,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsGetCall) Fields(s ...googleapi.Field) *TargetPoolsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsGetCall) Do() (*TargetPool, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -64330,6 +66711,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsGetHealthCall) Fields(s ...googleapi.Field) *TargetPoolsGetHealthCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsGetHealthCall) Do() (*TargetPoolInstanceHealth, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.instancereference)
@@ -64339,6 +66728,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/getHealth")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -64428,6 +66820,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsInsertCall) Fields(s ...googleapi.Field) *TargetPoolsInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpool)
@@ -64437,6 +66837,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -64538,6 +66941,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsListCall) Fields(s ...googleapi.Field) *TargetPoolsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsListCall) Do() (*TargetPoolList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -64551,6 +66962,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -64648,6 +67062,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsRemoveHealthCheckCall) Fields(s ...googleapi.Field) *TargetPoolsRemoveHealthCheckCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *TargetPoolsRemoveHealthCheckCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremovehealthcheckrequest)
@@ -64657,6 +67079,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeHealthCheck")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -64746,124 +67171,146 @@ index 294df37..0000000
 -	return c
 -}
 -
--func (c *TargetPoolsRemoveInstanceCall) Do() (*Operation, error) {
--	var body io.Reader = nil
--	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest)
--	if err != nil {
--		return nil, err
--	}
--	ctype := "application/json"
--	params := make(url.Values)
--	params.Set("alt", "json")
--	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeInstance")
--	urls += "?" + params.Encode()
--	req, _ := http.NewRequest("POST", urls, body)
--	googleapi.Expand(req.URL, map[string]string{
--		"project":    c.project,
--		"region":     c.region,
--		"targetPool": c.targetPool,
--	})
--	req.Header.Set("Content-Type", ctype)
--	req.Header.Set("User-Agent", "google-api-go-client/0.5")
--	res, err := c.s.client.Do(req)
--	if err != nil {
--		return nil, err
--	}
--	defer googleapi.CloseBody(res)
--	if err := googleapi.CheckResponse(res); err != nil {
--		return nil, err
--	}
--	var ret *Operation
--	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
--		return nil, err
--	}
--	return ret, nil
--	// {
--	//   "description": "Removes instance URL from targetPool.",
--	//   "httpMethod": "POST",
--	//   "id": "compute.targetPools.removeInstance",
--	//   "parameterOrder": [
--	//     "project",
--	//     "region",
--	//     "targetPool"
--	//   ],
--	//   "parameters": {
--	//     "project": {
--	//       "location": "path",
--	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
--	//       "required": true,
--	//       "type": "string"
--	//     },
--	//     "region": {
--	//       "description": "Name of the region scoping this request.",
--	//       "location": "path",
--	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
--	//       "required": true,
--	//       "type": "string"
--	//     },
--	//     "targetPool": {
--	//       "description": "Name of the TargetPool resource to which instance_url is to be removed.",
--	//       "location": "path",
--	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
--	//       "required": true,
--	//       "type": "string"
--	//     }
--	//   },
--	//   "path": "{project}/regions/{region}/targetPools/{targetPool}/removeInstance",
--	//   "request": {
--	//     "$ref": "TargetPoolsRemoveInstanceRequest"
--	//   },
--	//   "response": {
--	//     "$ref": "Operation"
--	//   },
--	//   "scopes": [
--	//     "https://www.googleapis.com/auth/compute"
--	//   ]
--	// }
--
--}
--
--// method id "compute.targetPools.setBackup":
--
--type TargetPoolsSetBackupCall struct {
--	s               *Service
--	project         string
--	region          string
--	targetPool      string
--	targetreference *TargetReference
--	opt_            map[string]interface{}
--}
--
--// SetBackup: Changes backup pool configurations.
--func (r *TargetPoolsService) SetBackup(project string, region string, targetPool string, targetreference *TargetReference) *TargetPoolsSetBackupCall {
--	c := &TargetPoolsSetBackupCall{s: r.s, opt_: make(map[string]interface{})}
--	c.project = project
--	c.region = region
--	c.targetPool = targetPool
--	c.targetreference = targetreference
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsRemoveInstanceCall) Fields(s ...googleapi.Field) *TargetPoolsRemoveInstanceCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
 -	return c
 -}
 -
--// FailoverRatio sets the optional parameter "failoverRatio": New
--// failoverRatio value for the containing target pool.
--func (c *TargetPoolsSetBackupCall) FailoverRatio(failoverRatio float64) *TargetPoolsSetBackupCall {
--	c.opt_["failoverRatio"] = failoverRatio
--	return c
--}
--
--func (c *TargetPoolsSetBackupCall) Do() (*Operation, error) {
+-func (c *TargetPoolsRemoveInstanceCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
--	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
+-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetpoolsremoveinstancerequest)
 -	if err != nil {
 -		return nil, err
 -	}
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
--	if v, ok := c.opt_["failoverRatio"]; ok {
--		params.Set("failoverRatio", fmt.Sprintf("%v", v))
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
 -	}
--	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/setBackup")
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/removeInstance")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("POST", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"project":    c.project,
+-		"region":     c.region,
+-		"targetPool": c.targetPool,
+-	})
+-	req.Header.Set("Content-Type", ctype)
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Operation
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Removes instance URL from targetPool.",
+-	//   "httpMethod": "POST",
+-	//   "id": "compute.targetPools.removeInstance",
+-	//   "parameterOrder": [
+-	//     "project",
+-	//     "region",
+-	//     "targetPool"
+-	//   ],
+-	//   "parameters": {
+-	//     "project": {
+-	//       "location": "path",
+-	//       "pattern": "(?:(?:[-a-z0-9]{1,63}\\.)*(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?):)?(?:[0-9]{1,19}|(?:[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?))",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "region": {
+-	//       "description": "Name of the region scoping this request.",
+-	//       "location": "path",
+-	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "targetPool": {
+-	//       "description": "Name of the TargetPool resource to which instance_url is to be removed.",
+-	//       "location": "path",
+-	//       "pattern": "[a-z](?:[-a-z0-9]{0,61}[a-z0-9])?",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{project}/regions/{region}/targetPools/{targetPool}/removeInstance",
+-	//   "request": {
+-	//     "$ref": "TargetPoolsRemoveInstanceRequest"
+-	//   },
+-	//   "response": {
+-	//     "$ref": "Operation"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/compute"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "compute.targetPools.setBackup":
+-
+-type TargetPoolsSetBackupCall struct {
+-	s               *Service
+-	project         string
+-	region          string
+-	targetPool      string
+-	targetreference *TargetReference
+-	opt_            map[string]interface{}
+-}
+-
+-// SetBackup: Changes backup pool configurations.
+-func (r *TargetPoolsService) SetBackup(project string, region string, targetPool string, targetreference *TargetReference) *TargetPoolsSetBackupCall {
+-	c := &TargetPoolsSetBackupCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.project = project
+-	c.region = region
+-	c.targetPool = targetPool
+-	c.targetreference = targetreference
+-	return c
+-}
+-
+-// FailoverRatio sets the optional parameter "failoverRatio": New
+-// failoverRatio value for the containing target pool.
+-func (c *TargetPoolsSetBackupCall) FailoverRatio(failoverRatio float64) *TargetPoolsSetBackupCall {
+-	c.opt_["failoverRatio"] = failoverRatio
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *TargetPoolsSetBackupCall) Fields(s ...googleapi.Field) *TargetPoolsSetBackupCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *TargetPoolsSetBackupCall) Do() (*Operation, error) {
+-	var body io.Reader = nil
+-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.targetreference)
+-	if err != nil {
+-		return nil, err
+-	}
+-	ctype := "application/json"
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["failoverRatio"]; ok {
+-		params.Set("failoverRatio", fmt.Sprintf("%v", v))
+-	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/regions/{region}/targetPools/{targetPool}/setBackup")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
 -	googleapi.Expand(req.URL, map[string]string{
@@ -64955,10 +67402,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsDeleteCall) Fields(s ...googleapi.Field) *UrlMapsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsDeleteCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -65032,10 +67490,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsGetCall) Fields(s ...googleapi.Field) *UrlMapsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsGetCall) Do() (*UrlMap, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -65111,6 +67580,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsInsertCall) Fields(s ...googleapi.Field) *UrlMapsInsertCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsInsertCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
@@ -65120,6 +67597,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -65210,6 +67690,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsListCall) Fields(s ...googleapi.Field) *UrlMapsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsListCall) Do() (*UrlMapList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -65223,6 +67711,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -65310,6 +67801,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsPatchCall) Fields(s ...googleapi.Field) *UrlMapsPatchCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsPatchCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
@@ -65319,6 +67818,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PATCH", urls, body)
@@ -65398,6 +67900,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsUpdateCall) Fields(s ...googleapi.Field) *UrlMapsUpdateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsUpdateCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmap)
@@ -65407,6 +67917,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("PUT", urls, body)
@@ -65488,6 +68001,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *UrlMapsValidateCall) Fields(s ...googleapi.Field) *UrlMapsValidateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *UrlMapsValidateCall) Do() (*UrlMapsValidateResponse, error) {
 -	var body io.Reader = nil
 -	body, err := googleapi.WithoutDataWrapper.JSONReader(c.urlmapsvalidaterequest)
@@ -65497,6 +68018,9 @@ index 294df37..0000000
 -	ctype := "application/json"
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/global/urlMaps/{urlMap}/validate")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("POST", urls, body)
@@ -65576,10 +68100,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ZoneOperationsDeleteCall) Fields(s ...googleapi.Field) *ZoneOperationsDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ZoneOperationsDeleteCall) Do() error {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/operations/{operation}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("DELETE", urls, body)
@@ -65657,10 +68192,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ZoneOperationsGetCall) Fields(s ...googleapi.Field) *ZoneOperationsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ZoneOperationsGetCall) Do() (*Operation, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/operations/{operation}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -65768,6 +68314,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ZoneOperationsListCall) Fields(s ...googleapi.Field) *ZoneOperationsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ZoneOperationsListCall) Do() (*OperationList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -65781,6 +68335,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}/operations")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -65874,10 +68431,21 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ZonesGetCall) Fields(s ...googleapi.Field) *ZonesGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ZonesGetCall) Do() (*Zone, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
 -	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones/{zone}")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -65974,6 +68542,14 @@ index 294df37..0000000
 -	return c
 -}
 -
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ZonesListCall) Fields(s ...googleapi.Field) *ZonesListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
 -func (c *ZonesListCall) Do() (*ZoneList, error) {
 -	var body io.Reader = nil
 -	params := make(url.Values)
@@ -65987,6 +68563,9 @@ index 294df37..0000000
 -	if v, ok := c.opt_["pageToken"]; ok {
 -		params.Set("pageToken", fmt.Sprintf("%v", v))
 -	}
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
 -	urls := googleapi.ResolveRelative(c.s.BasePath, "{project}/zones")
 -	urls += "?" + params.Encode()
 -	req, _ := http.NewRequest("GET", urls, body)
@@ -66053,3809 +68632,14193 @@ index 294df37..0000000
 -	// }
 -
 -}
-diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-api.json b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-api.json
 deleted file mode 100644
-index c3a1e80..0000000
---- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go
+index bca5a31..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-api.json
 +++ /dev/null
-@@ -1,377 +0,0 @@
--// Copyright 2011 Google Inc. All rights reserved.
--// Use of this source code is governed by a BSD-style
--// license that can be found in the LICENSE file.
--
--// Package googleapi contains the common code shared by all Google API
--// libraries.
--package googleapi
+@@ -1,579 +0,0 @@
+-{
+- "kind": "discovery#restDescription",
+- "etag": "\"l66ggWbucbkBw9Lpos72oziyefE/ZrZBeDfQYPqAxFURJt0IhCOLUHQ\"",
+- "discoveryVersion": "v1",
+- "id": "container:v1beta1",
+- "name": "container",
+- "version": "v1beta1",
+- "revision": "20141103",
+- "title": "Google Container Engine API",
+- "description": "The Google Container Engine API is used for building and managing container based applications, powered by the open source Kubernetes technology.",
+- "ownerDomain": "google.com",
+- "ownerName": "Google",
+- "icons": {
+-  "x16": "http://www.google.com/images/icons/product/search-16.gif",
+-  "x32": "http://www.google.com/images/icons/product/search-32.gif"
+- },
+- "protocol": "rest",
+- "baseUrl": "https://www.googleapis.com/container/v1beta1/projects/",
+- "basePath": "/container/v1beta1/projects/",
+- "rootUrl": "https://www.googleapis.com/",
+- "servicePath": "container/v1beta1/projects/",
+- "batchPath": "batch",
+- "parameters": {
+-  "alt": {
+-   "type": "string",
+-   "description": "Data format for the response.",
+-   "default": "json",
+-   "enum": [
+-    "json"
+-   ],
+-   "enumDescriptions": [
+-    "Responses with Content-Type of application/json"
+-   ],
+-   "location": "query"
+-  },
+-  "fields": {
+-   "type": "string",
+-   "description": "Selector specifying which fields to include in a partial response.",
+-   "location": "query"
+-  },
+-  "key": {
+-   "type": "string",
+-   "description": "API key. Your API key identifies your project and provides you with API access, quota, and reports. Required unless you provide an OAuth 2.0 token.",
+-   "location": "query"
+-  },
+-  "oauth_token": {
+-   "type": "string",
+-   "description": "OAuth 2.0 token for the current user.",
+-   "location": "query"
+-  },
+-  "prettyPrint": {
+-   "type": "boolean",
+-   "description": "Returns response with indentations and line breaks.",
+-   "default": "true",
+-   "location": "query"
+-  },
+-  "quotaUser": {
+-   "type": "string",
+-   "description": "Available to use for quota purposes for server-side applications. Can be any arbitrary string assigned to a user, but should not exceed 40 characters. Overrides userIp if both are provided.",
+-   "location": "query"
+-  },
+-  "userIp": {
+-   "type": "string",
+-   "description": "IP address of the site where the request originates. Use this if you want to enforce per-user limits.",
+-   "location": "query"
+-  }
+- },
+- "auth": {
+-  "oauth2": {
+-   "scopes": {
+-    "https://www.googleapis.com/auth/cloud-platform": {
+-     "description": "View and manage your data across Google Cloud Platform services"
+-    }
+-   }
+-  }
+- },
+- "schemas": {
+-  "Cluster": {
+-   "id": "Cluster",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.Cluster",
+-   "properties": {
+-    "clusterApiVersion": {
+-     "type": "string",
+-     "description": "The API version of the Kubernetes master and kubelets running in this cluster. Allowed value is 0.4.2, or leave blank to pick up the latest stable release."
+-    },
+-    "containerIpv4Cidr": {
+-     "type": "string",
+-     "description": "[Output only] The IP addresses of the container pods in this cluster, in  CIDR notation (e.g. 1.2.3.4/29)."
+-    },
+-    "creationTimestamp": {
+-     "type": "string",
+-     "description": "[Output only] The time the cluster was created, in RFC3339 text format."
+-    },
+-    "description": {
+-     "type": "string",
+-     "description": "An optional description of this cluster."
+-    },
+-    "endpoint": {
+-     "type": "string",
+-     "description": "[Output only] The IP address of this cluster's Kubernetes master. The endpoint can be accessed from the internet at https://username:password@endpoint/.\n\nSee the masterAuth property of this resource for username and password information."
+-    },
+-    "masterAuth": {
+-     "$ref": "MasterAuth",
+-     "description": "The HTTP basic authentication information for accessing the master. Because the master endpoint is open to the internet, you should create a strong password."
+-    },
+-    "name": {
+-     "type": "string",
+-     "description": "The name of this cluster. The name must be unique within this project and zone, and can be up to 40 characters with the following restrictions:  \n- Lowercase letters, numbers, and hyphens only.\n- Must start with a letter.\n- Must end with a number or a letter."
+-    },
+-    "nodeConfig": {
+-     "$ref": "NodeConfig",
+-     "description": "The machine type and image to use for all nodes in this cluster. See the descriptions of the child properties of nodeConfig."
+-    },
+-    "nodeRoutingPrefixSize": {
+-     "type": "integer",
+-     "description": "[Output only] The size of the address space on each node for hosting containers.",
+-     "format": "int32"
+-    },
+-    "numNodes": {
+-     "type": "integer",
+-     "description": "The number of nodes to create in this cluster. You must ensure that your Compute Engine resource quota is sufficient for this number of instances plus one (to include the master). You must also have available firewall and routes quota.",
+-     "format": "int32"
+-    },
+-    "servicesIpv4Cidr": {
+-     "type": "string",
+-     "description": "[Output only] The IP addresses of the Kubernetes services in this cluster, in  CIDR notation (e.g. 1.2.3.4/29). Service addresses are always in the 10.0.0.0/16 range."
+-    },
+-    "status": {
+-     "type": "string",
+-     "description": "[Output only] The current status of this cluster.",
+-     "enum": [
+-      "error",
+-      "provisioning",
+-      "running",
+-      "stopping"
+-     ],
+-     "enumDescriptions": [
+-      "",
+-      "",
+-      "",
+-      ""
+-     ]
+-    },
+-    "statusMessage": {
+-     "type": "string",
+-     "description": "[Output only] Additional information about the current status of this cluster, if available."
+-    },
+-    "zone": {
+-     "type": "string",
+-     "description": "[Output only] The name of the Google Compute Engine zone in which the cluster resides."
+-    }
+-   }
+-  },
+-  "CreateClusterRequest": {
+-   "id": "CreateClusterRequest",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.CreateClusterRequest",
+-   "properties": {
+-    "cluster": {
+-     "$ref": "Cluster",
+-     "description": "A cluster resource."
+-    }
+-   }
+-  },
+-  "ListAggregatedClustersResponse": {
+-   "id": "ListAggregatedClustersResponse",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.ListAggregatedClustersResponse",
+-   "properties": {
+-    "clusters": {
+-     "type": "array",
+-     "description": "A list of clusters in the project, across all zones.",
+-     "items": {
+-      "$ref": "Cluster"
+-     }
+-    }
+-   }
+-  },
+-  "ListAggregatedOperationsResponse": {
+-   "id": "ListAggregatedOperationsResponse",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.ListAggregatedOperationsResponse",
+-   "properties": {
+-    "operations": {
+-     "type": "array",
+-     "description": "A list of operations in the project, across all zones.",
+-     "items": {
+-      "$ref": "Operation"
+-     }
+-    }
+-   }
+-  },
+-  "ListClustersResponse": {
+-   "id": "ListClustersResponse",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.ListClustersResponse",
+-   "properties": {
+-    "clusters": {
+-     "type": "array",
+-     "description": "A list of clusters in the project in the specified zone.",
+-     "items": {
+-      "$ref": "Cluster"
+-     }
+-    }
+-   }
+-  },
+-  "ListOperationsResponse": {
+-   "id": "ListOperationsResponse",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.ListOperationsResponse",
+-   "properties": {
+-    "operations": {
+-     "type": "array",
+-     "description": "A list of operations in the project in the specified zone.",
+-     "items": {
+-      "$ref": "Operation"
+-     }
+-    }
+-   }
+-  },
+-  "MasterAuth": {
+-   "id": "MasterAuth",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.MasterAuth",
+-   "properties": {
+-    "password": {
+-     "type": "string",
+-     "description": "The password to use when accessing the Kubernetes master endpoint."
+-    },
+-    "user": {
+-     "type": "string",
+-     "description": "The username to use when accessing the Kubernetes master endpoint."
+-    }
+-   }
+-  },
+-  "NodeConfig": {
+-   "id": "NodeConfig",
+-   "type": "object",
+-   "externalTypeName": "container.v1beta1.NodeConfig",
+-   "properties": {
+-    "machineType": {
+-     "type": "string",
+-     "description": "The name of a Google Compute Engine machine type (e.g. n1-standard-1).\n\nIf unspecified, the default machine type is n1-standard-1."
+-    },
+-    "sourceImage": {
+-     "type": "string",
+-     "description": "The fully-specified name of a Google Compute Engine image. For example: https://www.googleapis.com/compute/v1/projects/debian-cloud/global/images/backports-debian-7-wheezy-vYYYYMMDD (where YYYMMDD is the version date).\n\nIf specifying an image, you are responsible for ensuring its compatibility with the Debian 7 backports image. We recommend leaving this field blank to accept the default backports-debian-7-wheezy value."
+-    }
+-   }
+-  },
+-  "Operation": {
+-   "id": "Operation",
+-   "type": "object",
+-   "description": "Defines the operation resource. All fields are output only.",
+-   "externalTypeName": "container.v1beta1.Operation",
+-   "properties": {
+-    "errorMessage": {
+-     "type": "string",
+-     "description": "If an error has occurred, a textual description of the error."
+-    },
+-    "name": {
+-     "type": "string",
+-     "description": "The server-assigned ID for this operation. If the operation is fulfilled upfront, it may not have a resource name."
+-    },
+-    "operationType": {
+-     "type": "string",
+-     "description": "The operation type.",
+-     "enum": [
+-      "createCluster",
+-      "deleteCluster"
+-     ],
+-     "enumDescriptions": [
+-      "",
+-      ""
+-     ]
+-    },
+-    "status": {
+-     "type": "string",
+-     "description": "The current status of the operation.",
+-     "enum": [
+-      "done",
+-      "pending",
+-      "running"
+-     ],
+-     "enumDescriptions": [
+-      "",
+-      "",
+-      ""
+-     ]
+-    },
+-    "target": {
+-     "type": "string",
+-     "description": "[Optional] The URL of the cluster resource that this operation is associated with."
+-    },
+-    "zone": {
+-     "type": "string",
+-     "description": "The name of the Google Compute Engine zone in which the operation is taking place."
+-    }
+-   }
+-  }
+- },
+- "resources": {
+-  "projects": {
+-   "resources": {
+-    "clusters": {
+-     "methods": {
+-      "list": {
+-       "id": "container.projects.clusters.list",
+-       "path": "{projectId}/clusters",
+-       "httpMethod": "GET",
+-       "description": "Lists all clusters owned by a project across all zones.",
+-       "parameters": {
+-        "projectId": {
+-         "type": "string",
+-         "description": "The Google Developers Console project ID or  project number.",
+-         "required": true,
+-         "location": "path"
+-        }
+-       },
+-       "parameterOrder": [
+-        "projectId"
+-       ],
+-       "response": {
+-        "$ref": "ListAggregatedClustersResponse"
+-       },
+-       "scopes": [
+-        "https://www.googleapis.com/auth/cloud-platform"
+-       ]
+-      }
+-     }
+-    },
+-    "operations": {
+-     "methods": {
+-      "list": {
+-       "id": "container.projects.operations.list",
+-       "path": "{projectId}/operations",
+-       "httpMethod": "GET",
+-       "description": "Lists all operations in a project, across all zones.",
+-       "parameters": {
+-        "projectId": {
+-         "type": "string",
+-         "description": "The Google Developers Console project ID or  project number.",
+-         "required": true,
+-         "location": "path"
+-        }
+-       },
+-       "parameterOrder": [
+-        "projectId"
+-       ],
+-       "response": {
+-        "$ref": "ListAggregatedOperationsResponse"
+-       },
+-       "scopes": [
+-        "https://www.googleapis.com/auth/cloud-platform"
+-       ]
+-      }
+-     }
+-    },
+-    "zones": {
+-     "resources": {
+-      "clusters": {
+-       "methods": {
+-        "create": {
+-         "id": "container.projects.zones.clusters.create",
+-         "path": "{projectId}/zones/{zoneId}/clusters",
+-         "httpMethod": "POST",
+-         "description": "Creates a cluster, consisting of the specified number and type of Google Compute Engine instances, plus a Kubernetes master instance.\n\nThe cluster is created in the project's default network.\n\nA firewall is added that allows traffic into port 443 on the master, which enables HTTPS. A firewall and a route is added for each node to allow the containers on that node to communicate with all other instances in the cluster.\n\nFinally, a route named k8s-iproute-10-xx-0-0 is created to track that the cluster's 10.xx.0.0/16 CIDR has been assigned.",
+-         "parameters": {
+-          "projectId": {
+-           "type": "string",
+-           "description": "The Google Developers Console project ID or  project number.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "zoneId": {
+-           "type": "string",
+-           "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-           "required": true,
+-           "location": "path"
+-          }
+-         },
+-         "parameterOrder": [
+-          "projectId",
+-          "zoneId"
+-         ],
+-         "request": {
+-          "$ref": "CreateClusterRequest"
+-         },
+-         "response": {
+-          "$ref": "Operation"
+-         },
+-         "scopes": [
+-          "https://www.googleapis.com/auth/cloud-platform"
+-         ]
+-        },
+-        "delete": {
+-         "id": "container.projects.zones.clusters.delete",
+-         "path": "{projectId}/zones/{zoneId}/clusters/{clusterId}",
+-         "httpMethod": "DELETE",
+-         "description": "Deletes the cluster, including the Kubernetes master and all worker nodes.\n\nFirewalls and routes that were configured at cluster creation are also deleted.",
+-         "parameters": {
+-          "clusterId": {
+-           "type": "string",
+-           "description": "The name of the cluster to delete.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "projectId": {
+-           "type": "string",
+-           "description": "The Google Developers Console project ID or  project number.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "zoneId": {
+-           "type": "string",
+-           "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-           "required": true,
+-           "location": "path"
+-          }
+-         },
+-         "parameterOrder": [
+-          "projectId",
+-          "zoneId",
+-          "clusterId"
+-         ],
+-         "response": {
+-          "$ref": "Operation"
+-         },
+-         "scopes": [
+-          "https://www.googleapis.com/auth/cloud-platform"
+-         ]
+-        },
+-        "get": {
+-         "id": "container.projects.zones.clusters.get",
+-         "path": "{projectId}/zones/{zoneId}/clusters/{clusterId}",
+-         "httpMethod": "GET",
+-         "description": "Gets a specific cluster.",
+-         "parameters": {
+-          "clusterId": {
+-           "type": "string",
+-           "description": "The name of the cluster to retrieve.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "projectId": {
+-           "type": "string",
+-           "description": "The Google Developers Console project ID or  project number.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "zoneId": {
+-           "type": "string",
+-           "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-           "required": true,
+-           "location": "path"
+-          }
+-         },
+-         "parameterOrder": [
+-          "projectId",
+-          "zoneId",
+-          "clusterId"
+-         ],
+-         "response": {
+-          "$ref": "Cluster"
+-         },
+-         "scopes": [
+-          "https://www.googleapis.com/auth/cloud-platform"
+-         ]
+-        },
+-        "list": {
+-         "id": "container.projects.zones.clusters.list",
+-         "path": "{projectId}/zones/{zoneId}/clusters",
+-         "httpMethod": "GET",
+-         "description": "Lists all clusters owned by a project in the specified zone.",
+-         "parameters": {
+-          "projectId": {
+-           "type": "string",
+-           "description": "The Google Developers Console project ID or  project number.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "zoneId": {
+-           "type": "string",
+-           "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-           "required": true,
+-           "location": "path"
+-          }
+-         },
+-         "parameterOrder": [
+-          "projectId",
+-          "zoneId"
+-         ],
+-         "response": {
+-          "$ref": "ListClustersResponse"
+-         },
+-         "scopes": [
+-          "https://www.googleapis.com/auth/cloud-platform"
+-         ]
+-        }
+-       }
+-      },
+-      "operations": {
+-       "methods": {
+-        "get": {
+-         "id": "container.projects.zones.operations.get",
+-         "path": "{projectId}/zones/{zoneId}/operations/{operationId}",
+-         "httpMethod": "GET",
+-         "description": "Gets the specified operation.",
+-         "parameters": {
+-          "operationId": {
+-           "type": "string",
+-           "description": "The server-assigned name of the operation.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "projectId": {
+-           "type": "string",
+-           "description": "The Google Developers Console project ID or  project number.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "zoneId": {
+-           "type": "string",
+-           "description": "The name of the Google Compute Engine zone in which the operation resides. This is always the same zone as the cluster with which the operation is associated.",
+-           "required": true,
+-           "location": "path"
+-          }
+-         },
+-         "parameterOrder": [
+-          "projectId",
+-          "zoneId",
+-          "operationId"
+-         ],
+-         "response": {
+-          "$ref": "Operation"
+-         },
+-         "scopes": [
+-          "https://www.googleapis.com/auth/cloud-platform"
+-         ]
+-        },
+-        "list": {
+-         "id": "container.projects.zones.operations.list",
+-         "path": "{projectId}/zones/{zoneId}/operations",
+-         "httpMethod": "GET",
+-         "description": "Lists all operations in a project in a specific zone.",
+-         "parameters": {
+-          "projectId": {
+-           "type": "string",
+-           "description": "The Google Developers Console project ID or  project number.",
+-           "required": true,
+-           "location": "path"
+-          },
+-          "zoneId": {
+-           "type": "string",
+-           "description": "The name of the Google Compute Engine zone to return operations for.",
+-           "required": true,
+-           "location": "path"
+-          }
+-         },
+-         "parameterOrder": [
+-          "projectId",
+-          "zoneId"
+-         ],
+-         "response": {
+-          "$ref": "ListOperationsResponse"
+-         },
+-         "scopes": [
+-          "https://www.googleapis.com/auth/cloud-platform"
+-         ]
+-        }
+-       }
+-      }
+-     }
+-    }
+-   }
+-  }
+- }
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-gen.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-gen.go
+deleted file mode 100644
+index c9fce64..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/container/v1beta1/container-gen.go
++++ /dev/null
+@@ -1,1007 +0,0 @@
+-// Package container provides access to the Google Container Engine API.
+-//
+-// Usage example:
+-//
+-//   import "code.google.com/p/google-api-go-client/container/v1beta1"
+-//   ...
+-//   containerService, err := container.New(oauthHttpClient)
+-package container
 -
 -import (
 -	"bytes"
+-	"code.google.com/p/google-api-go-client/googleapi"
 -	"encoding/json"
+-	"errors"
 -	"fmt"
 -	"io"
--	"io/ioutil"
--	"mime/multipart"
 -	"net/http"
--	"net/textproto"
 -	"net/url"
--	"os"
--	"regexp"
+-	"strconv"
 -	"strings"
 -)
 -
--// ContentTyper is an interface for Readers which know (or would like
--// to override) their Content-Type. If a media body doesn't implement
--// ContentTyper, the type is sniffed from the content using
--// http.DetectContentType.
--type ContentTyper interface {
--	ContentType() string
--}
--
--const Version = "0.5"
+-// Always reference these packages, just in case the auto-generated code
+-// below doesn't.
+-var _ = bytes.NewBuffer
+-var _ = strconv.Itoa
+-var _ = fmt.Sprintf
+-var _ = json.NewDecoder
+-var _ = io.Copy
+-var _ = url.Parse
+-var _ = googleapi.Version
+-var _ = errors.New
+-var _ = strings.Replace
 -
--// Error contains an error response from the server.
--type Error struct {
--	// Code is the HTTP response status code and will always be populated.
--	Code int `json:"code"`
--	// Message is the server response message and is only populated when
--	// explicitly referenced by the JSON server response.
--	Message string `json:"message"`
--	// Body is the raw response returned by the server.
--	// It is often but not always JSON, depending on how the request fails.
--	Body string
+-const apiId = "container:v1beta1"
+-const apiName = "container"
+-const apiVersion = "v1beta1"
+-const basePath = "https://www.googleapis.com/container/v1beta1/projects/"
 -
--	Errors []ErrorItem
--}
+-// OAuth2 scopes used by this API.
+-const (
+-	// View and manage your data across Google Cloud Platform services
+-	CloudPlatformScope = "https://www.googleapis.com/auth/cloud-platform"
+-)
 -
--// ErrorItem is a detailed error code & message from the Google API frontend.
--type ErrorItem struct {
+-func New(client *http.Client) (*Service, error) {
+-	if client == nil {
+-		return nil, errors.New("client is nil")
+-	}
+-	s := &Service{client: client, BasePath: basePath}
+-	s.Projects = NewProjectsService(s)
+-	return s, nil
+-}
+-
+-type Service struct {
+-	client   *http.Client
+-	BasePath string // API endpoint base URL
+-
+-	Projects *ProjectsService
+-}
+-
+-func NewProjectsService(s *Service) *ProjectsService {
+-	rs := &ProjectsService{s: s}
+-	rs.Clusters = NewProjectsClustersService(s)
+-	rs.Operations = NewProjectsOperationsService(s)
+-	rs.Zones = NewProjectsZonesService(s)
+-	return rs
+-}
+-
+-type ProjectsService struct {
+-	s *Service
+-
+-	Clusters *ProjectsClustersService
+-
+-	Operations *ProjectsOperationsService
+-
+-	Zones *ProjectsZonesService
+-}
+-
+-func NewProjectsClustersService(s *Service) *ProjectsClustersService {
+-	rs := &ProjectsClustersService{s: s}
+-	return rs
+-}
+-
+-type ProjectsClustersService struct {
+-	s *Service
+-}
+-
+-func NewProjectsOperationsService(s *Service) *ProjectsOperationsService {
+-	rs := &ProjectsOperationsService{s: s}
+-	return rs
+-}
+-
+-type ProjectsOperationsService struct {
+-	s *Service
+-}
+-
+-func NewProjectsZonesService(s *Service) *ProjectsZonesService {
+-	rs := &ProjectsZonesService{s: s}
+-	rs.Clusters = NewProjectsZonesClustersService(s)
+-	rs.Operations = NewProjectsZonesOperationsService(s)
+-	return rs
+-}
+-
+-type ProjectsZonesService struct {
+-	s *Service
+-
+-	Clusters *ProjectsZonesClustersService
+-
+-	Operations *ProjectsZonesOperationsService
+-}
+-
+-func NewProjectsZonesClustersService(s *Service) *ProjectsZonesClustersService {
+-	rs := &ProjectsZonesClustersService{s: s}
+-	return rs
+-}
+-
+-type ProjectsZonesClustersService struct {
+-	s *Service
+-}
+-
+-func NewProjectsZonesOperationsService(s *Service) *ProjectsZonesOperationsService {
+-	rs := &ProjectsZonesOperationsService{s: s}
+-	return rs
+-}
+-
+-type ProjectsZonesOperationsService struct {
+-	s *Service
+-}
+-
+-type Cluster struct {
+-	// ClusterApiVersion: The API version of the Kubernetes master and
+-	// kubelets running in this cluster. Allowed value is 0.4.2, or leave
+-	// blank to pick up the latest stable release.
+-	ClusterApiVersion string `json:"clusterApiVersion,omitempty"`
+-
+-	// ContainerIpv4Cidr: [Output only] The IP addresses of the container
+-	// pods in this cluster, in  CIDR notation (e.g. 1.2.3.4/29).
+-	ContainerIpv4Cidr string `json:"containerIpv4Cidr,omitempty"`
+-
+-	// CreationTimestamp: [Output only] The time the cluster was created, in
+-	// RFC3339 text format.
+-	CreationTimestamp string `json:"creationTimestamp,omitempty"`
+-
+-	// Description: An optional description of this cluster.
+-	Description string `json:"description,omitempty"`
+-
+-	// Endpoint: [Output only] The IP address of this cluster's Kubernetes
+-	// master. The endpoint can be accessed from the internet at
+-	// https://username:password@endpoint/.
+-	//
+-	// See the masterAuth property of
+-	// this resource for username and password information.
+-	Endpoint string `json:"endpoint,omitempty"`
+-
+-	// MasterAuth: The HTTP basic authentication information for accessing
+-	// the master. Because the master endpoint is open to the internet, you
+-	// should create a strong password.
+-	MasterAuth *MasterAuth `json:"masterAuth,omitempty"`
+-
+-	// Name: The name of this cluster. The name must be unique within this
+-	// project and zone, and can be up to 40 characters with the following
+-	// restrictions:
+-	// - Lowercase letters, numbers, and hyphens only.
+-	// -
+-	// Must start with a letter.
+-	// - Must end with a number or a letter.
+-	Name string `json:"name,omitempty"`
+-
+-	// NodeConfig: The machine type and image to use for all nodes in this
+-	// cluster. See the descriptions of the child properties of nodeConfig.
+-	NodeConfig *NodeConfig `json:"nodeConfig,omitempty"`
+-
+-	// NodeRoutingPrefixSize: [Output only] The size of the address space on
+-	// each node for hosting containers.
+-	NodeRoutingPrefixSize int64 `json:"nodeRoutingPrefixSize,omitempty"`
+-
+-	// NumNodes: The number of nodes to create in this cluster. You must
+-	// ensure that your Compute Engine resource quota is sufficient for this
+-	// number of instances plus one (to include the master). You must also
+-	// have available firewall and routes quota.
+-	NumNodes int64 `json:"numNodes,omitempty"`
+-
+-	// ServicesIpv4Cidr: [Output only] The IP addresses of the Kubernetes
+-	// services in this cluster, in  CIDR notation (e.g. 1.2.3.4/29).
+-	// Service addresses are always in the 10.0.0.0/16 range.
+-	ServicesIpv4Cidr string `json:"servicesIpv4Cidr,omitempty"`
+-
+-	// Status: [Output only] The current status of this cluster.
+-	Status string `json:"status,omitempty"`
+-
+-	// StatusMessage: [Output only] Additional information about the current
+-	// status of this cluster, if available.
+-	StatusMessage string `json:"statusMessage,omitempty"`
+-
+-	// Zone: [Output only] The name of the Google Compute Engine zone in
+-	// which the cluster resides.
+-	Zone string `json:"zone,omitempty"`
+-}
+-
+-type CreateClusterRequest struct {
+-	// Cluster: A cluster resource.
+-	Cluster *Cluster `json:"cluster,omitempty"`
+-}
+-
+-type ListAggregatedClustersResponse struct {
+-	// Clusters: A list of clusters in the project, across all zones.
+-	Clusters []*Cluster `json:"clusters,omitempty"`
+-}
+-
+-type ListAggregatedOperationsResponse struct {
+-	// Operations: A list of operations in the project, across all zones.
+-	Operations []*Operation `json:"operations,omitempty"`
+-}
+-
+-type ListClustersResponse struct {
+-	// Clusters: A list of clusters in the project in the specified zone.
+-	Clusters []*Cluster `json:"clusters,omitempty"`
+-}
+-
+-type ListOperationsResponse struct {
+-	// Operations: A list of operations in the project in the specified
+-	// zone.
+-	Operations []*Operation `json:"operations,omitempty"`
+-}
+-
+-type MasterAuth struct {
+-	// Password: The password to use when accessing the Kubernetes master
+-	// endpoint.
+-	Password string `json:"password,omitempty"`
+-
+-	// User: The username to use when accessing the Kubernetes master
+-	// endpoint.
+-	User string `json:"user,omitempty"`
+-}
+-
+-type NodeConfig struct {
+-	// MachineType: The name of a Google Compute Engine machine type (e.g.
+-	// n1-standard-1).
+-	//
+-	// If unspecified, the default machine type is
+-	// n1-standard-1.
+-	MachineType string `json:"machineType,omitempty"`
+-
+-	// SourceImage: The fully-specified name of a Google Compute Engine
+-	// image. For example:
+-	// https://www.googleapis.com/compute/v1/projects/debian-cloud/global/ima
+-	// ges/backports-debian-7-wheezy-vYYYYMMDD (where YYYMMDD is the version
+-	// date).
+-	//
+-	// If specifying an image, you are responsible for ensuring its
+-	// compatibility with the Debian 7 backports image. We recommend leaving
+-	// this field blank to accept the default backports-debian-7-wheezy
+-	// value.
+-	SourceImage string `json:"sourceImage,omitempty"`
+-}
+-
+-type Operation struct {
+-	// ErrorMessage: If an error has occurred, a textual description of the
+-	// error.
+-	ErrorMessage string `json:"errorMessage,omitempty"`
+-
+-	// Name: The server-assigned ID for this operation. If the operation is
+-	// fulfilled upfront, it may not have a resource name.
+-	Name string `json:"name,omitempty"`
+-
+-	// OperationType: The operation type.
+-	OperationType string `json:"operationType,omitempty"`
+-
+-	// Status: The current status of the operation.
+-	Status string `json:"status,omitempty"`
+-
+-	// Target: [Optional] The URL of the cluster resource that this
+-	// operation is associated with.
+-	Target string `json:"target,omitempty"`
+-
+-	// Zone: The name of the Google Compute Engine zone in which the
+-	// operation is taking place.
+-	Zone string `json:"zone,omitempty"`
+-}
+-
+-// method id "container.projects.clusters.list":
+-
+-type ProjectsClustersListCall struct {
+-	s         *Service
+-	projectId string
+-	opt_      map[string]interface{}
+-}
+-
+-// List: Lists all clusters owned by a project across all zones.
+-func (r *ProjectsClustersService) List(projectId string) *ProjectsClustersListCall {
+-	c := &ProjectsClustersListCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsClustersListCall) Fields(s ...googleapi.Field) *ProjectsClustersListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsClustersListCall) Do() (*ListAggregatedClustersResponse, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/clusters")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *ListAggregatedClustersResponse
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Lists all clusters owned by a project across all zones.",
+-	//   "httpMethod": "GET",
+-	//   "id": "container.projects.clusters.list",
+-	//   "parameterOrder": [
+-	//     "projectId"
+-	//   ],
+-	//   "parameters": {
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/clusters",
+-	//   "response": {
+-	//     "$ref": "ListAggregatedClustersResponse"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.operations.list":
+-
+-type ProjectsOperationsListCall struct {
+-	s         *Service
+-	projectId string
+-	opt_      map[string]interface{}
+-}
+-
+-// List: Lists all operations in a project, across all zones.
+-func (r *ProjectsOperationsService) List(projectId string) *ProjectsOperationsListCall {
+-	c := &ProjectsOperationsListCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsOperationsListCall) Fields(s ...googleapi.Field) *ProjectsOperationsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsOperationsListCall) Do() (*ListAggregatedOperationsResponse, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/operations")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *ListAggregatedOperationsResponse
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Lists all operations in a project, across all zones.",
+-	//   "httpMethod": "GET",
+-	//   "id": "container.projects.operations.list",
+-	//   "parameterOrder": [
+-	//     "projectId"
+-	//   ],
+-	//   "parameters": {
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/operations",
+-	//   "response": {
+-	//     "$ref": "ListAggregatedOperationsResponse"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.zones.clusters.create":
+-
+-type ProjectsZonesClustersCreateCall struct {
+-	s                    *Service
+-	projectId            string
+-	zoneId               string
+-	createclusterrequest *CreateClusterRequest
+-	opt_                 map[string]interface{}
+-}
+-
+-// Create: Creates a cluster, consisting of the specified number and
+-// type of Google Compute Engine instances, plus a Kubernetes master
+-// instance.
+-//
+-// The cluster is created in the project's default
+-// network.
+-//
+-// A firewall is added that allows traffic into port 443 on
+-// the master, which enables HTTPS. A firewall and a route is added for
+-// each node to allow the containers on that node to communicate with
+-// all other instances in the cluster.
+-//
+-// Finally, a route named
+-// k8s-iproute-10-xx-0-0 is created to track that the cluster's
+-// 10.xx.0.0/16 CIDR has been assigned.
+-func (r *ProjectsZonesClustersService) Create(projectId string, zoneId string, createclusterrequest *CreateClusterRequest) *ProjectsZonesClustersCreateCall {
+-	c := &ProjectsZonesClustersCreateCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	c.zoneId = zoneId
+-	c.createclusterrequest = createclusterrequest
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsZonesClustersCreateCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersCreateCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsZonesClustersCreateCall) Do() (*Operation, error) {
+-	var body io.Reader = nil
+-	body, err := googleapi.WithoutDataWrapper.JSONReader(c.createclusterrequest)
+-	if err != nil {
+-		return nil, err
+-	}
+-	ctype := "application/json"
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/zones/{zoneId}/clusters")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("POST", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-		"zoneId":    c.zoneId,
+-	})
+-	req.Header.Set("Content-Type", ctype)
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Operation
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Creates a cluster, consisting of the specified number and type of Google Compute Engine instances, plus a Kubernetes master instance.\n\nThe cluster is created in the project's default network.\n\nA firewall is added that allows traffic into port 443 on the master, which enables HTTPS. A firewall and a route is added for each node to allow the containers on that node to communicate with all other instances in the cluster.\n\nFinally, a route named k8s-iproute-10-xx-0-0 is created to track that the cluster's 10.xx.0.0/16 CIDR has been assigned.",
+-	//   "httpMethod": "POST",
+-	//   "id": "container.projects.zones.clusters.create",
+-	//   "parameterOrder": [
+-	//     "projectId",
+-	//     "zoneId"
+-	//   ],
+-	//   "parameters": {
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zoneId": {
+-	//       "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/zones/{zoneId}/clusters",
+-	//   "request": {
+-	//     "$ref": "CreateClusterRequest"
+-	//   },
+-	//   "response": {
+-	//     "$ref": "Operation"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.zones.clusters.delete":
+-
+-type ProjectsZonesClustersDeleteCall struct {
+-	s         *Service
+-	projectId string
+-	zoneId    string
+-	clusterId string
+-	opt_      map[string]interface{}
+-}
+-
+-// Delete: Deletes the cluster, including the Kubernetes master and all
+-// worker nodes.
+-//
+-// Firewalls and routes that were configured at cluster
+-// creation are also deleted.
+-func (r *ProjectsZonesClustersService) Delete(projectId string, zoneId string, clusterId string) *ProjectsZonesClustersDeleteCall {
+-	c := &ProjectsZonesClustersDeleteCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	c.zoneId = zoneId
+-	c.clusterId = clusterId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsZonesClustersDeleteCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersDeleteCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsZonesClustersDeleteCall) Do() (*Operation, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/zones/{zoneId}/clusters/{clusterId}")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("DELETE", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-		"zoneId":    c.zoneId,
+-		"clusterId": c.clusterId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Operation
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Deletes the cluster, including the Kubernetes master and all worker nodes.\n\nFirewalls and routes that were configured at cluster creation are also deleted.",
+-	//   "httpMethod": "DELETE",
+-	//   "id": "container.projects.zones.clusters.delete",
+-	//   "parameterOrder": [
+-	//     "projectId",
+-	//     "zoneId",
+-	//     "clusterId"
+-	//   ],
+-	//   "parameters": {
+-	//     "clusterId": {
+-	//       "description": "The name of the cluster to delete.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zoneId": {
+-	//       "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/zones/{zoneId}/clusters/{clusterId}",
+-	//   "response": {
+-	//     "$ref": "Operation"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.zones.clusters.get":
+-
+-type ProjectsZonesClustersGetCall struct {
+-	s         *Service
+-	projectId string
+-	zoneId    string
+-	clusterId string
+-	opt_      map[string]interface{}
+-}
+-
+-// Get: Gets a specific cluster.
+-func (r *ProjectsZonesClustersService) Get(projectId string, zoneId string, clusterId string) *ProjectsZonesClustersGetCall {
+-	c := &ProjectsZonesClustersGetCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	c.zoneId = zoneId
+-	c.clusterId = clusterId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsZonesClustersGetCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsZonesClustersGetCall) Do() (*Cluster, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/zones/{zoneId}/clusters/{clusterId}")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-		"zoneId":    c.zoneId,
+-		"clusterId": c.clusterId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Cluster
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Gets a specific cluster.",
+-	//   "httpMethod": "GET",
+-	//   "id": "container.projects.zones.clusters.get",
+-	//   "parameterOrder": [
+-	//     "projectId",
+-	//     "zoneId",
+-	//     "clusterId"
+-	//   ],
+-	//   "parameters": {
+-	//     "clusterId": {
+-	//       "description": "The name of the cluster to retrieve.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zoneId": {
+-	//       "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/zones/{zoneId}/clusters/{clusterId}",
+-	//   "response": {
+-	//     "$ref": "Cluster"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.zones.clusters.list":
+-
+-type ProjectsZonesClustersListCall struct {
+-	s         *Service
+-	projectId string
+-	zoneId    string
+-	opt_      map[string]interface{}
+-}
+-
+-// List: Lists all clusters owned by a project in the specified zone.
+-func (r *ProjectsZonesClustersService) List(projectId string, zoneId string) *ProjectsZonesClustersListCall {
+-	c := &ProjectsZonesClustersListCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	c.zoneId = zoneId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsZonesClustersListCall) Fields(s ...googleapi.Field) *ProjectsZonesClustersListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsZonesClustersListCall) Do() (*ListClustersResponse, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/zones/{zoneId}/clusters")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-		"zoneId":    c.zoneId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *ListClustersResponse
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Lists all clusters owned by a project in the specified zone.",
+-	//   "httpMethod": "GET",
+-	//   "id": "container.projects.zones.clusters.list",
+-	//   "parameterOrder": [
+-	//     "projectId",
+-	//     "zoneId"
+-	//   ],
+-	//   "parameters": {
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zoneId": {
+-	//       "description": "The name of the Google Compute Engine zone in which the cluster resides.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/zones/{zoneId}/clusters",
+-	//   "response": {
+-	//     "$ref": "ListClustersResponse"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.zones.operations.get":
+-
+-type ProjectsZonesOperationsGetCall struct {
+-	s           *Service
+-	projectId   string
+-	zoneId      string
+-	operationId string
+-	opt_        map[string]interface{}
+-}
+-
+-// Get: Gets the specified operation.
+-func (r *ProjectsZonesOperationsService) Get(projectId string, zoneId string, operationId string) *ProjectsZonesOperationsGetCall {
+-	c := &ProjectsZonesOperationsGetCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	c.zoneId = zoneId
+-	c.operationId = operationId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsZonesOperationsGetCall) Fields(s ...googleapi.Field) *ProjectsZonesOperationsGetCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsZonesOperationsGetCall) Do() (*Operation, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/zones/{zoneId}/operations/{operationId}")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId":   c.projectId,
+-		"zoneId":      c.zoneId,
+-		"operationId": c.operationId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *Operation
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Gets the specified operation.",
+-	//   "httpMethod": "GET",
+-	//   "id": "container.projects.zones.operations.get",
+-	//   "parameterOrder": [
+-	//     "projectId",
+-	//     "zoneId",
+-	//     "operationId"
+-	//   ],
+-	//   "parameters": {
+-	//     "operationId": {
+-	//       "description": "The server-assigned name of the operation.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zoneId": {
+-	//       "description": "The name of the Google Compute Engine zone in which the operation resides. This is always the same zone as the cluster with which the operation is associated.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/zones/{zoneId}/operations/{operationId}",
+-	//   "response": {
+-	//     "$ref": "Operation"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+-
+-// method id "container.projects.zones.operations.list":
+-
+-type ProjectsZonesOperationsListCall struct {
+-	s         *Service
+-	projectId string
+-	zoneId    string
+-	opt_      map[string]interface{}
+-}
+-
+-// List: Lists all operations in a project in a specific zone.
+-func (r *ProjectsZonesOperationsService) List(projectId string, zoneId string) *ProjectsZonesOperationsListCall {
+-	c := &ProjectsZonesOperationsListCall{s: r.s, opt_: make(map[string]interface{})}
+-	c.projectId = projectId
+-	c.zoneId = zoneId
+-	return c
+-}
+-
+-// Fields allows partial responses to be retrieved.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-// for more information.
+-func (c *ProjectsZonesOperationsListCall) Fields(s ...googleapi.Field) *ProjectsZonesOperationsListCall {
+-	c.opt_["fields"] = googleapi.CombineFields(s)
+-	return c
+-}
+-
+-func (c *ProjectsZonesOperationsListCall) Do() (*ListOperationsResponse, error) {
+-	var body io.Reader = nil
+-	params := make(url.Values)
+-	params.Set("alt", "json")
+-	if v, ok := c.opt_["fields"]; ok {
+-		params.Set("fields", fmt.Sprintf("%v", v))
+-	}
+-	urls := googleapi.ResolveRelative(c.s.BasePath, "{projectId}/zones/{zoneId}/operations")
+-	urls += "?" + params.Encode()
+-	req, _ := http.NewRequest("GET", urls, body)
+-	googleapi.Expand(req.URL, map[string]string{
+-		"projectId": c.projectId,
+-		"zoneId":    c.zoneId,
+-	})
+-	req.Header.Set("User-Agent", "google-api-go-client/0.5")
+-	res, err := c.s.client.Do(req)
+-	if err != nil {
+-		return nil, err
+-	}
+-	defer googleapi.CloseBody(res)
+-	if err := googleapi.CheckResponse(res); err != nil {
+-		return nil, err
+-	}
+-	var ret *ListOperationsResponse
+-	if err := json.NewDecoder(res.Body).Decode(&ret); err != nil {
+-		return nil, err
+-	}
+-	return ret, nil
+-	// {
+-	//   "description": "Lists all operations in a project in a specific zone.",
+-	//   "httpMethod": "GET",
+-	//   "id": "container.projects.zones.operations.list",
+-	//   "parameterOrder": [
+-	//     "projectId",
+-	//     "zoneId"
+-	//   ],
+-	//   "parameters": {
+-	//     "projectId": {
+-	//       "description": "The Google Developers Console project ID or  project number.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     },
+-	//     "zoneId": {
+-	//       "description": "The name of the Google Compute Engine zone to return operations for.",
+-	//       "location": "path",
+-	//       "required": true,
+-	//       "type": "string"
+-	//     }
+-	//   },
+-	//   "path": "{projectId}/zones/{zoneId}/operations",
+-	//   "response": {
+-	//     "$ref": "ListOperationsResponse"
+-	//   },
+-	//   "scopes": [
+-	//     "https://www.googleapis.com/auth/cloud-platform"
+-	//   ]
+-	// }
+-
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go
+deleted file mode 100644
+index d6e5cd8..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi.go
++++ /dev/null
+@@ -1,401 +0,0 @@
+-// Copyright 2011 Google Inc. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-// Package googleapi contains the common code shared by all Google API
+-// libraries.
+-package googleapi
+-
+-import (
+-	"bytes"
+-	"encoding/json"
+-	"fmt"
+-	"io"
+-	"io/ioutil"
+-	"mime/multipart"
+-	"net/http"
+-	"net/textproto"
+-	"net/url"
+-	"os"
+-	"strings"
+-
+-	"code.google.com/p/google-api-go-client/googleapi/internal/uritemplates"
+-)
+-
+-// ContentTyper is an interface for Readers which know (or would like
+-// to override) their Content-Type. If a media body doesn't implement
+-// ContentTyper, the type is sniffed from the content using
+-// http.DetectContentType.
+-type ContentTyper interface {
+-	ContentType() string
+-}
+-
+-const Version = "0.5"
+-
+-// Error contains an error response from the server.
+-type Error struct {
+-	// Code is the HTTP response status code and will always be populated.
+-	Code int `json:"code"`
+-	// Message is the server response message and is only populated when
+-	// explicitly referenced by the JSON server response.
+-	Message string `json:"message"`
+-	// Body is the raw response returned by the server.
+-	// It is often but not always JSON, depending on how the request fails.
+-	Body string
+-
+-	Errors []ErrorItem
+-}
+-
+-// ErrorItem is a detailed error code & message from the Google API frontend.
+-type ErrorItem struct {
 -	// Reason is the typed error code. For example: "some_example".
 -	Reason string `json:"reason"`
 -	// Message is the human-readable description of the error.
 -	Message string `json:"message"`
 -}
 -
--func (e *Error) Error() string {
--	if len(e.Errors) == 0 && e.Message == "" {
--		return fmt.Sprintf("googleapi: got HTTP response code %d with body: %v", e.Code, e.Body)
+-func (e *Error) Error() string {
+-	if len(e.Errors) == 0 && e.Message == "" {
+-		return fmt.Sprintf("googleapi: got HTTP response code %d with body: %v", e.Code, e.Body)
+-	}
+-	var buf bytes.Buffer
+-	fmt.Fprintf(&buf, "googleapi: Error %d: ", e.Code)
+-	if e.Message != "" {
+-		fmt.Fprintf(&buf, "%s", e.Message)
+-	}
+-	if len(e.Errors) == 0 {
+-		return strings.TrimSpace(buf.String())
+-	}
+-	if len(e.Errors) == 1 && e.Errors[0].Message == e.Message {
+-		fmt.Fprintf(&buf, ", %s", e.Errors[0].Reason)
+-		return buf.String()
+-	}
+-	fmt.Fprintln(&buf, "\nMore details:")
+-	for _, v := range e.Errors {
+-		fmt.Fprintf(&buf, "Reason: %s, Message: %s\n", v.Reason, v.Message)
+-	}
+-	return buf.String()
+-}
+-
+-type errorReply struct {
+-	Error *Error `json:"error"`
+-}
+-
+-// CheckResponse returns an error (of type *Error) if the response
+-// status code is not 2xx.
+-func CheckResponse(res *http.Response) error {
+-	if res.StatusCode >= 200 && res.StatusCode <= 299 {
+-		return nil
+-	}
+-	slurp, err := ioutil.ReadAll(res.Body)
+-	if err == nil {
+-		jerr := new(errorReply)
+-		err = json.Unmarshal(slurp, jerr)
+-		if err == nil && jerr.Error != nil {
+-			if jerr.Error.Code == 0 {
+-				jerr.Error.Code = res.StatusCode
+-			}
+-			jerr.Error.Body = string(slurp)
+-			return jerr.Error
+-		}
+-	}
+-	return &Error{
+-		Code: res.StatusCode,
+-		Body: string(slurp),
+-	}
+-}
+-
+-type MarshalStyle bool
+-
+-var WithDataWrapper = MarshalStyle(true)
+-var WithoutDataWrapper = MarshalStyle(false)
+-
+-func (wrap MarshalStyle) JSONReader(v interface{}) (io.Reader, error) {
+-	buf := new(bytes.Buffer)
+-	if wrap {
+-		buf.Write([]byte(`{"data": `))
+-	}
+-	err := json.NewEncoder(buf).Encode(v)
+-	if err != nil {
+-		return nil, err
+-	}
+-	if wrap {
+-		buf.Write([]byte(`}`))
+-	}
+-	return buf, nil
+-}
+-
+-func getMediaType(media io.Reader) (io.Reader, string) {
+-	if typer, ok := media.(ContentTyper); ok {
+-		return media, typer.ContentType()
+-	}
+-
+-	typ := "application/octet-stream"
+-	buf := make([]byte, 1024)
+-	n, err := media.Read(buf)
+-	buf = buf[:n]
+-	if err == nil {
+-		typ = http.DetectContentType(buf)
+-	}
+-	return io.MultiReader(bytes.NewBuffer(buf), media), typ
+-}
+-
+-type Lengther interface {
+-	Len() int
+-}
+-
+-// endingWithErrorReader from r until it returns an error.  If the
+-// final error from r is os.EOF and e is non-nil, e is used instead.
+-type endingWithErrorReader struct {
+-	r io.Reader
+-	e error
+-}
+-
+-func (er endingWithErrorReader) Read(p []byte) (n int, err error) {
+-	n, err = er.r.Read(p)
+-	if err == io.EOF && er.e != nil {
+-		err = er.e
+-	}
+-	return
+-}
+-
+-func getReaderSize(r io.Reader) (io.Reader, int64) {
+-	// Ideal case, the reader knows its own size.
+-	if lr, ok := r.(Lengther); ok {
+-		return r, int64(lr.Len())
+-	}
+-
+-	// But maybe it's a seeker and we can seek to the end to find its size.
+-	if s, ok := r.(io.Seeker); ok {
+-		pos0, err := s.Seek(0, os.SEEK_CUR)
+-		if err == nil {
+-			posend, err := s.Seek(0, os.SEEK_END)
+-			if err == nil {
+-				_, err = s.Seek(pos0, os.SEEK_SET)
+-				if err == nil {
+-					return r, posend - pos0
+-				} else {
+-					// We moved it forward but can't restore it.
+-					// Seems unlikely, but can't really restore now.
+-					return endingWithErrorReader{strings.NewReader(""), err}, posend - pos0
+-				}
+-			}
+-		}
+-	}
+-
+-	// Otherwise we have to make a copy to calculate how big the reader is.
+-	buf := new(bytes.Buffer)
+-	// TODO(bradfitz): put a cap on this copy? spill to disk after
+-	// a certain point?
+-	_, err := io.Copy(buf, r)
+-	return endingWithErrorReader{buf, err}, int64(buf.Len())
+-}
+-
+-func typeHeader(contentType string) textproto.MIMEHeader {
+-	h := make(textproto.MIMEHeader)
+-	h.Set("Content-Type", contentType)
+-	return h
+-}
+-
+-// countingWriter counts the number of bytes it receives to write, but
+-// discards them.
+-type countingWriter struct {
+-	n *int64
+-}
+-
+-func (w countingWriter) Write(p []byte) (int, error) {
+-	*w.n += int64(len(p))
+-	return len(p), nil
+-}
+-
+-// ConditionallyIncludeMedia does nothing if media is nil.
+-//
+-// bodyp is an in/out parameter.  It should initially point to the
+-// reader of the application/json (or whatever) payload to send in the
+-// API request.  It's updated to point to the multipart body reader.
+-//
+-// ctypep is an in/out parameter.  It should initially point to the
+-// content type of the bodyp, usually "application/json".  It's updated
+-// to the "multipart/related" content type, with random boundary.
+-//
+-// The return value is the content-length of the entire multpart body.
+-func ConditionallyIncludeMedia(media io.Reader, bodyp *io.Reader, ctypep *string) (totalContentLength int64, ok bool) {
+-	if media == nil {
+-		return
+-	}
+-	// Get the media type and size. The type check might return a
+-	// different reader instance, so do the size check first,
+-	// which looks at the specific type of the io.Reader.
+-	var mediaType string
+-	if typer, ok := media.(ContentTyper); ok {
+-		mediaType = typer.ContentType()
+-	}
+-	media, mediaSize := getReaderSize(media)
+-	if mediaType == "" {
+-		media, mediaType = getMediaType(media)
+-	}
+-	body, bodyType := *bodyp, *ctypep
+-	body, bodySize := getReaderSize(body)
+-
+-	// Calculate how big the the multipart will be.
+-	{
+-		totalContentLength = bodySize + mediaSize
+-		mpw := multipart.NewWriter(countingWriter{&totalContentLength})
+-		mpw.CreatePart(typeHeader(bodyType))
+-		mpw.CreatePart(typeHeader(mediaType))
+-		mpw.Close()
+-	}
+-
+-	pr, pw := io.Pipe()
+-	mpw := multipart.NewWriter(pw)
+-	*bodyp = pr
+-	*ctypep = "multipart/related; boundary=" + mpw.Boundary()
+-	go func() {
+-		defer pw.Close()
+-		defer mpw.Close()
+-
+-		w, err := mpw.CreatePart(typeHeader(bodyType))
+-		if err != nil {
+-			return
+-		}
+-		_, err = io.Copy(w, body)
+-		if err != nil {
+-			return
+-		}
+-
+-		w, err = mpw.CreatePart(typeHeader(mediaType))
+-		if err != nil {
+-			return
+-		}
+-		_, err = io.Copy(w, media)
+-		if err != nil {
+-			return
+-		}
+-	}()
+-	return totalContentLength, true
+-}
+-
+-func ResolveRelative(basestr, relstr string) string {
+-	u, _ := url.Parse(basestr)
+-	rel, _ := url.Parse(relstr)
+-	u = u.ResolveReference(rel)
+-	us := u.String()
+-	us = strings.Replace(us, "%7B", "{", -1)
+-	us = strings.Replace(us, "%7D", "}", -1)
+-	return us
+-}
+-
+-// has4860Fix is whether this Go environment contains the fix for
+-// http://golang.org/issue/4860
+-var has4860Fix bool
+-
+-// init initializes has4860Fix by checking the behavior of the net/http package.
+-func init() {
+-	r := http.Request{
+-		URL: &url.URL{
+-			Scheme: "http",
+-			Opaque: "//opaque",
+-		},
+-	}
+-	b := &bytes.Buffer{}
+-	r.Write(b)
+-	has4860Fix = bytes.HasPrefix(b.Bytes(), []byte("GET http"))
+-}
+-
+-// SetOpaque sets u.Opaque from u.Path such that HTTP requests to it
+-// don't alter any hex-escaped characters in u.Path.
+-func SetOpaque(u *url.URL) {
+-	u.Opaque = "//" + u.Host + u.Path
+-	if !has4860Fix {
+-		u.Opaque = u.Scheme + ":" + u.Opaque
+-	}
+-}
+-
+-// Expand subsitutes any {encoded} strings in the URL passed in using
+-// the map supplied.
+-//
+-// This calls SetOpaque to avoid encoding of the parameters in the URL path.
+-func Expand(u *url.URL, expansions map[string]string) {
+-	expanded, err := uritemplates.Expand(u.Path, expansions)
+-	if err == nil {
+-		u.Path = expanded
+-		SetOpaque(u)
+-	}
+-}
+-
+-// CloseBody is used to close res.Body.
+-// Prior to calling Close, it also tries to Read a small amount to see an EOF.
+-// Not seeing an EOF can prevent HTTP Transports from reusing connections.
+-func CloseBody(res *http.Response) {
+-	if res == nil || res.Body == nil {
+-		return
+-	}
+-	// Justification for 3 byte reads: two for up to "\r\n" after
+-	// a JSON/XML document, and then 1 to see EOF if we haven't yet.
+-	// TODO(bradfitz): detect Go 1.3+ and skip these reads.
+-	// See https://codereview.appspot.com/58240043
+-	// and https://codereview.appspot.com/49570044
+-	buf := make([]byte, 1)
+-	for i := 0; i < 3; i++ {
+-		_, err := res.Body.Read(buf)
+-		if err != nil {
+-			break
+-		}
+-	}
+-	res.Body.Close()
+-
+-}
+-
+-// VariantType returns the type name of the given variant.
+-// If the map doesn't contain the named key or the value is not a []interface{}, "" is returned.
+-// This is used to support "variant" APIs that can return one of a number of different types.
+-func VariantType(t map[string]interface{}) string {
+-	s, _ := t["type"].(string)
+-	return s
+-}
+-
+-// ConvertVariant uses the JSON encoder/decoder to fill in the struct 'dst' with the fields found in variant 'v'.
+-// This is used to support "variant" APIs that can return one of a number of different types.
+-// It reports whether the conversion was successful.
+-func ConvertVariant(v map[string]interface{}, dst interface{}) bool {
+-	var buf bytes.Buffer
+-	err := json.NewEncoder(&buf).Encode(v)
+-	if err != nil {
+-		return false
+-	}
+-	return json.Unmarshal(buf.Bytes(), dst) == nil
+-}
+-
+-// A Field names a field to be retrieved with a partial response.
+-// See https://developers.google.com/gdata/docs/2.0/basics#PartialResponse
+-//
+-// Partial responses can dramatically reduce the amount of data that must be sent to your application.
+-// In order to request partial responses, you can specify the full list of fields
+-// that your application needs by adding the Fields option to your request.
+-//
+-// Field strings use camelCase with leading lower-case characters to identify fields within the response.
+-//
+-// For example, if your response has a "NextPageToken" and a slice of "Items" with "Id" fields,
+-// you could request just those fields like this:
+-//
+-//     svc.Events.List().Fields("nextPageToken", "items/id").Do()
+-//
+-// or if you were also interested in each Item's "Updated" field, you can combine them like this:
+-//
+-//     svc.Events.List().Fields("nextPageToken", "items(id,updated)").Do()
+-//
+-// More information about field formatting can be found here:
+-// https://developers.google.com/+/api/#fields-syntax
+-//
+-// Another way to find field names is through the Google API explorer:
+-// https://developers.google.com/apis-explorer/#p/
+-type Field string
+-
+-// CombineFields combines fields into a single string.
+-func CombineFields(s []Field) string {
+-	r := make([]string, len(s))
+-	for i, v := range s {
+-		r[i] = string(v)
+-	}
+-	return strings.Join(r, ",")
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go
+deleted file mode 100644
+index abc5185..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go
++++ /dev/null
+@@ -1,361 +0,0 @@
+-// Copyright 2011 Google Inc. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-package googleapi
+-
+-import (
+-	"bytes"
+-	"encoding/json"
+-	"fmt"
+-	"io/ioutil"
+-	"net/http"
+-	"net/url"
+-	"reflect"
+-	"strings"
+-	"testing"
+-)
+-
+-type SetOpaqueTest struct {
+-	in             *url.URL
+-	wantRequestURI string
+-}
+-
+-var setOpaqueTests = []SetOpaqueTest{
+-	// no path
+-	{
+-		&url.URL{
+-			Scheme: "http",
+-			Host:   "www.golang.org",
+-		},
+-		"http://www.golang.org",
+-	},
+-	// path
+-	{
+-		&url.URL{
+-			Scheme: "http",
+-			Host:   "www.golang.org",
+-			Path:   "/",
+-		},
+-		"http://www.golang.org/",
+-	},
+-	// file with hex escaping
+-	{
+-		&url.URL{
+-			Scheme: "https",
+-			Host:   "www.golang.org",
+-			Path:   "/file%20one&two",
+-		},
+-		"https://www.golang.org/file%20one&two",
+-	},
+-	// query
+-	{
+-		&url.URL{
+-			Scheme:   "http",
+-			Host:     "www.golang.org",
+-			Path:     "/",
+-			RawQuery: "q=go+language",
+-		},
+-		"http://www.golang.org/?q=go+language",
+-	},
+-	// file with hex escaping in path plus query
+-	{
+-		&url.URL{
+-			Scheme:   "https",
+-			Host:     "www.golang.org",
+-			Path:     "/file%20one&two",
+-			RawQuery: "q=go+language",
+-		},
+-		"https://www.golang.org/file%20one&two?q=go+language",
+-	},
+-	// query with hex escaping
+-	{
+-		&url.URL{
+-			Scheme:   "http",
+-			Host:     "www.golang.org",
+-			Path:     "/",
+-			RawQuery: "q=go%20language",
+-		},
+-		"http://www.golang.org/?q=go%20language",
+-	},
+-}
+-
+-// prefixTmpl is a template for the expected prefix of the output of writing
+-// an HTTP request.
+-const prefixTmpl = "GET %v HTTP/1.1\r\nHost: %v\r\n"
+-
+-func TestSetOpaque(t *testing.T) {
+-	for _, test := range setOpaqueTests {
+-		u := *test.in
+-		SetOpaque(&u)
+-
+-		w := &bytes.Buffer{}
+-		r := &http.Request{URL: &u}
+-		if err := r.Write(w); err != nil {
+-			t.Errorf("write request: %v", err)
+-			continue
+-		}
+-
+-		prefix := fmt.Sprintf(prefixTmpl, test.wantRequestURI, test.in.Host)
+-		if got := string(w.Bytes()); !strings.HasPrefix(got, prefix) {
+-			t.Errorf("got %q expected prefix %q", got, prefix)
+-		}
+-	}
+-}
+-
+-type ExpandTest struct {
+-	in         string
+-	expansions map[string]string
+-	want       string
+-}
+-
+-var expandTests = []ExpandTest{
+-	// no expansions
+-	{
+-		"http://www.golang.org/",
+-		map[string]string{},
+-		"http://www.golang.org/",
+-	},
+-	// one expansion, no escaping
+-	{
+-		"http://www.golang.org/{bucket}/delete",
+-		map[string]string{
+-			"bucket": "red",
+-		},
+-		"http://www.golang.org/red/delete",
+-	},
+-	// one expansion, with hex escapes
+-	{
+-		"http://www.golang.org/{bucket}/delete",
+-		map[string]string{
+-			"bucket": "red/blue",
+-		},
+-		"http://www.golang.org/red%2Fblue/delete",
+-	},
+-	// one expansion, with space
+-	{
+-		"http://www.golang.org/{bucket}/delete",
+-		map[string]string{
+-			"bucket": "red or blue",
+-		},
+-		"http://www.golang.org/red%20or%20blue/delete",
+-	},
+-	// expansion not found
+-	{
+-		"http://www.golang.org/{object}/delete",
+-		map[string]string{
+-			"bucket": "red or blue",
+-		},
+-		"http://www.golang.org//delete",
+-	},
+-	// multiple expansions
+-	{
+-		"http://www.golang.org/{one}/{two}/{three}/get",
+-		map[string]string{
+-			"one":   "ONE",
+-			"two":   "TWO",
+-			"three": "THREE",
+-		},
+-		"http://www.golang.org/ONE/TWO/THREE/get",
+-	},
+-	// utf-8 characters
+-	{
+-		"http://www.golang.org/{bucket}/get",
+-		map[string]string{
+-			"bucket": "£100",
+-		},
+-		"http://www.golang.org/%C2%A3100/get",
+-	},
+-	// punctuations
+-	{
+-		"http://www.golang.org/{bucket}/get",
+-		map[string]string{
+-			"bucket": `/\@:,.`,
+-		},
+-		"http://www.golang.org/%2F%5C%40%3A%2C./get",
+-	},
+-	// mis-matched brackets
+-	{
+-		"http://www.golang.org/{bucket/get",
+-		map[string]string{
+-			"bucket": "red",
+-		},
+-		"http://www.golang.org/{bucket/get",
+-	},
+-	// "+" prefix for suppressing escape
+-	// See also: http://tools.ietf.org/html/rfc6570#section-3.2.3
+-	{
+-		"http://www.golang.org/{+topic}",
+-		map[string]string{
+-			"topic": "/topics/myproject/mytopic",
+-		},
+-		// The double slashes here look weird, but it's intentional
+-		"http://www.golang.org//topics/myproject/mytopic",
+-	},
+-}
+-
+-func TestExpand(t *testing.T) {
+-	for i, test := range expandTests {
+-		u := url.URL{
+-			Path: test.in,
+-		}
+-		Expand(&u, test.expansions)
+-		got := u.Path
+-		if got != test.want {
+-			t.Errorf("got %q expected %q in test %d", got, test.want, i+1)
+-		}
+-	}
+-}
+-
+-type CheckResponseTest struct {
+-	in       *http.Response
+-	bodyText string
+-	want     error
+-	errText  string
+-}
+-
+-var checkResponseTests = []CheckResponseTest{
+-	{
+-		&http.Response{
+-			StatusCode: http.StatusOK,
+-		},
+-		"",
+-		nil,
+-		"",
+-	},
+-	{
+-		&http.Response{
+-			StatusCode: http.StatusInternalServerError,
+-		},
+-		`{"error":{}}`,
+-		&Error{
+-			Code: http.StatusInternalServerError,
+-			Body: `{"error":{}}`,
+-		},
+-		`googleapi: got HTTP response code 500 with body: {"error":{}}`,
+-	},
+-	{
+-		&http.Response{
+-			StatusCode: http.StatusNotFound,
+-		},
+-		`{"error":{"message":"Error message for StatusNotFound."}}`,
+-		&Error{
+-			Code:    http.StatusNotFound,
+-			Message: "Error message for StatusNotFound.",
+-			Body:    `{"error":{"message":"Error message for StatusNotFound."}}`,
+-		},
+-		"googleapi: Error 404: Error message for StatusNotFound.",
+-	},
+-	{
+-		&http.Response{
+-			StatusCode: http.StatusBadRequest,
+-		},
+-		`{"error":"invalid_token","error_description":"Invalid Value"}`,
+-		&Error{
+-			Code: http.StatusBadRequest,
+-			Body: `{"error":"invalid_token","error_description":"Invalid Value"}`,
+-		},
+-		`googleapi: got HTTP response code 400 with body: {"error":"invalid_token","error_description":"Invalid Value"}`,
+-	},
+-	{
+-		&http.Response{
+-			StatusCode: http.StatusBadRequest,
+-		},
+-		`{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`,
+-		&Error{
+-			Code: http.StatusBadRequest,
+-			Errors: []ErrorItem{
+-				{
+-					Reason:  "keyInvalid",
+-					Message: "Bad Request",
+-				},
+-			},
+-			Body:    `{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`,
+-			Message: "Bad Request",
+-		},
+-		"googleapi: Error 400: Bad Request, keyInvalid",
+-	},
+-}
+-
+-func TestCheckResponse(t *testing.T) {
+-	for _, test := range checkResponseTests {
+-		res := test.in
+-		if test.bodyText != "" {
+-			res.Body = ioutil.NopCloser(strings.NewReader(test.bodyText))
+-		}
+-		g := CheckResponse(res)
+-		if !reflect.DeepEqual(g, test.want) {
+-			t.Errorf("CheckResponse: got %v, want %v", g, test.want)
+-			gotJson, err := json.Marshal(g)
+-			if err != nil {
+-				t.Error(err)
+-			}
+-			wantJson, err := json.Marshal(test.want)
+-			if err != nil {
+-				t.Error(err)
+-			}
+-			t.Errorf("json(got):  %q\njson(want): %q", string(gotJson), string(wantJson))
+-		}
+-		if g != nil && g.Error() != test.errText {
+-			t.Errorf("CheckResponse: unexpected error message.\nGot:  %q\nwant: %q", g, test.errText)
+-		}
+-	}
+-}
+-
+-type VariantPoint struct {
+-	Type        string
+-	Coordinates []float64
+-}
+-
+-type VariantTest struct {
+-	in     map[string]interface{}
+-	result bool
+-	want   VariantPoint
+-}
+-
+-var coords = []interface{}{1.0, 2.0}
+-
+-var variantTests = []VariantTest{
+-	{
+-		in: map[string]interface{}{
+-			"type":        "Point",
+-			"coordinates": coords,
+-		},
+-		result: true,
+-		want: VariantPoint{
+-			Type:        "Point",
+-			Coordinates: []float64{1.0, 2.0},
+-		},
+-	},
+-	{
+-		in: map[string]interface{}{
+-			"type":  "Point",
+-			"bogus": coords,
+-		},
+-		result: true,
+-		want: VariantPoint{
+-			Type: "Point",
+-		},
+-	},
+-}
+-
+-func TestVariantType(t *testing.T) {
+-	for _, test := range variantTests {
+-		if g := VariantType(test.in); g != test.want.Type {
+-			t.Errorf("VariantType(%v): got %v, want %v", test.in, g, test.want.Type)
+-		}
+-	}
+-}
+-
+-func TestConvertVariant(t *testing.T) {
+-	for _, test := range variantTests {
+-		g := VariantPoint{}
+-		r := ConvertVariant(test.in, &g)
+-		if r != test.result {
+-			t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, r, test.result)
+-		}
+-		if !reflect.DeepEqual(g, test.want) {
+-			t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, g, test.want)
+-		}
+-	}
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/LICENSE b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/LICENSE
+deleted file mode 100644
+index de9c88c..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/LICENSE
++++ /dev/null
+@@ -1,18 +0,0 @@
+-Copyright (c) 2013 Joshua Tacoma
+-
+-Permission is hereby granted, free of charge, to any person obtaining a copy of
+-this software and associated documentation files (the "Software"), to deal in
+-the Software without restriction, including without limitation the rights to
+-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+-the Software, and to permit persons to whom the Software is furnished to do so,
+-subject to the following conditions:
+-
+-The above copyright notice and this permission notice shall be included in all
+-copies or substantial portions of the Software.
+-
+-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+-COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+-IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/uritemplates.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/uritemplates.go
+deleted file mode 100644
+index 8a84813..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/uritemplates.go
++++ /dev/null
+@@ -1,359 +0,0 @@
+-// Copyright 2013 Joshua Tacoma. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-// Package uritemplates is a level 4 implementation of RFC 6570 (URI
+-// Template, http://tools.ietf.org/html/rfc6570).
+-//
+-// To use uritemplates, parse a template string and expand it with a value
+-// map:
+-//
+-//	template, _ := uritemplates.Parse("https://api.github.com/repos{/user,repo}")
+-//	values := make(map[string]interface{})
+-//	values["user"] = "jtacoma"
+-//	values["repo"] = "uritemplates"
+-//	expanded, _ := template.ExpandString(values)
+-//	fmt.Printf(expanded)
+-//
+-package uritemplates
+-
+-import (
+-	"bytes"
+-	"errors"
+-	"fmt"
+-	"reflect"
+-	"regexp"
+-	"strconv"
+-	"strings"
+-)
+-
+-var (
+-	unreserved = regexp.MustCompile("[^A-Za-z0-9\\-._~]")
+-	reserved   = regexp.MustCompile("[^A-Za-z0-9\\-._~:/?#[\\]@!$&'()*+,;=]")
+-	validname  = regexp.MustCompile("^([A-Za-z0-9_\\.]|%[0-9A-Fa-f][0-9A-Fa-f])+$")
+-	hex        = []byte("0123456789ABCDEF")
+-)
+-
+-func pctEncode(src []byte) []byte {
+-	dst := make([]byte, len(src)*3)
+-	for i, b := range src {
+-		buf := dst[i*3 : i*3+3]
+-		buf[0] = 0x25
+-		buf[1] = hex[b/16]
+-		buf[2] = hex[b%16]
+-	}
+-	return dst
+-}
+-
+-func escape(s string, allowReserved bool) (escaped string) {
+-	if allowReserved {
+-		escaped = string(reserved.ReplaceAllFunc([]byte(s), pctEncode))
+-	} else {
+-		escaped = string(unreserved.ReplaceAllFunc([]byte(s), pctEncode))
+-	}
+-	return escaped
+-}
+-
+-// A UriTemplate is a parsed representation of a URI template.
+-type UriTemplate struct {
+-	raw   string
+-	parts []templatePart
+-}
+-
+-// Parse parses a URI template string into a UriTemplate object.
+-func Parse(rawtemplate string) (template *UriTemplate, err error) {
+-	template = new(UriTemplate)
+-	template.raw = rawtemplate
+-	split := strings.Split(rawtemplate, "{")
+-	template.parts = make([]templatePart, len(split)*2-1)
+-	for i, s := range split {
+-		if i == 0 {
+-			if strings.Contains(s, "}") {
+-				err = errors.New("unexpected }")
+-				break
+-			}
+-			template.parts[i].raw = s
+-		} else {
+-			subsplit := strings.Split(s, "}")
+-			if len(subsplit) != 2 {
+-				err = errors.New("malformed template")
+-				break
+-			}
+-			expression := subsplit[0]
+-			template.parts[i*2-1], err = parseExpression(expression)
+-			if err != nil {
+-				break
+-			}
+-			template.parts[i*2].raw = subsplit[1]
+-		}
+-	}
+-	if err != nil {
+-		template = nil
+-	}
+-	return template, err
+-}
+-
+-type templatePart struct {
+-	raw           string
+-	terms         []templateTerm
+-	first         string
+-	sep           string
+-	named         bool
+-	ifemp         string
+-	allowReserved bool
+-}
+-
+-type templateTerm struct {
+-	name     string
+-	explode  bool
+-	truncate int
+-}
+-
+-func parseExpression(expression string) (result templatePart, err error) {
+-	switch expression[0] {
+-	case '+':
+-		result.sep = ","
+-		result.allowReserved = true
+-		expression = expression[1:]
+-	case '.':
+-		result.first = "."
+-		result.sep = "."
+-		expression = expression[1:]
+-	case '/':
+-		result.first = "/"
+-		result.sep = "/"
+-		expression = expression[1:]
+-	case ';':
+-		result.first = ";"
+-		result.sep = ";"
+-		result.named = true
+-		expression = expression[1:]
+-	case '?':
+-		result.first = "?"
+-		result.sep = "&"
+-		result.named = true
+-		result.ifemp = "="
+-		expression = expression[1:]
+-	case '&':
+-		result.first = "&"
+-		result.sep = "&"
+-		result.named = true
+-		result.ifemp = "="
+-		expression = expression[1:]
+-	case '#':
+-		result.first = "#"
+-		result.sep = ","
+-		result.allowReserved = true
+-		expression = expression[1:]
+-	default:
+-		result.sep = ","
+-	}
+-	rawterms := strings.Split(expression, ",")
+-	result.terms = make([]templateTerm, len(rawterms))
+-	for i, raw := range rawterms {
+-		result.terms[i], err = parseTerm(raw)
+-		if err != nil {
+-			break
+-		}
+-	}
+-	return result, err
+-}
+-
+-func parseTerm(term string) (result templateTerm, err error) {
+-	if strings.HasSuffix(term, "*") {
+-		result.explode = true
+-		term = term[:len(term)-1]
+-	}
+-	split := strings.Split(term, ":")
+-	if len(split) == 1 {
+-		result.name = term
+-	} else if len(split) == 2 {
+-		result.name = split[0]
+-		var parsed int64
+-		parsed, err = strconv.ParseInt(split[1], 10, 0)
+-		result.truncate = int(parsed)
+-	} else {
+-		err = errors.New("multiple colons in same term")
+-	}
+-	if !validname.MatchString(result.name) {
+-		err = errors.New("not a valid name: " + result.name)
+-	}
+-	if result.explode && result.truncate > 0 {
+-		err = errors.New("both explode and prefix modifers on same term")
+-	}
+-	return result, err
+-}
+-
+-// Expand expands a URI template with a set of values to produce a string.
+-func (self *UriTemplate) Expand(value interface{}) (string, error) {
+-	values, ismap := value.(map[string]interface{})
+-	if !ismap {
+-		if m, ismap := struct2map(value); !ismap {
+-			return "", errors.New("expected map[string]interface{}, struct, or pointer to struct.")
+-		} else {
+-			return self.Expand(m)
+-		}
+-	}
+-	var buf bytes.Buffer
+-	for _, p := range self.parts {
+-		err := p.expand(&buf, values)
+-		if err != nil {
+-			return "", err
+-		}
+-	}
+-	return buf.String(), nil
+-}
+-
+-func (self *templatePart) expand(buf *bytes.Buffer, values map[string]interface{}) error {
+-	if len(self.raw) > 0 {
+-		buf.WriteString(self.raw)
+-		return nil
+-	}
+-	var zeroLen = buf.Len()
+-	buf.WriteString(self.first)
+-	var firstLen = buf.Len()
+-	for _, term := range self.terms {
+-		value, exists := values[term.name]
+-		if !exists {
+-			continue
+-		}
+-		if buf.Len() != firstLen {
+-			buf.WriteString(self.sep)
+-		}
+-		switch v := value.(type) {
+-		case string:
+-			self.expandString(buf, term, v)
+-		case []interface{}:
+-			self.expandArray(buf, term, v)
+-		case map[string]interface{}:
+-			if term.truncate > 0 {
+-				return errors.New("cannot truncate a map expansion")
+-			}
+-			self.expandMap(buf, term, v)
+-		default:
+-			if m, ismap := struct2map(value); ismap {
+-				if term.truncate > 0 {
+-					return errors.New("cannot truncate a map expansion")
+-				}
+-				self.expandMap(buf, term, m)
+-			} else {
+-				str := fmt.Sprintf("%v", value)
+-				self.expandString(buf, term, str)
+-			}
+-		}
+-	}
+-	if buf.Len() == firstLen {
+-		original := buf.Bytes()[:zeroLen]
+-		buf.Reset()
+-		buf.Write(original)
+-	}
+-	return nil
+-}
+-
+-func (self *templatePart) expandName(buf *bytes.Buffer, name string, empty bool) {
+-	if self.named {
+-		buf.WriteString(name)
+-		if empty {
+-			buf.WriteString(self.ifemp)
+-		} else {
+-			buf.WriteString("=")
+-		}
+-	}
+-}
+-
+-func (self *templatePart) expandString(buf *bytes.Buffer, t templateTerm, s string) {
+-	if len(s) > t.truncate && t.truncate > 0 {
+-		s = s[:t.truncate]
+-	}
+-	self.expandName(buf, t.name, len(s) == 0)
+-	buf.WriteString(escape(s, self.allowReserved))
+-}
+-
+-func (self *templatePart) expandArray(buf *bytes.Buffer, t templateTerm, a []interface{}) {
+-	if len(a) == 0 {
+-		return
+-	} else if !t.explode {
+-		self.expandName(buf, t.name, false)
+-	}
+-	for i, value := range a {
+-		if t.explode && i > 0 {
+-			buf.WriteString(self.sep)
+-		} else if i > 0 {
+-			buf.WriteString(",")
+-		}
+-		var s string
+-		switch v := value.(type) {
+-		case string:
+-			s = v
+-		default:
+-			s = fmt.Sprintf("%v", v)
+-		}
+-		if len(s) > t.truncate && t.truncate > 0 {
+-			s = s[:t.truncate]
+-		}
+-		if self.named && t.explode {
+-			self.expandName(buf, t.name, len(s) == 0)
+-		}
+-		buf.WriteString(escape(s, self.allowReserved))
+-	}
+-}
+-
+-func (self *templatePart) expandMap(buf *bytes.Buffer, t templateTerm, m map[string]interface{}) {
+-	if len(m) == 0 {
+-		return
+-	}
+-	if !t.explode {
+-		self.expandName(buf, t.name, len(m) == 0)
+-	}
+-	var firstLen = buf.Len()
+-	for k, value := range m {
+-		if firstLen != buf.Len() {
+-			if t.explode {
+-				buf.WriteString(self.sep)
+-			} else {
+-				buf.WriteString(",")
+-			}
+-		}
+-		var s string
+-		switch v := value.(type) {
+-		case string:
+-			s = v
+-		default:
+-			s = fmt.Sprintf("%v", v)
+-		}
+-		if t.explode {
+-			buf.WriteString(escape(k, self.allowReserved))
+-			buf.WriteRune('=')
+-			buf.WriteString(escape(s, self.allowReserved))
+-		} else {
+-			buf.WriteString(escape(k, self.allowReserved))
+-			buf.WriteRune(',')
+-			buf.WriteString(escape(s, self.allowReserved))
+-		}
+-	}
+-}
+-
+-func struct2map(v interface{}) (map[string]interface{}, bool) {
+-	value := reflect.ValueOf(v)
+-	switch value.Type().Kind() {
+-	case reflect.Ptr:
+-		return struct2map(value.Elem().Interface())
+-	case reflect.Struct:
+-		m := make(map[string]interface{})
+-		for i := 0; i < value.NumField(); i++ {
+-			tag := value.Type().Field(i).Tag
+-			var name string
+-			if strings.Contains(string(tag), ":") {
+-				name = tag.Get("uri")
+-			} else {
+-				name = strings.TrimSpace(string(tag))
+-			}
+-			if len(name) == 0 {
+-				name = value.Type().Field(i).Name
+-			}
+-			m[name] = value.Field(i).Interface()
+-		}
+-		return m, true
+-	}
+-	return nil, false
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/utils.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/utils.go
+deleted file mode 100644
+index 399ef46..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/internal/uritemplates/utils.go
++++ /dev/null
+@@ -1,13 +0,0 @@
+-package uritemplates
+-
+-func Expand(path string, expansions map[string]string) (string, error) {
+-	template, err := Parse(path)
+-	if err != nil {
+-		return "", err
+-	}
+-	values := make(map[string]interface{})
+-	for k, v := range expansions {
+-		values[k] = v
+-	}
+-	return template.Expand(values)
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go
+deleted file mode 100644
+index eca1ea2..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go
++++ /dev/null
+@@ -1,38 +0,0 @@
+-// Copyright 2012 Google Inc. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-// Package transport contains HTTP transports used to make
+-// authenticated API requests.
+-package transport
+-
+-import (
+-	"errors"
+-	"net/http"
+-)
+-
+-// APIKey is an HTTP Transport which wraps an underlying transport and
+-// appends an API Key "key" parameter to the URL of outgoing requests.
+-type APIKey struct {
+-	// Key is the API Key to set on requests.
+-	Key string
+-
+-	// Transport is the underlying HTTP transport.
+-	// If nil, http.DefaultTransport is used.
+-	Transport http.RoundTripper
+-}
+-
+-func (t *APIKey) RoundTrip(req *http.Request) (*http.Response, error) {
+-	rt := t.Transport
+-	if rt == nil {
+-		rt = http.DefaultTransport
+-		if rt == nil {
+-			return nil, errors.New("googleapi/transport: no Transport specified or available")
+-		}
+-	}
+-	newReq := *req
+-	args := newReq.URL.Query()
+-	args.Set("key", t.Key)
+-	newReq.URL.RawQuery = args.Encode()
+-	return rt.RoundTrip(&newReq)
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go
+deleted file mode 100644
+index 7ed7dd9..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go
++++ /dev/null
+@@ -1,150 +0,0 @@
+-// Copyright 2013 Google Inc. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-package googleapi
+-
+-import (
+-	"encoding/json"
+-	"strconv"
+-)
+-
+-// Int64s is a slice of int64s that marshal as quoted strings in JSON.
+-type Int64s []int64
+-
+-func (q *Int64s) UnmarshalJSON(raw []byte) error {
+-	*q = (*q)[:0]
+-	var ss []string
+-	if err := json.Unmarshal(raw, &ss); err != nil {
+-		return err
+-	}
+-	for _, s := range ss {
+-		v, err := strconv.ParseInt(s, 10, 64)
+-		if err != nil {
+-			return err
+-		}
+-		*q = append(*q, int64(v))
+-	}
+-	return nil
+-}
+-
+-// Int32s is a slice of int32s that marshal as quoted strings in JSON.
+-type Int32s []int32
+-
+-func (q *Int32s) UnmarshalJSON(raw []byte) error {
+-	*q = (*q)[:0]
+-	var ss []string
+-	if err := json.Unmarshal(raw, &ss); err != nil {
+-		return err
+-	}
+-	for _, s := range ss {
+-		v, err := strconv.ParseInt(s, 10, 32)
+-		if err != nil {
+-			return err
+-		}
+-		*q = append(*q, int32(v))
+-	}
+-	return nil
+-}
+-
+-// Uint64s is a slice of uint64s that marshal as quoted strings in JSON.
+-type Uint64s []uint64
+-
+-func (q *Uint64s) UnmarshalJSON(raw []byte) error {
+-	*q = (*q)[:0]
+-	var ss []string
+-	if err := json.Unmarshal(raw, &ss); err != nil {
+-		return err
+-	}
+-	for _, s := range ss {
+-		v, err := strconv.ParseUint(s, 10, 64)
+-		if err != nil {
+-			return err
+-		}
+-		*q = append(*q, uint64(v))
+-	}
+-	return nil
+-}
+-
+-// Uint32s is a slice of uint32s that marshal as quoted strings in JSON.
+-type Uint32s []uint32
+-
+-func (q *Uint32s) UnmarshalJSON(raw []byte) error {
+-	*q = (*q)[:0]
+-	var ss []string
+-	if err := json.Unmarshal(raw, &ss); err != nil {
+-		return err
+-	}
+-	for _, s := range ss {
+-		v, err := strconv.ParseUint(s, 10, 32)
+-		if err != nil {
+-			return err
+-		}
+-		*q = append(*q, uint32(v))
+-	}
+-	return nil
+-}
+-
+-// Float64s is a slice of float64s that marshal as quoted strings in JSON.
+-type Float64s []float64
+-
+-func (q *Float64s) UnmarshalJSON(raw []byte) error {
+-	*q = (*q)[:0]
+-	var ss []string
+-	if err := json.Unmarshal(raw, &ss); err != nil {
+-		return err
+-	}
+-	for _, s := range ss {
+-		v, err := strconv.ParseFloat(s, 64)
+-		if err != nil {
+-			return err
+-		}
+-		*q = append(*q, float64(v))
+-	}
+-	return nil
+-}
+-
+-func quotedList(n int, fn func(dst []byte, i int) []byte) ([]byte, error) {
+-	dst := make([]byte, 0, 2+n*10) // somewhat arbitrary
+-	dst = append(dst, '[')
+-	for i := 0; i < n; i++ {
+-		if i > 0 {
+-			dst = append(dst, ',')
+-		}
+-		dst = append(dst, '"')
+-		dst = fn(dst, i)
+-		dst = append(dst, '"')
+-	}
+-	dst = append(dst, ']')
+-	return dst, nil
+-}
+-
+-func (s Int64s) MarshalJSON() ([]byte, error) {
+-	return quotedList(len(s), func(dst []byte, i int) []byte {
+-		return strconv.AppendInt(dst, s[i], 10)
+-	})
+-}
+-
+-func (s Int32s) MarshalJSON() ([]byte, error) {
+-	return quotedList(len(s), func(dst []byte, i int) []byte {
+-		return strconv.AppendInt(dst, int64(s[i]), 10)
+-	})
+-}
+-
+-func (s Uint64s) MarshalJSON() ([]byte, error) {
+-	return quotedList(len(s), func(dst []byte, i int) []byte {
+-		return strconv.AppendUint(dst, s[i], 10)
+-	})
+-}
+-
+-func (s Uint32s) MarshalJSON() ([]byte, error) {
+-	return quotedList(len(s), func(dst []byte, i int) []byte {
+-		return strconv.AppendUint(dst, uint64(s[i]), 10)
+-	})
+-}
+-
+-func (s Float64s) MarshalJSON() ([]byte, error) {
+-	return quotedList(len(s), func(dst []byte, i int) []byte {
+-		return strconv.AppendFloat(dst, s[i], 'g', -1, 64)
+-	})
+-}
+diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go
+deleted file mode 100644
+index a6b2045..0000000
+--- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go
++++ /dev/null
+@@ -1,44 +0,0 @@
+-// Copyright 2013 Google Inc. All rights reserved.
+-// Use of this source code is governed by a BSD-style
+-// license that can be found in the LICENSE file.
+-
+-package googleapi
+-
+-import (
+-	"encoding/json"
+-	"reflect"
+-	"testing"
+-)
+-
+-func TestTypes(t *testing.T) {
+-	type T struct {
+-		I32 Int32s
+-		I64 Int64s
+-		U32 Uint32s
+-		U64 Uint64s
+-		F64 Float64s
+-	}
+-	v := &T{
+-		I32: Int32s{-1, 2, 3},
+-		I64: Int64s{-1, 2, 1 << 33},
+-		U32: Uint32s{1, 2},
+-		U64: Uint64s{1, 2, 1 << 33},
+-		F64: Float64s{1.5, 3.33},
+-	}
+-	got, err := json.Marshal(v)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	want := `{"I32":["-1","2","3"],"I64":["-1","2","8589934592"],"U32":["1","2"],"U64":["1","2","8589934592"],"F64":["1.5","3.33"]}`
+-	if string(got) != want {
+-		t.Fatalf("Marshal mismatch.\n got: %s\nwant: %s\n", got, want)
+-	}
+-
+-	v2 := new(T)
+-	if err := json.Unmarshal(got, v2); err != nil {
+-		t.Fatalf("Unmarshal: %v", err)
+-	}
+-	if !reflect.DeepEqual(v, v2) {
+-		t.Fatalf("Unmarshal didn't produce same results.\n got: %#v\nwant: %#v\n", v, v2)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child.go
+deleted file mode 100644
+index 7122be0..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child.go
++++ /dev/null
+@@ -1,23 +0,0 @@
+-package etcd
+-
+-// Add a new directory with a random etcd-generated key under the given path.
+-func (c *Client) AddChildDir(key string, ttl uint64) (*Response, error) {
+-	raw, err := c.post(key, "", ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// Add a new file with a random etcd-generated key under the given path.
+-func (c *Client) AddChild(key string, value string, ttl uint64) (*Response, error) {
+-	raw, err := c.post(key, value, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child_test.go
+deleted file mode 100644
+index 26223ff..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child_test.go
++++ /dev/null
+@@ -1,73 +0,0 @@
+-package etcd
+-
+-import "testing"
+-
+-func TestAddChild(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("fooDir", true)
+-		c.Delete("nonexistentDir", true)
+-	}()
+-
+-	c.CreateDir("fooDir", 5)
+-
+-	_, err := c.AddChild("fooDir", "v0", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	_, err = c.AddChild("fooDir", "v1", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	resp, err := c.Get("fooDir", true, false)
+-	// The child with v0 should proceed the child with v1 because it's added
+-	// earlier, so it should have a lower key.
+-	if !(len(resp.Node.Nodes) == 2 && (resp.Node.Nodes[0].Value == "v0" && resp.Node.Nodes[1].Value == "v1")) {
+-		t.Fatalf("AddChild 1 failed.  There should be two chlidren whose values are v0 and v1, respectively."+
+-			"  The response was: %#v", resp)
+-	}
+-
+-	// Creating a child under a nonexistent directory should succeed.
+-	// The directory should be created.
+-	resp, err = c.AddChild("nonexistentDir", "foo", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-}
+-
+-func TestAddChildDir(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("fooDir", true)
+-		c.Delete("nonexistentDir", true)
+-	}()
+-
+-	c.CreateDir("fooDir", 5)
+-
+-	_, err := c.AddChildDir("fooDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	_, err = c.AddChildDir("fooDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	resp, err := c.Get("fooDir", true, false)
+-	// The child with v0 should proceed the child with v1 because it's added
+-	// earlier, so it should have a lower key.
+-	if !(len(resp.Node.Nodes) == 2 && (len(resp.Node.Nodes[0].Nodes) == 0 && len(resp.Node.Nodes[1].Nodes) == 0)) {
+-		t.Fatalf("AddChildDir 1 failed.  There should be two chlidren whose values are v0 and v1, respectively."+
+-			"  The response was: %#v", resp)
+-	}
+-
+-	// Creating a child under a nonexistent directory should succeed.
+-	// The directory should be created.
+-	resp, err = c.AddChildDir("nonexistentDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client.go
+deleted file mode 100644
+index f6ae548..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client.go
++++ /dev/null
+@@ -1,435 +0,0 @@
+-package etcd
+-
+-import (
+-	"crypto/tls"
+-	"crypto/x509"
+-	"encoding/json"
+-	"errors"
+-	"io"
+-	"io/ioutil"
+-	"net"
+-	"net/http"
+-	"net/url"
+-	"os"
+-	"path"
+-	"time"
+-)
+-
+-// See SetConsistency for how to use these constants.
+-const (
+-	// Using strings rather than iota because the consistency level
+-	// could be persisted to disk, so it'd be better to use
+-	// human-readable values.
+-	STRONG_CONSISTENCY = "STRONG"
+-	WEAK_CONSISTENCY   = "WEAK"
+-)
+-
+-const (
+-	defaultBufferSize = 10
+-)
+-
+-type Config struct {
+-	CertFile    string        `json:"certFile"`
+-	KeyFile     string        `json:"keyFile"`
+-	CaCertFile  []string      `json:"caCertFiles"`
+-	DialTimeout time.Duration `json:"timeout"`
+-	Consistency string        `json:"consistency"`
+-}
+-
+-type Client struct {
+-	config      Config   `json:"config"`
+-	cluster     *Cluster `json:"cluster"`
+-	httpClient  *http.Client
+-	persistence io.Writer
+-	cURLch      chan string
+-	// CheckRetry can be used to control the policy for failed requests
+-	// and modify the cluster if needed.
+-	// The client calls it before sending requests again, and
+-	// stops retrying if CheckRetry returns some error. The cases that
+-	// this function needs to handle include no response and unexpected
+-	// http status code of response.
+-	// If CheckRetry is nil, client will call the default one
+-	// `DefaultCheckRetry`.
+-	// Argument cluster is the etcd.Cluster object that these requests have been made on.
+-	// Argument numReqs is the number of http.Requests that have been made so far.
+-	// Argument lastResp is the http.Responses from the last request.
+-	// Argument err is the reason of the failure.
+-	CheckRetry func(cluster *Cluster, numReqs int,
+-		lastResp http.Response, err error) error
+-}
+-
+-// NewClient create a basic client that is configured to be used
+-// with the given machine list.
+-func NewClient(machines []string) *Client {
+-	config := Config{
+-		// default timeout is one second
+-		DialTimeout: time.Second,
+-		// default consistency level is STRONG
+-		Consistency: STRONG_CONSISTENCY,
+-	}
+-
+-	client := &Client{
+-		cluster: NewCluster(machines),
+-		config:  config,
+-	}
+-
+-	client.initHTTPClient()
+-	client.saveConfig()
+-
+-	return client
+-}
+-
+-// NewTLSClient create a basic client with TLS configuration
+-func NewTLSClient(machines []string, cert, key, caCert string) (*Client, error) {
+-	// overwrite the default machine to use https
+-	if len(machines) == 0 {
+-		machines = []string{"https://127.0.0.1:4001"}
+-	}
+-
+-	config := Config{
+-		// default timeout is one second
+-		DialTimeout: time.Second,
+-		// default consistency level is STRONG
+-		Consistency: STRONG_CONSISTENCY,
+-		CertFile:    cert,
+-		KeyFile:     key,
+-		CaCertFile:  make([]string, 0),
+-	}
+-
+-	client := &Client{
+-		cluster: NewCluster(machines),
+-		config:  config,
+-	}
+-
+-	err := client.initHTTPSClient(cert, key)
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	err = client.AddRootCA(caCert)
+-
+-	client.saveConfig()
+-
+-	return client, nil
+-}
+-
+-// NewClientFromFile creates a client from a given file path.
+-// The given file is expected to use the JSON format.
+-func NewClientFromFile(fpath string) (*Client, error) {
+-	fi, err := os.Open(fpath)
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	defer func() {
+-		if err := fi.Close(); err != nil {
+-			panic(err)
+-		}
+-	}()
+-
+-	return NewClientFromReader(fi)
+-}
+-
+-// NewClientFromReader creates a Client configured from a given reader.
+-// The configuration is expected to use the JSON format.
+-func NewClientFromReader(reader io.Reader) (*Client, error) {
+-	c := new(Client)
+-
+-	b, err := ioutil.ReadAll(reader)
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	err = json.Unmarshal(b, c)
+-	if err != nil {
+-		return nil, err
+-	}
+-	if c.config.CertFile == "" {
+-		c.initHTTPClient()
+-	} else {
+-		err = c.initHTTPSClient(c.config.CertFile, c.config.KeyFile)
+-	}
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	for _, caCert := range c.config.CaCertFile {
+-		if err := c.AddRootCA(caCert); err != nil {
+-			return nil, err
+-		}
+-	}
+-
+-	return c, nil
+-}
+-
+-// Override the Client's HTTP Transport object
+-func (c *Client) SetTransport(tr *http.Transport) {
+-	c.httpClient.Transport = tr
+-}
+-
+-// initHTTPClient initializes a HTTP client for etcd client
+-func (c *Client) initHTTPClient() {
+-	tr := &http.Transport{
+-		Dial: c.dial,
+-		TLSClientConfig: &tls.Config{
+-			InsecureSkipVerify: true,
+-		},
+-	}
+-	c.httpClient = &http.Client{Transport: tr}
+-}
+-
+-// initHTTPClient initializes a HTTPS client for etcd client
+-func (c *Client) initHTTPSClient(cert, key string) error {
+-	if cert == "" || key == "" {
+-		return errors.New("Require both cert and key path")
+-	}
+-
+-	tlsCert, err := tls.LoadX509KeyPair(cert, key)
+-	if err != nil {
+-		return err
+-	}
+-
+-	tlsConfig := &tls.Config{
+-		Certificates:       []tls.Certificate{tlsCert},
+-		InsecureSkipVerify: true,
+-	}
+-
+-	tr := &http.Transport{
+-		TLSClientConfig: tlsConfig,
+-		Dial:            c.dial,
+-	}
+-
+-	c.httpClient = &http.Client{Transport: tr}
+-	return nil
+-}
+-
+-// SetPersistence sets a writer to which the config will be
+-// written every time it's changed.
+-func (c *Client) SetPersistence(writer io.Writer) {
+-	c.persistence = writer
+-}
+-
+-// SetConsistency changes the consistency level of the client.
+-//
+-// When consistency is set to STRONG_CONSISTENCY, all requests,
+-// including GET, are sent to the leader.  This means that, assuming
+-// the absence of leader failures, GET requests are guaranteed to see
+-// the changes made by previous requests.
+-//
+-// When consistency is set to WEAK_CONSISTENCY, other requests
+-// are still sent to the leader, but GET requests are sent to a
+-// random server from the server pool.  This reduces the read
+-// load on the leader, but it's not guaranteed that the GET requests
+-// will see changes made by previous requests (they might have not
+-// yet been committed on non-leader servers).
+-func (c *Client) SetConsistency(consistency string) error {
+-	if !(consistency == STRONG_CONSISTENCY || consistency == WEAK_CONSISTENCY) {
+-		return errors.New("The argument must be either STRONG_CONSISTENCY or WEAK_CONSISTENCY.")
+-	}
+-	c.config.Consistency = consistency
+-	return nil
+-}
+-
+-// Sets the DialTimeout value
+-func (c *Client) SetDialTimeout(d time.Duration) {
+-	c.config.DialTimeout = d
+-}
+-
+-// AddRootCA adds a root CA cert for the etcd client
+-func (c *Client) AddRootCA(caCert string) error {
+-	if c.httpClient == nil {
+-		return errors.New("Client has not been initialized yet!")
+-	}
+-
+-	certBytes, err := ioutil.ReadFile(caCert)
+-	if err != nil {
+-		return err
+-	}
+-
+-	tr, ok := c.httpClient.Transport.(*http.Transport)
+-
+-	if !ok {
+-		panic("AddRootCA(): Transport type assert should not fail")
+-	}
+-
+-	if tr.TLSClientConfig.RootCAs == nil {
+-		caCertPool := x509.NewCertPool()
+-		ok = caCertPool.AppendCertsFromPEM(certBytes)
+-		if ok {
+-			tr.TLSClientConfig.RootCAs = caCertPool
+-		}
+-		tr.TLSClientConfig.InsecureSkipVerify = false
+-	} else {
+-		ok = tr.TLSClientConfig.RootCAs.AppendCertsFromPEM(certBytes)
+-	}
+-
+-	if !ok {
+-		err = errors.New("Unable to load caCert")
+-	}
+-
+-	c.config.CaCertFile = append(c.config.CaCertFile, caCert)
+-	c.saveConfig()
+-
+-	return err
+-}
+-
+-// SetCluster updates cluster information using the given machine list.
+-func (c *Client) SetCluster(machines []string) bool {
+-	success := c.internalSyncCluster(machines)
+-	return success
+-}
+-
+-func (c *Client) GetCluster() []string {
+-	return c.cluster.Machines
+-}
+-
+-// SyncCluster updates the cluster information using the internal machine list.
+-func (c *Client) SyncCluster() bool {
+-	return c.internalSyncCluster(c.cluster.Machines)
+-}
+-
+-// internalSyncCluster syncs cluster information using the given machine list.
+-func (c *Client) internalSyncCluster(machines []string) bool {
+-	for _, machine := range machines {
+-		httpPath := c.createHttpPath(machine, path.Join(version, "machines"))
+-		resp, err := c.httpClient.Get(httpPath)
+-		if err != nil {
+-			// try another machine in the cluster
+-			continue
+-		} else {
+-			b, err := ioutil.ReadAll(resp.Body)
+-			resp.Body.Close()
+-			if err != nil {
+-				// try another machine in the cluster
+-				continue
+-			}
+-
+-			// update Machines List
+-			c.cluster.updateFromStr(string(b))
+-
+-			// update leader
+-			// the first one in the machine list is the leader
+-			c.cluster.switchLeader(0)
+-
+-			logger.Debug("sync.machines ", c.cluster.Machines)
+-			c.saveConfig()
+-			return true
+-		}
+-	}
+-	return false
+-}
+-
+-// createHttpPath creates a complete HTTP URL.
+-// serverName should contain both the host name and a port number, if any.
+-func (c *Client) createHttpPath(serverName string, _path string) string {
+-	u, err := url.Parse(serverName)
+-	if err != nil {
+-		panic(err)
+-	}
+-
+-	u.Path = path.Join(u.Path, _path)
+-
+-	if u.Scheme == "" {
+-		u.Scheme = "http"
+-	}
+-	return u.String()
+-}
+-
+-// dial attempts to open a TCP connection to the provided address, explicitly
+-// enabling keep-alives with a one-second interval.
+-func (c *Client) dial(network, addr string) (net.Conn, error) {
+-	conn, err := net.DialTimeout(network, addr, c.config.DialTimeout)
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	tcpConn, ok := conn.(*net.TCPConn)
+-	if !ok {
+-		return nil, errors.New("Failed type-assertion of net.Conn as *net.TCPConn")
+-	}
+-
+-	// Keep TCP alive to check whether or not the remote machine is down
+-	if err = tcpConn.SetKeepAlive(true); err != nil {
+-		return nil, err
+-	}
+-
+-	if err = tcpConn.SetKeepAlivePeriod(time.Second); err != nil {
+-		return nil, err
+-	}
+-
+-	return tcpConn, nil
+-}
+-
+-func (c *Client) OpenCURL() {
+-	c.cURLch = make(chan string, defaultBufferSize)
+-}
+-
+-func (c *Client) CloseCURL() {
+-	c.cURLch = nil
+-}
+-
+-func (c *Client) sendCURL(command string) {
+-	go func() {
+-		select {
+-		case c.cURLch <- command:
+-		default:
+-		}
+-	}()
+-}
+-
+-func (c *Client) RecvCURL() string {
+-	return <-c.cURLch
+-}
+-
+-// saveConfig saves the current config using c.persistence.
+-func (c *Client) saveConfig() error {
+-	if c.persistence != nil {
+-		b, err := json.Marshal(c)
+-		if err != nil {
+-			return err
+-		}
+-
+-		_, err = c.persistence.Write(b)
+-		if err != nil {
+-			return err
+-		}
+-	}
+-
+-	return nil
+-}
+-
+-// MarshalJSON implements the Marshaller interface
+-// as defined by the standard JSON package.
+-func (c *Client) MarshalJSON() ([]byte, error) {
+-	b, err := json.Marshal(struct {
+-		Config  Config   `json:"config"`
+-		Cluster *Cluster `json:"cluster"`
+-	}{
+-		Config:  c.config,
+-		Cluster: c.cluster,
+-	})
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return b, nil
+-}
+-
+-// UnmarshalJSON implements the Unmarshaller interface
+-// as defined by the standard JSON package.
+-func (c *Client) UnmarshalJSON(b []byte) error {
+-	temp := struct {
+-		Config  Config   `json:"config"`
+-		Cluster *Cluster `json:"cluster"`
+-	}{}
+-	err := json.Unmarshal(b, &temp)
+-	if err != nil {
+-		return err
+-	}
+-
+-	c.cluster = temp.Cluster
+-	c.config = temp.Config
+-	return nil
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client_test.go
+deleted file mode 100644
+index c245e47..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client_test.go
++++ /dev/null
+@@ -1,96 +0,0 @@
+-package etcd
+-
+-import (
+-	"encoding/json"
+-	"fmt"
+-	"net"
+-	"net/url"
+-	"os"
+-	"testing"
+-)
+-
+-// To pass this test, we need to create a cluster of 3 machines
+-// The server should be listening on 127.0.0.1:4001, 4002, 4003
+-func TestSync(t *testing.T) {
+-	fmt.Println("Make sure there are three nodes at 0.0.0.0:4001-4003")
+-
+-	// Explicit trailing slash to ensure this doesn't reproduce:
+-	// https://github.com/coreos/go-etcd/issues/82
+-	c := NewClient([]string{"http://127.0.0.1:4001/"})
+-
+-	success := c.SyncCluster()
+-	if !success {
+-		t.Fatal("cannot sync machines")
+-	}
+-
+-	for _, m := range c.GetCluster() {
+-		u, err := url.Parse(m)
+-		if err != nil {
+-			t.Fatal(err)
+-		}
+-		if u.Scheme != "http" {
+-			t.Fatal("scheme must be http")
+-		}
+-
+-		host, _, err := net.SplitHostPort(u.Host)
+-		if err != nil {
+-			t.Fatal(err)
+-		}
+-		if host != "127.0.0.1" {
+-			t.Fatal("Host must be 127.0.0.1")
+-		}
+-	}
+-
+-	badMachines := []string{"abc", "edef"}
+-
+-	success = c.SetCluster(badMachines)
+-
+-	if success {
+-		t.Fatal("should not sync on bad machines")
+-	}
+-
+-	goodMachines := []string{"127.0.0.1:4002"}
+-
+-	success = c.SetCluster(goodMachines)
+-
+-	if !success {
+-		t.Fatal("cannot sync machines")
+-	} else {
+-		fmt.Println(c.cluster.Machines)
+-	}
+-
+-}
+-
+-func TestPersistence(t *testing.T) {
+-	c := NewClient(nil)
+-	c.SyncCluster()
+-
+-	fo, err := os.Create("config.json")
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	defer func() {
+-		if err := fo.Close(); err != nil {
+-			panic(err)
+-		}
+-	}()
+-
+-	c.SetPersistence(fo)
+-	err = c.saveConfig()
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	c2, err := NewClientFromFile("config.json")
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	// Verify that the two clients have the same config
+-	b1, _ := json.Marshal(c)
+-	b2, _ := json.Marshal(c2)
+-
+-	if string(b1) != string(b2) {
+-		t.Fatalf("The two configs should be equal!")
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/cluster.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/cluster.go
+deleted file mode 100644
+index aaa2054..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/cluster.go
++++ /dev/null
+@@ -1,51 +0,0 @@
+-package etcd
+-
+-import (
+-	"net/url"
+-	"strings"
+-)
+-
+-type Cluster struct {
+-	Leader   string   `json:"leader"`
+-	Machines []string `json:"machines"`
+-}
+-
+-func NewCluster(machines []string) *Cluster {
+-	// if an empty slice was sent in then just assume HTTP 4001 on localhost
+-	if len(machines) == 0 {
+-		machines = []string{"http://127.0.0.1:4001"}
+-	}
+-
+-	// default leader and machines
+-	return &Cluster{
+-		Leader:   machines[0],
+-		Machines: machines,
+-	}
+-}
+-
+-// switchLeader switch the current leader to machines[num]
+-func (cl *Cluster) switchLeader(num int) {
+-	logger.Debugf("switch.leader[from %v to %v]",
+-		cl.Leader, cl.Machines[num])
+-
+-	cl.Leader = cl.Machines[num]
+-}
+-
+-func (cl *Cluster) updateFromStr(machines string) {
+-	cl.Machines = strings.Split(machines, ", ")
+-}
+-
+-func (cl *Cluster) updateLeader(leader string) {
+-	logger.Debugf("update.leader[%s,%s]", cl.Leader, leader)
+-	cl.Leader = leader
+-}
+-
+-func (cl *Cluster) updateLeaderFromURL(u *url.URL) {
+-	var leader string
+-	if u.Scheme == "" {
+-		leader = "http://" + u.Host
+-	} else {
+-		leader = u.Scheme + "://" + u.Host
+-	}
+-	cl.updateLeader(leader)
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete.go
+deleted file mode 100644
+index 11131bb..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete.go
++++ /dev/null
+@@ -1,34 +0,0 @@
+-package etcd
+-
+-import "fmt"
+-
+-func (c *Client) CompareAndDelete(key string, prevValue string, prevIndex uint64) (*Response, error) {
+-	raw, err := c.RawCompareAndDelete(key, prevValue, prevIndex)
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-func (c *Client) RawCompareAndDelete(key string, prevValue string, prevIndex uint64) (*RawResponse, error) {
+-	if prevValue == "" && prevIndex == 0 {
+-		return nil, fmt.Errorf("You must give either prevValue or prevIndex.")
+-	}
+-
+-	options := Options{}
+-	if prevValue != "" {
+-		options["prevValue"] = prevValue
+-	}
+-	if prevIndex != 0 {
+-		options["prevIndex"] = prevIndex
+-	}
+-
+-	raw, err := c.delete(key, options)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw, err
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go
+deleted file mode 100644
+index 223e50f..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go
++++ /dev/null
+@@ -1,46 +0,0 @@
+-package etcd
+-
+-import (
+-	"testing"
+-)
+-
+-func TestCompareAndDelete(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-	}()
+-
+-	c.Set("foo", "bar", 5)
+-
+-	// This should succeed an correct prevValue
+-	resp, err := c.CompareAndDelete("foo", "bar", 0)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
+-		t.Fatalf("CompareAndDelete 1 prevNode failed: %#v", resp)
+-	}
+-
+-	resp, _ = c.Set("foo", "bar", 5)
+-	// This should fail because it gives an incorrect prevValue
+-	_, err = c.CompareAndDelete("foo", "xxx", 0)
+-	if err == nil {
+-		t.Fatalf("CompareAndDelete 2 should have failed.  The response is: %#v", resp)
+-	}
+-
+-	// This should succeed because it gives an correct prevIndex
+-	resp, err = c.CompareAndDelete("foo", "", resp.Node.ModifiedIndex)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
+-		t.Fatalf("CompareAndSwap 3 prevNode failed: %#v", resp)
+-	}
+-
+-	c.Set("foo", "bar", 5)
+-	// This should fail because it gives an incorrect prevIndex
+-	resp, err = c.CompareAndDelete("foo", "", 29817514)
+-	if err == nil {
+-		t.Fatalf("CompareAndDelete 4 should have failed.  The response is: %#v", resp)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap.go
+deleted file mode 100644
+index bb4f906..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap.go
++++ /dev/null
+@@ -1,36 +0,0 @@
+-package etcd
+-
+-import "fmt"
+-
+-func (c *Client) CompareAndSwap(key string, value string, ttl uint64,
+-	prevValue string, prevIndex uint64) (*Response, error) {
+-	raw, err := c.RawCompareAndSwap(key, value, ttl, prevValue, prevIndex)
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-func (c *Client) RawCompareAndSwap(key string, value string, ttl uint64,
+-	prevValue string, prevIndex uint64) (*RawResponse, error) {
+-	if prevValue == "" && prevIndex == 0 {
+-		return nil, fmt.Errorf("You must give either prevValue or prevIndex.")
+-	}
+-
+-	options := Options{}
+-	if prevValue != "" {
+-		options["prevValue"] = prevValue
+-	}
+-	if prevIndex != 0 {
+-		options["prevIndex"] = prevIndex
+-	}
+-
+-	raw, err := c.put(key, value, ttl, options)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw, err
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go
+deleted file mode 100644
+index 14a1b00..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go
++++ /dev/null
+@@ -1,57 +0,0 @@
+-package etcd
+-
+-import (
+-	"testing"
+-)
+-
+-func TestCompareAndSwap(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-	}()
+-
+-	c.Set("foo", "bar", 5)
+-
+-	// This should succeed
+-	resp, err := c.CompareAndSwap("foo", "bar2", 5, "bar", 0)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Value == "bar2" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) {
+-		t.Fatalf("CompareAndSwap 1 failed: %#v", resp)
+-	}
+-
+-	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
+-		t.Fatalf("CompareAndSwap 1 prevNode failed: %#v", resp)
+-	}
+-
+-	// This should fail because it gives an incorrect prevValue
+-	resp, err = c.CompareAndSwap("foo", "bar3", 5, "xxx", 0)
+-	if err == nil {
+-		t.Fatalf("CompareAndSwap 2 should have failed.  The response is: %#v", resp)
+-	}
+-
+-	resp, err = c.Set("foo", "bar", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	// This should succeed
+-	resp, err = c.CompareAndSwap("foo", "bar2", 5, "", resp.Node.ModifiedIndex)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Value == "bar2" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) {
+-		t.Fatalf("CompareAndSwap 3 failed: %#v", resp)
+-	}
+-
+-	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
+-		t.Fatalf("CompareAndSwap 3 prevNode failed: %#v", resp)
+-	}
+-
+-	// This should fail because it gives an incorrect prevIndex
+-	resp, err = c.CompareAndSwap("foo", "bar3", 5, "", 29817514)
+-	if err == nil {
+-		t.Fatalf("CompareAndSwap 4 should have failed.  The response is: %#v", resp)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug.go
+deleted file mode 100644
+index 0f77788..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug.go
++++ /dev/null
+@@ -1,55 +0,0 @@
+-package etcd
+-
+-import (
+-	"fmt"
+-	"io/ioutil"
+-	"log"
+-	"strings"
+-)
+-
+-var logger *etcdLogger
+-
+-func SetLogger(l *log.Logger) {
+-	logger = &etcdLogger{l}
+-}
+-
+-func GetLogger() *log.Logger {
+-	return logger.log
+-}
+-
+-type etcdLogger struct {
+-	log *log.Logger
+-}
+-
+-func (p *etcdLogger) Debug(args ...interface{}) {
+-	msg := "DEBUG: " + fmt.Sprint(args...)
+-	p.log.Println(msg)
+-}
+-
+-func (p *etcdLogger) Debugf(f string, args ...interface{}) {
+-	msg := "DEBUG: " + fmt.Sprintf(f, args...)
+-	// Append newline if necessary
+-	if !strings.HasSuffix(msg, "\n") {
+-		msg = msg + "\n"
+-	}
+-	p.log.Print(msg)
+-}
+-
+-func (p *etcdLogger) Warning(args ...interface{}) {
+-	msg := "WARNING: " + fmt.Sprint(args...)
+-	p.log.Println(msg)
+-}
+-
+-func (p *etcdLogger) Warningf(f string, args ...interface{}) {
+-	msg := "WARNING: " + fmt.Sprintf(f, args...)
+-	// Append newline if necessary
+-	if !strings.HasSuffix(msg, "\n") {
+-		msg = msg + "\n"
+-	}
+-	p.log.Print(msg)
+-}
+-
+-func init() {
+-	// Default logger uses the go default log.
+-	SetLogger(log.New(ioutil.Discard, "go-etcd", log.LstdFlags))
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug_test.go
+deleted file mode 100644
+index 97f6d11..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug_test.go
++++ /dev/null
+@@ -1,28 +0,0 @@
+-package etcd
+-
+-import (
+-	"testing"
+-)
+-
+-type Foo struct{}
+-type Bar struct {
+-	one string
+-	two int
+-}
+-
+-// Tests that logs don't panic with arbitrary interfaces
+-func TestDebug(t *testing.T) {
+-	f := &Foo{}
+-	b := &Bar{"asfd", 3}
+-	for _, test := range []interface{}{
+-		1234,
+-		"asdf",
+-		f,
+-		b,
+-	} {
+-		logger.Debug(test)
+-		logger.Debugf("something, %s", test)
+-		logger.Warning(test)
+-		logger.Warningf("something, %s", test)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete.go
+deleted file mode 100644
+index b37accd..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete.go
++++ /dev/null
+@@ -1,40 +0,0 @@
+-package etcd
+-
+-// Delete deletes the given key.
+-//
+-// When recursive set to false, if the key points to a
+-// directory the method will fail.
+-//
+-// When recursive set to true, if the key points to a file,
+-// the file will be deleted; if the key points to a directory,
+-// then everything under the directory (including all child directories)
+-// will be deleted.
+-func (c *Client) Delete(key string, recursive bool) (*Response, error) {
+-	raw, err := c.RawDelete(key, recursive, false)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// DeleteDir deletes an empty directory or a key value pair
+-func (c *Client) DeleteDir(key string) (*Response, error) {
+-	raw, err := c.RawDelete(key, false, true)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-func (c *Client) RawDelete(key string, recursive bool, dir bool) (*RawResponse, error) {
+-	ops := Options{
+-		"recursive": recursive,
+-		"dir":       dir,
+-	}
+-
+-	return c.delete(key, ops)
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete_test.go
+deleted file mode 100644
+index 5904971..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete_test.go
++++ /dev/null
+@@ -1,81 +0,0 @@
+-package etcd
+-
+-import (
+-	"testing"
+-)
+-
+-func TestDelete(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-	}()
+-
+-	c.Set("foo", "bar", 5)
+-	resp, err := c.Delete("foo", false)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Node.Value == "") {
+-		t.Fatalf("Delete failed with %s", resp.Node.Value)
+-	}
+-
+-	if !(resp.PrevNode.Value == "bar") {
+-		t.Fatalf("Delete PrevNode failed with %s", resp.Node.Value)
+-	}
+-
+-	resp, err = c.Delete("foo", false)
+-	if err == nil {
+-		t.Fatalf("Delete should have failed because the key foo did not exist.  "+
+-			"The response was: %v", resp)
+-	}
+-}
+-
+-func TestDeleteAll(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-		c.Delete("fooDir", true)
+-	}()
+-
+-	c.SetDir("foo", 5)
+-	// test delete an empty dir
+-	resp, err := c.DeleteDir("foo")
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Node.Value == "") {
+-		t.Fatalf("DeleteAll 1 failed: %#v", resp)
+-	}
+-
+-	if !(resp.PrevNode.Dir == true && resp.PrevNode.Value == "") {
+-		t.Fatalf("DeleteAll 1 PrevNode failed: %#v", resp)
+-	}
+-
+-	c.CreateDir("fooDir", 5)
+-	c.Set("fooDir/foo", "bar", 5)
+-	_, err = c.DeleteDir("fooDir")
+-	if err == nil {
+-		t.Fatal("should not able to delete a non-empty dir with deletedir")
+-	}
+-
+-	resp, err = c.Delete("fooDir", true)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Node.Value == "") {
+-		t.Fatalf("DeleteAll 2 failed: %#v", resp)
+-	}
+-
+-	if !(resp.PrevNode.Dir == true && resp.PrevNode.Value == "") {
+-		t.Fatalf("DeleteAll 2 PrevNode failed: %#v", resp)
+-	}
+-
+-	resp, err = c.Delete("foo", true)
+-	if err == nil {
+-		t.Fatalf("DeleteAll should have failed because the key foo did not exist.  "+
+-			"The response was: %v", resp)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/error.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/error.go
+deleted file mode 100644
+index 7e69287..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/error.go
++++ /dev/null
+@@ -1,48 +0,0 @@
+-package etcd
+-
+-import (
+-	"encoding/json"
+-	"fmt"
+-)
+-
+-const (
+-	ErrCodeEtcdNotReachable = 501
+-)
+-
+-var (
+-	errorMap = map[int]string{
+-		ErrCodeEtcdNotReachable: "All the given peers are not reachable",
+-	}
+-)
+-
+-type EtcdError struct {
+-	ErrorCode int    `json:"errorCode"`
+-	Message   string `json:"message"`
+-	Cause     string `json:"cause,omitempty"`
+-	Index     uint64 `json:"index"`
+-}
+-
+-func (e EtcdError) Error() string {
+-	return fmt.Sprintf("%v: %v (%v) [%v]", e.ErrorCode, e.Message, e.Cause, e.Index)
+-}
+-
+-func newError(errorCode int, cause string, index uint64) *EtcdError {
+-	return &EtcdError{
+-		ErrorCode: errorCode,
+-		Message:   errorMap[errorCode],
+-		Cause:     cause,
+-		Index:     index,
+-	}
+-}
+-
+-func handleError(b []byte) error {
+-	etcdErr := new(EtcdError)
+-
+-	err := json.Unmarshal(b, etcdErr)
+-	if err != nil {
+-		logger.Warningf("cannot unmarshal etcd error: %v", err)
+-		return err
+-	}
+-
+-	return etcdErr
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get.go
+deleted file mode 100644
+index 976bf07..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get.go
++++ /dev/null
+@@ -1,27 +0,0 @@
+-package etcd
+-
+-// Get gets the file or directory associated with the given key.
+-// If the key points to a directory, files and directories under
+-// it will be returned in sorted or unsorted order, depending on
+-// the sort flag.
+-// If recursive is set to false, contents under child directories
+-// will not be returned.
+-// If recursive is set to true, all the contents will be returned.
+-func (c *Client) Get(key string, sort, recursive bool) (*Response, error) {
+-	raw, err := c.RawGet(key, sort, recursive)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-func (c *Client) RawGet(key string, sort, recursive bool) (*RawResponse, error) {
+-	ops := Options{
+-		"recursive": recursive,
+-		"sorted":    sort,
+-	}
+-
+-	return c.get(key, ops)
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get_test.go
+deleted file mode 100644
+index 279c4e2..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get_test.go
++++ /dev/null
+@@ -1,131 +0,0 @@
+-package etcd
+-
+-import (
+-	"reflect"
+-	"testing"
+-)
+-
+-// cleanNode scrubs Expiration, ModifiedIndex and CreatedIndex of a node.
+-func cleanNode(n *Node) {
+-	n.Expiration = nil
+-	n.ModifiedIndex = 0
+-	n.CreatedIndex = 0
+-}
+-
+-// cleanResult scrubs a result object two levels deep of Expiration,
+-// ModifiedIndex and CreatedIndex.
+-func cleanResult(result *Response) {
+-	//  TODO(philips): make this recursive.
+-	cleanNode(result.Node)
+-	for i, _ := range result.Node.Nodes {
+-		cleanNode(result.Node.Nodes[i])
+-		for j, _ := range result.Node.Nodes[i].Nodes {
+-			cleanNode(result.Node.Nodes[i].Nodes[j])
+-		}
+-	}
+-}
+-
+-func TestGet(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-	}()
+-
+-	c.Set("foo", "bar", 5)
+-
+-	result, err := c.Get("foo", false, false)
+-
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if result.Node.Key != "/foo" || result.Node.Value != "bar" {
+-		t.Fatalf("Get failed with %s %s %v", result.Node.Key, result.Node.Value, result.Node.TTL)
+-	}
+-
+-	result, err = c.Get("goo", false, false)
+-	if err == nil {
+-		t.Fatalf("should not be able to get non-exist key")
+-	}
+-}
+-
+-func TestGetAll(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("fooDir", true)
+-	}()
+-
+-	c.CreateDir("fooDir", 5)
+-	c.Set("fooDir/k0", "v0", 5)
+-	c.Set("fooDir/k1", "v1", 5)
+-
+-	// Return kv-pairs in sorted order
+-	result, err := c.Get("fooDir", true, false)
+-
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	expected := Nodes{
+-		&Node{
+-			Key:   "/fooDir/k0",
+-			Value: "v0",
+-			TTL:   5,
+-		},
+-		&Node{
+-			Key:   "/fooDir/k1",
+-			Value: "v1",
+-			TTL:   5,
+-		},
+-	}
+-
+-	cleanResult(result)
+-
+-	if !reflect.DeepEqual(result.Node.Nodes, expected) {
+-		t.Fatalf("(actual) %v != (expected) %v", result.Node.Nodes, expected)
+-	}
+-
+-	// Test the `recursive` option
+-	c.CreateDir("fooDir/childDir", 5)
+-	c.Set("fooDir/childDir/k2", "v2", 5)
+-
+-	// Return kv-pairs in sorted order
+-	result, err = c.Get("fooDir", true, true)
+-
+-	cleanResult(result)
+-
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	expected = Nodes{
+-		&Node{
+-			Key: "/fooDir/childDir",
+-			Dir: true,
+-			Nodes: Nodes{
+-				&Node{
+-					Key:   "/fooDir/childDir/k2",
+-					Value: "v2",
+-					TTL:   5,
+-				},
+-			},
+-			TTL: 5,
+-		},
+-		&Node{
+-			Key:   "/fooDir/k0",
+-			Value: "v0",
+-			TTL:   5,
+-		},
+-		&Node{
+-			Key:   "/fooDir/k1",
+-			Value: "v1",
+-			TTL:   5,
+-		},
+-	}
+-
+-	cleanResult(result)
+-
+-	if !reflect.DeepEqual(result.Node.Nodes, expected) {
+-		t.Fatalf("(actual) %v != (expected) %v", result.Node.Nodes, expected)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/options.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/options.go
+deleted file mode 100644
+index 701c9b3..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/options.go
++++ /dev/null
+@@ -1,72 +0,0 @@
+-package etcd
+-
+-import (
+-	"fmt"
+-	"net/url"
+-	"reflect"
+-)
+-
+-type Options map[string]interface{}
+-
+-// An internally-used data structure that represents a mapping
+-// between valid options and their kinds
+-type validOptions map[string]reflect.Kind
+-
+-// Valid options for GET, PUT, POST, DELETE
+-// Using CAPITALIZED_UNDERSCORE to emphasize that these
+-// values are meant to be used as constants.
+-var (
+-	VALID_GET_OPTIONS = validOptions{
+-		"recursive":  reflect.Bool,
+-		"consistent": reflect.Bool,
+-		"sorted":     reflect.Bool,
+-		"wait":       reflect.Bool,
+-		"waitIndex":  reflect.Uint64,
+-	}
+-
+-	VALID_PUT_OPTIONS = validOptions{
+-		"prevValue": reflect.String,
+-		"prevIndex": reflect.Uint64,
+-		"prevExist": reflect.Bool,
+-		"dir":       reflect.Bool,
+-	}
+-
+-	VALID_POST_OPTIONS = validOptions{}
+-
+-	VALID_DELETE_OPTIONS = validOptions{
+-		"recursive": reflect.Bool,
+-		"dir":       reflect.Bool,
+-		"prevValue": reflect.String,
+-		"prevIndex": reflect.Uint64,
+-	}
+-)
+-
+-// Convert options to a string of HTML parameters
+-func (ops Options) toParameters(validOps validOptions) (string, error) {
+-	p := "?"
+-	values := url.Values{}
+-
+-	if ops == nil {
+-		return "", nil
+-	}
+-
+-	for k, v := range ops {
+-		// Check if the given option is valid (that it exists)
+-		kind := validOps[k]
+-		if kind == reflect.Invalid {
+-			return "", fmt.Errorf("Invalid option: %v", k)
+-		}
+-
+-		// Check if the given option is of the valid type
+-		t := reflect.TypeOf(v)
+-		if kind != t.Kind() {
+-			return "", fmt.Errorf("Option %s should be of %v kind, not of %v kind.",
+-				k, kind, t.Kind())
+-		}
+-
+-		values.Set(k, fmt.Sprintf("%v", v))
+-	}
+-
+-	p += values.Encode()
+-	return p, nil
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/requests.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/requests.go
+deleted file mode 100644
+index 5d8b45a..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/requests.go
++++ /dev/null
+@@ -1,377 +0,0 @@
+-package etcd
+-
+-import (
+-	"errors"
+-	"fmt"
+-	"io/ioutil"
+-	"math/rand"
+-	"net/http"
+-	"net/url"
+-	"path"
+-	"strings"
+-	"sync"
+-	"time"
+-)
+-
+-// Errors introduced by handling requests
+-var (
+-	ErrRequestCancelled = errors.New("sending request is cancelled")
+-)
+-
+-type RawRequest struct {
+-	Method       string
+-	RelativePath string
+-	Values       url.Values
+-	Cancel       <-chan bool
+-}
+-
+-// NewRawRequest returns a new RawRequest
+-func NewRawRequest(method, relativePath string, values url.Values, cancel <-chan bool) *RawRequest {
+-	return &RawRequest{
+-		Method:       method,
+-		RelativePath: relativePath,
+-		Values:       values,
+-		Cancel:       cancel,
+-	}
+-}
+-
+-// getCancelable issues a cancelable GET request
+-func (c *Client) getCancelable(key string, options Options,
+-	cancel <-chan bool) (*RawResponse, error) {
+-	logger.Debugf("get %s [%s]", key, c.cluster.Leader)
+-	p := keyToPath(key)
+-
+-	// If consistency level is set to STRONG, append
+-	// the `consistent` query string.
+-	if c.config.Consistency == STRONG_CONSISTENCY {
+-		options["consistent"] = true
+-	}
+-
+-	str, err := options.toParameters(VALID_GET_OPTIONS)
+-	if err != nil {
+-		return nil, err
+-	}
+-	p += str
+-
+-	req := NewRawRequest("GET", p, nil, cancel)
+-	resp, err := c.SendRequest(req)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return resp, nil
+-}
+-
+-// get issues a GET request
+-func (c *Client) get(key string, options Options) (*RawResponse, error) {
+-	return c.getCancelable(key, options, nil)
+-}
+-
+-// put issues a PUT request
+-func (c *Client) put(key string, value string, ttl uint64,
+-	options Options) (*RawResponse, error) {
+-
+-	logger.Debugf("put %s, %s, ttl: %d, [%s]", key, value, ttl, c.cluster.Leader)
+-	p := keyToPath(key)
+-
+-	str, err := options.toParameters(VALID_PUT_OPTIONS)
+-	if err != nil {
+-		return nil, err
+-	}
+-	p += str
+-
+-	req := NewRawRequest("PUT", p, buildValues(value, ttl), nil)
+-	resp, err := c.SendRequest(req)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return resp, nil
+-}
+-
+-// post issues a POST request
+-func (c *Client) post(key string, value string, ttl uint64) (*RawResponse, error) {
+-	logger.Debugf("post %s, %s, ttl: %d, [%s]", key, value, ttl, c.cluster.Leader)
+-	p := keyToPath(key)
+-
+-	req := NewRawRequest("POST", p, buildValues(value, ttl), nil)
+-	resp, err := c.SendRequest(req)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return resp, nil
+-}
+-
+-// delete issues a DELETE request
+-func (c *Client) delete(key string, options Options) (*RawResponse, error) {
+-	logger.Debugf("delete %s [%s]", key, c.cluster.Leader)
+-	p := keyToPath(key)
+-
+-	str, err := options.toParameters(VALID_DELETE_OPTIONS)
+-	if err != nil {
+-		return nil, err
+-	}
+-	p += str
+-
+-	req := NewRawRequest("DELETE", p, nil, nil)
+-	resp, err := c.SendRequest(req)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return resp, nil
+-}
+-
+-// SendRequest sends a HTTP request and returns a Response as defined by etcd
+-func (c *Client) SendRequest(rr *RawRequest) (*RawResponse, error) {
+-
+-	var req *http.Request
+-	var resp *http.Response
+-	var httpPath string
+-	var err error
+-	var respBody []byte
+-
+-	var numReqs = 1
+-
+-	checkRetry := c.CheckRetry
+-	if checkRetry == nil {
+-		checkRetry = DefaultCheckRetry
+-	}
+-
+-	cancelled := make(chan bool, 1)
+-	reqLock := new(sync.Mutex)
+-
+-	if rr.Cancel != nil {
+-		cancelRoutine := make(chan bool)
+-		defer close(cancelRoutine)
+-
+-		go func() {
+-			select {
+-			case <-rr.Cancel:
+-				cancelled <- true
+-				logger.Debug("send.request is cancelled")
+-			case <-cancelRoutine:
+-				return
+-			}
+-
+-			// Repeat canceling request until this thread is stopped
+-			// because we have no idea about whether it succeeds.
+-			for {
+-				reqLock.Lock()
+-				c.httpClient.Transport.(*http.Transport).CancelRequest(req)
+-				reqLock.Unlock()
+-
+-				select {
+-				case <-time.After(100 * time.Millisecond):
+-				case <-cancelRoutine:
+-					return
+-				}
+-			}
+-		}()
+-	}
+-
+-	// If we connect to a follower and consistency is required, retry until
+-	// we connect to a leader
+-	sleep := 25 * time.Millisecond
+-	maxSleep := time.Second
+-	for attempt := 0; ; attempt++ {
+-		if attempt > 0 {
+-			select {
+-			case <-cancelled:
+-				return nil, ErrRequestCancelled
+-			case <-time.After(sleep):
+-				sleep = sleep * 2
+-				if sleep > maxSleep {
+-					sleep = maxSleep
+-				}
+-			}
+-		}
+-
+-		logger.Debug("Connecting to etcd: attempt", attempt+1, "for", rr.RelativePath)
+-
+-		if rr.Method == "GET" && c.config.Consistency == WEAK_CONSISTENCY {
+-			// If it's a GET and consistency level is set to WEAK,
+-			// then use a random machine.
+-			httpPath = c.getHttpPath(true, rr.RelativePath)
+-		} else {
+-			// Else use the leader.
+-			httpPath = c.getHttpPath(false, rr.RelativePath)
+-		}
+-
+-		// Return a cURL command if curlChan is set
+-		if c.cURLch != nil {
+-			command := fmt.Sprintf("curl -X %s %s", rr.Method, httpPath)
+-			for key, value := range rr.Values {
+-				command += fmt.Sprintf(" -d %s=%s", key, value[0])
+-			}
+-			c.sendCURL(command)
+-		}
+-
+-		logger.Debug("send.request.to ", httpPath, " | method ", rr.Method)
+-
+-		reqLock.Lock()
+-		if rr.Values == nil {
+-			if req, err = http.NewRequest(rr.Method, httpPath, nil); err != nil {
+-				return nil, err
+-			}
+-		} else {
+-			body := strings.NewReader(rr.Values.Encode())
+-			if req, err = http.NewRequest(rr.Method, httpPath, body); err != nil {
+-				return nil, err
+-			}
+-
+-			req.Header.Set("Content-Type",
+-				"application/x-www-form-urlencoded; param=value")
+-		}
+-		reqLock.Unlock()
+-
+-		resp, err = c.httpClient.Do(req)
+-		defer func() {
+-			if resp != nil {
+-				resp.Body.Close()
+-			}
+-		}()
+-
+-		// If the request was cancelled, return ErrRequestCancelled directly
+-		select {
+-		case <-cancelled:
+-			return nil, ErrRequestCancelled
+-		default:
+-		}
+-
+-		numReqs++
+-
+-		// network error, change a machine!
+-		if err != nil {
+-			logger.Debug("network error:", err.Error())
+-			lastResp := http.Response{}
+-			if checkErr := checkRetry(c.cluster, numReqs, lastResp, err); checkErr != nil {
+-				return nil, checkErr
+-			}
+-
+-			c.cluster.switchLeader(attempt % len(c.cluster.Machines))
+-			continue
+-		}
+-
+-		// if there is no error, it should receive response
+-		logger.Debug("recv.response.from", httpPath)
+-
+-		if validHttpStatusCode[resp.StatusCode] {
+-			// try to read byte code and break the loop
+-			respBody, err = ioutil.ReadAll(resp.Body)
+-			if err == nil {
+-				logger.Debug("recv.success.", httpPath)
+-				break
+-			}
+-			// ReadAll error may be caused due to cancel request
+-			select {
+-			case <-cancelled:
+-				return nil, ErrRequestCancelled
+-			default:
+-			}
+-		}
+-
+-		// if resp is TemporaryRedirect, set the new leader and retry
+-		if resp.StatusCode == http.StatusTemporaryRedirect {
+-			u, err := resp.Location()
+-
+-			if err != nil {
+-				logger.Warning(err)
+-			} else {
+-				// Update cluster leader based on redirect location
+-				// because it should point to the leader address
+-				c.cluster.updateLeaderFromURL(u)
+-				logger.Debug("recv.response.relocate", u.String())
+-			}
+-			resp.Body.Close()
+-			continue
+-		}
+-
+-		if checkErr := checkRetry(c.cluster, numReqs, *resp,
+-			errors.New("Unexpected HTTP status code")); checkErr != nil {
+-			return nil, checkErr
+-		}
+-		resp.Body.Close()
+-	}
+-
+-	r := &RawResponse{
+-		StatusCode: resp.StatusCode,
+-		Body:       respBody,
+-		Header:     resp.Header,
+-	}
+-
+-	return r, nil
+-}
+-
+-// DefaultCheckRetry defines the retrying behaviour for bad HTTP requests
+-// If we have retried 2 * machine number, stop retrying.
+-// If status code is InternalServerError, sleep for 200ms.
+-func DefaultCheckRetry(cluster *Cluster, numReqs int, lastResp http.Response,
+-	err error) error {
+-
+-	if numReqs >= 2*len(cluster.Machines) {
+-		return newError(ErrCodeEtcdNotReachable,
+-			"Tried to connect to each peer twice and failed", 0)
+-	}
+-
+-	code := lastResp.StatusCode
+-	if code == http.StatusInternalServerError {
+-		time.Sleep(time.Millisecond * 200)
+-
+-	}
+-
+-	logger.Warning("bad response status code", code)
+-	return nil
+-}
+-
+-func (c *Client) getHttpPath(random bool, s ...string) string {
+-	var machine string
+-	if random {
+-		machine = c.cluster.Machines[rand.Intn(len(c.cluster.Machines))]
+-	} else {
+-		machine = c.cluster.Leader
+-	}
+-
+-	fullPath := machine + "/" + version
+-	for _, seg := range s {
+-		fullPath = fullPath + "/" + seg
+-	}
+-
+-	return fullPath
+-}
+-
+-// buildValues builds a url.Values map according to the given value and ttl
+-func buildValues(value string, ttl uint64) url.Values {
+-	v := url.Values{}
+-
+-	if value != "" {
+-		v.Set("value", value)
+-	}
+-
+-	if ttl > 0 {
+-		v.Set("ttl", fmt.Sprintf("%v", ttl))
+-	}
+-
+-	return v
+-}
+-
+-// convert key string to http path exclude version
+-// for example: key[foo] -> path[keys/foo]
+-// key[/] -> path[keys/]
+-func keyToPath(key string) string {
+-	p := path.Join("keys", key)
+-
+-	// corner case: if key is "/" or "//" ect
+-	// path join will clear the tailing "/"
+-	// we need to add it back
+-	if p == "keys" {
+-		p = "keys/"
+-	}
+-
+-	return p
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/response.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/response.go
+deleted file mode 100644
+index 1fe9b4e..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/response.go
++++ /dev/null
+@@ -1,89 +0,0 @@
+-package etcd
+-
+-import (
+-	"encoding/json"
+-	"net/http"
+-	"strconv"
+-	"time"
+-)
+-
+-const (
+-	rawResponse = iota
+-	normalResponse
+-)
+-
+-type responseType int
+-
+-type RawResponse struct {
+-	StatusCode int
+-	Body       []byte
+-	Header     http.Header
+-}
+-
+-var (
+-	validHttpStatusCode = map[int]bool{
+-		http.StatusCreated:            true,
+-		http.StatusOK:                 true,
+-		http.StatusBadRequest:         true,
+-		http.StatusNotFound:           true,
+-		http.StatusPreconditionFailed: true,
+-		http.StatusForbidden:          true,
+-	}
+-)
+-
+-// Unmarshal parses RawResponse and stores the result in Response
+-func (rr *RawResponse) Unmarshal() (*Response, error) {
+-	if rr.StatusCode != http.StatusOK && rr.StatusCode != http.StatusCreated {
+-		return nil, handleError(rr.Body)
+-	}
+-
+-	resp := new(Response)
+-
+-	err := json.Unmarshal(rr.Body, resp)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	// attach index and term to response
+-	resp.EtcdIndex, _ = strconv.ParseUint(rr.Header.Get("X-Etcd-Index"), 10, 64)
+-	resp.RaftIndex, _ = strconv.ParseUint(rr.Header.Get("X-Raft-Index"), 10, 64)
+-	resp.RaftTerm, _ = strconv.ParseUint(rr.Header.Get("X-Raft-Term"), 10, 64)
+-
+-	return resp, nil
+-}
+-
+-type Response struct {
+-	Action    string `json:"action"`
+-	Node      *Node  `json:"node"`
+-	PrevNode  *Node  `json:"prevNode,omitempty"`
+-	EtcdIndex uint64 `json:"etcdIndex"`
+-	RaftIndex uint64 `json:"raftIndex"`
+-	RaftTerm  uint64 `json:"raftTerm"`
+-}
+-
+-type Node struct {
+-	Key           string     `json:"key, omitempty"`
+-	Value         string     `json:"value,omitempty"`
+-	Dir           bool       `json:"dir,omitempty"`
+-	Expiration    *time.Time `json:"expiration,omitempty"`
+-	TTL           int64      `json:"ttl,omitempty"`
+-	Nodes         Nodes      `json:"nodes,omitempty"`
+-	ModifiedIndex uint64     `json:"modifiedIndex,omitempty"`
+-	CreatedIndex  uint64     `json:"createdIndex,omitempty"`
+-}
+-
+-type Nodes []*Node
+-
+-// interfaces for sorting
+-func (ns Nodes) Len() int {
+-	return len(ns)
+-}
+-
+-func (ns Nodes) Less(i, j int) bool {
+-	return ns[i].Key < ns[j].Key
+-}
+-
+-func (ns Nodes) Swap(i, j int) {
+-	ns[i], ns[j] = ns[j], ns[i]
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go
+deleted file mode 100644
+index 756e317..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go
++++ /dev/null
+@@ -1,42 +0,0 @@
+-package etcd
+-
+-import (
+-	"fmt"
+-	"testing"
+-)
+-
+-func TestSetCurlChan(t *testing.T) {
+-	c := NewClient(nil)
+-	c.OpenCURL()
+-
+-	defer func() {
+-		c.Delete("foo", true)
+-	}()
+-
+-	_, err := c.Set("foo", "bar", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	expected := fmt.Sprintf("curl -X PUT %s/v2/keys/foo -d value=bar -d ttl=5",
+-		c.cluster.Leader)
+-	actual := c.RecvCURL()
+-	if expected != actual {
+-		t.Fatalf(`Command "%s" is not equal to expected value "%s"`,
+-			actual, expected)
+-	}
+-
+-	c.SetConsistency(STRONG_CONSISTENCY)
+-	_, err = c.Get("foo", false, false)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	expected = fmt.Sprintf("curl -X GET %s/v2/keys/foo?consistent=true&recursive=false&sorted=false",
+-		c.cluster.Leader)
+-	actual = c.RecvCURL()
+-	if expected != actual {
+-		t.Fatalf(`Command "%s" is not equal to expected value "%s"`,
+-			actual, expected)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create.go
+deleted file mode 100644
+index cb0d567..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create.go
++++ /dev/null
+@@ -1,137 +0,0 @@
+-package etcd
+-
+-// Set sets the given key to the given value.
+-// It will create a new key value pair or replace the old one.
+-// It will not replace a existing directory.
+-func (c *Client) Set(key string, value string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawSet(key, value, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// Set sets the given key to a directory.
+-// It will create a new directory or replace the old key value pair by a directory.
+-// It will not replace a existing directory.
+-func (c *Client) SetDir(key string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawSetDir(key, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// CreateDir creates a directory. It succeeds only if
+-// the given key does not yet exist.
+-func (c *Client) CreateDir(key string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawCreateDir(key, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// UpdateDir updates the given directory. It succeeds only if the
+-// given key already exists.
+-func (c *Client) UpdateDir(key string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawUpdateDir(key, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// Create creates a file with the given value under the given key.  It succeeds
+-// only if the given key does not yet exist.
+-func (c *Client) Create(key string, value string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawCreate(key, value, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// CreateInOrder creates a file with a key that's guaranteed to be higher than other
+-// keys in the given directory. It is useful for creating queues.
+-func (c *Client) CreateInOrder(dir string, value string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawCreateInOrder(dir, value, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-// Update updates the given key to the given value.  It succeeds only if the
+-// given key already exists.
+-func (c *Client) Update(key string, value string, ttl uint64) (*Response, error) {
+-	raw, err := c.RawUpdate(key, value, ttl)
+-
+-	if err != nil {
+-		return nil, err
+-	}
+-
+-	return raw.Unmarshal()
+-}
+-
+-func (c *Client) RawUpdateDir(key string, ttl uint64) (*RawResponse, error) {
+-	ops := Options{
+-		"prevExist": true,
+-		"dir":       true,
+-	}
+-
+-	return c.put(key, "", ttl, ops)
+-}
+-
+-func (c *Client) RawCreateDir(key string, ttl uint64) (*RawResponse, error) {
+-	ops := Options{
+-		"prevExist": false,
+-		"dir":       true,
+-	}
+-
+-	return c.put(key, "", ttl, ops)
+-}
+-
+-func (c *Client) RawSet(key string, value string, ttl uint64) (*RawResponse, error) {
+-	return c.put(key, value, ttl, nil)
+-}
+-
+-func (c *Client) RawSetDir(key string, ttl uint64) (*RawResponse, error) {
+-	ops := Options{
+-		"dir": true,
+-	}
+-
+-	return c.put(key, "", ttl, ops)
+-}
+-
+-func (c *Client) RawUpdate(key string, value string, ttl uint64) (*RawResponse, error) {
+-	ops := Options{
+-		"prevExist": true,
+-	}
+-
+-	return c.put(key, value, ttl, ops)
+-}
+-
+-func (c *Client) RawCreate(key string, value string, ttl uint64) (*RawResponse, error) {
+-	ops := Options{
+-		"prevExist": false,
+-	}
+-
+-	return c.put(key, value, ttl, ops)
+-}
+-
+-func (c *Client) RawCreateInOrder(dir string, value string, ttl uint64) (*RawResponse, error) {
+-	return c.post(dir, value, ttl)
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create_test.go
+deleted file mode 100644
+index ced0f06..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create_test.go
++++ /dev/null
+@@ -1,241 +0,0 @@
+-package etcd
+-
+-import (
+-	"testing"
+-)
+-
+-func TestSet(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-	}()
+-
+-	resp, err := c.Set("foo", "bar", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if resp.Node.Key != "/foo" || resp.Node.Value != "bar" || resp.Node.TTL != 5 {
+-		t.Fatalf("Set 1 failed: %#v", resp)
+-	}
+-	if resp.PrevNode != nil {
+-		t.Fatalf("Set 1 PrevNode failed: %#v", resp)
+-	}
+-
+-	resp, err = c.Set("foo", "bar2", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/foo" && resp.Node.Value == "bar2" && resp.Node.TTL == 5) {
+-		t.Fatalf("Set 2 failed: %#v", resp)
+-	}
+-	if resp.PrevNode.Key != "/foo" || resp.PrevNode.Value != "bar" || resp.Node.TTL != 5 {
+-		t.Fatalf("Set 2 PrevNode failed: %#v", resp)
+-	}
+-}
+-
+-func TestUpdate(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-		c.Delete("nonexistent", true)
+-	}()
+-
+-	resp, err := c.Set("foo", "bar", 5)
+-
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	// This should succeed.
+-	resp, err = c.Update("foo", "wakawaka", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Action == "update" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) {
+-		t.Fatalf("Update 1 failed: %#v", resp)
+-	}
+-	if !(resp.PrevNode.Key == "/foo" && resp.PrevNode.Value == "bar" && resp.Node.TTL == 5) {
+-		t.Fatalf("Update 1 prevValue failed: %#v", resp)
+-	}
+-
+-	// This should fail because the key does not exist.
+-	resp, err = c.Update("nonexistent", "whatever", 5)
+-	if err == nil {
+-		t.Fatalf("The key %v did not exist, so the update should have failed."+
+-			"The response was: %#v", resp.Node.Key, resp)
+-	}
+-}
+-
+-func TestCreate(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("newKey", true)
+-	}()
+-
+-	newKey := "/newKey"
+-	newValue := "/newValue"
+-
+-	// This should succeed
+-	resp, err := c.Create(newKey, newValue, 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Action == "create" && resp.Node.Key == newKey &&
+-		resp.Node.Value == newValue && resp.Node.TTL == 5) {
+-		t.Fatalf("Create 1 failed: %#v", resp)
+-	}
+-	if resp.PrevNode != nil {
+-		t.Fatalf("Create 1 PrevNode failed: %#v", resp)
+-	}
+-
+-	// This should fail, because the key is already there
+-	resp, err = c.Create(newKey, newValue, 5)
+-	if err == nil {
+-		t.Fatalf("The key %v did exist, so the creation should have failed."+
+-			"The response was: %#v", resp.Node.Key, resp)
+-	}
+-}
+-
+-func TestCreateInOrder(t *testing.T) {
+-	c := NewClient(nil)
+-	dir := "/queue"
+-	defer func() {
+-		c.DeleteDir(dir)
+-	}()
+-
+-	var firstKey, secondKey string
+-
+-	resp, err := c.CreateInOrder(dir, "1", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Action == "create" && resp.Node.Value == "1" && resp.Node.TTL == 5) {
+-		t.Fatalf("Create 1 failed: %#v", resp)
+-	}
+-
+-	firstKey = resp.Node.Key
+-
+-	resp, err = c.CreateInOrder(dir, "2", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Action == "create" && resp.Node.Value == "2" && resp.Node.TTL == 5) {
+-		t.Fatalf("Create 2 failed: %#v", resp)
+-	}
+-
+-	secondKey = resp.Node.Key
+-
+-	if firstKey >= secondKey {
+-		t.Fatalf("Expected first key to be greater than second key, but %s is not greater than %s",
+-			firstKey, secondKey)
+-	}
+-}
+-
+-func TestSetDir(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("foo", true)
+-		c.Delete("fooDir", true)
+-	}()
+-
+-	resp, err := c.CreateDir("fooDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/fooDir" && resp.Node.Value == "" && resp.Node.TTL == 5) {
+-		t.Fatalf("SetDir 1 failed: %#v", resp)
+-	}
+-	if resp.PrevNode != nil {
+-		t.Fatalf("SetDir 1 PrevNode failed: %#v", resp)
+-	}
+-
+-	// This should fail because /fooDir already points to a directory
+-	resp, err = c.CreateDir("/fooDir", 5)
+-	if err == nil {
+-		t.Fatalf("fooDir already points to a directory, so SetDir should have failed."+
+-			"The response was: %#v", resp)
+-	}
+-
+-	_, err = c.Set("foo", "bar", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	// This should succeed
+-	// It should replace the key
+-	resp, err = c.SetDir("foo", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/foo" && resp.Node.Value == "" && resp.Node.TTL == 5) {
+-		t.Fatalf("SetDir 2 failed: %#v", resp)
+-	}
+-	if !(resp.PrevNode.Key == "/foo" && resp.PrevNode.Value == "bar" && resp.PrevNode.TTL == 5) {
+-		t.Fatalf("SetDir 2 failed: %#v", resp)
+-	}
+-}
+-
+-func TestUpdateDir(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("fooDir", true)
+-	}()
+-
+-	resp, err := c.CreateDir("fooDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	// This should succeed.
+-	resp, err = c.UpdateDir("fooDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Action == "update" && resp.Node.Key == "/fooDir" &&
+-		resp.Node.Value == "" && resp.Node.TTL == 5) {
+-		t.Fatalf("UpdateDir 1 failed: %#v", resp)
+-	}
+-	if !(resp.PrevNode.Key == "/fooDir" && resp.PrevNode.Dir == true && resp.PrevNode.TTL == 5) {
+-		t.Fatalf("UpdateDir 1 PrevNode failed: %#v", resp)
+-	}
+-
+-	// This should fail because the key does not exist.
+-	resp, err = c.UpdateDir("nonexistentDir", 5)
+-	if err == nil {
+-		t.Fatalf("The key %v did not exist, so the update should have failed."+
+-			"The response was: %#v", resp.Node.Key, resp)
+-	}
+-}
+-
+-func TestCreateDir(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("fooDir", true)
+-	}()
+-
+-	// This should succeed
+-	resp, err := c.CreateDir("fooDir", 5)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if !(resp.Action == "create" && resp.Node.Key == "/fooDir" &&
+-		resp.Node.Value == "" && resp.Node.TTL == 5) {
+-		t.Fatalf("CreateDir 1 failed: %#v", resp)
+-	}
+-	if resp.PrevNode != nil {
+-		t.Fatalf("CreateDir 1 PrevNode failed: %#v", resp)
+-	}
+-
+-	// This should fail, because the key is already there
+-	resp, err = c.CreateDir("fooDir", 5)
+-	if err == nil {
+-		t.Fatalf("The key %v did exist, so the creation should have failed."+
+-			"The response was: %#v", resp.Node.Key, resp)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/version.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/version.go
+deleted file mode 100644
+index b3d05df..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/version.go
++++ /dev/null
+@@ -1,3 +0,0 @@
+-package etcd
+-
+-const version = "v2"
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch.go
+deleted file mode 100644
+index aa8d3df..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch.go
++++ /dev/null
+@@ -1,103 +0,0 @@
+-package etcd
+-
+-import (
+-	"errors"
+-)
+-
+-// Errors introduced by the Watch command.
+-var (
+-	ErrWatchStoppedByUser = errors.New("Watch stopped by the user via stop channel")
+-)
+-
+-// If recursive is set to true the watch returns the first change under the given
+-// prefix since the given index.
+-//
+-// If recursive is set to false the watch returns the first change to the given key
+-// since the given index.
+-//
+-// To watch for the latest change, set waitIndex = 0.
+-//
+-// If a receiver channel is given, it will be a long-term watch. Watch will block at the
+-//channel. After someone receives the channel, it will go on to watch that
+-// prefix.  If a stop channel is given, the client can close long-term watch using
+-// the stop channel.
+-func (c *Client) Watch(prefix string, waitIndex uint64, recursive bool,
+-	receiver chan *Response, stop chan bool) (*Response, error) {
+-	logger.Debugf("watch %s [%s]", prefix, c.cluster.Leader)
+-	if receiver == nil {
+-		raw, err := c.watchOnce(prefix, waitIndex, recursive, stop)
+-
+-		if err != nil {
+-			return nil, err
+-		}
+-
+-		return raw.Unmarshal()
+-	}
+-	defer close(receiver)
+-
+-	for {
+-		raw, err := c.watchOnce(prefix, waitIndex, recursive, stop)
+-
+-		if err != nil {
+-			return nil, err
+-		}
+-
+-		resp, err := raw.Unmarshal()
+-
+-		if err != nil {
+-			return nil, err
+-		}
+-
+-		waitIndex = resp.Node.ModifiedIndex + 1
+-		receiver <- resp
+-	}
+-}
+-
+-func (c *Client) RawWatch(prefix string, waitIndex uint64, recursive bool,
+-	receiver chan *RawResponse, stop chan bool) (*RawResponse, error) {
+-
+-	logger.Debugf("rawWatch %s [%s]", prefix, c.cluster.Leader)
+-	if receiver == nil {
+-		return c.watchOnce(prefix, waitIndex, recursive, stop)
+-	}
+-
+-	for {
+-		raw, err := c.watchOnce(prefix, waitIndex, recursive, stop)
+-
+-		if err != nil {
+-			return nil, err
+-		}
+-
+-		resp, err := raw.Unmarshal()
+-
+-		if err != nil {
+-			return nil, err
+-		}
+-
+-		waitIndex = resp.Node.ModifiedIndex + 1
+-		receiver <- raw
+-	}
+-}
+-
+-// helper func
+-// return when there is change under the given prefix
+-func (c *Client) watchOnce(key string, waitIndex uint64, recursive bool, stop chan bool) (*RawResponse, error) {
+-
+-	options := Options{
+-		"wait": true,
+-	}
+-	if waitIndex > 0 {
+-		options["waitIndex"] = waitIndex
+-	}
+-	if recursive {
+-		options["recursive"] = true
+-	}
+-
+-	resp, err := c.getCancelable(key, options, stop)
+-
+-	if err == ErrRequestCancelled {
+-		return nil, ErrWatchStoppedByUser
+-	}
+-
+-	return resp, err
+-}
+diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch_test.go
+deleted file mode 100644
+index 43e1dfe..0000000
+--- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch_test.go
++++ /dev/null
+@@ -1,119 +0,0 @@
+-package etcd
+-
+-import (
+-	"fmt"
+-	"runtime"
+-	"testing"
+-	"time"
+-)
+-
+-func TestWatch(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("watch_foo", true)
+-	}()
+-
+-	go setHelper("watch_foo", "bar", c)
+-
+-	resp, err := c.Watch("watch_foo", 0, false, nil, nil)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/watch_foo" && resp.Node.Value == "bar") {
+-		t.Fatalf("Watch 1 failed: %#v", resp)
+-	}
+-
+-	go setHelper("watch_foo", "bar", c)
+-
+-	resp, err = c.Watch("watch_foo", resp.Node.ModifiedIndex+1, false, nil, nil)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/watch_foo" && resp.Node.Value == "bar") {
+-		t.Fatalf("Watch 2 failed: %#v", resp)
+-	}
+-
+-	routineNum := runtime.NumGoroutine()
+-
+-	ch := make(chan *Response, 10)
+-	stop := make(chan bool, 1)
+-
+-	go setLoop("watch_foo", "bar", c)
+-
+-	go receiver(ch, stop)
+-
+-	_, err = c.Watch("watch_foo", 0, false, ch, stop)
+-	if err != ErrWatchStoppedByUser {
+-		t.Fatalf("Watch returned a non-user stop error")
+-	}
+-
+-	if newRoutineNum := runtime.NumGoroutine(); newRoutineNum != routineNum {
+-		t.Fatalf("Routine numbers differ after watch stop: %v, %v", routineNum, newRoutineNum)
+-	}
+-}
+-
+-func TestWatchAll(t *testing.T) {
+-	c := NewClient(nil)
+-	defer func() {
+-		c.Delete("watch_foo", true)
+-	}()
+-
+-	go setHelper("watch_foo/foo", "bar", c)
+-
+-	resp, err := c.Watch("watch_foo", 0, true, nil, nil)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/watch_foo/foo" && resp.Node.Value == "bar") {
+-		t.Fatalf("WatchAll 1 failed: %#v", resp)
+-	}
+-
+-	go setHelper("watch_foo/foo", "bar", c)
+-
+-	resp, err = c.Watch("watch_foo", resp.Node.ModifiedIndex+1, true, nil, nil)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-	if !(resp.Node.Key == "/watch_foo/foo" && resp.Node.Value == "bar") {
+-		t.Fatalf("WatchAll 2 failed: %#v", resp)
+-	}
+-
+-	ch := make(chan *Response, 10)
+-	stop := make(chan bool, 1)
+-
+-	routineNum := runtime.NumGoroutine()
+-
+-	go setLoop("watch_foo/foo", "bar", c)
+-
+-	go receiver(ch, stop)
+-
+-	_, err = c.Watch("watch_foo", 0, true, ch, stop)
+-	if err != ErrWatchStoppedByUser {
+-		t.Fatalf("Watch returned a non-user stop error")
+-	}
+-
+-	if newRoutineNum := runtime.NumGoroutine(); newRoutineNum != routineNum {
+-		t.Fatalf("Routine numbers differ after watch stop: %v, %v", routineNum, newRoutineNum)
+-	}
+-}
+-
+-func setHelper(key, value string, c *Client) {
+-	time.Sleep(time.Second)
+-	c.Set(key, value, 100)
+-}
+-
+-func setLoop(key, value string, c *Client) {
+-	time.Sleep(time.Second)
+-	for i := 0; i < 10; i++ {
+-		newValue := fmt.Sprintf("%s_%v", value, i)
+-		c.Set(key, newValue, 100)
+-		time.Sleep(time.Second / 10)
+-	}
+-}
+-
+-func receiver(c chan *Response, stop chan bool) {
+-	for i := 0; i < 10; i++ {
+-		<-c
+-	}
+-	stop <- true
+-}
+diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE
+deleted file mode 100644
+index 5782c72..0000000
+--- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE
++++ /dev/null
+@@ -1,23 +0,0 @@
+-Copyright (c) 2014, Elazar Leibovich
+-All rights reserved.
+-
+-Redistribution and use in source and binary forms, with or without
+-modification, are permitted provided that the following conditions are met:
+-
+-* Redistributions of source code must retain the above copyright notice, this
+-  list of conditions and the following disclaimer.
+-
+-* Redistributions in binary form must reproduce the above copyright notice,
+-  this list of conditions and the following disclaimer in the documentation
+-  and/or other materials provided with the distribution.
+-
+-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+-DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+-SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+-CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+-OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md
+deleted file mode 100644
+index a3929a8..0000000
+--- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md
++++ /dev/null
+@@ -1,18 +0,0 @@
+-go-bindata-http
+-===============
+-
+-Serve embedded files from [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) with `net/http`.
+-
+-[GoDoc](http://godoc.org/github.com/elazarl/go-bindata-assetfs)
+-
+-After running
+-
+-    $ go-bindata data/...
+-
+-Use
+-
+-     http.Handle("/",
+-        http.FileServer(
+-        &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"}))
+-
+-to serve files embedded from the `data` directory.
+diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go
+deleted file mode 100644
+index 83cd94d..0000000
+--- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go
++++ /dev/null
+@@ -1,141 +0,0 @@
+-package assetfs
+-
+-import (
+-	"bytes"
+-	"errors"
+-	"fmt"
+-	"io"
+-	"io/ioutil"
+-	"net/http"
+-	"os"
+-	"path"
+-	"path/filepath"
+-	"time"
+-)
+-
+-// FakeFile implements os.FileInfo interface for a given path and size
+-type FakeFile struct {
+-	// Path is the path of this file
+-	Path string
+-	// Dir marks of the path is a directory
+-	Dir bool
+-	// Len is the length of the fake file, zero if it is a directory
+-	Len int64
+-}
+-
+-func (f *FakeFile) Name() string {
+-	_, name := filepath.Split(f.Path)
+-	return name
+-}
+-
+-func (f *FakeFile) Mode() os.FileMode {
+-	mode := os.FileMode(0644)
+-	if f.Dir {
+-		return mode | os.ModeDir
+-	}
+-	return mode
+-}
+-
+-func (f *FakeFile) ModTime() time.Time {
+-	return time.Unix(0, 0)
+-}
+-
+-func (f *FakeFile) Size() int64 {
+-	return f.Len
+-}
+-
+-func (f *FakeFile) IsDir() bool {
+-	return f.Mode().IsDir()
+-}
+-
+-func (f *FakeFile) Sys() interface{} {
+-	return nil
+-}
+-
+-// AssetFile implements http.File interface for a no-directory file with content
+-type AssetFile struct {
+-	*bytes.Reader
+-	io.Closer
+-	FakeFile
+-}
+-
+-func NewAssetFile(name string, content []byte) *AssetFile {
+-	return &AssetFile{
+-		bytes.NewReader(content),
+-		ioutil.NopCloser(nil),
+-		FakeFile{name, false, int64(len(content))}}
+-}
+-
+-func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) {
+-	return nil, errors.New("not a directory")
+-}
+-
+-func (f *AssetFile) Stat() (os.FileInfo, error) {
+-	return f, nil
+-}
+-
+-// AssetDirectory implements http.File interface for a directory
+-type AssetDirectory struct {
+-	AssetFile
+-	ChildrenRead int
+-	Children     []os.FileInfo
+-}
+-
+-func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory {
+-	fileinfos := make([]os.FileInfo, 0, len(children))
+-	for _, child := range children {
+-		_, err := fs.AssetDir(filepath.Join(name, child))
+-		fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0})
 -	}
--	var buf bytes.Buffer
--	fmt.Fprintf(&buf, "googleapi: Error %d: ", e.Code)
--	if e.Message != "" {
--		fmt.Fprintf(&buf, "%s", e.Message)
+-	return &AssetDirectory{
+-		AssetFile{
+-			bytes.NewReader(nil),
+-			ioutil.NopCloser(nil),
+-			FakeFile{name, true, 0},
+-		},
+-		0,
+-		fileinfos}
+-}
+-
+-func (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) {
+-	fmt.Println(f, count)
+-	if count <= 0 {
+-		return f.Children, nil
 -	}
--	if len(e.Errors) == 0 {
--		return strings.TrimSpace(buf.String())
+-	if f.ChildrenRead+count > len(f.Children) {
+-		count = len(f.Children) - f.ChildrenRead
 -	}
--	if len(e.Errors) == 1 && e.Errors[0].Message == e.Message {
--		fmt.Fprintf(&buf, ", %s", e.Errors[0].Reason)
--		return buf.String()
+-	rv := f.Children[f.ChildrenRead : f.ChildrenRead+count]
+-	f.ChildrenRead += count
+-	return rv, nil
+-}
+-
+-func (f *AssetDirectory) Stat() (os.FileInfo, error) {
+-	return f, nil
+-}
+-
+-// AssetFS implements http.FileSystem, allowing
+-// embedded files to be served from net/http package.
+-type AssetFS struct {
+-	// Asset should return content of file in path if exists
+-	Asset func(path string) ([]byte, error)
+-	// AssetDir should return list of files in the path
+-	AssetDir func(path string) ([]string, error)
+-	// Prefix would be prepended to http requests
+-	Prefix string
+-}
+-
+-func (fs *AssetFS) Open(name string) (http.File, error) {
+-	name = path.Join(fs.Prefix, name)
+-	if len(name) > 0 && name[0] == '/' {
+-		name = name[1:]
 -	}
--	fmt.Fprintln(&buf, "\nMore details:")
--	for _, v := range e.Errors {
--		fmt.Fprintf(&buf, "Reason: %s, Message: %s\n", v.Reason, v.Message)
+-	if children, err := fs.AssetDir(name); err == nil {
+-		return NewAssetDirectory(name, children, fs), nil
 -	}
--	return buf.String()
+-	b, err := fs.Asset(name)
+-	if err != nil {
+-		return nil, err
+-	}
+-	return NewAssetFile(name, b), nil
 -}
+diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go
+deleted file mode 100644
+index a664249..0000000
+--- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go
++++ /dev/null
+@@ -1,13 +0,0 @@
+-// assetfs allows packages to serve static content embedded
+-// with the go-bindata tool with the standard net/http package.
+-//
+-// See https://github.com/jteeuwen/go-bindata for more information
+-// about embedding binary data with go-bindata.
+-//
+-// Usage example, after running
+-//    $ go-bindata data/...
+-// use:
+-//     http.Handle("/",
+-//        http.FileServer(
+-//        &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"}))
+-package assetfs
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/.gitignore b/Godeps/_workspace/src/github.com/emicklei/go-restful/.gitignore
+deleted file mode 100644
+index cece7be..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/.gitignore
++++ /dev/null
+@@ -1,70 +0,0 @@
+-# Compiled Object files, Static and Dynamic libs (Shared Objects)
+-*.o
+-*.a
+-*.so
 -
--type errorReply struct {
--	Error *Error `json:"error"`
+-# Folders
+-_obj
+-_test
+-
+-# Architecture specific extensions/prefixes
+-*.[568vq]
+-[568vq].out
+-
+-*.cgo1.go
+-*.cgo2.c
+-_cgo_defun.c
+-_cgo_gotypes.go
+-_cgo_export.*
+-
+-_testmain.go
+-
+-*.exe
+-
+-restful.html
+-
+-*.out
+-
+-tmp.prof
+-
+-go-restful.test
+-
+-examples/restful-basic-authentication
+-
+-examples/restful-encoding-filter
+-
+-examples/restful-filters
+-
+-examples/restful-hello-world
+-
+-examples/restful-resource-functions
+-
+-examples/restful-serve-static
+-
+-examples/restful-user-service
+-
+-*.DS_Store
+-examples/restful-user-resource
+-
+-examples/restful-multi-containers
+-
+-examples/restful-form-handling
+-
+-examples/restful-CORS-filter
+-
+-examples/restful-options-filter
+-
+-examples/restful-curly-router
+-
+-examples/restful-cpuprofiler-service
+-
+-examples/restful-pre-post-filters
+-
+-curly.prof
+-
+-examples/restful-NCSA-logging
+-
+-examples/restful-html-template
+-
+-s.html
+-restful-path-tail
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/CHANGES.md b/Godeps/_workspace/src/github.com/emicklei/go-restful/CHANGES.md
+deleted file mode 100644
+index a04408b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/CHANGES.md
++++ /dev/null
+@@ -1,121 +0,0 @@
+-Change history of go-restful
+-=
+-2014-10-31
+-- (api change) ReturnsError -> Returns
+-- (api add)    RouteBuilder.Do(aBuilder) for DRY use of RouteBuilder
+-- fix swagger nested structs
+-- sort Swagger response messages by code
+-
+-2014-10-23
+-- (api add) ReturnsError allows you to document Http codes in swagger
+-- fixed problem with greedy CurlyRouter
+-- (api add) Access-Control-Max-Age in CORS
+-- add tracing functionality (injectable) for debugging purposes
+-- support JSON parse 64bit int 
+-- fix empty parameters for swagger
+-- WebServicesUrl is now optional for swagger
+-- fixed duplicate AccessControlAllowOrigin in CORS
+-- (api change) expose ServeMux in container
+-- (api add) added AllowedDomains in CORS
+-- (api add) ParameterNamed for detailed documentation
+-
+-2014-04-16
+-- (api add) expose constructor of Request for testing.
+-
+-2014-06-27
+-- (api add) ParameterNamed gives access to a Parameter definition and its data (for further specification).
+-- (api add) SetCacheReadEntity allow scontrol over whether or not the request body is being cached (default true for compatibility reasons).
+-
+-2014-07-03
+-- (api add) CORS can be configured with a list of allowed domains
+-
+-2014-03-12
+-- (api add) Route path parameters can use wildcard or regular expressions. (requires CurlyRouter)
+-
+-2014-02-26
+-- (api add) Request now provides information about the matched Route, see method SelectedRoutePath 
+-
+-2014-02-17
+-- (api change) renamed parameter constants (go-lint checks)
+-
+-2014-01-10
+- - (api add) support for CloseNotify, see http://golang.org/pkg/net/http/#CloseNotifier
+-
+-2014-01-07
+- - (api change) Write* methods in Response now return the error or nil.
+- - added example of serving HTML from a Go template.
+- - fixed comparing Allowed headers in CORS (is now case-insensitive)
+-
+-2013-11-13
+- - (api add) Response knows how many bytes are written to the response body.
+-
+-2013-10-29
+- - (api add) RecoverHandler(handler RecoverHandleFunction) to change how panic recovery is handled. Default behavior is to log and return a stacktrace. This may be a security issue as it exposes sourcecode information.
+-
+-2013-10-04
+- - (api add) Response knows what HTTP status has been written
+- - (api add) Request can have attributes (map of string->interface, also called request-scoped variables
+-
+-2013-09-12
+- - (api change) Router interface simplified
+- - Implemented CurlyRouter, a Router that does not use|allow regular expressions in paths
+-
+-2013-08-05
+- - add OPTIONS support
+- - add CORS support
+-
+-2013-08-27
+- - fixed some reported issues (see github)
+- - (api change) deprecated use of WriteError; use WriteErrorString instead
+-
+-2014-04-15
+- - (fix) v1.0.1 tag: fix Issue 111: WriteErrorString
+-
+-2013-08-08
+- - (api add) Added implementation Container: a WebServices collection with its own http.ServeMux allowing multiple endpoints per program. Existing uses of go-restful will register their services to the DefaultContainer.
+- - (api add) the swagger package has be extended to have a UI per container.
+- - if panic is detected then a small stack trace is printed (thanks to runner-mei)
+- - (api add) WriteErrorString to Response
+-
+-Important API changes:
+-
+- - (api remove) package variable DoNotRecover no longer works ; use restful.DefaultContainer.DoNotRecover(true) instead.
+- - (api remove) package variable EnableContentEncoding no longer works ; use restful.DefaultContainer.EnableContentEncoding(true) instead.
+- 
+- 
+-2013-07-06
+-
+- - (api add) Added support for response encoding (gzip and deflate(zlib)). This feature is disabled on default (for backwards compatibility). Use restful.EnableContentEncoding = true in your initialization to enable this feature.
+-
+-2013-06-19
+-
+- - (improve) DoNotRecover option, moved request body closer, improved ReadEntity
+-
+-2013-06-03
+-
+- - (api change) removed Dispatcher interface, hide PathExpression
+- - changed receiver names of type functions to be more idiomatic Go
+-
+-2013-06-02
+-
+- - (optimize) Cache the RegExp compilation of Paths.
+-
+-2013-05-22
+-	
+- - (api add) Added support for request/response filter functions
+-
+-2013-05-18
+-
+-
+- - (api add) Added feature to change the default Http Request Dispatch function (travis cline)
+- - (api change) Moved Swagger Webservice to swagger package (see example restful-user)
+-
+-[2012-11-14 .. 2013-05-18>
+- 
+- - See https://github.com/emicklei/go-restful/commits
+-
+-2012-11-14
+-
+- - Initial commit
+-
+-
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/LICENSE b/Godeps/_workspace/src/github.com/emicklei/go-restful/LICENSE
+deleted file mode 100644
+index ece7ec6..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/LICENSE
++++ /dev/null
+@@ -1,22 +0,0 @@
+-Copyright (c) 2012,2013 Ernest Micklei
+-
+-MIT License
+-
+-Permission is hereby granted, free of charge, to any person obtaining
+-a copy of this software and associated documentation files (the
+-"Software"), to deal in the Software without restriction, including
+-without limitation the rights to use, copy, modify, merge, publish,
+-distribute, sublicense, and/or sell copies of the Software, and to
+-permit persons to whom the Software is furnished to do so, subject to
+-the following conditions:
+-
+-The above copyright notice and this permission notice shall be
+-included in all copies or substantial portions of the Software.
+-
+-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+-LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+-OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+-WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/README.md b/Godeps/_workspace/src/github.com/emicklei/go-restful/README.md
+deleted file mode 100644
+index 8af137d..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/README.md
++++ /dev/null
+@@ -1,70 +0,0 @@
+-go-restful
+-==========
+-
+-package for building REST-style Web Services using Google Go
+-
+-REST asks developers to use HTTP methods explicitly and in a way that's consistent with the protocol definition. This basic REST design principle establishes a one-to-one mapping between create, read, update, and delete (CRUD) operations and HTTP methods. According to this mapping:
+-
+-- GET = Retrieve a representation of a resource
+-- POST = Create if you are sending content to the server to create a subordinate of the specified resource collection, using some server-side algorithm.
+-- PUT = Create if you are sending the full content of the specified resource (URI).
+-- PUT = Update if you are updating the full content of the specified resource.
+-- DELETE = Delete if you are requesting the server to delete the resource
+-- PATCH = Update partial content of a resource
+-- OPTIONS = Get information about the communication options for the request URI
+-    
+-### Example
+-
+-```Go
+-ws := new(restful.WebService)
+-ws.
+-	Path("/users").
+-	Consumes(restful.MIME_XML, restful.MIME_JSON).
+-	Produces(restful.MIME_JSON, restful.MIME_XML)
+-
+-ws.Route(ws.GET("/{user-id}").To(u.findUser).
+-	Doc("get a user").
+-	Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-	Writes(User{}))		
+-...
+-	
+-func (u UserResource) findUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	...
 -}
+-```
+-	
+-[Full API of a UserResource](https://github.com/emicklei/go-restful/tree/master/examples/restful-user-resource.go) 
+-		
+-### Features
+-
+-- Routes for request &#8594; function mapping with path parameter (e.g. {id}) support
+-- Configurable router:
+-	- Routing algorithm after [JSR311](http://jsr311.java.net/nonav/releases/1.1/spec/spec.html) that is implemented using (but doest **not** accept) regular expressions (See RouterJSR311 which is used by default)
+-	- Fast routing algorithm that allows static elements, regular expressions and dynamic parameters in the URL path (e.g. /meetings/{id} or /static/{subpath:*}, See CurlyRouter)
+-- Request API for reading structs from JSON/XML and accesing parameters (path,query,header)
+-- Response API for writing structs to JSON/XML and setting headers
+-- Filters for intercepting the request &#8594; response flow on Service or Route level
+-- Request-scoped variables using attributes
+-- Containers for WebServices on different HTTP endpoints
+-- Content encoding (gzip,deflate) of responses
+-- Automatic responses on OPTIONS (using a filter)
+-- Automatic CORS request handling (using a filter)
+-- API declaration for Swagger UI (see swagger package)
+-- Panic recovery to produce HTTP 500, customizable using RecoverHandler(...)
+-	
+-### Resources
 -
--// CheckResponse returns an error (of type *Error) if the response
--// status code is not 2xx.
--func CheckResponse(res *http.Response) error {
--	if res.StatusCode >= 200 && res.StatusCode <= 299 {
--		return nil
+-- [Documentation on godoc.org](http://godoc.org/github.com/emicklei/go-restful)
+-- [Code examples](https://github.com/emicklei/go-restful/tree/master/examples)
+-- [Example posted on blog](http://ernestmicklei.com/2012/11/24/go-restful-first-working-example/)
+-- [Design explained on blog](http://ernestmicklei.com/2012/11/11/go-restful-api-design/)
+-- [sourcegraph](https://sourcegraph.com/github.com/emicklei/go-restful)
+-- [gopkg.in](https://gopkg.in/emicklei/go-restful.v1)
+-- [showcase: Mora - MongoDB REST Api server](https://github.com/emicklei/mora)
+-
+-[![Build Status](https://drone.io/github.com/emicklei/go-restful/status.png)](https://drone.io/github.com/emicklei/go-restful/latest)[![library users](https://sourcegraph.com/api/repos/github.com/emicklei/go-restful/badges/library-users.png)](https://sourcegraph.com/github.com/emicklei/go-restful) [![authors](https://sourcegraph.com/api/repos/github.com/emicklei/go-restful/badges/authors.png)](https://sourcegraph.com/github.com/emicklei/go-restful) [![xrefs](https://sourcegraph.com/api/repos/github.com/emicklei/go-restful/badges/xrefs.png)](https://sourcegraph.com/github.com/emicklei/go-restful)
+-
+-(c) 2012 - 2014, http://ernestmicklei.com. MIT License
+-
+-Type ```git shortlog -s``` for a full list of contributors.
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/Srcfile b/Godeps/_workspace/src/github.com/emicklei/go-restful/Srcfile
+deleted file mode 100644
+index 16fd186..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/Srcfile
++++ /dev/null
+@@ -1 +0,0 @@
+-{"SkipDirs": ["examples"]}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go
+deleted file mode 100644
+index db6a1a7..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_curly_test.go
++++ /dev/null
+@@ -1,51 +0,0 @@
+-package restful
+-
+-import (
+-	"fmt"
+-	"net/http"
+-	"net/http/httptest"
+-	"testing"
+-)
+-
+-func setupCurly(container *Container) []string {
+-	wsCount := 26
+-	rtCount := 26
+-	urisCurly := []string{}
+-
+-	container.Router(CurlyRouter{})
+-	for i := 0; i < wsCount; i++ {
+-		root := fmt.Sprintf("/%s/{%s}/", string(i+97), string(i+97))
+-		ws := new(WebService).Path(root)
+-		for j := 0; j < rtCount; j++ {
+-			sub := fmt.Sprintf("/%s2/{%s2}", string(j+97), string(j+97))
+-			ws.Route(ws.GET(sub).Consumes("application/xml").Produces("application/xml").To(echoCurly))
+-		}
+-		container.Add(ws)
+-		for _, each := range ws.Routes() {
+-			urisCurly = append(urisCurly, "http://bench.com"+each.Path)
+-		}
 -	}
--	slurp, err := ioutil.ReadAll(res.Body)
--	if err == nil {
--		jerr := new(errorReply)
--		err = json.Unmarshal(slurp, jerr)
--		if err == nil && jerr.Error != nil {
--			if jerr.Error.Code == 0 {
--				jerr.Error.Code = res.StatusCode
+-	return urisCurly
+-}
+-
+-func echoCurly(req *Request, resp *Response) {}
+-
+-func BenchmarkManyCurly(b *testing.B) {
+-	container := NewContainer()
+-	urisCurly := setupCurly(container)
+-	b.ResetTimer()
+-	for t := 0; t < b.N; t++ {
+-		for r := 0; r < 1000; r++ {
+-			for _, each := range urisCurly {
+-				sendNoReturnTo(each, container, t)
 -			}
--			jerr.Error.Body = string(slurp)
--			return jerr.Error
 -		}
 -	}
--	return &Error{
--		Code: res.StatusCode,
--		Body: string(slurp),
--	}
 -}
 -
--type MarshalStyle bool
+-func sendNoReturnTo(address string, container *Container, t int) {
+-	httpRequest, _ := http.NewRequest("GET", address, nil)
+-	httpRequest.Header.Set("Accept", "application/xml")
+-	httpWriter := httptest.NewRecorder()
+-	container.dispatch(httpWriter, httpRequest)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go
+deleted file mode 100644
+index 3e77c2d..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.go
++++ /dev/null
+@@ -1,43 +0,0 @@
+-package restful
 -
--var WithDataWrapper = MarshalStyle(true)
--var WithoutDataWrapper = MarshalStyle(false)
+-import (
+-	"fmt"
+-	"io"
+-	"testing"
+-)
 -
--func (wrap MarshalStyle) JSONReader(v interface{}) (io.Reader, error) {
--	buf := new(bytes.Buffer)
--	if wrap {
--		buf.Write([]byte(`{"data": `))
+-var uris = []string{}
+-
+-func setup(container *Container) {
+-	wsCount := 26
+-	rtCount := 26
+-
+-	for i := 0; i < wsCount; i++ {
+-		root := fmt.Sprintf("/%s/{%s}/", string(i+97), string(i+97))
+-		ws := new(WebService).Path(root)
+-		for j := 0; j < rtCount; j++ {
+-			sub := fmt.Sprintf("/%s2/{%s2}", string(j+97), string(j+97))
+-			ws.Route(ws.GET(sub).To(echo))
+-		}
+-		container.Add(ws)
+-		for _, each := range ws.Routes() {
+-			uris = append(uris, "http://bench.com"+each.Path)
+-		}
 -	}
--	err := json.NewEncoder(buf).Encode(v)
--	if err != nil {
--		return nil, err
+-}
+-
+-func echo(req *Request, resp *Response) {
+-	io.WriteString(resp.ResponseWriter, "echo")
+-}
+-
+-func BenchmarkMany(b *testing.B) {
+-	container := NewContainer()
+-	setup(container)
+-	b.ResetTimer()
+-	for t := 0; t < b.N; t++ {
+-		for _, each := range uris {
+-			// println(each)
+-			sendItTo(each, container)
+-		}
 -	}
--	if wrap {
--		buf.Write([]byte(`}`))
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.sh b/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.sh
+deleted file mode 100644
+index 47ffbe4..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/bench_test.sh
++++ /dev/null
+@@ -1,10 +0,0 @@
+-#go test -run=none -file bench_test.go -test.bench . -cpuprofile=bench_test.out
+-
+-go test -c
+-./go-restful.test -test.run=none -test.cpuprofile=tmp.prof -test.bench=BenchmarkMany
+-./go-restful.test -test.run=none -test.cpuprofile=curly.prof -test.bench=BenchmarkManyCurly
+-
+-#go tool pprof go-restful.test tmp.prof
+-go tool pprof go-restful.test curly.prof
+-
+-
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/compress.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/compress.go
+deleted file mode 100644
+index c4dcca0..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/compress.go
++++ /dev/null
+@@ -1,89 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
+-import (
+-	"compress/gzip"
+-	"compress/zlib"
+-	"errors"
+-	"io"
+-	"net/http"
+-	"strings"
+-)
+-
+-// OBSOLETE : use restful.DefaultContainer.EnableContentEncoding(true) to change this setting.
+-var EnableContentEncoding = false
+-
+-// CompressingResponseWriter is a http.ResponseWriter that can perform content encoding (gzip and zlib)
+-type CompressingResponseWriter struct {
+-	writer     http.ResponseWriter
+-	compressor io.WriteCloser
+-}
+-
+-// Header is part of http.ResponseWriter interface
+-func (c *CompressingResponseWriter) Header() http.Header {
+-	return c.writer.Header()
+-}
+-
+-// WriteHeader is part of http.ResponseWriter interface
+-func (c *CompressingResponseWriter) WriteHeader(status int) {
+-	c.writer.WriteHeader(status)
+-}
+-
+-// Write is part of http.ResponseWriter interface
+-// It is passed through the compressor
+-func (c *CompressingResponseWriter) Write(bytes []byte) (int, error) {
+-	return c.compressor.Write(bytes)
+-}
+-
+-// CloseNotify is part of http.CloseNotifier interface
+-func (c *CompressingResponseWriter) CloseNotify() <-chan bool {
+-	return c.writer.(http.CloseNotifier).CloseNotify()
+-}
+-
+-// Close the underlying compressor
+-func (c *CompressingResponseWriter) Close() {
+-	c.compressor.Close()
+-}
+-
+-// WantsCompressedResponse reads the Accept-Encoding header to see if and which encoding is requested.
+-func wantsCompressedResponse(httpRequest *http.Request) (bool, string) {
+-	header := httpRequest.Header.Get(HEADER_AcceptEncoding)
+-	gi := strings.Index(header, ENCODING_GZIP)
+-	zi := strings.Index(header, ENCODING_DEFLATE)
+-	// use in order of appearance
+-	if gi == -1 {
+-		return zi != -1, ENCODING_DEFLATE
+-	} else if zi == -1 {
+-		return gi != -1, ENCODING_GZIP
+-	} else {
+-		if gi < zi {
+-			return true, ENCODING_GZIP
+-		}
+-		return true, ENCODING_DEFLATE
 -	}
--	return buf, nil
 -}
 -
--func getMediaType(media io.Reader) (io.Reader, string) {
--	if typer, ok := media.(ContentTyper); ok {
--		return media, typer.ContentType()
+-// NewCompressingResponseWriter create a CompressingResponseWriter for a known encoding = {gzip,deflate}
+-func NewCompressingResponseWriter(httpWriter http.ResponseWriter, encoding string) (*CompressingResponseWriter, error) {
+-	httpWriter.Header().Set(HEADER_ContentEncoding, encoding)
+-	c := new(CompressingResponseWriter)
+-	c.writer = httpWriter
+-	var err error
+-	if ENCODING_GZIP == encoding {
+-		c.compressor, err = gzip.NewWriterLevel(httpWriter, gzip.BestSpeed)
+-		if err != nil {
+-			return nil, err
+-		}
+-	} else if ENCODING_DEFLATE == encoding {
+-		c.compressor, err = zlib.NewWriterLevel(httpWriter, zlib.BestSpeed)
+-		if err != nil {
+-			return nil, err
+-		}
+-	} else {
+-		return nil, errors.New("Unknown encoding:" + encoding)
 -	}
+-	return c, err
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go
+deleted file mode 100644
+index 332fb22..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/compress_test.go
++++ /dev/null
+@@ -1,53 +0,0 @@
+-package restful
 -
--	typ := "application/octet-stream"
--	buf := make([]byte, 1024)
--	n, err := media.Read(buf)
--	buf = buf[:n]
--	if err == nil {
--		typ = http.DetectContentType(buf)
+-import (
+-	"net/http"
+-	"net/http/httptest"
+-	"testing"
+-)
+-
+-func TestGzip(t *testing.T) {
+-	EnableContentEncoding = true
+-	httpRequest, _ := http.NewRequest("GET", "/test", nil)
+-	httpRequest.Header.Set("Accept-Encoding", "gzip,deflate")
+-	httpWriter := httptest.NewRecorder()
+-	wanted, encoding := wantsCompressedResponse(httpRequest)
+-	if !wanted {
+-		t.Fatal("should accept gzip")
+-	}
+-	if encoding != "gzip" {
+-		t.Fatal("expected gzip")
+-	}
+-	c, err := NewCompressingResponseWriter(httpWriter, encoding)
+-	if err != nil {
+-		t.Fatal(err.Error())
+-	}
+-	c.Write([]byte("Hello World"))
+-	c.Close()
+-	if httpWriter.Header().Get("Content-Encoding") != "gzip" {
+-		t.Fatal("Missing gzip header")
 -	}
--	return io.MultiReader(bytes.NewBuffer(buf), media), typ
 -}
 -
--type Lengther interface {
--	Len() int
+-func TestDeflate(t *testing.T) {
+-	EnableContentEncoding = true
+-	httpRequest, _ := http.NewRequest("GET", "/test", nil)
+-	httpRequest.Header.Set("Accept-Encoding", "deflate,gzip")
+-	httpWriter := httptest.NewRecorder()
+-	wanted, encoding := wantsCompressedResponse(httpRequest)
+-	if !wanted {
+-		t.Fatal("should accept deflate")
+-	}
+-	if encoding != "deflate" {
+-		t.Fatal("expected deflate")
+-	}
+-	c, err := NewCompressingResponseWriter(httpWriter, encoding)
+-	if err != nil {
+-		t.Fatal(err.Error())
+-	}
+-	c.Write([]byte("Hello World"))
+-	c.Close()
+-	if httpWriter.Header().Get("Content-Encoding") != "deflate" {
+-		t.Fatal("Missing deflate header")
+-	}
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/constants.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/constants.go
+deleted file mode 100644
+index 5e564d0..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/constants.go
++++ /dev/null
+@@ -1,29 +0,0 @@
+-package restful
 -
--// endingWithErrorReader from r until it returns an error.  If the
--// final error from r is os.EOF and e is non-nil, e is used instead.
--type endingWithErrorReader struct {
--	r io.Reader
--	e error
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
+-const (
+-	MIME_XML  = "application/xml"  // Accept or Content-Type used in Consumes() and/or Produces()
+-	MIME_JSON = "application/json" // Accept or Content-Type used in Consumes() and/or Produces()
+-
+-	HEADER_Allow                         = "Allow"
+-	HEADER_Accept                        = "Accept"
+-	HEADER_Origin                        = "Origin"
+-	HEADER_ContentType                   = "Content-Type"
+-	HEADER_LastModified                  = "Last-Modified"
+-	HEADER_AcceptEncoding                = "Accept-Encoding"
+-	HEADER_ContentEncoding               = "Content-Encoding"
+-	HEADER_AccessControlExposeHeaders    = "Access-Control-Expose-Headers"
+-	HEADER_AccessControlRequestMethod    = "Access-Control-Request-Method"
+-	HEADER_AccessControlRequestHeaders   = "Access-Control-Request-Headers"
+-	HEADER_AccessControlAllowMethods     = "Access-Control-Allow-Methods"
+-	HEADER_AccessControlAllowOrigin      = "Access-Control-Allow-Origin"
+-	HEADER_AccessControlAllowCredentials = "Access-Control-Allow-Credentials"
+-	HEADER_AccessControlAllowHeaders     = "Access-Control-Allow-Headers"
+-	HEADER_AccessControlMaxAge           = "Access-Control-Max-Age"
+-
+-	ENCODING_GZIP    = "gzip"
+-	ENCODING_DEFLATE = "deflate"
+-)
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/container.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/container.go
+deleted file mode 100644
+index b5b5b2d..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/container.go
++++ /dev/null
+@@ -1,257 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
+-import (
+-	"bytes"
+-	"fmt"
+-	"log"
+-	"net/http"
+-	"runtime"
+-	"strings"
+-)
+-
+-// Container holds a collection of WebServices and a http.ServeMux to dispatch http requests.
+-// The requests are further dispatched to routes of WebServices using a RouteSelector
+-type Container struct {
+-	webServices            []*WebService
+-	ServeMux               *http.ServeMux
+-	isRegisteredOnRoot     bool
+-	containerFilters       []FilterFunction
+-	doNotRecover           bool // default is false
+-	recoverHandleFunc      RecoverHandleFunction
+-	router                 RouteSelector // default is a RouterJSR311, CurlyRouter is the faster alternative
+-	contentEncodingEnabled bool          // default is false
+-}
+-
+-// NewContainer creates a new Container using a new ServeMux and default router (RouterJSR311)
+-func NewContainer() *Container {
+-	return &Container{
+-		webServices:            []*WebService{},
+-		ServeMux:               http.NewServeMux(),
+-		isRegisteredOnRoot:     false,
+-		containerFilters:       []FilterFunction{},
+-		doNotRecover:           false,
+-		recoverHandleFunc:      logStackOnRecover,
+-		router:                 RouterJSR311{},
+-		contentEncodingEnabled: false}
+-}
+-
+-// RecoverHandleFunction declares functions that can be used to handle a panic situation.
+-// The first argument is what recover() returns. The second must be used to communicate an error response.
+-type RecoverHandleFunction func(interface{}, http.ResponseWriter)
+-
+-// RecoverHandler changes the default function (logStackOnRecover) to be called
+-// when a panic is detected. DoNotRecover must be have its default value (=false).
+-func (c *Container) RecoverHandler(handler RecoverHandleFunction) {
+-	c.recoverHandleFunc = handler
+-}
+-
+-// DoNotRecover controls whether panics will be caught to return HTTP 500.
+-// If set to true, Route functions are responsible for handling any error situation.
+-// Default value is false = recover from panics. This has performance implications.
+-func (c *Container) DoNotRecover(doNot bool) {
+-	c.doNotRecover = doNot
+-}
+-
+-// Router changes the default Router (currently RouterJSR311)
+-func (c *Container) Router(aRouter RouteSelector) {
+-	c.router = aRouter
+-}
+-
+-// EnableContentEncoding (default=false) allows for GZIP or DEFLATE encoding of responses.
+-func (c *Container) EnableContentEncoding(enabled bool) {
+-	c.contentEncodingEnabled = enabled
+-}
+-
+-// Add a WebService to the Container. It will detect duplicate root paths and panic in that case.
+-func (c *Container) Add(service *WebService) *Container {
+-	// If registered on root then no additional specific mapping is needed
+-	if !c.isRegisteredOnRoot {
+-		pattern := c.fixedPrefixPath(service.RootPath())
+-		// check if root path registration is needed
+-		if "/" == pattern || "" == pattern {
+-			c.ServeMux.HandleFunc("/", c.dispatch)
+-			c.isRegisteredOnRoot = true
+-		} else {
+-			// detect if registration already exists
+-			alreadyMapped := false
+-			for _, each := range c.webServices {
+-				if each.RootPath() == service.RootPath() {
+-					alreadyMapped = true
+-					break
+-				}
+-			}
+-			if !alreadyMapped {
+-				c.ServeMux.HandleFunc(pattern, c.dispatch)
+-				if !strings.HasSuffix(pattern, "/") {
+-					c.ServeMux.HandleFunc(pattern+"/", c.dispatch)
+-				}
+-			}
+-		}
+-	}
+-	// cannot have duplicate root paths
+-	for _, each := range c.webServices {
+-		if each.RootPath() == service.RootPath() {
+-			log.Fatalf("[restful] WebService with duplicate root path detected:['%v']", each)
+-		}
+-	}
+-	c.webServices = append(c.webServices, service)
+-	return c
 -}
 -
--func (er endingWithErrorReader) Read(p []byte) (n int, err error) {
--	n, err = er.r.Read(p)
--	if err == io.EOF && er.e != nil {
--		err = er.e
+-// logStackOnRecover is the default RecoverHandleFunction and is called
+-// when DoNotRecover is false and the recoverHandleFunc is not set for the container.
+-// Default implementation logs the stacktrace and writes the stacktrace on the response.
+-// This may be a security issue as it exposes sourcecode information.
+-func logStackOnRecover(panicReason interface{}, httpWriter http.ResponseWriter) {
+-	var buffer bytes.Buffer
+-	buffer.WriteString(fmt.Sprintf("[restful] recover from panic situation: - %v\r\n", panicReason))
+-	for i := 2; ; i += 1 {
+-		_, file, line, ok := runtime.Caller(i)
+-		if !ok {
+-			break
+-		}
+-		buffer.WriteString(fmt.Sprintf("    %s:%d\r\n", file, line))
 -	}
--	return
+-	log.Println(buffer.String())
+-	httpWriter.WriteHeader(http.StatusInternalServerError)
+-	httpWriter.Write(buffer.Bytes())
 -}
 -
--func getReaderSize(r io.Reader) (io.Reader, int64) {
--	// Ideal case, the reader knows its own size.
--	if lr, ok := r.(Lengther); ok {
--		return r, int64(lr.Len())
+-// Dispatch the incoming Http Request to a matching WebService.
+-func (c *Container) dispatch(httpWriter http.ResponseWriter, httpRequest *http.Request) {
+-	// Instal panic recovery unless told otherwise
+-	if !c.doNotRecover { // catch all for 500 response
+-		defer func() {
+-			if r := recover(); r != nil {
+-				c.recoverHandleFunc(r, httpWriter)
+-				return
+-			}
+-		}()
 -	}
+-	// Install closing the request body (if any)
+-	defer func() {
+-		if nil != httpRequest.Body {
+-			httpRequest.Body.Close()
+-		}
+-	}()
 -
--	// But maybe it's a seeker and we can seek to the end to find its size.
--	if s, ok := r.(io.Seeker); ok {
--		pos0, err := s.Seek(0, os.SEEK_CUR)
--		if err == nil {
--			posend, err := s.Seek(0, os.SEEK_END)
--			if err == nil {
--				_, err = s.Seek(pos0, os.SEEK_SET)
--				if err == nil {
--					return r, posend - pos0
--				} else {
--					// We moved it forward but can't restore it.
--					// Seems unlikely, but can't really restore now.
--					return endingWithErrorReader{strings.NewReader(""), err}, posend - pos0
--				}
+-	// Detect if compression is needed
+-	// assume without compression, test for override
+-	writer := httpWriter
+-	if c.contentEncodingEnabled {
+-		doCompress, encoding := wantsCompressedResponse(httpRequest)
+-		if doCompress {
+-			var err error
+-			writer, err = NewCompressingResponseWriter(httpWriter, encoding)
+-			if err != nil {
+-				log.Println("[restful] unable to install compressor:", err)
+-				httpWriter.WriteHeader(http.StatusInternalServerError)
+-				return
 -			}
+-			defer func() {
+-				writer.(*CompressingResponseWriter).Close()
+-			}()
 -		}
 -	}
+-	// Find best match Route ; err is non nil if no match was found
+-	webService, route, err := c.router.SelectRoute(
+-		c.webServices,
+-		httpRequest)
+-	if err != nil {
+-		// a non-200 response has already been written
+-		// run container filters anyway ; they should not touch the response...
+-		chain := FilterChain{Filters: c.containerFilters, Target: func(req *Request, resp *Response) {
+-			switch err.(type) {
+-			case ServiceError:
+-				ser := err.(ServiceError)
+-				resp.WriteErrorString(ser.Code, ser.Message)
+-			}
+-			// TODO
+-		}}
+-		chain.ProcessFilter(NewRequest(httpRequest), NewResponse(writer))
+-		return
+-	}
+-	wrappedRequest, wrappedResponse := route.wrapRequestResponse(writer, httpRequest)
+-	// pass through filters (if any)
+-	if len(c.containerFilters)+len(webService.filters)+len(route.Filters) > 0 {
+-		// compose filter chain
+-		allFilters := []FilterFunction{}
+-		allFilters = append(allFilters, c.containerFilters...)
+-		allFilters = append(allFilters, webService.filters...)
+-		allFilters = append(allFilters, route.Filters...)
+-		chain := FilterChain{Filters: allFilters, Target: func(req *Request, resp *Response) {
+-			// handle request by route after passing all filters
+-			route.Function(wrappedRequest, wrappedResponse)
+-		}}
+-		chain.ProcessFilter(wrappedRequest, wrappedResponse)
+-	} else {
+-		// no filters, handle request by route
+-		route.Function(wrappedRequest, wrappedResponse)
+-	}
+-}
 -
--	// Otherwise we have to make a copy to calculate how big the reader is.
--	buf := new(bytes.Buffer)
--	// TODO(bradfitz): put a cap on this copy? spill to disk after
--	// a certain point?
--	_, err := io.Copy(buf, r)
--	return endingWithErrorReader{buf, err}, int64(buf.Len())
+-// fixedPrefixPath returns the fixed part of the partspec ; it may include template vars {}
+-func (c Container) fixedPrefixPath(pathspec string) string {
+-	varBegin := strings.Index(pathspec, "{")
+-	if -1 == varBegin {
+-		return pathspec
+-	}
+-	return pathspec[:varBegin]
 -}
 -
--func typeHeader(contentType string) textproto.MIMEHeader {
--	h := make(textproto.MIMEHeader)
--	h.Set("Content-Type", contentType)
--	return h
+-// ServeHTTP implements net/http.Handler therefore a Container can be a Handler in a http.Server
+-func (c Container) ServeHTTP(httpwriter http.ResponseWriter, httpRequest *http.Request) {
+-	c.ServeMux.ServeHTTP(httpwriter, httpRequest)
 -}
 -
--// countingWriter counts the number of bytes it receives to write, but
--// discards them.
--type countingWriter struct {
--	n *int64
+-// Handle registers the handler for the given pattern. If a handler already exists for pattern, Handle panics.
+-func (c Container) Handle(pattern string, handler http.Handler) {
+-	c.ServeMux.Handle(pattern, handler)
 -}
 -
--func (w countingWriter) Write(p []byte) (int, error) {
--	*w.n += int64(len(p))
--	return len(p), nil
+-// Filter appends a container FilterFunction. These are called before dispatching
+-// a http.Request to a WebService from the container
+-func (c *Container) Filter(filter FilterFunction) {
+-	c.containerFilters = append(c.containerFilters, filter)
 -}
 -
--// ConditionallyIncludeMedia does nothing if media is nil.
--//
--// bodyp is an in/out parameter.  It should initially point to the
--// reader of the application/json (or whatever) payload to send in the
--// API request.  It's updated to point to the multipart body reader.
--//
--// ctypep is an in/out parameter.  It should initially point to the
--// content type of the bodyp, usually "application/json".  It's updated
--// to the "multipart/related" content type, with random boundary.
--//
--// The return value is the content-length of the entire multpart body.
--func ConditionallyIncludeMedia(media io.Reader, bodyp *io.Reader, ctypep *string) (totalContentLength int64, ok bool) {
--	if media == nil {
--		return
--	}
--	// Get the media type and size. The type check might return a
--	// different reader instance, so do the size check first,
--	// which looks at the specific type of the io.Reader.
--	var mediaType string
--	if typer, ok := media.(ContentTyper); ok {
--		mediaType = typer.ContentType()
--	}
--	media, mediaSize := getReaderSize(media)
--	if mediaType == "" {
--		media, mediaType = getMediaType(media)
--	}
--	body, bodyType := *bodyp, *ctypep
--	body, bodySize := getReaderSize(body)
+-// RegisteredWebServices returns the collections of added WebServices
+-func (c Container) RegisteredWebServices() []*WebService {
+-	return c.webServices
+-}
 -
--	// Calculate how big the the multipart will be.
--	{
--		totalContentLength = bodySize + mediaSize
--		mpw := multipart.NewWriter(countingWriter{&totalContentLength})
--		mpw.CreatePart(typeHeader(bodyType))
--		mpw.CreatePart(typeHeader(mediaType))
--		mpw.Close()
+-// computeAllowedMethods returns a list of HTTP methods that are valid for a Request
+-func (c Container) computeAllowedMethods(req *Request) []string {
+-	// Go through all RegisteredWebServices() and all its Routes to collect the options
+-	methods := []string{}
+-	requestPath := req.Request.URL.Path
+-	for _, ws := range c.RegisteredWebServices() {
+-		matches := ws.compiledPathExpression().Matcher.FindStringSubmatch(requestPath)
+-		if matches != nil {
+-			finalMatch := matches[len(matches)-1]
+-			for _, rt := range ws.Routes() {
+-				matches := rt.pathExpr.Matcher.FindStringSubmatch(finalMatch)
+-				if matches != nil {
+-					lastMatch := matches[len(matches)-1]
+-					if lastMatch == "" || lastMatch == "/" { // do not include if value is neither empty nor ‘/’.
+-						methods = append(methods, rt.Method)
+-					}
+-				}
+-			}
+-		}
 -	}
+-	// methods = append(methods, "OPTIONS")  not sure about this
+-	return methods
+-}
 -
--	pr, pw := io.Pipe()
--	mpw := multipart.NewWriter(pw)
--	*bodyp = pr
--	*ctypep = "multipart/related; boundary=" + mpw.Boundary()
--	go func() {
--		defer pw.Close()
--		defer mpw.Close()
+-// newBasicRequestResponse creates a pair of Request,Response from its http versions.
+-// It is basic because no parameter or (produces) content-type information is given.
+-func newBasicRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request) (*Request, *Response) {
+-	resp := NewResponse(httpWriter)
+-	resp.requestAccept = httpRequest.Header.Get(HEADER_Accept)
+-	return NewRequest(httpRequest), resp
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter.go
+deleted file mode 100644
+index ae166b6..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter.go
++++ /dev/null
+@@ -1,170 +0,0 @@
+-package restful
 -
--		w, err := mpw.CreatePart(typeHeader(bodyType))
--		if err != nil {
--			return
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
+-import (
+-	"strconv"
+-	"strings"
+-)
+-
+-// CrossOriginResourceSharing is used to create a Container Filter that implements CORS.
+-// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page
+-// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from.
+-//
+-// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
+-// http://enable-cors.org/server.html
+-// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request
+-type CrossOriginResourceSharing struct {
+-	ExposeHeaders  []string // list of Header names
+-	AllowedHeaders []string // list of Header names
+-	AllowedDomains []string // list of allowed values for Http Origin. If empty all are allowed.
+-	AllowedMethods []string
+-	MaxAge         int // number of seconds before requiring new Options request
+-	CookiesAllowed bool
+-	Container      *Container
+-}
+-
+-// Filter is a filter function that implements the CORS flow as documented on http://enable-cors.org/server.html
+-// and http://www.html5rocks.com/static/images/cors_server_flowchart.png
+-func (c CrossOriginResourceSharing) Filter(req *Request, resp *Response, chain *FilterChain) {
+-	origin := req.Request.Header.Get(HEADER_Origin)
+-	if len(origin) == 0 {
+-		if trace {
+-			traceLogger.Println("no Http header Origin set")
+-		}
+-		chain.ProcessFilter(req, resp)
+-		return
+-	}
+-	if len(c.AllowedDomains) > 0 { // if provided then origin must be included
+-		included := false
+-		for _, each := range c.AllowedDomains {
+-			if each == origin {
+-				included = true
+-				break
+-			}
 -		}
--		_, err = io.Copy(w, body)
--		if err != nil {
+-		if !included {
+-			if trace {
+-				traceLogger.Println("HTTP Origin:%s is not part of %v", origin, c.AllowedDomains)
+-			}
+-			chain.ProcessFilter(req, resp)
 -			return
 -		}
+-	}
+-	if req.Request.Method != "OPTIONS" {
+-		c.doActualRequest(req, resp)
+-		chain.ProcessFilter(req, resp)
+-		return
+-	}
+-	if acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod); acrm != "" {
+-		c.doPreflightRequest(req, resp)
+-	} else {
+-		c.doActualRequest(req, resp)
+-	}
+-}
 -
--		w, err = mpw.CreatePart(typeHeader(mediaType))
--		if err != nil {
--			return
+-func (c CrossOriginResourceSharing) doActualRequest(req *Request, resp *Response) {
+-	c.setOptionsHeaders(req, resp)
+-	// continue processing the response
+-}
+-
+-func (c CrossOriginResourceSharing) doPreflightRequest(req *Request, resp *Response) {
+-	if len(c.AllowedMethods) == 0 {
+-		c.AllowedMethods = c.Container.computeAllowedMethods(req)
+-	}
+-
+-	acrm := req.Request.Header.Get(HEADER_AccessControlRequestMethod)
+-	if !c.isValidAccessControlRequestMethod(acrm, c.AllowedMethods) {
+-		if trace {
+-			traceLogger.Printf("Http header %s:%s is not in %v",
+-				HEADER_AccessControlRequestMethod,
+-				acrm,
+-				c.AllowedMethods)
 -		}
--		_, err = io.Copy(w, media)
--		if err != nil {
--			return
+-		return
+-	}
+-	acrhs := req.Request.Header.Get(HEADER_AccessControlRequestHeaders)
+-	if len(acrhs) > 0 {
+-		for _, each := range strings.Split(acrhs, ",") {
+-			if !c.isValidAccessControlRequestHeader(strings.Trim(each, " ")) {
+-				if trace {
+-					traceLogger.Printf("Http header %s:%s is not in %v",
+-						HEADER_AccessControlRequestHeaders,
+-						acrhs,
+-						c.AllowedHeaders)
+-				}
+-				return
+-			}
 -		}
--	}()
--	return totalContentLength, true
+-	}
+-	resp.AddHeader(HEADER_AccessControlAllowMethods, strings.Join(c.AllowedMethods, ","))
+-	resp.AddHeader(HEADER_AccessControlAllowHeaders, acrhs)
+-	c.setOptionsHeaders(req, resp)
+-
+-	// return http 200 response, no body
 -}
 -
--func ResolveRelative(basestr, relstr string) string {
--	u, _ := url.Parse(basestr)
--	rel, _ := url.Parse(relstr)
--	u = u.ResolveReference(rel)
--	us := u.String()
--	us = strings.Replace(us, "%7B", "{", -1)
--	us = strings.Replace(us, "%7D", "}", -1)
--	return us
+-func (c CrossOriginResourceSharing) setOptionsHeaders(req *Request, resp *Response) {
+-	c.checkAndSetExposeHeaders(resp)
+-	c.setAllowOriginHeader(req, resp)
+-	c.checkAndSetAllowCredentials(resp)
+-	if c.MaxAge > 0 {
+-		resp.AddHeader(HEADER_AccessControlMaxAge, strconv.Itoa(c.MaxAge))
+-	}
 -}
 -
--// has4860Fix is whether this Go environment contains the fix for
--// http://golang.org/issue/4860
--var has4860Fix bool
+-func (c CrossOriginResourceSharing) isOriginAllowed(origin string) bool {
+-	if len(origin) == 0 {
+-		return false
+-	}
+-	if len(c.AllowedDomains) == 0 {
+-		return true
+-	}
+-	allowed := false
+-	for _, each := range c.AllowedDomains {
+-		if each == origin {
+-			allowed = true
+-			break
+-		}
+-	}
+-	return allowed
+-}
 -
--// init initializes has4860Fix by checking the behavior of the net/http package.
--func init() {
--	r := http.Request{
--		URL: &url.URL{
--			Scheme: "http",
--			Opaque: "//opaque",
--		},
+-func (c CrossOriginResourceSharing) setAllowOriginHeader(req *Request, resp *Response) {
+-	origin := req.Request.Header.Get(HEADER_Origin)
+-	if c.isOriginAllowed(origin) {
+-		resp.AddHeader(HEADER_AccessControlAllowOrigin, origin)
 -	}
--	b := &bytes.Buffer{}
--	r.Write(b)
--	has4860Fix = bytes.HasPrefix(b.Bytes(), []byte("GET http"))
 -}
 -
--// SetOpaque sets u.Opaque from u.Path such that HTTP requests to it
--// don't alter any hex-escaped characters in u.Path.
--func SetOpaque(u *url.URL) {
--	u.Opaque = "//" + u.Host + u.Path
--	if !has4860Fix {
--		u.Opaque = u.Scheme + ":" + u.Opaque
+-func (c CrossOriginResourceSharing) checkAndSetExposeHeaders(resp *Response) {
+-	if len(c.ExposeHeaders) > 0 {
+-		resp.AddHeader(HEADER_AccessControlExposeHeaders, strings.Join(c.ExposeHeaders, ","))
 -	}
 -}
 -
--// Find {encoded} strings
--var findEncodedStrings = regexp.MustCompile(`(\{[A-Za-z_]+\})`)
+-func (c CrossOriginResourceSharing) checkAndSetAllowCredentials(resp *Response) {
+-	if c.CookiesAllowed {
+-		resp.AddHeader(HEADER_AccessControlAllowCredentials, "true")
+-	}
+-}
 -
--// Expand subsitutes any {encoded} strings in the URL passed in using
--// the map supplied.
--//
--// This calls SetOpaque to avoid encoding of the parameters in the URL path.
--func Expand(u *url.URL, expansions map[string]string) {
--	u.Path = findEncodedStrings.ReplaceAllStringFunc(u.Path, func(replace string) string {
--		argument := replace[1 : len(replace)-1]
--		value, ok := expansions[argument]
--		if !ok {
--			// Expansion not found - leave unchanged
--			return replace
+-func (c CrossOriginResourceSharing) isValidAccessControlRequestMethod(method string, allowedMethods []string) bool {
+-	for _, each := range allowedMethods {
+-		if each == method {
+-			return true
 -		}
--		// Would like to call url.escape(value, encodePath) here
--		encodedValue := url.QueryEscape(value)
--		encodedValue = strings.Replace(encodedValue, "+", "%20", -1)
--		return encodedValue
--	})
--	SetOpaque(u)
+-	}
+-	return false
 -}
 -
--// CloseBody is used to close res.Body.
--// Prior to calling Close, it also tries to Read a small amount to see an EOF.
--// Not seeing an EOF can prevent HTTP Transports from reusing connections.
--func CloseBody(res *http.Response) {
--	if res == nil || res.Body == nil {
--		return
--	}
--	// Justification for 3 byte reads: two for up to "\r\n" after
--	// a JSON/XML document, and then 1 to see EOF if we haven't yet.
--	// TODO(bradfitz): detect Go 1.3+ and skip these reads.
--	// See https://codereview.appspot.com/58240043
--	// and https://codereview.appspot.com/49570044
--	buf := make([]byte, 1)
--	for i := 0; i < 3; i++ {
--		_, err := res.Body.Read(buf)
--		if err != nil {
--			break
+-func (c CrossOriginResourceSharing) isValidAccessControlRequestHeader(header string) bool {
+-	for _, each := range c.AllowedHeaders {
+-		if strings.ToLower(each) == strings.ToLower(header) {
+-			return true
 -		}
 -	}
--	res.Body.Close()
+-	return false
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go
+deleted file mode 100644
+index 9b47230..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/cors_filter_test.go
++++ /dev/null
+@@ -1,125 +0,0 @@
+-package restful
+-
+-import (
+-	"net/http"
+-	"net/http/httptest"
+-	"testing"
+-)
+-
+-// go test -v -test.run TestCORSFilter_Preflight ...restful
+-// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request
+-func TestCORSFilter_Preflight(t *testing.T) {
+-	tearDown()
+-	ws := new(WebService)
+-	ws.Route(ws.PUT("/cors").To(dummy))
+-	Add(ws)
+-
+-	cors := CrossOriginResourceSharing{
+-		ExposeHeaders:  []string{"X-Custom-Header"},
+-		AllowedHeaders: []string{"X-Custom-Header", "X-Additional-Header"},
+-		CookiesAllowed: true,
+-		Container:      DefaultContainer}
+-	Filter(cors.Filter)
+-
+-	// Preflight
+-	httpRequest, _ := http.NewRequest("OPTIONS", "http://api.alice.com/cors", nil)
+-	httpRequest.Method = "OPTIONS"
+-	httpRequest.Header.Set(HEADER_Origin, "http://api.bob.com")
+-	httpRequest.Header.Set(HEADER_AccessControlRequestMethod, "PUT")
+-	httpRequest.Header.Set(HEADER_AccessControlRequestHeaders, "X-Custom-Header, X-Additional-Header")
+-
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-
+-	actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin)
+-	if "http://api.bob.com" != actual {
+-		t.Fatal("expected: http://api.bob.com but got:" + actual)
+-	}
+-	actual = httpWriter.Header().Get(HEADER_AccessControlAllowMethods)
+-	if "PUT" != actual {
+-		t.Fatal("expected: PUT but got:" + actual)
+-	}
+-	actual = httpWriter.Header().Get(HEADER_AccessControlAllowHeaders)
+-	if "X-Custom-Header, X-Additional-Header" != actual {
+-		t.Fatal("expected: X-Custom-Header, X-Additional-Header but got:" + actual)
+-	}
+-
+-	if !cors.isOriginAllowed("somewhere") {
+-		t.Fatal("origin expected to be allowed")
+-	}
+-	cors.AllowedDomains = []string{"overthere.com"}
+-	if cors.isOriginAllowed("somewhere") {
+-		t.Fatal("origin [somewhere] expected NOT to be allowed")
+-	}
+-	if !cors.isOriginAllowed("overthere.com") {
+-		t.Fatal("origin [overthere] expected to be allowed")
+-	}
 -
 -}
 -
--// VariantType returns the type name of the given variant.
--// If the map doesn't contain the named key or the value is not a []interface{}, "" is returned.
--// This is used to support "variant" APIs that can return one of a number of different types.
--func VariantType(t map[string]interface{}) string {
--	s, _ := t["type"].(string)
--	return s
+-// go test -v -test.run TestCORSFilter_Actual ...restful
+-// http://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request
+-func TestCORSFilter_Actual(t *testing.T) {
+-	tearDown()
+-	ws := new(WebService)
+-	ws.Route(ws.PUT("/cors").To(dummy))
+-	Add(ws)
+-
+-	cors := CrossOriginResourceSharing{
+-		ExposeHeaders:  []string{"X-Custom-Header"},
+-		AllowedHeaders: []string{"X-Custom-Header", "X-Additional-Header"},
+-		CookiesAllowed: true,
+-		Container:      DefaultContainer}
+-	Filter(cors.Filter)
+-
+-	// Actual
+-	httpRequest, _ := http.NewRequest("PUT", "http://api.alice.com/cors", nil)
+-	httpRequest.Header.Set(HEADER_Origin, "http://api.bob.com")
+-	httpRequest.Header.Set("X-Custom-Header", "value")
+-
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin)
+-	if "http://api.bob.com" != actual {
+-		t.Fatal("expected: http://api.bob.com but got:" + actual)
+-	}
+-	if httpWriter.Body.String() != "dummy" {
+-		t.Fatal("expected: dummy but got:" + httpWriter.Body.String())
+-	}
 -}
 -
--// ConvertVariant uses the JSON encoder/decoder to fill in the struct 'dst' with the fields found in variant 'v'.
--// This is used to support "variant" APIs that can return one of a number of different types.
--// It reports whether the conversion was successful.
--func ConvertVariant(v map[string]interface{}, dst interface{}) bool {
--	var buf bytes.Buffer
--	err := json.NewEncoder(&buf).Encode(v)
--	if err != nil {
--		return false
+-var allowedDomainInput = []struct {
+-	domains  []string
+-	origin   string
+-	accepted bool
+-}{
+-	{[]string{}, "http://anything.com", true},
+-}
+-
+-// go test -v -test.run TestCORSFilter_AllowedDomains ...restful
+-func TestCORSFilter_AllowedDomains(t *testing.T) {
+-	for _, each := range allowedDomainInput {
+-		tearDown()
+-		ws := new(WebService)
+-		ws.Route(ws.PUT("/cors").To(dummy))
+-		Add(ws)
+-
+-		cors := CrossOriginResourceSharing{
+-			AllowedDomains: each.domains,
+-			CookiesAllowed: true,
+-			Container:      DefaultContainer}
+-		Filter(cors.Filter)
+-
+-		httpRequest, _ := http.NewRequest("PUT", "http://api.his.com/cors", nil)
+-		httpRequest.Header.Set(HEADER_Origin, each.origin)
+-		httpWriter := httptest.NewRecorder()
+-		DefaultContainer.dispatch(httpWriter, httpRequest)
+-		actual := httpWriter.Header().Get(HEADER_AccessControlAllowOrigin)
+-		if actual != each.origin && each.accepted {
+-			t.Fatal("expected to be accepted")
+-		}
+-		if actual == each.origin && !each.accepted {
+-			t.Fatal("did not expect to be accepted")
+-		}
 -	}
--	return json.Unmarshal(buf.Bytes(), dst) == nil
 -}
-diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/coverage.sh b/Godeps/_workspace/src/github.com/emicklei/go-restful/coverage.sh
 deleted file mode 100644
-index d94e6c0..0000000
---- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/googleapi_test.go
+index e27dbf1..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/coverage.sh
 +++ /dev/null
-@@ -1,351 +0,0 @@
--// Copyright 2011 Google Inc. All rights reserved.
--// Use of this source code is governed by a BSD-style
--// license that can be found in the LICENSE file.
+@@ -1,2 +0,0 @@
+-go test -coverprofile=coverage.out
+-go tool cover -html=coverage.out
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/curly.go
+deleted file mode 100644
+index 1a29826..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly.go
++++ /dev/null
+@@ -1,162 +0,0 @@
+-package restful
 -
--package googleapi
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
 -import (
--	"bytes"
--	"encoding/json"
--	"fmt"
--	"io/ioutil"
 -	"net/http"
--	"net/url"
--	"reflect"
+-	"regexp"
+-	"sort"
 -	"strings"
--	"testing"
 -)
 -
--type SetOpaqueTest struct {
--	in             *url.URL
--	wantRequestURI string
--}
+-// CurlyRouter expects Routes with paths that contain zero or more parameters in curly brackets.
+-type CurlyRouter struct{}
 -
--var setOpaqueTests = []SetOpaqueTest{
--	// no path
--	{
--		&url.URL{
--			Scheme: "http",
--			Host:   "www.golang.org",
--		},
--		"http://www.golang.org",
--	},
--	// path
--	{
--		&url.URL{
--			Scheme: "http",
--			Host:   "www.golang.org",
--			Path:   "/",
--		},
--		"http://www.golang.org/",
--	},
--	// file with hex escaping
--	{
--		&url.URL{
--			Scheme: "https",
--			Host:   "www.golang.org",
--			Path:   "/file%20one&two",
--		},
--		"https://www.golang.org/file%20one&two",
--	},
--	// query
--	{
--		&url.URL{
--			Scheme:   "http",
--			Host:     "www.golang.org",
--			Path:     "/",
--			RawQuery: "q=go+language",
--		},
--		"http://www.golang.org/?q=go+language",
--	},
--	// file with hex escaping in path plus query
--	{
--		&url.URL{
--			Scheme:   "https",
--			Host:     "www.golang.org",
--			Path:     "/file%20one&two",
--			RawQuery: "q=go+language",
--		},
--		"https://www.golang.org/file%20one&two?q=go+language",
--	},
--	// query with hex escaping
--	{
--		&url.URL{
--			Scheme:   "http",
--			Host:     "www.golang.org",
--			Path:     "/",
--			RawQuery: "q=go%20language",
--		},
--		"http://www.golang.org/?q=go%20language",
--	},
--}
+-// SelectRoute is part of the Router interface and returns the best match
+-// for the WebService and its Route for the given Request.
+-func (c CurlyRouter) SelectRoute(
+-	webServices []*WebService,
+-	httpRequest *http.Request) (selectedService *WebService, selected *Route, err error) {
 -
--// prefixTmpl is a template for the expected prefix of the output of writing
--// an HTTP request.
--const prefixTmpl = "GET %v HTTP/1.1\r\nHost: %v\r\n"
+-	requestTokens := tokenizePath(httpRequest.URL.Path)
 -
--func TestSetOpaque(t *testing.T) {
--	for _, test := range setOpaqueTests {
--		u := *test.in
--		SetOpaque(&u)
+-	detectedService := c.detectWebService(requestTokens, webServices)
+-	if detectedService == nil {
+-		if trace {
+-			traceLogger.Printf("no WebService was found to match URL path:%s\n", httpRequest.URL.Path)
+-		}
+-		return nil, nil, NewError(http.StatusNotFound, "404: Page Not Found")
+-	}
+-	candidateRoutes := c.selectRoutes(detectedService, requestTokens)
+-	if len(candidateRoutes) == 0 {
+-		if trace {
+-			traceLogger.Printf("no Route in WebService with path %s was found to match URL path:%s\n", detectedService.rootPath, httpRequest.URL.Path)
+-		}
+-		return detectedService, nil, NewError(http.StatusNotFound, "404: Page Not Found")
+-	}
+-	selectedRoute, err := c.detectRoute(candidateRoutes, httpRequest)
+-	if selectedRoute == nil {
+-		return detectedService, nil, err
+-	}
+-	return detectedService, selectedRoute, nil
+-}
 -
--		w := &bytes.Buffer{}
--		r := &http.Request{URL: &u}
--		if err := r.Write(w); err != nil {
--			t.Errorf("write request: %v", err)
--			continue
+-// selectRoutes return a collection of Route from a WebService that matches the path tokens from the request.
+-func (c CurlyRouter) selectRoutes(ws *WebService, requestTokens []string) []Route {
+-	candidates := &sortableCurlyRoutes{[]*curlyRoute{}}
+-	for _, each := range ws.routes {
+-		matches, paramCount, staticCount := c.matchesRouteByPathTokens(each.pathParts, requestTokens)
+-		if matches {
+-			candidates.add(&curlyRoute{each, paramCount, staticCount}) // TODO make sure Routes() return pointers?
 -		}
+-	}
+-	sort.Sort(sort.Reverse(candidates))
+-	return candidates.routes()
+-}
 -
--		prefix := fmt.Sprintf(prefixTmpl, test.wantRequestURI, test.in.Host)
--		if got := string(w.Bytes()); !strings.HasPrefix(got, prefix) {
--			t.Errorf("got %q expected prefix %q", got, prefix)
+-// matchesRouteByPathTokens computes whether it matches, howmany parameters do match and what the number of static path elements are.
+-func (c CurlyRouter) matchesRouteByPathTokens(routeTokens, requestTokens []string) (matches bool, paramCount int, staticCount int) {
+-	if len(routeTokens) < len(requestTokens) {
+-		// proceed in matching only if last routeToken is wildcard
+-		count := len(routeTokens)
+-		if count == 0 || !strings.HasSuffix(routeTokens[count-1], "*}") {
+-			return false, 0, 0
+-		}
+-		// proceed
+-	}
+-	for i, routeToken := range routeTokens {
+-		if i == len(requestTokens) {
+-			// reached end of request path
+-			return false, 0, 0
+-		}
+-		requestToken := requestTokens[i]
+-		if strings.HasPrefix(routeToken, "{") {
+-			paramCount++
+-			if colon := strings.Index(routeToken, ":"); colon != -1 {
+-				// match by regex
+-				matchesToken, matchesRemainder := c.regularMatchesPathToken(routeToken, colon, requestToken)
+-				if !matchesToken {
+-					return false, 0, 0
+-				}
+-				if matchesRemainder {
+-					break
+-				}
+-			}
+-		} else { // no { prefix
+-			if requestToken != routeToken {
+-				return false, 0, 0
+-			}
+-			staticCount++
 -		}
 -	}
+-	return true, paramCount, staticCount
 -}
 -
--type ExpandTest struct {
--	in         string
--	expansions map[string]string
--	want       string
+-// regularMatchesPathToken tests whether the regular expression part of routeToken matches the requestToken or all remaining tokens
+-// format routeToken is {someVar:someExpression}, e.g. {zipcode:[\d][\d][\d][\d][A-Z][A-Z]}
+-func (c CurlyRouter) regularMatchesPathToken(routeToken string, colon int, requestToken string) (matchesToken bool, matchesRemainder bool) {
+-	regPart := routeToken[colon+1 : len(routeToken)-1]
+-	if regPart == "*" {
+-		if trace {
+-			traceLogger.Printf("wildcard parameter detected in route token %s that matches %s\n", routeToken, requestToken)
+-		}
+-		return true, true
+-	}
+-	matched, err := regexp.MatchString(regPart, requestToken)
+-	return (matched && err == nil), false
 -}
 -
--var expandTests = []ExpandTest{
--	// no expansions
--	{
--		"http://www.golang.org/",
--		map[string]string{},
--		"http://www.golang.org/",
--	},
--	// one expansion, no escaping
--	{
--		"http://www.golang.org/{bucket}/delete",
--		map[string]string{
--			"bucket": "red",
--		},
--		"http://www.golang.org/red/delete",
--	},
--	// one expansion, with hex escapes
--	{
--		"http://www.golang.org/{bucket}/delete",
--		map[string]string{
--			"bucket": "red/blue",
--		},
--		"http://www.golang.org/red%2Fblue/delete",
--	},
--	// one expansion, with space
--	{
--		"http://www.golang.org/{bucket}/delete",
--		map[string]string{
--			"bucket": "red or blue",
--		},
--		"http://www.golang.org/red%20or%20blue/delete",
--	},
--	// expansion not found
--	{
--		"http://www.golang.org/{object}/delete",
--		map[string]string{
--			"bucket": "red or blue",
--		},
--		"http://www.golang.org/{object}/delete",
--	},
--	// multiple expansions
--	{
--		"http://www.golang.org/{one}/{two}/{three}/get",
--		map[string]string{
--			"one":   "ONE",
--			"two":   "TWO",
--			"three": "THREE",
--		},
--		"http://www.golang.org/ONE/TWO/THREE/get",
--	},
--	// utf-8 characters
--	{
--		"http://www.golang.org/{bucket}/get",
--		map[string]string{
--			"bucket": "£100",
--		},
--		"http://www.golang.org/%C2%A3100/get",
--	},
--	// punctuations
--	{
--		"http://www.golang.org/{bucket}/get",
--		map[string]string{
--			"bucket": `/\@:,.`,
--		},
--		"http://www.golang.org/%2F%5C%40%3A%2C./get",
--	},
--	// mis-matched brackets
--	{
--		"http://www.golang.org/{bucket/get",
--		map[string]string{
--			"bucket": "red",
--		},
--		"http://www.golang.org/{bucket/get",
--	},
+-// detectRoute selectes from a list of Route the first match by inspecting both the Accept and Content-Type
+-// headers of the Request. See also RouterJSR311 in jsr311.go
+-func (c CurlyRouter) detectRoute(candidateRoutes []Route, httpRequest *http.Request) (*Route, error) {
+-	// tracing is done inside detectRoute
+-	return RouterJSR311{}.detectRoute(candidateRoutes, httpRequest)
 -}
 -
--func TestExpand(t *testing.T) {
--	for i, test := range expandTests {
--		u := url.URL{
--			Path: test.in,
+-// detectWebService returns the best matching webService given the list of path tokens.
+-// see also computeWebserviceScore
+-func (c CurlyRouter) detectWebService(requestTokens []string, webServices []*WebService) *WebService {
+-	var best *WebService
+-	score := -1
+-	for _, each := range webServices {
+-		matches, eachScore := c.computeWebserviceScore(requestTokens, each.compiledPathExpression().tokens)
+-		if matches && (eachScore > score) {
+-			best = each
+-			score = eachScore
 -		}
--		Expand(&u, test.expansions)
--		got := u.Path
--		if got != test.want {
--			t.Errorf("got %q expected %q in test %d", got, test.want, i+1)
+-	}
+-	return best
+-}
+-
+-// computeWebserviceScore returns whether tokens match and
+-// the weighted score of the longest matching consecutive tokens from the beginning.
+-func (c CurlyRouter) computeWebserviceScore(requestTokens []string, tokens []string) (bool, int) {
+-	if len(tokens) > len(requestTokens) {
+-		return false, 0
+-	}
+-	score := 0
+-	for i := 0; i < len(tokens); i++ {
+-		each := requestTokens[i]
+-		other := tokens[i]
+-		if len(each) == 0 && len(other) == 0 {
+-			score++
+-			continue
+-		}
+-		if len(other) > 0 && strings.HasPrefix(other, "{") {
+-			// no empty match
+-			if len(each) == 0 {
+-				return false, score
+-			}
+-			score += 1
+-		} else {
+-			// not a parameter
+-			if each != other {
+-				return false, score
+-			}
+-			score += (len(tokens) - i) * 10 //fuzzy
 -		}
 -	}
+-	return true, score
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_route.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_route.go
+deleted file mode 100644
+index 3edab72..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_route.go
++++ /dev/null
+@@ -1,54 +0,0 @@
+-package restful
 -
--type CheckResponseTest struct {
--	in       *http.Response
--	bodyText string
--	want     error
--	errText  string
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
+-// curlyRoute exits for sorting Routes by the CurlyRouter based on number of parameters and number of static path elements.
+-type curlyRoute struct {
+-	route       Route
+-	paramCount  int
+-	staticCount int
 -}
 -
--var checkResponseTests = []CheckResponseTest{
--	{
--		&http.Response{
--			StatusCode: http.StatusOK,
--		},
--		"",
--		nil,
--		"",
--	},
--	{
--		&http.Response{
--			StatusCode: http.StatusInternalServerError,
--		},
--		`{"error":{}}`,
--		&Error{
--			Code: http.StatusInternalServerError,
--			Body: `{"error":{}}`,
--		},
--		`googleapi: got HTTP response code 500 with body: {"error":{}}`,
--	},
--	{
--		&http.Response{
--			StatusCode: http.StatusNotFound,
--		},
--		`{"error":{"message":"Error message for StatusNotFound."}}`,
--		&Error{
--			Code:    http.StatusNotFound,
--			Message: "Error message for StatusNotFound.",
--			Body:    `{"error":{"message":"Error message for StatusNotFound."}}`,
--		},
--		"googleapi: Error 404: Error message for StatusNotFound.",
--	},
--	{
--		&http.Response{
--			StatusCode: http.StatusBadRequest,
--		},
--		`{"error":"invalid_token","error_description":"Invalid Value"}`,
--		&Error{
--			Code: http.StatusBadRequest,
--			Body: `{"error":"invalid_token","error_description":"Invalid Value"}`,
--		},
--		`googleapi: got HTTP response code 400 with body: {"error":"invalid_token","error_description":"Invalid Value"}`,
--	},
--	{
--		&http.Response{
--			StatusCode: http.StatusBadRequest,
--		},
--		`{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`,
--		&Error{
--			Code: http.StatusBadRequest,
--			Errors: []ErrorItem{
--				{
--					Reason:  "keyInvalid",
--					Message: "Bad Request",
--				},
--			},
--			Body:    `{"error":{"errors":[{"domain":"usageLimits","reason":"keyInvalid","message":"Bad Request"}],"code":400,"message":"Bad Request"}}`,
--			Message: "Bad Request",
--		},
--		"googleapi: Error 400: Bad Request, keyInvalid",
--	},
+-type sortableCurlyRoutes struct {
+-	candidates []*curlyRoute
 -}
 -
--func TestCheckResponse(t *testing.T) {
--	for _, test := range checkResponseTests {
--		res := test.in
--		if test.bodyText != "" {
--			res.Body = ioutil.NopCloser(strings.NewReader(test.bodyText))
+-func (s *sortableCurlyRoutes) add(route *curlyRoute) {
+-	s.candidates = append(s.candidates, route)
+-}
+-
+-func (s *sortableCurlyRoutes) routes() (routes []Route) {
+-	for _, each := range s.candidates {
+-		routes = append(routes, each.route) // TODO change return type
+-	}
+-	return routes
+-}
+-
+-func (s *sortableCurlyRoutes) Len() int {
+-	return len(s.candidates)
+-}
+-func (s *sortableCurlyRoutes) Swap(i, j int) {
+-	s.candidates[i], s.candidates[j] = s.candidates[j], s.candidates[i]
+-}
+-func (s *sortableCurlyRoutes) Less(i, j int) bool {
+-	ci := s.candidates[i]
+-	cj := s.candidates[j]
+-
+-	// primary key
+-	if ci.staticCount < cj.staticCount {
+-		return true
+-	}
+-	if ci.staticCount > cj.staticCount {
+-		return false
+-	}
+-	// secundary key
+-	if ci.paramCount < cj.paramCount {
+-		return true
+-	}
+-	if ci.paramCount > cj.paramCount {
+-		return false
+-	}
+-	return ci.route.Path < cj.route.Path
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go
+deleted file mode 100644
+index 4291825..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/curly_test.go
++++ /dev/null
+@@ -1,228 +0,0 @@
+-package restful
+-
+-import (
+-	"io"
+-	"net/http"
+-	"testing"
+-)
+-
+-var requestPaths = []struct {
+-	// url with path (1) is handled by service with root (2) and remainder has value final (3)
+-	path, root string
+-}{
+-	{"/", "/"},
+-	{"/p", "/p"},
+-	{"/p/x", "/p/{q}"},
+-	{"/q/x", "/q"},
+-	{"/p/x/", "/p/{q}"},
+-	{"/p/x/y", "/p/{q}"},
+-	{"/q/x/y", "/q"},
+-	{"/z/q", "/{p}/q"},
+-	{"/a/b/c/q", "/"},
+-}
+-
+-// go test -v -test.run TestCurlyDetectWebService ...restful
+-func TestCurlyDetectWebService(t *testing.T) {
+-	ws1 := new(WebService).Path("/")
+-	ws2 := new(WebService).Path("/p")
+-	ws3 := new(WebService).Path("/q")
+-	ws4 := new(WebService).Path("/p/q")
+-	ws5 := new(WebService).Path("/p/{q}")
+-	ws7 := new(WebService).Path("/{p}/q")
+-	var wss = []*WebService{ws1, ws2, ws3, ws4, ws5, ws7}
+-
+-	for _, each := range wss {
+-		t.Logf("path=%s,toks=%v\n", each.compiledPathExpression().Source, each.compiledPathExpression().tokens)
+-	}
+-
+-	router := CurlyRouter{}
+-
+-	ok := true
+-	for i, fixture := range requestPaths {
+-		requestTokens := tokenizePath(fixture.path)
+-		who := router.detectWebService(requestTokens, wss)
+-		if who != nil && who.RootPath() != fixture.root {
+-			t.Logf("[line:%v] Unexpected dispatcher, expected:%v, actual:%v", i, fixture.root, who.RootPath())
+-			ok = false
 -		}
--		g := CheckResponse(res)
--		if !reflect.DeepEqual(g, test.want) {
--			t.Errorf("CheckResponse: got %v, want %v", g, test.want)
--			gotJson, err := json.Marshal(g)
--			if err != nil {
--				t.Error(err)
--			}
--			wantJson, err := json.Marshal(test.want)
--			if err != nil {
--				t.Error(err)
+-	}
+-	if !ok {
+-		t.Fail()
+-	}
+-}
+-
+-var serviceDetects = []struct {
+-	path  string
+-	found bool
+-	root  string
+-}{
+-	{"/a/b", true, "/{p}/{q}/{r}"},
+-	{"/p/q", true, "/p/q"},
+-	{"/q/p", true, "/q"},
+-	{"/", true, "/"},
+-	{"/p/q/r", true, "/p/q"},
+-}
+-
+-// go test -v -test.run Test_detectWebService ...restful
+-func Test_detectWebService(t *testing.T) {
+-	router := CurlyRouter{}
+-	ws1 := new(WebService).Path("/")
+-	ws2 := new(WebService).Path("/p")
+-	ws3 := new(WebService).Path("/q")
+-	ws4 := new(WebService).Path("/p/q")
+-	ws5 := new(WebService).Path("/p/{q}")
+-	ws6 := new(WebService).Path("/p/{q}/")
+-	ws7 := new(WebService).Path("/{p}/q")
+-	ws8 := new(WebService).Path("/{p}/{q}/{r}")
+-	var wss = []*WebService{ws8, ws7, ws6, ws5, ws4, ws3, ws2, ws1}
+-	for _, fix := range serviceDetects {
+-		requestPath := fix.path
+-		requestTokens := tokenizePath(requestPath)
+-		for _, ws := range wss {
+-			serviceTokens := ws.compiledPathExpression().tokens
+-			matches, score := router.computeWebserviceScore(requestTokens, serviceTokens)
+-			t.Logf("req=%s,toks:%v,ws=%s,toks:%v,score=%d,matches=%v", requestPath, requestTokens, ws.RootPath(), serviceTokens, score, matches)
+-		}
+-		best := router.detectWebService(requestTokens, wss)
+-		if best != nil {
+-			if fix.found {
+-				t.Logf("best=%s", best.RootPath())
+-			} else {
+-				t.Fatalf("should have found:%s", fix.root)
 -			}
--			t.Errorf("json(got):  %q\njson(want): %q", string(gotJson), string(wantJson))
 -		}
--		if g != nil && g.Error() != test.errText {
--			t.Errorf("CheckResponse: unexpected error message.\nGot:  %q\nwant: %q", g, test.errText)
+-	}
+-}
+-
+-var routeMatchers = []struct {
+-	route       string
+-	path        string
+-	matches     bool
+-	paramCount  int
+-	staticCount int
+-}{
+-	// route, request-path
+-	{"/a", "/a", true, 0, 1},
+-	{"/a", "/b", false, 0, 0},
+-	{"/a", "/b", false, 0, 0},
+-	{"/a/{b}/c/", "/a/2/c", true, 1, 2},
+-	{"/{a}/{b}/{c}/", "/a/b", false, 0, 0},
+-	{"/{x:*}", "/", false, 0, 0},
+-	{"/{x:*}", "/a", true, 1, 0},
+-	{"/{x:*}", "/a/b", true, 1, 0},
+-	{"/a/{x:*}", "/a/b", true, 1, 1},
+-	{"/a/{x:[A-Z][A-Z]}", "/a/ZX", true, 1, 1},
+-	{"/basepath/{resource:*}", "/basepath/some/other/location/test.xml", true, 1, 1},
+-}
+-
+-// clear && go test -v -test.run Test_matchesRouteByPathTokens ...restful
+-func Test_matchesRouteByPathTokens(t *testing.T) {
+-	router := CurlyRouter{}
+-	for i, each := range routeMatchers {
+-		routeToks := tokenizePath(each.route)
+-		reqToks := tokenizePath(each.path)
+-		matches, pCount, sCount := router.matchesRouteByPathTokens(routeToks, reqToks)
+-		if matches != each.matches {
+-			t.Fatalf("[%d] unexpected matches outcome route:%s, path:%s, matches:%v", i, each.route, each.path, matches)
+-		}
+-		if pCount != each.paramCount {
+-			t.Fatalf("[%d] unexpected paramCount got:%d want:%d ", i, pCount, each.paramCount)
+-		}
+-		if sCount != each.staticCount {
+-			t.Fatalf("[%d] unexpected staticCount got:%d want:%d ", i, sCount, each.staticCount)
 -		}
 -	}
 -}
 -
--type VariantPoint struct {
--	Type        string
--	Coordinates []float64
+-// clear && go test -v -test.run TestExtractParameters_Wildcard1 ...restful
+-func TestExtractParameters_Wildcard1(t *testing.T) {
+-	params := doExtractParams("/fixed/{var:*}", 2, "/fixed/remainder", t)
+-	if params["var"] != "remainder" {
+-		t.Errorf("parameter mismatch var: %s", params["var"])
+-	}
 -}
 -
--type VariantTest struct {
--	in     map[string]interface{}
--	result bool
--	want   VariantPoint
+-// clear && go test -v -test.run TestExtractParameters_Wildcard2 ...restful
+-func TestExtractParameters_Wildcard2(t *testing.T) {
+-	params := doExtractParams("/fixed/{var:*}", 2, "/fixed/remain/der", t)
+-	if params["var"] != "remain/der" {
+-		t.Errorf("parameter mismatch var: %s", params["var"])
+-	}
 -}
 -
--var coords = []interface{}{1.0, 2.0}
+-// clear && go test -v -test.run TestExtractParameters_Wildcard3 ...restful
+-func TestExtractParameters_Wildcard3(t *testing.T) {
+-	params := doExtractParams("/static/{var:*}", 2, "/static/test/sub/hi.html", t)
+-	if params["var"] != "test/sub/hi.html" {
+-		t.Errorf("parameter mismatch var: %s", params["var"])
+-	}
+-}
 -
--var variantTests = []VariantTest{
--	{
--		in: map[string]interface{}{
--			"type":        "Point",
--			"coordinates": coords,
--		},
--		result: true,
--		want: VariantPoint{
--			Type:        "Point",
--			Coordinates: []float64{1.0, 2.0},
--		},
--	},
--	{
--		in: map[string]interface{}{
--			"type":  "Point",
--			"bogus": coords,
--		},
--		result: true,
--		want: VariantPoint{
--			Type: "Point",
--		},
--	},
+-// clear && go test -v -test.run TestCurly_ISSUE_34 ...restful
+-func TestCurly_ISSUE_34(t *testing.T) {
+-	ws1 := new(WebService).Path("/")
+-	ws1.Route(ws1.GET("/{type}/{id}").To(curlyDummy))
+-	ws1.Route(ws1.GET("/network/{id}").To(curlyDummy))
+-	routes := CurlyRouter{}.selectRoutes(ws1, tokenizePath("/network/12"))
+-	if len(routes) != 2 {
+-		t.Fatal("expected 2 routes")
+-	}
+-	if routes[0].Path != "/network/{id}" {
+-		t.Error("first is", routes[0].Path)
+-	}
 -}
 -
--func TestVariantType(t *testing.T) {
--	for _, test := range variantTests {
--		if g := VariantType(test.in); g != test.want.Type {
--			t.Errorf("VariantType(%v): got %v, want %v", test.in, g, test.want.Type)
--		}
+-// clear && go test -v -test.run TestCurly_ISSUE_34_2 ...restful
+-func TestCurly_ISSUE_34_2(t *testing.T) {
+-	ws1 := new(WebService)
+-	ws1.Route(ws1.GET("/network/{id}").To(curlyDummy))
+-	ws1.Route(ws1.GET("/{type}/{id}").To(curlyDummy))
+-	routes := CurlyRouter{}.selectRoutes(ws1, tokenizePath("/network/12"))
+-	if len(routes) != 2 {
+-		t.Fatal("expected 2 routes")
+-	}
+-	if routes[0].Path != "/network/{id}" {
+-		t.Error("first is", routes[0].Path)
 -	}
 -}
 -
--func TestConvertVariant(t *testing.T) {
--	for _, test := range variantTests {
--		g := VariantPoint{}
--		r := ConvertVariant(test.in, &g)
--		if r != test.result {
--			t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, r, test.result)
--		}
--		if !reflect.DeepEqual(g, test.want) {
--			t.Errorf("ConvertVariant(%v): got %v, want %v", test.in, g, test.want)
--		}
+-// clear && go test -v -test.run TestCurly_JsonHtml ...restful
+-func TestCurly_JsonHtml(t *testing.T) {
+-	ws1 := new(WebService)
+-	ws1.Route(ws1.GET("/some.html").To(curlyDummy).Consumes("*/*").Produces("text/html"))
+-	req, _ := http.NewRequest("GET", "/some.html", nil)
+-	req.Header.Set("Accept", "application/json")
+-	_, route, err := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req)
+-	if err == nil {
+-		t.Error("error expected")
+-	}
+-	if route != nil {
+-		t.Error("no route expected")
 -	}
 -}
-diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go
+-
+-// go test -v -test.run TestCurly_ISSUE_137 ...restful
+-func TestCurly_ISSUE_137(t *testing.T) {
+-	ws1 := new(WebService)
+-	ws1.Route(ws1.GET("/hello").To(curlyDummy))
+-	req, _ := http.NewRequest("GET", "/", nil)
+-	_, route, _ := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req)
+-	t.Log(route)
+-	if route != nil {
+-		t.Error("no route expected")
+-	}
+-}
+-
+-// go test -v -test.run TestCurly_ISSUE_137_2 ...restful
+-func TestCurly_ISSUE_137_2(t *testing.T) {
+-	ws1 := new(WebService)
+-	ws1.Route(ws1.GET("/hello").To(curlyDummy))
+-	req, _ := http.NewRequest("GET", "/hello/bob", nil)
+-	_, route, _ := CurlyRouter{}.SelectRoute([]*WebService{ws1}, req)
+-	t.Log(route)
+-	if route != nil {
+-		t.Errorf("no route expected, got %v", route)
+-	}
+-}
+-
+-func curlyDummy(req *Request, resp *Response) { io.WriteString(resp.ResponseWriter, "curlyDummy") }
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/doc.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/doc.go
 deleted file mode 100644
-index eca1ea2..0000000
---- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/transport/apikey.go
+index c095566..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/doc.go
 +++ /dev/null
-@@ -1,38 +0,0 @@
--// Copyright 2012 Google Inc. All rights reserved.
--// Use of this source code is governed by a BSD-style
--// license that can be found in the LICENSE file.
+@@ -1,184 +0,0 @@
+-/*
+-Package restful, a lean package for creating REST-style WebServices without magic.
 -
--// Package transport contains HTTP transports used to make
--// authenticated API requests.
--package transport
+-WebServices and Routes
 -
--import (
--	"errors"
--	"net/http"
--)
+-A WebService has a collection of Route objects that dispatch incoming Http Requests to a function calls.
+-Typically, a WebService has a root path (e.g. /users) and defines common MIME types for its routes.
+-WebServices must be added to a container (see below) in order to handler Http requests from a server.
 -
--// APIKey is an HTTP Transport which wraps an underlying transport and
--// appends an API Key "key" parameter to the URL of outgoing requests.
--type APIKey struct {
--	// Key is the API Key to set on requests.
--	Key string
+-A Route is defined by a HTTP method, an URL path and (optionally) the MIME types it consumes (Content-Type) and produces (Accept).
+-This package has the logic to find the best matching Route and if found, call its Function.
 -
--	// Transport is the underlying HTTP transport.
--	// If nil, http.DefaultTransport is used.
--	Transport http.RoundTripper
--}
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes(restful.MIME_JSON, restful.MIME_XML).
+-		Produces(restful.MIME_JSON, restful.MIME_XML)
 -
--func (t *APIKey) RoundTrip(req *http.Request) (*http.Response, error) {
--	rt := t.Transport
--	if rt == nil {
--		rt = http.DefaultTransport
--		if rt == nil {
--			return nil, errors.New("googleapi/transport: no Transport specified or available")
--		}
+-	ws.Route(ws.GET("/{user-id}").To(u.findUser))  // u is a UserResource
+-
+-	...
+-
+-	// GET http://localhost:8080/users/1
+-	func (u UserResource) findUser(request *restful.Request, response *restful.Response) {
+-		id := request.PathParameter("user-id")
+-		...
 -	}
--	newReq := *req
--	args := newReq.URL.Query()
--	args.Set("key", t.Key)
--	newReq.URL.RawQuery = args.Encode()
--	return rt.RoundTrip(&newReq)
+-
+-The (*Request, *Response) arguments provide functions for reading information from the request and writing information back to the response.
+-
+-See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-user-resource.go with a full implementation.
+-
+-Regular expression matching Routes
+-
+-A Route parameter can be specified using the format "uri/{var[:regexp]}" or the special version "uri/{var:*}" for matching the tail of the path.
+-For example, /persons/{name:[A-Z][A-Z]} can be used to restrict values for the parameter "name" to only contain capital alphabetic characters.
+-Regular expressions must use the standard Go syntax as described in the regexp package. (https://code.google.com/p/re2/wiki/Syntax)
+-This feature requires the use of a CurlyRouter.
+-
+-Containers
+-
+-A Container holds a collection of WebServices, Filters and a http.ServeMux for multiplexing http requests.
+-Using the statements "restful.Add(...) and restful.Filter(...)" will register WebServices and Filters to the Default Container.
+-The Default container of go-restful uses the http.DefaultServeMux.
+-You can create your own Container and create a new http.Server for that particular container.
+-
+-	container := restful.NewContainer()
+-	server := &http.Server{Addr: ":8081", Handler: container}
+-
+-Filters
+-
+-A filter dynamically intercepts requests and responses to transform or use the information contained in the requests or responses.
+-You can use filters to perform generic logging, measurement, authentication, redirect, set response headers etc.
+-In the restful package there are three hooks into the request,response flow where filters can be added.
+-Each filter must define a FilterFunction:
+-
+-	func (req *restful.Request, resp *restful.Response, chain *restful.FilterChain)
+-
+-Use the following statement to pass the request,response pair to the next filter or RouteFunction
+-
+-	chain.ProcessFilter(req, resp)
+-
+-Container Filters
+-
+-These are processed before any registered WebService.
+-
+-	// install a (global) filter for the default container (processed before any webservice)
+-	restful.Filter(globalLogging)
+-
+-WebService Filters
+-
+-These are processed before any Route of a WebService.
+-
+-	// install a webservice filter (processed before any route)
+-	ws.Filter(webserviceLogging).Filter(measureTime)
+-
+-
+-Route Filters
+-
+-These are processed before calling the function associated with the Route.
+-
+-	// install 2 chained route filters (processed before calling findUser)
+-	ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser))
+-
+-See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-filters.go with full implementations.
+-
+-Response Encoding
+-
+-Two encodings are supported: gzip and deflate. To enable this for all responses:
+-
+-	restful.DefaultContainer.EnableContentEncoding(true)
+-
+-If a Http request includes the Accept-Encoding header then the response content will be compressed using the specified encoding.
+-Alternatively, you can create a Filter that performs the encoding and install it per WebService or Route.
+-
+-See the example https://github.com/emicklei/go-restful/blob/master/examples/restful-encoding-filter.go
+-
+-OPTIONS support
+-
+-By installing a pre-defined container filter, your Webservice(s) can respond to the OPTIONS Http request.
+-
+-	Filter(OPTIONSFilter())
+-
+-CORS
+-
+-By installing the filter of a CrossOriginResourceSharing (CORS), your WebService(s) can handle CORS requests.
+-
+-	cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer}
+-	Filter(cors.Filter)
+-
+-Error Handling
+-
+-Unexpected things happen. If a request cannot be processed because of a failure, your service needs to tell via the response what happened and why.
+-For this reason HTTP status codes exist and it is important to use the correct code in every exceptional situation.
+-
+-	400: Bad Request
+-
+-If path or query parameters are not valid (content or type) then use http.StatusBadRequest.
+-
+-	404: Not Found
+-
+-Despite a valid URI, the resource requested may not be available
+-
+-	500: Internal Server Error
+-
+-If the application logic could not process the request (or write the response) then use http.StatusInternalServerError.
+-
+-	405: Method Not Allowed
+-
+-The request has a valid URL but the method (GET,PUT,POST,...) is not allowed.
+-
+-	406: Not Acceptable
+-
+-The request does not have or has an unknown Accept Header set for this operation.
+-
+-	415: Unsupported Media Type
+-
+-The request does not have or has an unknown Content-Type Header set for this operation.
+-
+-ServiceError
+-
+-In addition to setting the correct (error) Http status code, you can choose to write a ServiceError message on the response.
+-
+-Performance options
+-
+-This package has several options that affect the performance of your service. It is important to understand them and how you can change it.
+-
+-	restful.DefaultContainer.Router(CurlyRouter{})
+-
+-The default router is the RouterJSR311 which is an implementation of its spec (http://jsr311.java.net/nonav/releases/1.1/spec/spec.html).
+-However, it uses regular expressions for all its routes which, depending on your usecase, may consume a significant amount of time.
+-The CurlyRouter implementation is more lightweight that also allows you to use wildcards and expressions, but only if needed.
+-
+-	restful.DefaultContainer.DoNotRecover(true)
+-
+-DoNotRecover controls whether panics will be caught to return HTTP 500.
+-If set to true, Route functions are responsible for handling any error situation.
+-Default value is false; it will recover from panics. This has performance implications.
+-
+-	restful.SetCacheReadEntity(false)
+-
+-SetCacheReadEntity controls whether the response data ([]byte) is cached such that ReadEntity is repeatable.
+-If you expect to read large amounts of payload data, and you do not use this feature, you should set it to false.
+-
+-Trouble shooting
+-
+-This package has the means to produce detail logging of the complete Http request matching process and filter invocation.
+-Enabling this feature requires you to set a log.Logger instance such as:
+-
+-	restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile))
+-
+-Resources
+-
+-[project]: https://github.com/emicklei/go-restful
+-
+-[examples]: https://github.com/emicklei/go-restful/blob/master/examples
+-
+-[design]:  http://ernestmicklei.com/2012/11/11/go-restful-api-design/
+-
+-[showcases]: https://github.com/emicklei/mora, https://github.com/emicklei/landskape
+-
+-(c) 2012-2014, http://ernestmicklei.com. MIT License
+-*/
+-package restful
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go
+deleted file mode 100644
+index e1a2f3b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/doc_examples_test.go
++++ /dev/null
+@@ -1,35 +0,0 @@
+-package restful
+-
+-import "net/http"
+-
+-func ExampleOPTIONSFilter() {
+-	// Install the OPTIONS filter on the default Container
+-	Filter(OPTIONSFilter())
 -}
-diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go
+-func ExampleContainer_OPTIONSFilter() {
+-	// Install the OPTIONS filter on a Container
+-	myContainer := new(Container)
+-	myContainer.Filter(myContainer.OPTIONSFilter)
+-}
+-
+-func ExampleContainer() {
+-	// The Default container of go-restful uses the http.DefaultServeMux.
+-	// You can create your own Container using restful.NewContainer() and create a new http.Server for that particular container
+-
+-	ws := new(WebService)
+-	wsContainer := NewContainer()
+-	wsContainer.Add(ws)
+-	server := &http.Server{Addr: ":8080", Handler: wsContainer}
+-	server.ListenAndServe()
+-}
+-
+-func ExampleCrossOriginResourceSharing() {
+-	// To install this filter on the Default Container use:
+-	cors := CrossOriginResourceSharing{ExposeHeaders: []string{"X-My-Header"}, CookiesAllowed: false, Container: DefaultContainer}
+-	Filter(cors.Filter)
+-}
+-
+-func ExampleServiceError() {
+-	resp := new(Response)
+-	resp.WriteEntity(NewError(http.StatusBadRequest, "Non-integer {id} path parameter"))
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey
 deleted file mode 100644
-index 7ed7dd9..0000000
---- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types.go
+index 8485e98..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/.goconvey
 +++ /dev/null
-@@ -1,150 +0,0 @@
--// Copyright 2013 Google Inc. All rights reserved.
--// Use of this source code is governed by a BSD-style
--// license that can be found in the LICENSE file.
+@@ -1 +0,0 @@
+-ignore
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey
+deleted file mode 100644
+index 8485e98..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/.goconvey
++++ /dev/null
+@@ -1 +0,0 @@
+-ignore
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml
+deleted file mode 100644
+index 362db6b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/app.yaml
++++ /dev/null
+@@ -1,20 +0,0 @@
+-#
+-# Include your application ID here
+-#
+-application: <your_app_id>
+-version: 1
+-runtime: go
+-api_version: go1
 -
--package googleapi
+-handlers:
+-#
+-# Regex for all swagger files to make as static content.
+-# You should create the folder static/swagger and copy
+-# swagger-ui into it.
+-#
+-- url: /apidocs/(.*?)/(.*\.(js|html|css))
+-  static_files: static/swagger/\1/\2
+-  upload: static/swagger/(.*?)/(.*\.(js|html|css))
+-
+-- url: /.*
+-  script: _go_app
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey
+deleted file mode 100644
+index 8485e98..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/.goconvey
++++ /dev/null
+@@ -1 +0,0 @@
+-ignore
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml
+deleted file mode 100644
+index 33883d1..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/app.yaml
++++ /dev/null
+@@ -1,18 +0,0 @@
+-application: datastore-example
+-version: 1
+-runtime: go
+-api_version: go1
+-
+-handlers:
+-# Regex for all swagger files to make as static content.
+-# You should create the folder static/swagger and copy
+-# swagger-ui into it.
+-#
+-- url: /apidocs/(.*?)/(.*\.(js|html|css))
+-  static_files: static/swagger/\1/\2
+-  upload: static/swagger/(.*?)/(.*\.(js|html|css))
+-
+-# Catch all.
+-- url: /.*
+-  script: _go_app
+-  login: required
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go
+deleted file mode 100644
+index cf832ef..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/datastore/main.go
++++ /dev/null
+@@ -1,266 +0,0 @@
+-package main
 -
 -import (
--	"encoding/json"
--	"strconv"
+-	"appengine"
+-	"appengine/datastore"
+-	"appengine/user"
+-	"github.com/emicklei/go-restful"
+-	"github.com/emicklei/go-restful/swagger"
+-	"net/http"
+-	"time"
 -)
 -
--// Int64s is a slice of int64s that marshal as quoted strings in JSON.
--type Int64s []int64
+-// This example demonstrates a reasonably complete suite of RESTful operations backed
+-// by DataStore on Google App Engine.
 -
--func (q *Int64s) UnmarshalJSON(raw []byte) error {
--	*q = (*q)[:0]
--	var ss []string
--	if err := json.Unmarshal(raw, &ss); err != nil {
--		return err
+-// Our simple example struct.
+-type Profile struct {
+-	LastModified time.Time `json:"-" xml:"-"`
+-	Email        string    `json:"-" xml:"-"`
+-	FirstName    string    `json:"first_name" xml:"first-name"`
+-	NickName     string    `json:"nick_name" xml:"nick-name"`
+-	LastName     string    `json:"last_name" xml:"last-name"`
+-}
+-
+-type ProfileApi struct {
+-	Path string
+-}
+-
+-func gaeUrl() string {
+-	if appengine.IsDevAppServer() {
+-		return "http://localhost:8080"
+-	} else {
+-		// Include your URL on App Engine here.
+-		// I found no way to get AppID without appengine.Context and this always
+-		// based on a http.Request.
+-		return "http://federatedservices.appspot.com"
 -	}
--	for _, s := range ss {
--		v, err := strconv.ParseInt(s, 10, 64)
--		if err != nil {
--			return err
--		}
--		*q = append(*q, int64(v))
+-}
+-
+-func init() {
+-	u := ProfileApi{Path: "/profiles"}
+-	u.register()
+-
+-	// Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API
+-	// You need to download the Swagger HTML5 assets and change the FilePath location in the config below.
+-	// Open <your_app_id>.appspot.com/apidocs and enter
+-	// Place the Swagger UI files into a folder called static/swagger if you wish to use Swagger
+-	// http://<your_app_id>.appspot.com/apidocs.json in the api input field.
+-	// For testing, you can use http://localhost:8080/apidocs.json
+-	config := swagger.Config{
+-		// You control what services are visible
+-		WebServices:    restful.RegisteredWebServices(),
+-		WebServicesUrl: gaeUrl(),
+-		ApiPath:        "/apidocs.json",
+-
+-		// Optionally, specifiy where the UI is located
+-		SwaggerPath: "/apidocs/",
+-
+-		// GAE support static content which is configured in your app.yaml.
+-		// This example expect the swagger-ui in static/swagger so you should place it there :)
+-		SwaggerFilePath: "static/swagger"}
+-	swagger.InstallSwaggerService(config)
+-}
+-
+-func (u ProfileApi) register() {
+-	ws := new(restful.WebService)
+-
+-	ws.
+-		Path(u.Path).
+-		// You can specify consumes and produces per route as well.
+-		Consumes(restful.MIME_JSON, restful.MIME_XML).
+-		Produces(restful.MIME_JSON, restful.MIME_XML)
+-
+-	ws.Route(ws.POST("").To(u.insert).
+-		// Swagger documentation.
+-		Doc("insert a new profile").
+-		Param(ws.BodyParameter("Profile", "representation of a profile").DataType("main.Profile")).
+-		Reads(Profile{}))
+-
+-	ws.Route(ws.GET("/{profile-id}").To(u.read).
+-		// Swagger documentation.
+-		Doc("read a profile").
+-		Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")).
+-		Writes(Profile{}))
+-
+-	ws.Route(ws.PUT("/{profile-id}").To(u.update).
+-		// Swagger documentation.
+-		Doc("update an existing profile").
+-		Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")).
+-		Param(ws.BodyParameter("Profile", "representation of a profile").DataType("main.Profile")).
+-		Reads(Profile{}))
+-
+-	ws.Route(ws.DELETE("/{profile-id}").To(u.remove).
+-		// Swagger documentation.
+-		Doc("remove a profile").
+-		Param(ws.PathParameter("profile-id", "identifier for a profile").DataType("string")))
+-
+-	restful.Add(ws)
+-}
+-
+-// POST http://localhost:8080/profiles
+-// {"first_name": "Ivan", "nick_name": "Socks", "last_name": "Hawkes"}
+-//
+-func (u *ProfileApi) insert(r *restful.Request, w *restful.Response) {
+-	c := appengine.NewContext(r.Request)
+-
+-	// Marshall the entity from the request into a struct.
+-	p := new(Profile)
+-	err := r.ReadEntity(&p)
+-	if err != nil {
+-		w.WriteError(http.StatusNotAcceptable, err)
+-		return
 -	}
--	return nil
+-
+-	// Ensure we start with a sensible value for this field.
+-	p.LastModified = time.Now()
+-
+-	// The profile belongs to this user.
+-	p.Email = user.Current(c).String()
+-
+-	k, err := datastore.Put(c, datastore.NewIncompleteKey(c, "profiles", nil), p)
+-	if err != nil {
+-		http.Error(w, err.Error(), http.StatusInternalServerError)
+-		return
+-	}
+-
+-	// Let them know the location of the newly created resource.
+-	// TODO: Use a safe Url path append function.
+-	w.AddHeader("Location", u.Path+"/"+k.Encode())
+-
+-	// Return the resultant entity.
+-	w.WriteHeader(http.StatusCreated)
+-	w.WriteEntity(p)
 -}
 -
--// Int32s is a slice of int32s that marshal as quoted strings in JSON.
--type Int32s []int32
+-// GET http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM
+-//
+-func (u ProfileApi) read(r *restful.Request, w *restful.Response) {
+-	c := appengine.NewContext(r.Request)
 -
--func (q *Int32s) UnmarshalJSON(raw []byte) error {
--	*q = (*q)[:0]
--	var ss []string
--	if err := json.Unmarshal(raw, &ss); err != nil {
--		return err
+-	// Decode the request parameter to determine the key for the entity.
+-	k, err := datastore.DecodeKey(r.PathParameter("profile-id"))
+-	if err != nil {
+-		http.Error(w, err.Error(), http.StatusBadRequest)
+-		return
 -	}
--	for _, s := range ss {
--		v, err := strconv.ParseInt(s, 10, 32)
--		if err != nil {
--			return err
+-
+-	// Retrieve the entity from the datastore.
+-	p := Profile{}
+-	if err := datastore.Get(c, k, &p); err != nil {
+-		if err.Error() == "datastore: no such entity" {
+-			http.Error(w, err.Error(), http.StatusNotFound)
+-		} else {
+-			http.Error(w, err.Error(), http.StatusInternalServerError)
 -		}
--		*q = append(*q, int32(v))
+-		return
 -	}
--	return nil
+-
+-	// Check we own the profile before allowing them to view it.
+-	// Optionally, return a 404 instead to help prevent guessing ids.
+-	// TODO: Allow admins access.
+-	if p.Email != user.Current(c).String() {
+-		http.Error(w, "You do not have access to this resource", http.StatusForbidden)
+-		return
+-	}
+-
+-	w.WriteEntity(p)
 -}
 -
--// Uint64s is a slice of uint64s that marshal as quoted strings in JSON.
--type Uint64s []uint64
+-// PUT http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM
+-// {"first_name": "Ivan", "nick_name": "Socks", "last_name": "Hawkes"}
+-//
+-func (u *ProfileApi) update(r *restful.Request, w *restful.Response) {
+-	c := appengine.NewContext(r.Request)
 -
--func (q *Uint64s) UnmarshalJSON(raw []byte) error {
--	*q = (*q)[:0]
--	var ss []string
--	if err := json.Unmarshal(raw, &ss); err != nil {
--		return err
+-	// Decode the request parameter to determine the key for the entity.
+-	k, err := datastore.DecodeKey(r.PathParameter("profile-id"))
+-	if err != nil {
+-		http.Error(w, err.Error(), http.StatusBadRequest)
+-		return
 -	}
--	for _, s := range ss {
--		v, err := strconv.ParseUint(s, 10, 64)
--		if err != nil {
--			return err
+-
+-	// Marshall the entity from the request into a struct.
+-	p := new(Profile)
+-	err = r.ReadEntity(&p)
+-	if err != nil {
+-		w.WriteError(http.StatusNotAcceptable, err)
+-		return
+-	}
+-
+-	// Retrieve the old entity from the datastore.
+-	old := Profile{}
+-	if err := datastore.Get(c, k, &old); err != nil {
+-		if err.Error() == "datastore: no such entity" {
+-			http.Error(w, err.Error(), http.StatusNotFound)
+-		} else {
+-			http.Error(w, err.Error(), http.StatusInternalServerError)
 -		}
--		*q = append(*q, uint64(v))
+-		return
 -	}
--	return nil
+-
+-	// Check we own the profile before allowing them to update it.
+-	// Optionally, return a 404 instead to help prevent guessing ids.
+-	// TODO: Allow admins access.
+-	if old.Email != user.Current(c).String() {
+-		http.Error(w, "You do not have access to this resource", http.StatusForbidden)
+-		return
+-	}
+-
+-	// Since the whole entity is re-written, we need to assign any invariant fields again
+-	// e.g. the owner of the entity.
+-	p.Email = user.Current(c).String()
+-
+-	// Keep track of the last modification date.
+-	p.LastModified = time.Now()
+-
+-	// Attempt to overwrite the old entity.
+-	_, err = datastore.Put(c, k, p)
+-	if err != nil {
+-		http.Error(w, err.Error(), http.StatusInternalServerError)
+-		return
+-	}
+-
+-	// Let them know it succeeded.
+-	w.WriteHeader(http.StatusNoContent)
 -}
 -
--// Uint32s is a slice of uint32s that marshal as quoted strings in JSON.
--type Uint32s []uint32
+-// DELETE http://localhost:8080/profiles/ahdkZXZ-ZmVkZXJhdGlvbi1zZXJ2aWNlc3IVCxIIcHJvZmlsZXMYgICAgICAgAoM
+-//
+-func (u *ProfileApi) remove(r *restful.Request, w *restful.Response) {
+-	c := appengine.NewContext(r.Request)
 -
--func (q *Uint32s) UnmarshalJSON(raw []byte) error {
--	*q = (*q)[:0]
--	var ss []string
--	if err := json.Unmarshal(raw, &ss); err != nil {
--		return err
+-	// Decode the request parameter to determine the key for the entity.
+-	k, err := datastore.DecodeKey(r.PathParameter("profile-id"))
+-	if err != nil {
+-		http.Error(w, err.Error(), http.StatusBadRequest)
+-		return
 -	}
--	for _, s := range ss {
--		v, err := strconv.ParseUint(s, 10, 32)
--		if err != nil {
--			return err
+-
+-	// Retrieve the old entity from the datastore.
+-	old := Profile{}
+-	if err := datastore.Get(c, k, &old); err != nil {
+-		if err.Error() == "datastore: no such entity" {
+-			http.Error(w, err.Error(), http.StatusNotFound)
+-		} else {
+-			http.Error(w, err.Error(), http.StatusInternalServerError)
 -		}
--		*q = append(*q, uint32(v))
+-		return
 -	}
--	return nil
+-
+-	// Check we own the profile before allowing them to delete it.
+-	// Optionally, return a 404 instead to help prevent guessing ids.
+-	// TODO: Allow admins access.
+-	if old.Email != user.Current(c).String() {
+-		http.Error(w, "You do not have access to this resource", http.StatusForbidden)
+-		return
+-	}
+-
+-	// Delete the entity.
+-	if err := datastore.Delete(c, k); err != nil {
+-		http.Error(w, err.Error(), http.StatusInternalServerError)
+-	}
+-
+-	// Success notification.
+-	w.WriteHeader(http.StatusNoContent)
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go
+deleted file mode 100644
+index b3261ee..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-appstats-integration.go
++++ /dev/null
+@@ -1,13 +0,0 @@
+-package main
 -
--// Float64s is a slice of float64s that marshal as quoted strings in JSON.
--type Float64s []float64
+-import (
+-	"github.com/mjibson/appstats"
+-)
 -
--func (q *Float64s) UnmarshalJSON(raw []byte) error {
--	*q = (*q)[:0]
--	var ss []string
--	if err := json.Unmarshal(raw, &ss); err != nil {
--		return err
+-
+-func stats(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	c := appstats.NewContext(req.Request)
+-	chain.ProcessFilter(req, resp)
+-	c.Stats.Status = resp.StatusCode()
+-	c.Save()
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go
+deleted file mode 100644
+index e97ba2e..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/google_app_engine/restful-user-service.go
++++ /dev/null
+@@ -1,161 +0,0 @@
+-package main
+-
+-import (
+-	"appengine"
+-	"appengine/memcache"
+-	"github.com/emicklei/go-restful"
+-	"github.com/emicklei/go-restful/swagger"
+-	"net/http"
+-)
+-
+-// This example is functionally the same as ../restful-user-service.go
+-// but it`s supposed to run on Goole App Engine (GAE)
+-//
+-// contributed by ivanhawkes
+-
+-type User struct {
+-	Id, Name string
+-}
+-
+-type UserService struct {
+-	// normally one would use DAO (data access object)
+-	// but in this example we simple use memcache.
+-}
+-
+-func (u UserService) Register() {
+-	ws := new(restful.WebService)
+-
+-	ws.
+-		Path("/users").
+-		Consumes(restful.MIME_XML, restful.MIME_JSON).
+-		Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well
+-
+-	ws.Route(ws.GET("/{user-id}").To(u.findUser).
+-		// docs
+-		Doc("get a user").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-		Writes(User{})) // on the response
+-
+-	ws.Route(ws.PATCH("").To(u.updateUser).
+-		// docs
+-		Doc("update a user").
+-		Reads(User{})) // from the request
+-
+-	ws.Route(ws.PUT("/{user-id}").To(u.createUser).
+-		// docs
+-		Doc("create a user").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-		Reads(User{})) // from the request
+-
+-	ws.Route(ws.DELETE("/{user-id}").To(u.removeUser).
+-		// docs
+-		Doc("delete a user").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")))
+-
+-	restful.Add(ws)
+-}
+-
+-// GET http://localhost:8080/users/1
+-//
+-func (u UserService) findUser(request *restful.Request, response *restful.Response) {
+-	c := appengine.NewContext(request.Request)
+-	id := request.PathParameter("user-id")
+-	usr := new(User)
+-	_, err := memcache.Gob.Get(c, id, &usr)
+-	if err != nil || len(usr.Id) == 0 {
+-		response.WriteErrorString(http.StatusNotFound, "User could not be found.")
+-	} else {
+-		response.WriteEntity(usr)
 -	}
--	for _, s := range ss {
--		v, err := strconv.ParseFloat(s, 64)
+-}
+-
+-// PATCH http://localhost:8080/users
+-// <User><Id>1</Id><Name>Melissa Raspberry</Name></User>
+-//
+-func (u *UserService) updateUser(request *restful.Request, response *restful.Response) {
+-	c := appengine.NewContext(request.Request)
+-	usr := new(User)
+-	err := request.ReadEntity(&usr)
+-	if err == nil {
+-		item := &memcache.Item{
+-			Key:    usr.Id,
+-			Object: &usr,
+-		}
+-		err = memcache.Gob.Set(c, item)
 -		if err != nil {
--			return err
+-			response.WriteError(http.StatusInternalServerError, err)
+-			return
 -		}
--		*q = append(*q, float64(v))
+-		response.WriteEntity(usr)
+-	} else {
+-		response.WriteError(http.StatusInternalServerError, err)
 -	}
--	return nil
 -}
 -
--func quotedList(n int, fn func(dst []byte, i int) []byte) ([]byte, error) {
--	dst := make([]byte, 0, 2+n*10) // somewhat arbitrary
--	dst = append(dst, '[')
--	for i := 0; i < n; i++ {
--		if i > 0 {
--			dst = append(dst, ',')
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa</Name></User>
+-//
+-func (u *UserService) createUser(request *restful.Request, response *restful.Response) {
+-	c := appengine.NewContext(request.Request)
+-	usr := User{Id: request.PathParameter("user-id")}
+-	err := request.ReadEntity(&usr)
+-	if err == nil {
+-		item := &memcache.Item{
+-			Key:    usr.Id,
+-			Object: &usr,
 -		}
--		dst = append(dst, '"')
--		dst = fn(dst, i)
--		dst = append(dst, '"')
+-		err = memcache.Gob.Add(c, item)
+-		if err != nil {
+-			response.WriteError(http.StatusInternalServerError, err)
+-			return
+-		}
+-		response.WriteHeader(http.StatusCreated)
+-		response.WriteEntity(usr)
+-	} else {
+-		response.WriteError(http.StatusInternalServerError, err)
 -	}
--	dst = append(dst, ']')
--	return dst, nil
 -}
 -
--func (s Int64s) MarshalJSON() ([]byte, error) {
--	return quotedList(len(s), func(dst []byte, i int) []byte {
--		return strconv.AppendInt(dst, s[i], 10)
--	})
+-// DELETE http://localhost:8080/users/1
+-//
+-func (u *UserService) removeUser(request *restful.Request, response *restful.Response) {
+-	c := appengine.NewContext(request.Request)
+-	id := request.PathParameter("user-id")
+-	err := memcache.Delete(c, id)
+-	if err != nil {
+-		response.WriteError(http.StatusInternalServerError, err)
+-	}
 -}
 -
--func (s Int32s) MarshalJSON() ([]byte, error) {
--	return quotedList(len(s), func(dst []byte, i int) []byte {
--		return strconv.AppendInt(dst, int64(s[i]), 10)
--	})
+-func getGaeURL() string {
+-	if appengine.IsDevAppServer() {
+-		return "http://localhost:8080"
+-	} else {
+-		/**
+-		 * Include your URL on App Engine here.
+-		 * I found no way to get AppID without appengine.Context and this always
+-		 * based on a http.Request.
+-		 */
+-		return "http://<your_app_id>.appspot.com"
+-	}
 -}
 -
--func (s Uint64s) MarshalJSON() ([]byte, error) {
--	return quotedList(len(s), func(dst []byte, i int) []byte {
--		return strconv.AppendUint(dst, s[i], 10)
--	})
+-func init() {
+-	u := UserService{}
+-	u.Register()
+-
+-	// Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API
+-	// You need to download the Swagger HTML5 assets and change the FilePath location in the config below.
+-	// Open <your_app_id>.appspot.com/apidocs and enter http://<your_app_id>.appspot.com/apidocs.json in the api input field.
+-	config := swagger.Config{
+-		WebServices:    restful.RegisteredWebServices(), // you control what services are visible
+-		WebServicesUrl: getGaeURL(),
+-		ApiPath:        "/apidocs.json",
+-
+-		// Optionally, specifiy where the UI is located
+-		SwaggerPath: "/apidocs/",
+-		// GAE support static content which is configured in your app.yaml.
+-		// This example expect the swagger-ui in static/swagger so you should place it there :)
+-		SwaggerFilePath: "static/swagger"}
+-	swagger.InstallSwaggerService(config)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html
+deleted file mode 100644
+index e5d49b4..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/home.html
++++ /dev/null
+@@ -1,7 +0,0 @@
+-<!DOCTYPE html>
+-
+-<html>
+-<body>
+-	<h1>{{.Text}}</h1>
+-</body>
+-</html>
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go
+deleted file mode 100644
+index aacaa3d..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-CORS-filter.go
++++ /dev/null
+@@ -1,67 +0,0 @@
+-package main
+-
+-import (
+-	"io"
+-	"log"
+-	"net/http"
+-
+-	"github.com/emicklei/go-restful"
+-)
+-
+-// Cross-origin resource sharing (CORS) is a mechanism that allows JavaScript on a web page
+-// to make XMLHttpRequests to another domain, not the domain the JavaScript originated from.
+-//
+-// http://en.wikipedia.org/wiki/Cross-origin_resource_sharing
+-// http://enable-cors.org/server.html
+-//
+-// GET http://localhost:8080/users
+-//
+-// GET http://localhost:8080/users/1
+-//
+-// PUT http://localhost:8080/users/1
+-//
+-// DELETE http://localhost:8080/users/1
+-//
+-// OPTIONS http://localhost:8080/users/1  with Header "Origin" set to some domain and
+-
+-type UserResource struct{}
+-
+-func (u UserResource) RegisterTo(container *restful.Container) {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes("*/*").
+-		Produces("*/*")
+-
+-	ws.Route(ws.GET("/{user-id}").To(u.nop))
+-	ws.Route(ws.POST("").To(u.nop))
+-	ws.Route(ws.PUT("/{user-id}").To(u.nop))
+-	ws.Route(ws.DELETE("/{user-id}").To(u.nop))
+-
+-	container.Add(ws)
 -}
 -
--func (s Uint32s) MarshalJSON() ([]byte, error) {
--	return quotedList(len(s), func(dst []byte, i int) []byte {
--		return strconv.AppendUint(dst, uint64(s[i]), 10)
--	})
+-func (u UserResource) nop(request *restful.Request, response *restful.Response) {
+-	io.WriteString(response.ResponseWriter, "this would be a normal response")
 -}
 -
--func (s Float64s) MarshalJSON() ([]byte, error) {
--	return quotedList(len(s), func(dst []byte, i int) []byte {
--		return strconv.AppendFloat(dst, s[i], 'g', -1, 64)
--	})
+-func main() {
+-	wsContainer := restful.NewContainer()
+-	u := UserResource{}
+-	u.RegisterTo(wsContainer)
+-
+-	// Add container filter to enable CORS
+-	cors := restful.CrossOriginResourceSharing{
+-		ExposeHeaders:  []string{"X-My-Header"},
+-		AllowedHeaders: []string{"Content-Type"},
+-		CookiesAllowed: false,
+-		Container:      wsContainer}
+-	wsContainer.Filter(cors.Filter)
+-
+-	// Add container filter to respond to OPTIONS
+-	wsContainer.Filter(wsContainer.OPTIONSFilter)
+-
+-	log.Printf("start listening on localhost:8080")
+-	server := &http.Server{Addr: ":8080", Handler: wsContainer}
+-	log.Fatal(server.ListenAndServe())
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go
+deleted file mode 100644
+index 0cda50d..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-NCSA-logging.go
++++ /dev/null
+@@ -1,54 +0,0 @@
+-package main
+-
+-import (
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"log"
+-	"net/http"
+-	"os"
+-	"strings"
+-	"time"
+-)
+-
+-// This example shows how to create a filter that produces log lines
+-// according to the Common Log Format, also known as the NCSA standard.
+-//
+-// kindly contributed by leehambley
+-//
+-// GET http://localhost:8080/ping
+-
+-var logger *log.Logger = log.New(os.Stdout, "", 0)
+-
+-func NCSACommonLogFormatLogger() restful.FilterFunction {
+-	return func(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-		var username = "-"
+-		if req.Request.URL.User != nil {
+-			if name := req.Request.URL.User.Username(); name != "" {
+-				username = name
+-			}
+-		}
+-		chain.ProcessFilter(req, resp)
+-		logger.Printf("%s - %s [%s] \"%s %s %s\" %d %d",
+-			strings.Split(req.Request.RemoteAddr, ":")[0],
+-			username,
+-			time.Now().Format("02/Jan/2006:15:04:05 -0700"),
+-			req.Request.Method,
+-			req.Request.URL.RequestURI(),
+-			req.Request.Proto,
+-			resp.StatusCode(),
+-			resp.ContentLength(),
+-		)
+-	}
+-}
+-
+-func main() {
+-	ws := new(restful.WebService)
+-	ws.Filter(NCSACommonLogFormatLogger())
+-	ws.Route(ws.GET("/ping").To(hello))
+-	restful.Add(ws)
+-	http.ListenAndServe(":8080", nil)
+-}
+-
+-func hello(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "pong")
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go
+deleted file mode 100644
+index 5dd3067..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-basic-authentication.go
++++ /dev/null
+@@ -1,35 +0,0 @@
+-package main
+-
+-import (
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"net/http"
+-)
+-
+-// This example shows how to create a (Route) Filter that performs Basic Authentication on the Http request.
+-//
+-// GET http://localhost:8080/secret
+-// and use admin,admin for the credentials
+-
+-func main() {
+-	ws := new(restful.WebService)
+-	ws.Route(ws.GET("/secret").Filter(basicAuthenticate).To(secret))
+-	restful.Add(ws)
+-	http.ListenAndServe(":8080", nil)
+-}
+-
+-func basicAuthenticate(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	encoded := req.Request.Header.Get("Authorization")
+-	// usr/pwd = admin/admin
+-	// real code does some decoding
+-	if len(encoded) == 0 || "Basic YWRtaW46YWRtaW4=" != encoded {
+-		resp.AddHeader("WWW-Authenticate", "Basic realm=Protected Area")
+-		resp.WriteErrorString(401, "401: Not Authorized")
+-		return
+-	}
+-	chain.ProcessFilter(req, resp)
+-}
+-
+-func secret(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "42")
 -}
-diff --git a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go b/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go
 deleted file mode 100644
-index a6b2045..0000000
---- a/Godeps/_workspace/src/code.google.com/p/google-api-go-client/googleapi/types_test.go
+index 9148213..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-cpuprofiler-service.go
 +++ /dev/null
-@@ -1,44 +0,0 @@
--// Copyright 2013 Google Inc. All rights reserved.
--// Use of this source code is governed by a BSD-style
--// license that can be found in the LICENSE file.
--
--package googleapi
+@@ -1,65 +0,0 @@
+-package main
 -
 -import (
--	"encoding/json"
--	"reflect"
--	"testing"
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"log"
+-	"os"
+-	"runtime/pprof"
 -)
 -
--func TestTypes(t *testing.T) {
--	type T struct {
--		I32 Int32s
--		I64 Int64s
--		U32 Uint32s
--		U64 Uint64s
--		F64 Float64s
--	}
--	v := &T{
--		I32: Int32s{-1, 2, 3},
--		I64: Int64s{-1, 2, 1 << 33},
--		U32: Uint32s{1, 2},
--		U64: Uint64s{1, 2, 1 << 33},
--		F64: Float64s{1.5, 3.33},
+-// ProfilingService is a WebService that can start/stop a CPU profile and write results to a file
+-// 	GET /{rootPath}/start will activate CPU profiling
+-//	GET /{rootPath}/stop will stop profiling
+-//
+-// NewProfileService("/profiler", "ace.prof").AddWebServiceTo(restful.DefaultContainer)
+-//
+-type ProfilingService struct {
+-	rootPath   string   // the base (root) of the service, e.g. /profiler
+-	cpuprofile string   // the output filename to write profile results, e.g. myservice.prof
+-	cpufile    *os.File // if not nil, then profiling is active
+-}
+-
+-func NewProfileService(rootPath string, outputFilename string) *ProfilingService {
+-	ps := new(ProfilingService)
+-	ps.rootPath = rootPath
+-	ps.cpuprofile = outputFilename
+-	return ps
+-}
+-
+-// Add this ProfileService to a restful Container
+-func (p ProfilingService) AddWebServiceTo(container *restful.Container) {
+-	ws := new(restful.WebService)
+-	ws.Path(p.rootPath).Consumes("*/*").Produces(restful.MIME_JSON)
+-	ws.Route(ws.GET("/start").To(p.startProfiler))
+-	ws.Route(ws.GET("/stop").To(p.stopProfiler))
+-	container.Add(ws)
+-}
+-
+-func (p *ProfilingService) startProfiler(req *restful.Request, resp *restful.Response) {
+-	if p.cpufile != nil {
+-		io.WriteString(resp.ResponseWriter, "[restful] CPU profiling already running")
+-		return // error?
 -	}
--	got, err := json.Marshal(v)
+-	cpufile, err := os.Create(p.cpuprofile)
 -	if err != nil {
--		t.Fatal(err)
--	}
--	want := `{"I32":["-1","2","3"],"I64":["-1","2","8589934592"],"U32":["1","2"],"U64":["1","2","8589934592"],"F64":["1.5","3.33"]}`
--	if string(got) != want {
--		t.Fatalf("Marshal mismatch.\n got: %s\nwant: %s\n", got, want)
+-		log.Fatal(err)
 -	}
+-	// remember for close
+-	p.cpufile = cpufile
+-	pprof.StartCPUProfile(cpufile)
+-	io.WriteString(resp.ResponseWriter, "[restful] CPU profiling started, writing on:"+p.cpuprofile)
+-}
 -
--	v2 := new(T)
--	if err := json.Unmarshal(got, v2); err != nil {
--		t.Fatalf("Unmarshal: %v", err)
--	}
--	if !reflect.DeepEqual(v, v2) {
--		t.Fatalf("Unmarshal didn't produce same results.\n got: %#v\nwant: %#v\n", v, v2)
+-func (p *ProfilingService) stopProfiler(req *restful.Request, resp *restful.Response) {
+-	if p.cpufile == nil {
+-		io.WriteString(resp.ResponseWriter, "[restful] CPU profiling not active")
+-		return // error?
 -	}
+-	pprof.StopCPUProfile()
+-	p.cpufile.Close()
+-	p.cpufile = nil
+-	io.WriteString(resp.ResponseWriter, "[restful] CPU profiling stopped, closing:"+p.cpuprofile)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child.go
+-
+-func main() {} // exists for example compilation only
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go
 deleted file mode 100644
-index 7122be0..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child.go
+index 1b95dd0..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-curly-router.go
 +++ /dev/null
-@@ -1,23 +0,0 @@
--package etcd
+@@ -1,107 +0,0 @@
+-package main
 -
--// Add a new directory with a random etcd-generated key under the given path.
--func (c *Client) AddChildDir(key string, ttl uint64) (*Response, error) {
--	raw, err := c.post(key, "", ttl)
+-import (
+-	"github.com/emicklei/go-restful"
+-	"log"
+-	"net/http"
+-)
 -
--	if err != nil {
--		return nil, err
--	}
+-// This example has the same service definition as restful-user-resource
+-// but uses a different router (CurlyRouter) that does not use regular expressions
+-//
+-// POST http://localhost:8080/users
+-// <User><Id>1</Id><Name>Melissa Raspberry</Name></User>
+-//
+-// GET http://localhost:8080/users/1
+-//
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa</Name></User>
+-//
+-// DELETE http://localhost:8080/users/1
+-//
 -
--	return raw.Unmarshal()
+-type User struct {
+-	Id, Name string
 -}
 -
--// Add a new file with a random etcd-generated key under the given path.
--func (c *Client) AddChild(key string, value string, ttl uint64) (*Response, error) {
--	raw, err := c.post(key, value, ttl)
--
--	if err != nil {
--		return nil, err
--	}
--
--	return raw.Unmarshal()
+-type UserResource struct {
+-	// normally one would use DAO (data access object)
+-	users map[string]User
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child_test.go
-deleted file mode 100644
-index 26223ff..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/add_child_test.go
-+++ /dev/null
-@@ -1,73 +0,0 @@
--package etcd
 -
--import "testing"
+-func (u UserResource) Register(container *restful.Container) {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes(restful.MIME_XML, restful.MIME_JSON).
+-		Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well
 -
--func TestAddChild(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("fooDir", true)
--		c.Delete("nonexistentDir", true)
--	}()
+-	ws.Route(ws.GET("/{user-id}").To(u.findUser))
+-	ws.Route(ws.POST("").To(u.updateUser))
+-	ws.Route(ws.PUT("/{user-id}").To(u.createUser))
+-	ws.Route(ws.DELETE("/{user-id}").To(u.removeUser))
 -
--	c.CreateDir("fooDir", 5)
+-	container.Add(ws)
+-}
 -
--	_, err := c.AddChild("fooDir", "v0", 5)
--	if err != nil {
--		t.Fatal(err)
+-// GET http://localhost:8080/users/1
+-//
+-func (u UserResource) findUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	usr := u.users[id]
+-	if len(usr.Id) == 0 {
+-		response.AddHeader("Content-Type", "text/plain")
+-		response.WriteErrorString(http.StatusNotFound, "User could not be found.")
+-	} else {
+-		response.WriteEntity(usr)
 -	}
+-}
 -
--	_, err = c.AddChild("fooDir", "v1", 5)
--	if err != nil {
--		t.Fatal(err)
+-// POST http://localhost:8080/users
+-// <User><Id>1</Id><Name>Melissa Raspberry</Name></User>
+-//
+-func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) {
+-	usr := new(User)
+-	err := request.ReadEntity(&usr)
+-	if err == nil {
+-		u.users[usr.Id] = *usr
+-		response.WriteEntity(usr)
+-	} else {
+-		response.AddHeader("Content-Type", "text/plain")
+-		response.WriteErrorString(http.StatusInternalServerError, err.Error())
 -	}
+-}
 -
--	resp, err := c.Get("fooDir", true, false)
--	// The child with v0 should proceed the child with v1 because it's added
--	// earlier, so it should have a lower key.
--	if !(len(resp.Node.Nodes) == 2 && (resp.Node.Nodes[0].Value == "v0" && resp.Node.Nodes[1].Value == "v1")) {
--		t.Fatalf("AddChild 1 failed.  There should be two chlidren whose values are v0 and v1, respectively."+
--			"  The response was: %#v", resp)
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa</Name></User>
+-//
+-func (u *UserResource) createUser(request *restful.Request, response *restful.Response) {
+-	usr := User{Id: request.PathParameter("user-id")}
+-	err := request.ReadEntity(&usr)
+-	if err == nil {
+-		u.users[usr.Id] = usr
+-		response.WriteHeader(http.StatusCreated)
+-		response.WriteEntity(usr)
+-	} else {
+-		response.AddHeader("Content-Type", "text/plain")
+-		response.WriteErrorString(http.StatusInternalServerError, err.Error())
 -	}
+-}
 -
--	// Creating a child under a nonexistent directory should succeed.
--	// The directory should be created.
--	resp, err = c.AddChild("nonexistentDir", "foo", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-// DELETE http://localhost:8080/users/1
+-//
+-func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	delete(u.users, id)
 -}
 -
--func TestAddChildDir(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("fooDir", true)
--		c.Delete("nonexistentDir", true)
--	}()
+-func main() {
+-	wsContainer := restful.NewContainer()
+-	wsContainer.Router(restful.CurlyRouter{})
+-	u := UserResource{map[string]User{}}
+-	u.Register(wsContainer)
 -
--	c.CreateDir("fooDir", 5)
+-	log.Printf("start listening on localhost:8080")
+-	server := &http.Server{Addr: ":8080", Handler: wsContainer}
+-	log.Fatal(server.ListenAndServe())
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go
+deleted file mode 100644
+index 6094c49..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-encoding-filter.go
++++ /dev/null
+@@ -1,61 +0,0 @@
+-package main
 -
--	_, err := c.AddChildDir("fooDir", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-import (
+-	"github.com/emicklei/go-restful"
+-	"log"
+-	"net/http"
+-)
 -
--	_, err = c.AddChildDir("fooDir", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-type User struct {
+-	Id, Name string
+-}
 -
--	resp, err := c.Get("fooDir", true, false)
--	// The child with v0 should proceed the child with v1 because it's added
--	// earlier, so it should have a lower key.
--	if !(len(resp.Node.Nodes) == 2 && (len(resp.Node.Nodes[0].Nodes) == 0 && len(resp.Node.Nodes[1].Nodes) == 0)) {
--		t.Fatalf("AddChildDir 1 failed.  There should be two chlidren whose values are v0 and v1, respectively."+
--			"  The response was: %#v", resp)
--	}
+-type UserList struct {
+-	Users []User
+-}
 -
--	// Creating a child under a nonexistent directory should succeed.
--	// The directory should be created.
--	resp, err = c.AddChildDir("nonexistentDir", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-//
+-// This example shows how to use the CompressingResponseWriter by a Filter
+-// such that encoding can be enabled per WebService or per Route (instead of per container)
+-// Using restful.DefaultContainer.EnableContentEncoding(true) will encode all responses served by WebServices in the DefaultContainer.
+-//
+-// Set Accept-Encoding to gzip or deflate
+-// GET http://localhost:8080/users/42
+-// and look at the response headers
+-
+-func main() {
+-	restful.Add(NewUserService())
+-	log.Printf("start listening on localhost:8080")
+-	log.Fatal(http.ListenAndServe(":8080", nil))
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client.go
+-
+-func NewUserService() *restful.WebService {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes(restful.MIME_XML, restful.MIME_JSON).
+-		Produces(restful.MIME_JSON, restful.MIME_XML)
+-
+-	// install a response encoding filter
+-	ws.Route(ws.GET("/{user-id}").Filter(encodingFilter).To(findUser))
+-	return ws
+-}
+-
+-// Route Filter (defines FilterFunction)
+-func encodingFilter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	log.Printf("[encoding-filter] %s,%s\n", req.Request.Method, req.Request.URL)
+-	// wrap responseWriter into a compressing one
+-	compress, _ := restful.NewCompressingResponseWriter(resp.ResponseWriter, restful.ENCODING_GZIP)
+-	resp.ResponseWriter = compress
+-	defer func() {
+-		compress.Close()
+-	}()
+-	chain.ProcessFilter(req, resp)
+-}
+-
+-// GET http://localhost:8080/users/42
+-//
+-func findUser(request *restful.Request, response *restful.Response) {
+-	log.Printf("findUser")
+-	response.WriteEntity(User{"42", "Gandalf"})
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go
 deleted file mode 100644
-index f6ae548..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client.go
+index 47e1146..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-filters.go
 +++ /dev/null
-@@ -1,435 +0,0 @@
--package etcd
+@@ -1,114 +0,0 @@
+-package main
 -
 -import (
--	"crypto/tls"
--	"crypto/x509"
--	"encoding/json"
--	"errors"
--	"io"
--	"io/ioutil"
--	"net"
+-	"github.com/emicklei/go-restful"
+-	"log"
 -	"net/http"
--	"net/url"
--	"os"
--	"path"
 -	"time"
 -)
 -
--// See SetConsistency for how to use these constants.
--const (
--	// Using strings rather than iota because the consistency level
--	// could be persisted to disk, so it'd be better to use
--	// human-readable values.
--	STRONG_CONSISTENCY = "STRONG"
--	WEAK_CONSISTENCY   = "WEAK"
--)
--
--const (
--	defaultBufferSize = 10
--)
--
--type Config struct {
--	CertFile    string        `json:"certFile"`
--	KeyFile     string        `json:"keyFile"`
--	CaCertFile  []string      `json:"caCertFiles"`
--	DialTimeout time.Duration `json:"timeout"`
--	Consistency string        `json:"consistency"`
+-type User struct {
+-	Id, Name string
 -}
 -
--type Client struct {
--	config      Config   `json:"config"`
--	cluster     *Cluster `json:"cluster"`
--	httpClient  *http.Client
--	persistence io.Writer
--	cURLch      chan string
--	// CheckRetry can be used to control the policy for failed requests
--	// and modify the cluster if needed.
--	// The client calls it before sending requests again, and
--	// stops retrying if CheckRetry returns some error. The cases that
--	// this function needs to handle include no response and unexpected
--	// http status code of response.
--	// If CheckRetry is nil, client will call the default one
--	// `DefaultCheckRetry`.
--	// Argument cluster is the etcd.Cluster object that these requests have been made on.
--	// Argument numReqs is the number of http.Requests that have been made so far.
--	// Argument lastResp is the http.Responses from the last request.
--	// Argument err is the reason of the failure.
--	CheckRetry func(cluster *Cluster, numReqs int,
--		lastResp http.Response, err error) error
+-type UserList struct {
+-	Users []User
 -}
 -
--// NewClient create a basic client that is configured to be used
--// with the given machine list.
--func NewClient(machines []string) *Client {
--	config := Config{
--		// default timeout is one second
--		DialTimeout: time.Second,
--		// default consistency level is STRONG
--		Consistency: STRONG_CONSISTENCY,
--	}
--
--	client := &Client{
--		cluster: NewCluster(machines),
--		config:  config,
--	}
+-// This example show how to create and use the three different Filters (Container,WebService and Route)
+-// When applied to the restful.DefaultContainer, we refer to them as a global filter.
+-//
+-// GET  http://locahost:8080/users/42
+-// and see the logging per filter (try repeating this request)
 -
--	client.initHTTPClient()
--	client.saveConfig()
+-func main() {
+-	// install a global (=DefaultContainer) filter (processed before any webservice in the DefaultContainer)
+-	restful.Filter(globalLogging)
 -
--	return client
+-	restful.Add(NewUserService())
+-	log.Printf("start listening on localhost:8080")
+-	log.Fatal(http.ListenAndServe(":8080", nil))
 -}
 -
--// NewTLSClient create a basic client with TLS configuration
--func NewTLSClient(machines []string, cert, key, caCert string) (*Client, error) {
--	// overwrite the default machine to use https
--	if len(machines) == 0 {
--		machines = []string{"https://127.0.0.1:4001"}
--	}
+-func NewUserService() *restful.WebService {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes(restful.MIME_XML, restful.MIME_JSON).
+-		Produces(restful.MIME_JSON, restful.MIME_XML)
 -
--	config := Config{
--		// default timeout is one second
--		DialTimeout: time.Second,
--		// default consistency level is STRONG
--		Consistency: STRONG_CONSISTENCY,
--		CertFile:    cert,
--		KeyFile:     key,
--		CaCertFile:  make([]string, 0),
--	}
+-	// install a webservice filter (processed before any route)
+-	ws.Filter(webserviceLogging).Filter(measureTime)
 -
--	client := &Client{
--		cluster: NewCluster(machines),
--		config:  config,
--	}
+-	// install a counter filter
+-	ws.Route(ws.GET("").Filter(NewCountFilter().routeCounter).To(getAllUsers))
 -
--	err := client.initHTTPSClient(cert, key)
--	if err != nil {
--		return nil, err
--	}
+-	// install 2 chained route filters (processed before calling findUser)
+-	ws.Route(ws.GET("/{user-id}").Filter(routeLogging).Filter(NewCountFilter().routeCounter).To(findUser))
+-	return ws
+-}
 -
--	err = client.AddRootCA(caCert)
+-// Global Filter
+-func globalLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	log.Printf("[global-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL)
+-	chain.ProcessFilter(req, resp)
+-}
 -
--	client.saveConfig()
+-// WebService Filter
+-func webserviceLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	log.Printf("[webservice-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL)
+-	chain.ProcessFilter(req, resp)
+-}
 -
--	return client, nil
+-// WebService (post-process) Filter (as a struct that defines a FilterFunction)
+-func measureTime(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	now := time.Now()
+-	chain.ProcessFilter(req, resp)
+-	log.Printf("[webservice-filter (timer)] %v\n", time.Now().Sub(now))
 -}
 -
--// NewClientFromFile creates a client from a given file path.
--// The given file is expected to use the JSON format.
--func NewClientFromFile(fpath string) (*Client, error) {
--	fi, err := os.Open(fpath)
--	if err != nil {
--		return nil, err
--	}
+-// Route Filter (defines FilterFunction)
+-func routeLogging(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	log.Printf("[route-filter (logger)] %s,%s\n", req.Request.Method, req.Request.URL)
+-	chain.ProcessFilter(req, resp)
+-}
 -
--	defer func() {
--		if err := fi.Close(); err != nil {
--			panic(err)
+-// Route Filter (as a struct that defines a FilterFunction)
+-// CountFilter implements a FilterFunction for counting requests.
+-type CountFilter struct {
+-	count   int
+-	counter chan int // for go-routine safe count increments
+-}
+-
+-// NewCountFilter creates and initializes a new CountFilter.
+-func NewCountFilter() *CountFilter {
+-	c := new(CountFilter)
+-	c.counter = make(chan int)
+-	go func() {
+-		for {
+-			c.count += <-c.counter
 -		}
 -	}()
+-	return c
+-}
 -
--	return NewClientFromReader(fi)
+-// routeCounter increments the count of the filter (through a channel)
+-func (c *CountFilter) routeCounter(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	c.counter <- 1
+-	log.Printf("[route-filter (counter)] count:%d", c.count)
+-	chain.ProcessFilter(req, resp)
 -}
 -
--// NewClientFromReader creates a Client configured from a given reader.
--// The configuration is expected to use the JSON format.
--func NewClientFromReader(reader io.Reader) (*Client, error) {
--	c := new(Client)
+-// GET http://localhost:8080/users
+-//
+-func getAllUsers(request *restful.Request, response *restful.Response) {
+-	log.Printf("getAllUsers")
+-	response.WriteEntity(UserList{[]User{User{"42", "Gandalf"}, User{"3.14", "Pi"}}})
+-}
 -
--	b, err := ioutil.ReadAll(reader)
--	if err != nil {
--		return nil, err
--	}
+-// GET http://localhost:8080/users/42
+-//
+-func findUser(request *restful.Request, response *restful.Response) {
+-	log.Printf("findUser")
+-	response.WriteEntity(User{"42", "Gandalf"})
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go
+deleted file mode 100644
+index a83db44..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-form-handling.go
++++ /dev/null
+@@ -1,62 +0,0 @@
+-package main
 -
--	err = json.Unmarshal(b, c)
+-import (
+-	"fmt"
+-	"github.com/emicklei/go-restful"
+-	"github.com/gorilla/schema"
+-	"io"
+-	"net/http"
+-)
+-
+-// This example shows how to handle a POST of a HTML form that uses the standard x-www-form-urlencoded content-type.
+-// It uses the gorilla web tool kit schema package to decode the form data into a struct.
+-//
+-// GET http://localhost:8080/profiles
+-//
+-
+-type Profile struct {
+-	Name string
+-	Age  int
+-}
+-
+-var decoder *schema.Decoder
+-
+-func main() {
+-	decoder = schema.NewDecoder()
+-	ws := new(restful.WebService)
+-	ws.Route(ws.POST("/profiles").Consumes("application/x-www-form-urlencoded").To(postAdddress))
+-	ws.Route(ws.GET("/profiles").To(addresssForm))
+-	restful.Add(ws)
+-	http.ListenAndServe(":8080", nil)
+-}
+-
+-func postAdddress(req *restful.Request, resp *restful.Response) {
+-	err := req.Request.ParseForm()
 -	if err != nil {
--		return nil, err
--	}
--	if c.config.CertFile == "" {
--		c.initHTTPClient()
--	} else {
--		err = c.initHTTPSClient(c.config.CertFile, c.config.KeyFile)
+-		resp.WriteErrorString(http.StatusBadRequest, err.Error())
+-		return
 -	}
--
+-	p := new(Profile)
+-	err = decoder.Decode(p, req.Request.PostForm)
 -	if err != nil {
--		return nil, err
+-		resp.WriteErrorString(http.StatusBadRequest, err.Error())
+-		return
 -	}
+-	io.WriteString(resp.ResponseWriter, fmt.Sprintf("<html><body>Name=%s, Age=%d</body></html>", p.Name, p.Age))
+-}
+-
+-func addresssForm(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp.ResponseWriter,
+-		`<html>
+-		<body>
+-		<h1>Enter Profile</h1>
+-		<form method="post">
+-		    <label>Name:</label>
+-			<input type="text" name="Name"/>
+-			<label>Age:</label>
+-		    <input type="text" name="Age"/>
+-			<input type="Submit" />
+-		</form>
+-		</body>
+-		</html>`)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go
+deleted file mode 100644
+index a21c2a6..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-hello-world.go
++++ /dev/null
+@@ -1,22 +0,0 @@
+-package main
 -
--	for _, caCert := range c.config.CaCertFile {
--		if err := c.AddRootCA(caCert); err != nil {
--			return nil, err
--		}
--	}
+-import (
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"net/http"
+-)
 -
--	return c, nil
+-// This example shows the minimal code needed to get a restful.WebService working.
+-//
+-// GET http://localhost:8080/hello
+-
+-func main() {
+-	ws := new(restful.WebService)
+-	ws.Route(ws.GET("/hello").To(hello))
+-	restful.Add(ws)
+-	http.ListenAndServe(":8080", nil)
 -}
 -
--// Override the Client's HTTP Transport object
--func (c *Client) SetTransport(tr *http.Transport) {
--	c.httpClient.Transport = tr
+-func hello(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "world")
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go
+deleted file mode 100644
+index de51c59..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-html-template.go
++++ /dev/null
+@@ -1,35 +0,0 @@
+-package main
 -
--// initHTTPClient initializes a HTTP client for etcd client
--func (c *Client) initHTTPClient() {
--	tr := &http.Transport{
--		Dial: c.dial,
--		TLSClientConfig: &tls.Config{
--			InsecureSkipVerify: true,
--		},
--	}
--	c.httpClient = &http.Client{Transport: tr}
+-import (
+-	"log"
+-	"net/http"
+-	"text/template"
+-
+-	"github.com/emicklei/go-restful"
+-)
+-
+-// This example shows how to serve a HTML page using the standard Go template engine.
+-//
+-// GET http://localhost:8080/
+-
+-func main() {
+-	ws := new(restful.WebService)
+-	ws.Route(ws.GET("/").To(home))
+-	restful.Add(ws)
+-	print("open browser on http://localhost:8080/\n")
+-	http.ListenAndServe(":8080", nil)
 -}
 -
--// initHTTPClient initializes a HTTPS client for etcd client
--func (c *Client) initHTTPSClient(cert, key string) error {
--	if cert == "" || key == "" {
--		return errors.New("Require both cert and key path")
--	}
+-type Message struct {
+-	Text string
+-}
 -
--	tlsCert, err := tls.LoadX509KeyPair(cert, key)
+-func home(req *restful.Request, resp *restful.Response) {
+-	p := &Message{"restful-html-template demo"}
+-	// you might want to cache compiled templates
+-	t, err := template.ParseFiles("home.html")
 -	if err != nil {
--		return err
+-		log.Fatalf("Template gave: %s", err)
 -	}
+-	t.Execute(resp.ResponseWriter, p)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go
+deleted file mode 100644
+index 3f1650b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-multi-containers.go
++++ /dev/null
+@@ -1,43 +0,0 @@
+-package main
 -
--	tlsConfig := &tls.Config{
--		Certificates:       []tls.Certificate{tlsCert},
--		InsecureSkipVerify: true,
--	}
+-import (
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"log"
+-	"net/http"
+-)
 -
--	tr := &http.Transport{
--		TLSClientConfig: tlsConfig,
--		Dial:            c.dial,
--	}
+-// This example shows how to have a program with 2 WebServices containers
+-// each having a http server listening on its own port.
+-//
+-// The first "hello" is added to the restful.DefaultContainer (and uses DefaultServeMux)
+-// For the second "hello", a new container and ServeMux is created
+-// and requires a new http.Server with the container being the Handler.
+-// This first server is spawn in its own go-routine such that the program proceeds to create the second.
+-//
+-// GET http://localhost:8080/hello
+-// GET http://localhost:8081/hello
 -
--	c.httpClient = &http.Client{Transport: tr}
--	return nil
+-func main() {
+-	ws := new(restful.WebService)
+-	ws.Route(ws.GET("/hello").To(hello))
+-	restful.Add(ws)
+-	go func() {
+-		http.ListenAndServe(":8080", nil)
+-	}()
+-
+-	container2 := restful.NewContainer()
+-	ws2 := new(restful.WebService)
+-	ws2.Route(ws2.GET("/hello").To(hello2))
+-	container2.Add(ws2)
+-	server := &http.Server{Addr: ":8081", Handler: container2}
+-	log.Fatal(server.ListenAndServe())
 -}
 -
--// SetPersistence sets a writer to which the config will be
--// written every time it's changed.
--func (c *Client) SetPersistence(writer io.Writer) {
--	c.persistence = writer
+-func hello(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "default world")
 -}
 -
--// SetConsistency changes the consistency level of the client.
+-func hello2(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "second world")
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go
+deleted file mode 100644
+index 73dc3cf..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-options-filter.go
++++ /dev/null
+@@ -1,51 +0,0 @@
+-package main
+-
+-import (
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"log"
+-	"net/http"
+-)
+-
+-// This example shows how to use the OPTIONSFilter on a Container
 -//
--// When consistency is set to STRONG_CONSISTENCY, all requests,
--// including GET, are sent to the leader.  This means that, assuming
--// the absence of leader failures, GET requests are guaranteed to see
--// the changes made by previous requests.
+-// OPTIONS http://localhost:8080/users
 -//
--// When consistency is set to WEAK_CONSISTENCY, other requests
--// are still sent to the leader, but GET requests are sent to a
--// random server from the server pool.  This reduces the read
--// load on the leader, but it's not guaranteed that the GET requests
--// will see changes made by previous requests (they might have not
--// yet been committed on non-leader servers).
--func (c *Client) SetConsistency(consistency string) error {
--	if !(consistency == STRONG_CONSISTENCY || consistency == WEAK_CONSISTENCY) {
--		return errors.New("The argument must be either STRONG_CONSISTENCY or WEAK_CONSISTENCY.")
--	}
--	c.config.Consistency = consistency
--	return nil
--}
+-// OPTIONS http://localhost:8080/users/1
 -
--// Sets the DialTimeout value
--func (c *Client) SetDialTimeout(d time.Duration) {
--	c.config.DialTimeout = d
+-type UserResource struct{}
+-
+-func (u UserResource) RegisterTo(container *restful.Container) {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes("*/*").
+-		Produces("*/*")
+-
+-	ws.Route(ws.GET("/{user-id}").To(u.nop))
+-	ws.Route(ws.POST("").To(u.nop))
+-	ws.Route(ws.PUT("/{user-id}").To(u.nop))
+-	ws.Route(ws.DELETE("/{user-id}").To(u.nop))
+-
+-	container.Add(ws)
 -}
 -
--// AddRootCA adds a root CA cert for the etcd client
--func (c *Client) AddRootCA(caCert string) error {
--	if c.httpClient == nil {
--		return errors.New("Client has not been initialized yet!")
--	}
+-func (u UserResource) nop(request *restful.Request, response *restful.Response) {
+-	io.WriteString(response.ResponseWriter, "this would be a normal response")
+-}
 -
--	certBytes, err := ioutil.ReadFile(caCert)
--	if err != nil {
--		return err
--	}
+-func main() {
+-	wsContainer := restful.NewContainer()
+-	u := UserResource{}
+-	u.RegisterTo(wsContainer)
 -
--	tr, ok := c.httpClient.Transport.(*http.Transport)
+-	// Add container filter to respond to OPTIONS
+-	wsContainer.Filter(wsContainer.OPTIONSFilter)
 -
--	if !ok {
--		panic("AddRootCA(): Transport type assert should not fail")
--	}
+-	// For use on the default container, you can write
+-	// restful.Filter(restful.OPTIONSFilter())
 -
--	if tr.TLSClientConfig.RootCAs == nil {
--		caCertPool := x509.NewCertPool()
--		ok = caCertPool.AppendCertsFromPEM(certBytes)
--		if ok {
--			tr.TLSClientConfig.RootCAs = caCertPool
--		}
--		tr.TLSClientConfig.InsecureSkipVerify = false
--	} else {
--		ok = tr.TLSClientConfig.RootCAs.AppendCertsFromPEM(certBytes)
--	}
+-	log.Printf("start listening on localhost:8080")
+-	server := &http.Server{Addr: ":8080", Handler: wsContainer}
+-	log.Fatal(server.ListenAndServe())
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go
+deleted file mode 100644
+index 8488a23..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-path-tail.go
++++ /dev/null
+@@ -1,26 +0,0 @@
+-package main
 -
--	if !ok {
--		err = errors.New("Unable to load caCert")
--	}
+-import (
+-	"io"
+-	"net/http"
+-	. "github.com/emicklei/go-restful"
+-)
 -
--	c.config.CaCertFile = append(c.config.CaCertFile, caCert)
--	c.saveConfig()
+-// This example shows how to a Route that matches the "tail" of a path.
+-// Requires the use of a CurlyRouter and the star "*" path parameter pattern.
+-//
+-// GET http://localhost:8080/basepath/some/other/location/test.xml
 -
--	return err
+-func main() {
+-	DefaultContainer.Router(CurlyRouter{})
+-	ws := new(WebService)
+-	ws.Route(ws.GET("/basepath/{resource:*}").To(staticFromPathParam))
+-	Add(ws)
+-
+-	println("[go-restful] serve path tails from http://localhost:8080/basepath")
+-	http.ListenAndServe(":8080", nil)
 -}
 -
--// SetCluster updates cluster information using the given machine list.
--func (c *Client) SetCluster(machines []string) bool {
--	success := c.internalSyncCluster(machines)
--	return success
+-func staticFromPathParam(req *Request, resp *Response) {
+-	io.WriteString(resp, "Tail="+req.PathParameter("resource"))
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go
+deleted file mode 100644
+index 0b55f14..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-pre-post-filters.go
++++ /dev/null
+@@ -1,98 +0,0 @@
+-package main
 -
--func (c *Client) GetCluster() []string {
--	return c.cluster.Machines
+-import (
+-	"github.com/emicklei/go-restful"
+-	"io"
+-	"log"
+-	"net/http"
+-)
+-
+-// This example shows how the different types of filters are called in the request-response flow.
+-// The call chain is logged on the console when sending an http request.
+-//
+-// GET http://localhost:8080/1
+-// GET http://localhost:8080/2
+-
+-var indentLevel int
+-
+-func container_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	log.Printf("url path:%v\n", req.Request.URL)
+-	trace("container_filter_A: before", 1)
+-	chain.ProcessFilter(req, resp)
+-	trace("container_filter_A: after", -1)
 -}
 -
--// SyncCluster updates the cluster information using the internal machine list.
--func (c *Client) SyncCluster() bool {
--	return c.internalSyncCluster(c.cluster.Machines)
+-func container_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	trace("container_filter_B: before", 1)
+-	chain.ProcessFilter(req, resp)
+-	trace("container_filter_B: after", -1)
 -}
 -
--// internalSyncCluster syncs cluster information using the given machine list.
--func (c *Client) internalSyncCluster(machines []string) bool {
--	for _, machine := range machines {
--		httpPath := c.createHttpPath(machine, path.Join(version, "machines"))
--		resp, err := c.httpClient.Get(httpPath)
--		if err != nil {
--			// try another machine in the cluster
--			continue
--		} else {
--			b, err := ioutil.ReadAll(resp.Body)
--			resp.Body.Close()
--			if err != nil {
--				// try another machine in the cluster
--				continue
--			}
+-func service_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	trace("service_filter_A: before", 1)
+-	chain.ProcessFilter(req, resp)
+-	trace("service_filter_A: after", -1)
+-}
 -
--			// update Machines List
--			c.cluster.updateFromStr(string(b))
+-func service_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	trace("service_filter_B: before", 1)
+-	chain.ProcessFilter(req, resp)
+-	trace("service_filter_B: after", -1)
+-}
 -
--			// update leader
--			// the first one in the machine list is the leader
--			c.cluster.switchLeader(0)
+-func route_filter_A(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	trace("route_filter_A: before", 1)
+-	chain.ProcessFilter(req, resp)
+-	trace("route_filter_A: after", -1)
+-}
 -
--			logger.Debug("sync.machines ", c.cluster.Machines)
--			c.saveConfig()
--			return true
--		}
--	}
--	return false
+-func route_filter_B(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	trace("route_filter_B: before", 1)
+-	chain.ProcessFilter(req, resp)
+-	trace("route_filter_B: after", -1)
 -}
 -
--// createHttpPath creates a complete HTTP URL.
--// serverName should contain both the host name and a port number, if any.
--func (c *Client) createHttpPath(serverName string, _path string) string {
--	u, err := url.Parse(serverName)
--	if err != nil {
--		panic(err)
+-func trace(what string, delta int) {
+-	indented := what
+-	if delta < 0 {
+-		indentLevel += delta
 -	}
--
--	u.Path = path.Join(u.Path, _path)
--
--	if u.Scheme == "" {
--		u.Scheme = "http"
+-	for t := 0; t < indentLevel; t++ {
+-		indented = "." + indented
+-	}
+-	log.Printf("%s", indented)
+-	if delta > 0 {
+-		indentLevel += delta
 -	}
--	return u.String()
 -}
 -
--// dial attempts to open a TCP connection to the provided address, explicitly
--// enabling keep-alives with a one-second interval.
--func (c *Client) dial(network, addr string) (net.Conn, error) {
--	conn, err := net.DialTimeout(network, addr, c.config.DialTimeout)
--	if err != nil {
--		return nil, err
--	}
+-func main() {
+-	restful.Filter(container_filter_A)
+-	restful.Filter(container_filter_B)
 -
--	tcpConn, ok := conn.(*net.TCPConn)
--	if !ok {
--		return nil, errors.New("Failed type-assertion of net.Conn as *net.TCPConn")
--	}
+-	ws1 := new(restful.WebService)
+-	ws1.Path("/1")
+-	ws1.Filter(service_filter_A)
+-	ws1.Filter(service_filter_B)
+-	ws1.Route(ws1.GET("").To(doit1).Filter(route_filter_A).Filter(route_filter_B))
 -
--	// Keep TCP alive to check whether or not the remote machine is down
--	if err = tcpConn.SetKeepAlive(true); err != nil {
--		return nil, err
--	}
+-	ws2 := new(restful.WebService)
+-	ws2.Path("/2")
+-	ws2.Filter(service_filter_A)
+-	ws2.Filter(service_filter_B)
+-	ws2.Route(ws2.GET("").To(doit2).Filter(route_filter_A).Filter(route_filter_B))
 -
--	if err = tcpConn.SetKeepAlivePeriod(time.Second); err != nil {
--		return nil, err
--	}
+-	restful.Add(ws1)
+-	restful.Add(ws2)
 -
--	return tcpConn, nil
+-	log.Print("go-restful example listing on http://localhost:8080/1 and http://localhost:8080/2")
+-	log.Fatal(http.ListenAndServe(":8080", nil))
 -}
 -
--func (c *Client) OpenCURL() {
--	c.cURLch = make(chan string, defaultBufferSize)
+-func doit1(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "nothing to see in 1")
 -}
 -
--func (c *Client) CloseCURL() {
--	c.cURLch = nil
+-func doit2(req *restful.Request, resp *restful.Response) {
+-	io.WriteString(resp, "nothing to see in 2")
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go
+deleted file mode 100644
+index fb1012a..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-resource-functions.go
++++ /dev/null
+@@ -1,63 +0,0 @@
+-package main
 -
--func (c *Client) sendCURL(command string) {
--	go func() {
--		select {
--		case c.cURLch <- command:
--		default:
--		}
--	}()
+-import (
+-	"github.com/emicklei/go-restful"
+-	"log"
+-	"net/http"
+-)
+-
+-// This example shows how to use methods as RouteFunctions for WebServices.
+-// The ProductResource has a Register() method that creates and initializes
+-// a WebService to expose its methods as REST operations.
+-// The WebService is added to the restful.DefaultContainer.
+-// A ProductResource is typically created using some data access object.
+-//
+-// GET http://localhost:8080/products/1
+-// POST http://localhost:8080/products
+-// <Product><Id>1</Id><Title>The First</Title></Product>
+-
+-type Product struct {
+-	Id, Title string
 -}
 -
--func (c *Client) RecvCURL() string {
--	return <-c.cURLch
+-type ProductResource struct {
+-	// typically reference a DAO (data-access-object)
 -}
 -
--// saveConfig saves the current config using c.persistence.
--func (c *Client) saveConfig() error {
--	if c.persistence != nil {
--		b, err := json.Marshal(c)
--		if err != nil {
--			return err
--		}
+-func (p ProductResource) getOne(req *restful.Request, resp *restful.Response) {
+-	id := req.PathParameter("id")
+-	log.Println("getting product with id:" + id)
+-	resp.WriteEntity(Product{Id: id, Title: "test"})
+-}
 -
--		_, err = c.persistence.Write(b)
--		if err != nil {
--			return err
--		}
+-func (p ProductResource) postOne(req *restful.Request, resp *restful.Response) {
+-	updatedProduct := new(Product)
+-	err := req.ReadEntity(updatedProduct)
+-	if err != nil { // bad request
+-		resp.WriteErrorString(http.StatusBadRequest, err.Error())
+-		return
 -	}
--
--	return nil
+-	log.Println("updating product with id:" + updatedProduct.Id)
 -}
 -
--// MarshalJSON implements the Marshaller interface
--// as defined by the standard JSON package.
--func (c *Client) MarshalJSON() ([]byte, error) {
--	b, err := json.Marshal(struct {
--		Config  Config   `json:"config"`
--		Cluster *Cluster `json:"cluster"`
--	}{
--		Config:  c.config,
--		Cluster: c.cluster,
--	})
+-func (p ProductResource) Register() {
+-	ws := new(restful.WebService)
+-	ws.Path("/products")
+-	ws.Consumes(restful.MIME_XML)
+-	ws.Produces(restful.MIME_XML)
 -
--	if err != nil {
--		return nil, err
--	}
+-	ws.Route(ws.GET("/{id}").To(p.getOne).
+-		Doc("get the product by its id").
+-		Param(ws.PathParameter("id", "identifier of the product").DataType("string")))
 -
--	return b, nil
+-	ws.Route(ws.POST("").To(p.postOne).
+-		Doc("update or create a product").
+-		Param(ws.BodyParameter("Product", "a Product (XML)").DataType("main.Product")))
+-
+-	restful.Add(ws)
 -}
 -
--// UnmarshalJSON implements the Unmarshaller interface
--// as defined by the standard JSON package.
--func (c *Client) UnmarshalJSON(b []byte) error {
--	temp := struct {
--		Config  Config   `json:"config"`
--		Cluster *Cluster `json:"cluster"`
--	}{}
--	err := json.Unmarshal(b, &temp)
--	if err != nil {
--		return err
+-func main() {
+-	ProductResource{}.Register()
+-	http.ListenAndServe(":8080", nil)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go
+deleted file mode 100644
+index 20c366b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-route_test.go
++++ /dev/null
+@@ -1,39 +0,0 @@
+-package main
+-
+-import (
+-	"net/http"
+-	"net/http/httptest"
+-	"strings"
+-	"testing"
+-
+-	"github.com/emicklei/go-restful"
+-)
+-
+-var (
+-	Result string
+-)
+-
+-func TestRouteExtractParameter(t *testing.T) {
+-	// setup service
+-	ws := new(restful.WebService)
+-	ws.Consumes(restful.MIME_XML)
+-	ws.Route(ws.GET("/test/{param}").To(DummyHandler))
+-	restful.Add(ws)
+-
+-	// setup request + writer
+-	bodyReader := strings.NewReader("<Sample><Value>42</Value></Sample>")
+-	httpRequest, _ := http.NewRequest("GET", "/test/THIS", bodyReader)
+-	httpRequest.Header.Set("Content-Type", restful.MIME_XML)
+-	httpWriter := httptest.NewRecorder()
+-
+-	// run
+-	restful.DefaultContainer.ServeHTTP(httpWriter, httpRequest)
+-
+-	if Result != "THIS" {
+-		t.Fatalf("Result is actually: %s", Result)
 -	}
+-}
 -
--	c.cluster = temp.Cluster
--	c.config = temp.Config
--	return nil
+-func DummyHandler(rq *restful.Request, rp *restful.Response) {
+-	Result = rq.PathParameter("param")
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client_test.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go
 deleted file mode 100644
-index c245e47..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/client_test.go
+index 6d61c5c..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-routefunction_test.go
 +++ /dev/null
-@@ -1,96 +0,0 @@
--package etcd
+@@ -1,29 +0,0 @@
+-package main
 -
 -import (
--	"encoding/json"
--	"fmt"
--	"net"
--	"net/url"
--	"os"
+-	"net/http"
+-	"net/http/httptest"
 -	"testing"
+-
+-	"github.com/emicklei/go-restful"
 -)
 -
--// To pass this test, we need to create a cluster of 3 machines
--// The server should be listening on 127.0.0.1:4001, 4002, 4003
--func TestSync(t *testing.T) {
--	fmt.Println("Make sure there are three nodes at 0.0.0.0:4001-4003")
+-// This example show how to test one particular RouteFunction (getIt)
+-// It uses the httptest.ResponseRecorder to capture output
 -
--	// Explicit trailing slash to ensure this doesn't reproduce:
--	// https://github.com/coreos/go-etcd/issues/82
--	c := NewClient([]string{"http://127.0.0.1:4001/"})
+-func getIt(req *restful.Request, resp *restful.Response) {
+-	resp.WriteHeader(404)
+-}
 -
--	success := c.SyncCluster()
--	if !success {
--		t.Fatal("cannot sync machines")
--	}
+-func TestCallFunction(t *testing.T) {
+-	httpReq, _ := http.NewRequest("GET", "/", nil)
+-	req := restful.NewRequest(httpReq)
 -
--	for _, m := range c.GetCluster() {
--		u, err := url.Parse(m)
--		if err != nil {
--			t.Fatal(err)
--		}
--		if u.Scheme != "http" {
--			t.Fatal("scheme must be http")
--		}
+-	recorder := new(httptest.ResponseRecorder)
+-	resp := restful.NewResponse(recoder)
 -
--		host, _, err := net.SplitHostPort(u.Host)
--		if err != nil {
--			t.Fatal(err)
--		}
--		if host != "127.0.0.1" {
--			t.Fatal("Host must be 127.0.0.1")
--		}
+-	getIt(req, resp)
+-	if recorder.Code != 404 {
+-		t.Logf("Missing or wrong status code:%d", recorder.Code)
 -	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go
+deleted file mode 100644
+index 8cb7848..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-serve-static.go
++++ /dev/null
+@@ -1,47 +0,0 @@
+-package main
 -
--	badMachines := []string{"abc", "edef"}
+-import (
+-	"fmt"
+-	"net/http"
+-	"path"
 -
--	success = c.SetCluster(badMachines)
+-	"github.com/emicklei/go-restful"
+-)
 -
--	if success {
--		t.Fatal("should not sync on bad machines")
--	}
+-// This example shows how to define methods that serve static files
+-// It uses the standard http.ServeFile method
+-//
+-// GET http://localhost:8080/static/test.xml
+-// GET http://localhost:8080/static/
+-//
+-// GET http://localhost:8080/static?resource=subdir/test.xml
 -
--	goodMachines := []string{"127.0.0.1:4002"}
+-var rootdir = "/tmp"
 -
--	success = c.SetCluster(goodMachines)
+-func main() {
+-	restful.DefaultContainer.Router(restful.CurlyRouter{})
 -
--	if !success {
--		t.Fatal("cannot sync machines")
--	} else {
--		fmt.Println(c.cluster.Machines)
--	}
+-	ws := new(restful.WebService)
+-	ws.Route(ws.GET("/static/{subpath:*}").To(staticFromPathParam))
+-	ws.Route(ws.GET("/static").To(staticFromQueryParam))
+-	restful.Add(ws)
 -
+-	println("[go-restful] serving files on http://localhost:8080/static from local /tmp")
+-	http.ListenAndServe(":8080", nil)
 -}
 -
--func TestPersistence(t *testing.T) {
--	c := NewClient(nil)
--	c.SyncCluster()
+-func staticFromPathParam(req *restful.Request, resp *restful.Response) {
+-	actual := path.Join(rootdir, req.PathParameter("subpath"))
+-	fmt.Printf("serving %s ... (from %s)\n", actual, req.PathParameter("subpath"))
+-	http.ServeFile(
+-		resp.ResponseWriter,
+-		req.Request,
+-		actual)
+-}
 -
--	fo, err := os.Create("config.json")
--	if err != nil {
--		t.Fatal(err)
+-func staticFromQueryParam(req *restful.Request, resp *restful.Response) {
+-	http.ServeFile(
+-		resp.ResponseWriter,
+-		req.Request,
+-		path.Join(rootdir, req.QueryParameter("resource")))
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go
+deleted file mode 100644
+index f6ec988..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-resource.go
++++ /dev/null
+@@ -1,153 +0,0 @@
+-package main
+-
+-import (
+-	"log"
+-	"net/http"
+-	"strconv"
+-
+-	"github.com/emicklei/go-restful"
+-	"github.com/emicklei/go-restful/swagger"
+-)
+-
+-// This example show a complete (GET,PUT,POST,DELETE) conventional example of
+-// a REST Resource including documentation to be served by e.g. a Swagger UI
+-// It is recommended to create a Resource struct (UserResource) that can encapsulate
+-// an object that provide domain access (a DAO)
+-// It has a Register method including the complete Route mapping to methods together
+-// with all the appropriate documentation
+-//
+-// POST http://localhost:8080/users
+-// <User><Id>1</Id><Name>Melissa Raspberry</Name></User>
+-//
+-// GET http://localhost:8080/users/1
+-//
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa</Name></User>
+-//
+-// DELETE http://localhost:8080/users/1
+-//
+-
+-type User struct {
+-	Id, Name string
+-}
+-
+-type UserResource struct {
+-	// normally one would use DAO (data access object)
+-	users map[string]User
+-}
+-
+-func (u UserResource) Register(container *restful.Container) {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Doc("Manage Users").
+-		Consumes(restful.MIME_XML, restful.MIME_JSON).
+-		Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well
+-
+-	ws.Route(ws.GET("/{user-id}").To(u.findUser).
+-		// docs
+-		Doc("get a user").
+-		Operation("findUser").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-		Writes(User{})) // on the response
+-
+-	ws.Route(ws.PUT("/{user-id}").To(u.updateUser).
+-		// docs
+-		Doc("update a user").
+-		Operation("updateUser").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-		ReturnsError(409, "duplicate user-id", nil).
+-		Reads(User{})) // from the request
+-
+-	ws.Route(ws.POST("").To(u.createUser).
+-		// docs
+-		Doc("create a user").
+-		Operation("createUser").
+-		Reads(User{})) // from the request
+-
+-	ws.Route(ws.DELETE("/{user-id}").To(u.removeUser).
+-		// docs
+-		Doc("delete a user").
+-		Operation("removeUser").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")))
+-
+-	container.Add(ws)
+-}
+-
+-// GET http://localhost:8080/users/1
+-//
+-func (u UserResource) findUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	usr := u.users[id]
+-	if len(usr.Id) == 0 {
+-		response.AddHeader("Content-Type", "text/plain")
+-		response.WriteErrorString(http.StatusNotFound, "404: User could not be found.")
+-		return
 -	}
--	defer func() {
--		if err := fo.Close(); err != nil {
--			panic(err)
--		}
--	}()
+-	response.WriteEntity(usr)
+-}
 -
--	c.SetPersistence(fo)
--	err = c.saveConfig()
+-// POST http://localhost:8080/users
+-// <User><Name>Melissa</Name></User>
+-//
+-func (u *UserResource) createUser(request *restful.Request, response *restful.Response) {
+-	usr := new(User)
+-	err := request.ReadEntity(usr)
 -	if err != nil {
--		t.Fatal(err)
+-		response.AddHeader("Content-Type", "text/plain")
+-		response.WriteErrorString(http.StatusInternalServerError, err.Error())
+-		return
 -	}
+-	usr.Id = strconv.Itoa(len(u.users) + 1) // simple id generation
+-	u.users[usr.Id] = *usr
+-	response.WriteHeader(http.StatusCreated)
+-	response.WriteEntity(usr)
+-}
 -
--	c2, err := NewClientFromFile("config.json")
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa Raspberry</Name></User>
+-//
+-func (u *UserResource) updateUser(request *restful.Request, response *restful.Response) {
+-	usr := new(User)
+-	err := request.ReadEntity(&usr)
 -	if err != nil {
--		t.Fatal(err)
+-		response.AddHeader("Content-Type", "text/plain")
+-		response.WriteErrorString(http.StatusInternalServerError, err.Error())
+-		return
 -	}
+-	u.users[usr.Id] = *usr
+-	response.WriteEntity(usr)
+-}
 -
--	// Verify that the two clients have the same config
--	b1, _ := json.Marshal(c)
--	b2, _ := json.Marshal(c2)
--
--	if string(b1) != string(b2) {
--		t.Fatalf("The two configs should be equal!")
--	}
+-// DELETE http://localhost:8080/users/1
+-//
+-func (u *UserResource) removeUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	delete(u.users, id)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/cluster.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/cluster.go
+-
+-func main() {
+-	// to see what happens in the package, uncomment the following
+-	//restful.TraceLogger(log.New(os.Stdout, "[restful] ", log.LstdFlags|log.Lshortfile))
+-
+-	wsContainer := restful.NewContainer()
+-	u := UserResource{map[string]User{}}
+-	u.Register(wsContainer)
+-
+-	// Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API
+-	// You need to download the Swagger HTML5 assets and change the FilePath location in the config below.
+-	// Open http://localhost:8080/apidocs and enter http://localhost:8080/apidocs.json in the api input field.
+-	config := swagger.Config{
+-		WebServices:    wsContainer.RegisteredWebServices(), // you control what services are visible
+-		WebServicesUrl: "http://localhost:8080",
+-		ApiPath:        "/apidocs.json",
+-
+-		// Optionally, specifiy where the UI is located
+-		SwaggerPath:     "/apidocs/",
+-		SwaggerFilePath: "/Users/emicklei/xProjects/swagger-ui/dist"}
+-	swagger.RegisterSwaggerService(config, wsContainer)
+-
+-	log.Printf("start listening on localhost:8080")
+-	server := &http.Server{Addr: ":8080", Handler: wsContainer}
+-	log.Fatal(server.ListenAndServe())
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go
 deleted file mode 100644
-index aaa2054..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/cluster.go
+index d0d9872..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/examples/restful-user-service.go
 +++ /dev/null
-@@ -1,51 +0,0 @@
--package etcd
+@@ -1,138 +0,0 @@
+-package main
 -
 -import (
--	"net/url"
--	"strings"
+-	"log"
+-	"net/http"
+-
+-	"github.com/emicklei/go-restful"
+-	"github.com/emicklei/go-restful/swagger"
 -)
 -
--type Cluster struct {
--	Leader   string   `json:"leader"`
--	Machines []string `json:"machines"`
--}
+-// This example is functionally the same as the example in restful-user-resource.go
+-// with the only difference that is served using the restful.DefaultContainer
 -
--func NewCluster(machines []string) *Cluster {
--	// if an empty slice was sent in then just assume HTTP 4001 on localhost
--	if len(machines) == 0 {
--		machines = []string{"http://127.0.0.1:4001"}
--	}
+-type User struct {
+-	Id, Name string
+-}
 -
--	// default leader and machines
--	return &Cluster{
--		Leader:   machines[0],
--		Machines: machines,
--	}
+-type UserService struct {
+-	// normally one would use DAO (data access object)
+-	users map[string]User
 -}
 -
--// switchLeader switch the current leader to machines[num]
--func (cl *Cluster) switchLeader(num int) {
--	logger.Debugf("switch.leader[from %v to %v]",
--		cl.Leader, cl.Machines[num])
+-func (u UserService) Register() {
+-	ws := new(restful.WebService)
+-	ws.
+-		Path("/users").
+-		Consumes(restful.MIME_XML, restful.MIME_JSON).
+-		Produces(restful.MIME_JSON, restful.MIME_XML) // you can specify this per route as well
 -
--	cl.Leader = cl.Machines[num]
--}
+-	ws.Route(ws.GET("/").To(u.findAllUsers).
+-		// docs
+-		Doc("get all users").
+-		Operation("findAllUsers").
+-		Returns(200, "OK", []User{}))
 -
--func (cl *Cluster) updateFromStr(machines string) {
--	cl.Machines = strings.Split(machines, ", ")
+-	ws.Route(ws.GET("/{user-id}").To(u.findUser).
+-		// docs
+-		Doc("get a user").
+-		Operation("findUser").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-		Writes(User{})) // on the response
+-
+-	ws.Route(ws.PUT("/{user-id}").To(u.updateUser).
+-		// docs
+-		Doc("update a user").
+-		Operation("updateUser").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")).
+-		Reads(User{})) // from the request
+-
+-	ws.Route(ws.PUT("").To(u.createUser).
+-		// docs
+-		Doc("create a user").
+-		Operation("createUser").
+-		Reads(User{})) // from the request
+-
+-	ws.Route(ws.DELETE("/{user-id}").To(u.removeUser).
+-		// docs
+-		Doc("delete a user").
+-		Operation("removeUser").
+-		Param(ws.PathParameter("user-id", "identifier of the user").DataType("string")))
+-
+-	restful.Add(ws)
 -}
 -
--func (cl *Cluster) updateLeader(leader string) {
--	logger.Debugf("update.leader[%s,%s]", cl.Leader, leader)
--	cl.Leader = leader
+-// GET http://localhost:8080/users
+-//
+-func (u UserService) findAllUsers(request *restful.Request, response *restful.Response) {
+-	response.WriteEntity(u.users)
 -}
 -
--func (cl *Cluster) updateLeaderFromURL(u *url.URL) {
--	var leader string
--	if u.Scheme == "" {
--		leader = "http://" + u.Host
+-// GET http://localhost:8080/users/1
+-//
+-func (u UserService) findUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	usr := u.users[id]
+-	if len(usr.Id) == 0 {
+-		response.WriteErrorString(http.StatusNotFound, "User could not be found.")
 -	} else {
--		leader = u.Scheme + "://" + u.Host
+-		response.WriteEntity(usr)
 -	}
--	cl.updateLeader(leader)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete.go
-deleted file mode 100644
-index 11131bb..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete.go
-+++ /dev/null
-@@ -1,34 +0,0 @@
--package etcd
 -
--import "fmt"
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa Raspberry</Name></User>
+-//
+-func (u *UserService) updateUser(request *restful.Request, response *restful.Response) {
+-	usr := new(User)
+-	err := request.ReadEntity(&usr)
+-	if err == nil {
+-		u.users[usr.Id] = *usr
+-		response.WriteEntity(usr)
+-	} else {
+-		response.WriteError(http.StatusInternalServerError, err)
+-	}
+-}
 -
--func (c *Client) CompareAndDelete(key string, prevValue string, prevIndex uint64) (*Response, error) {
--	raw, err := c.RawCompareAndDelete(key, prevValue, prevIndex)
--	if err != nil {
--		return nil, err
+-// PUT http://localhost:8080/users/1
+-// <User><Id>1</Id><Name>Melissa</Name></User>
+-//
+-func (u *UserService) createUser(request *restful.Request, response *restful.Response) {
+-	usr := User{Id: request.PathParameter("user-id")}
+-	err := request.ReadEntity(&usr)
+-	if err == nil {
+-		u.users[usr.Id] = usr
+-		response.WriteHeader(http.StatusCreated)
+-		response.WriteEntity(usr)
+-	} else {
+-		response.WriteError(http.StatusInternalServerError, err)
 -	}
+-}
 -
--	return raw.Unmarshal()
+-// DELETE http://localhost:8080/users/1
+-//
+-func (u *UserService) removeUser(request *restful.Request, response *restful.Response) {
+-	id := request.PathParameter("user-id")
+-	delete(u.users, id)
 -}
 -
--func (c *Client) RawCompareAndDelete(key string, prevValue string, prevIndex uint64) (*RawResponse, error) {
--	if prevValue == "" && prevIndex == 0 {
--		return nil, fmt.Errorf("You must give either prevValue or prevIndex.")
--	}
+-func main() {
+-	u := UserService{map[string]User{}}
+-	u.Register()
+-
+-	// Optionally, you can install the Swagger Service which provides a nice Web UI on your REST API
+-	// You need to download the Swagger HTML5 assets and change the FilePath location in the config below.
+-	// Open http://localhost:8080/apidocs and enter http://localhost:8080/apidocs.json in the api input field.
+-	config := swagger.Config{
+-		WebServices:    restful.RegisteredWebServices(), // you control what services are visible
+-		WebServicesUrl: "http://localhost:8080",
+-		ApiPath:        "/apidocs.json",
+-
+-		// Optionally, specifiy where the UI is located
+-		SwaggerPath:     "/apidocs/",
+-		SwaggerFilePath: "/Users/emicklei/Projects/swagger-ui/dist"}
+-	swagger.InstallSwaggerService(config)
+-
+-	log.Printf("start listening on localhost:8080")
+-	log.Fatal(http.ListenAndServe(":8080", nil))
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/filter.go
+deleted file mode 100644
+index 4b86656..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/filter.go
++++ /dev/null
+@@ -1,26 +0,0 @@
+-package restful
 -
--	options := Options{}
--	if prevValue != "" {
--		options["prevValue"] = prevValue
--	}
--	if prevIndex != 0 {
--		options["prevIndex"] = prevIndex
--	}
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--	raw, err := c.delete(key, options)
+-// FilterChain is a request scoped object to process one or more filters before calling the target RouteFunction.
+-type FilterChain struct {
+-	Filters []FilterFunction // ordered list of FilterFunction
+-	Index   int              // index into filters that is currently in progress
+-	Target  RouteFunction    // function to call after passing all filters
+-}
 -
--	if err != nil {
--		return nil, err
+-// ProcessFilter passes the request,response pair through the next of Filters.
+-// Each filter can decide to proceed to the next Filter or handle the Response itself.
+-func (f *FilterChain) ProcessFilter(request *Request, response *Response) {
+-	if f.Index < len(f.Filters) {
+-		f.Index++
+-		f.Filters[f.Index-1](request, response, f)
+-	} else {
+-		f.Target(request, response)
 -	}
--
--	return raw, err
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go
+-
+-// FilterFunction definitions must call ProcessFilter on the FilterChain to pass on the control and eventually call the RouteFunction
+-type FilterFunction func(*Request, *Response, *FilterChain)
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go
 deleted file mode 100644
-index 223e50f..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_delete_test.go
+index fadfb57..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/filter_test.go
 +++ /dev/null
-@@ -1,46 +0,0 @@
--package etcd
+@@ -1,141 +0,0 @@
+-package restful
 -
 -import (
+-	"io"
+-	"net/http"
+-	"net/http/httptest"
 -	"testing"
 -)
 -
--func TestCompareAndDelete(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--	}()
+-func setupServices(addGlobalFilter bool, addServiceFilter bool, addRouteFilter bool) {
+-	if addGlobalFilter {
+-		Filter(globalFilter)
+-	}
+-	Add(newTestService(addServiceFilter, addRouteFilter))
+-}
 -
--	c.Set("foo", "bar", 5)
+-func tearDown() {
+-	DefaultContainer.webServices = []*WebService{}
+-	DefaultContainer.isRegisteredOnRoot = true // this allows for setupServices multiple times
+-	DefaultContainer.containerFilters = []FilterFunction{}
+-}
 -
--	// This should succeed an correct prevValue
--	resp, err := c.CompareAndDelete("foo", "bar", 0)
--	if err != nil {
--		t.Fatal(err)
+-func newTestService(addServiceFilter bool, addRouteFilter bool) *WebService {
+-	ws := new(WebService).Path("")
+-	if addServiceFilter {
+-		ws.Filter(serviceFilter)
 -	}
--	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
--		t.Fatalf("CompareAndDelete 1 prevNode failed: %#v", resp)
+-	rb := ws.GET("/foo").To(foo)
+-	if addRouteFilter {
+-		rb.Filter(routeFilter)
 -	}
+-	ws.Route(rb)
+-	ws.Route(ws.GET("/bar").To(bar))
+-	return ws
+-}
 -
--	resp, _ = c.Set("foo", "bar", 5)
--	// This should fail because it gives an incorrect prevValue
--	_, err = c.CompareAndDelete("foo", "xxx", 0)
--	if err == nil {
--		t.Fatalf("CompareAndDelete 2 should have failed.  The response is: %#v", resp)
--	}
+-func foo(req *Request, resp *Response) {
+-	io.WriteString(resp.ResponseWriter, "foo")
+-}
 -
--	// This should succeed because it gives an correct prevIndex
--	resp, err = c.CompareAndDelete("foo", "", resp.Node.ModifiedIndex)
--	if err != nil {
--		t.Fatal(err)
--	}
--	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
--		t.Fatalf("CompareAndSwap 3 prevNode failed: %#v", resp)
--	}
+-func bar(req *Request, resp *Response) {
+-	io.WriteString(resp.ResponseWriter, "bar")
+-}
 -
--	c.Set("foo", "bar", 5)
--	// This should fail because it gives an incorrect prevIndex
--	resp, err = c.CompareAndDelete("foo", "", 29817514)
--	if err == nil {
--		t.Fatalf("CompareAndDelete 4 should have failed.  The response is: %#v", resp)
--	}
+-func fail(req *Request, resp *Response) {
+-	http.Error(resp.ResponseWriter, "something failed", http.StatusInternalServerError)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap.go
-deleted file mode 100644
-index bb4f906..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap.go
-+++ /dev/null
-@@ -1,36 +0,0 @@
--package etcd
 -
--import "fmt"
+-func globalFilter(req *Request, resp *Response, chain *FilterChain) {
+-	io.WriteString(resp.ResponseWriter, "global-")
+-	chain.ProcessFilter(req, resp)
+-}
 -
--func (c *Client) CompareAndSwap(key string, value string, ttl uint64,
--	prevValue string, prevIndex uint64) (*Response, error) {
--	raw, err := c.RawCompareAndSwap(key, value, ttl, prevValue, prevIndex)
--	if err != nil {
--		return nil, err
+-func serviceFilter(req *Request, resp *Response, chain *FilterChain) {
+-	io.WriteString(resp.ResponseWriter, "service-")
+-	chain.ProcessFilter(req, resp)
+-}
+-
+-func routeFilter(req *Request, resp *Response, chain *FilterChain) {
+-	io.WriteString(resp.ResponseWriter, "route-")
+-	chain.ProcessFilter(req, resp)
+-}
+-
+-func TestNoFilter(t *testing.T) {
+-	tearDown()
+-	setupServices(false, false, false)
+-	actual := sendIt("http://example.com/foo")
+-	if "foo" != actual {
+-		t.Fatal("expected: foo but got:" + actual)
 -	}
+-}
 -
--	return raw.Unmarshal()
+-func TestGlobalFilter(t *testing.T) {
+-	tearDown()
+-	setupServices(true, false, false)
+-	actual := sendIt("http://example.com/foo")
+-	if "global-foo" != actual {
+-		t.Fatal("expected: global-foo but got:" + actual)
+-	}
 -}
 -
--func (c *Client) RawCompareAndSwap(key string, value string, ttl uint64,
--	prevValue string, prevIndex uint64) (*RawResponse, error) {
--	if prevValue == "" && prevIndex == 0 {
--		return nil, fmt.Errorf("You must give either prevValue or prevIndex.")
+-func TestWebServiceFilter(t *testing.T) {
+-	tearDown()
+-	setupServices(true, true, false)
+-	actual := sendIt("http://example.com/foo")
+-	if "global-service-foo" != actual {
+-		t.Fatal("expected: global-service-foo but got:" + actual)
 -	}
+-}
 -
--	options := Options{}
--	if prevValue != "" {
--		options["prevValue"] = prevValue
+-func TestRouteFilter(t *testing.T) {
+-	tearDown()
+-	setupServices(true, true, true)
+-	actual := sendIt("http://example.com/foo")
+-	if "global-service-route-foo" != actual {
+-		t.Fatal("expected: global-service-route-foo but got:" + actual)
 -	}
--	if prevIndex != 0 {
--		options["prevIndex"] = prevIndex
+-}
+-
+-func TestRouteFilterOnly(t *testing.T) {
+-	tearDown()
+-	setupServices(false, false, true)
+-	actual := sendIt("http://example.com/foo")
+-	if "route-foo" != actual {
+-		t.Fatal("expected: route-foo but got:" + actual)
 -	}
+-}
 -
--	raw, err := c.put(key, value, ttl, options)
+-func TestBar(t *testing.T) {
+-	tearDown()
+-	setupServices(false, true, false)
+-	actual := sendIt("http://example.com/bar")
+-	if "service-bar" != actual {
+-		t.Fatal("expected: service-bar but got:" + actual)
+-	}
+-}
 -
--	if err != nil {
--		return nil, err
+-func TestAllFiltersBar(t *testing.T) {
+-	tearDown()
+-	setupServices(true, true, true)
+-	actual := sendIt("http://example.com/bar")
+-	if "global-service-bar" != actual {
+-		t.Fatal("expected: global-service-bar but got:" + actual)
 -	}
+-}
 -
--	return raw, err
+-func sendIt(address string) string {
+-	httpRequest, _ := http.NewRequest("GET", address, nil)
+-	httpRequest.Header.Set("Accept", "*/*")
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	return httpWriter.Body.String()
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go
+-
+-func sendItTo(address string, container *Container) string {
+-	httpRequest, _ := http.NewRequest("GET", address, nil)
+-	httpRequest.Header.Set("Accept", "*/*")
+-	httpWriter := httptest.NewRecorder()
+-	container.dispatch(httpWriter, httpRequest)
+-	return httpWriter.Body.String()
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/install.sh b/Godeps/_workspace/src/github.com/emicklei/go-restful/install.sh
 deleted file mode 100644
-index 14a1b00..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/compare_and_swap_test.go
+index b5de8a2..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/install.sh
 +++ /dev/null
-@@ -1,57 +0,0 @@
--package etcd
+@@ -1,9 +0,0 @@
+-cd examples
+-	ls *.go | xargs -I {} go build {}
+-	cd ..
+-go fmt ...swagger && \
+-go test -test.v ...swagger && \
+-go install ...swagger && \
+-go fmt ...restful && \
+-go test -test.v ...restful && \
+-go install ...restful
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311.go
+deleted file mode 100644
+index affeee7..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311.go
++++ /dev/null
+@@ -1,248 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
 -import (
--	"testing"
+-	"errors"
+-	"fmt"
+-	"net/http"
+-	"sort"
 -)
 -
--func TestCompareAndSwap(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--	}()
+-// RouterJSR311 implements the flow for matching Requests to Routes (and consequently Resource Functions)
+-// as specified by the JSR311 http://jsr311.java.net/nonav/releases/1.1/spec/spec.html.
+-// RouterJSR311 implements the Router interface.
+-// Concept of locators is not implemented.
+-type RouterJSR311 struct{}
 -
--	c.Set("foo", "bar", 5)
+-// SelectRoute is part of the Router interface and returns the best match
+-// for the WebService and its Route for the given Request.
+-func (r RouterJSR311) SelectRoute(
+-	webServices []*WebService,
+-	httpRequest *http.Request) (selectedService *WebService, selectedRoute *Route, err error) {
 -
--	// This should succeed
--	resp, err := c.CompareAndSwap("foo", "bar2", 5, "bar", 0)
+-	// Identify the root resource class (WebService)
+-	dispatcher, finalMatch, err := r.detectDispatcher(httpRequest.URL.Path, webServices)
 -	if err != nil {
--		t.Fatal(err)
+-		return nil, nil, NewError(http.StatusNotFound, "")
 -	}
--	if !(resp.Node.Value == "bar2" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) {
--		t.Fatalf("CompareAndSwap 1 failed: %#v", resp)
+-	// Obtain the set of candidate methods (Routes)
+-	routes := r.selectRoutes(dispatcher, finalMatch)
+-	if len(routes) == 0 {
+-		return dispatcher, nil, NewError(http.StatusNotFound, "404: Page Not Found")
 -	}
 -
--	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
--		t.Fatalf("CompareAndSwap 1 prevNode failed: %#v", resp)
--	}
+-	// Identify the method (Route) that will handle the request
+-	route, ok := r.detectRoute(routes, httpRequest)
+-	return dispatcher, route, ok
+-}
 -
--	// This should fail because it gives an incorrect prevValue
--	resp, err = c.CompareAndSwap("foo", "bar3", 5, "xxx", 0)
--	if err == nil {
--		t.Fatalf("CompareAndSwap 2 should have failed.  The response is: %#v", resp)
+-// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2
+-func (r RouterJSR311) detectRoute(routes []Route, httpRequest *http.Request) (*Route, error) {
+-	// http method
+-	methodOk := []Route{}
+-	for _, each := range routes {
+-		if httpRequest.Method == each.Method {
+-			methodOk = append(methodOk, each)
+-		}
 -	}
--
--	resp, err = c.Set("foo", "bar", 5)
--	if err != nil {
--		t.Fatal(err)
+-	if len(methodOk) == 0 {
+-		if trace {
+-			traceLogger.Printf("no Route found (in %d routes) that matches HTTP method %s\n", len(routes), httpRequest.Method)
+-		}
+-		return nil, NewError(http.StatusMethodNotAllowed, "405: Method Not Allowed")
 -	}
--
--	// This should succeed
--	resp, err = c.CompareAndSwap("foo", "bar2", 5, "", resp.Node.ModifiedIndex)
--	if err != nil {
--		t.Fatal(err)
+-	inputMediaOk := methodOk
+-	// content-type
+-	contentType := httpRequest.Header.Get(HEADER_ContentType)
+-	if httpRequest.ContentLength > 0 {
+-		inputMediaOk = []Route{}
+-		for _, each := range methodOk {
+-			if each.matchesContentType(contentType) {
+-				inputMediaOk = append(inputMediaOk, each)
+-			}
+-		}
+-		if len(inputMediaOk) == 0 {
+-			if trace {
+-				traceLogger.Printf("no Route found (from %d) that matches HTTP Content-Type: %s\n", len(methodOk), contentType)
+-			}
+-			return nil, NewError(http.StatusUnsupportedMediaType, "415: Unsupported Media Type")
+-		}
 -	}
--	if !(resp.Node.Value == "bar2" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) {
--		t.Fatalf("CompareAndSwap 3 failed: %#v", resp)
+-	// accept
+-	outputMediaOk := []Route{}
+-	accept := httpRequest.Header.Get(HEADER_Accept)
+-	if accept == "" {
+-		accept = "*/*"
+-	}
+-	for _, each := range inputMediaOk {
+-		if each.matchesAccept(accept) {
+-			outputMediaOk = append(outputMediaOk, each)
+-		}
 -	}
+-	if len(outputMediaOk) == 0 {
+-		if trace {
+-			traceLogger.Printf("no Route found (from %d) that matches HTTP Accept: %s\n", len(inputMediaOk), accept)
+-		}
+-		return nil, NewError(http.StatusNotAcceptable, "406: Not Acceptable")
+-	}
+-	return r.bestMatchByMedia(outputMediaOk, contentType, accept), nil
+-}
 -
--	if !(resp.PrevNode.Value == "bar" && resp.PrevNode.Key == "/foo" && resp.PrevNode.TTL == 5) {
--		t.Fatalf("CompareAndSwap 3 prevNode failed: %#v", resp)
+-// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2
+-// n/m > n/* > */*
+-func (r RouterJSR311) bestMatchByMedia(routes []Route, contentType string, accept string) *Route {
+-	// TODO
+-	return &routes[0]
+-}
+-
+-// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2  (step 2)
+-func (r RouterJSR311) selectRoutes(dispatcher *WebService, pathRemainder string) []Route {
+-	filtered := &sortableRouteCandidates{}
+-	for _, each := range dispatcher.Routes() {
+-		pathExpr := each.pathExpr
+-		matches := pathExpr.Matcher.FindStringSubmatch(pathRemainder)
+-		if matches != nil {
+-			lastMatch := matches[len(matches)-1]
+-			if len(lastMatch) == 0 || lastMatch == "/" { // do not include if value is neither empty nor ‘/’.
+-				filtered.candidates = append(filtered.candidates,
+-					routeCandidate{each, len(matches) - 1, pathExpr.LiteralCount, pathExpr.VarCount})
+-			}
+-		}
+-	}
+-	if len(filtered.candidates) == 0 {
+-		if trace {
+-			traceLogger.Printf("WebService on path %s has no routes that match URL path remainder:%s\n", dispatcher.rootPath, pathRemainder)
+-		}
+-		return []Route{}
 -	}
+-	sort.Sort(sort.Reverse(filtered))
 -
--	// This should fail because it gives an incorrect prevIndex
--	resp, err = c.CompareAndSwap("foo", "bar3", 5, "", 29817514)
--	if err == nil {
--		t.Fatalf("CompareAndSwap 4 should have failed.  The response is: %#v", resp)
+-	// select other routes from candidates whoes expression matches rmatch
+-	matchingRoutes := []Route{filtered.candidates[0].route}
+-	for c := 1; c < len(filtered.candidates); c++ {
+-		each := filtered.candidates[c]
+-		if each.route.pathExpr.Matcher.MatchString(pathRemainder) {
+-			matchingRoutes = append(matchingRoutes, each.route)
+-		}
 -	}
+-	return matchingRoutes
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug.go
-deleted file mode 100644
-index 0f77788..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug.go
-+++ /dev/null
-@@ -1,55 +0,0 @@
--package etcd
 -
--import (
--	"fmt"
--	"io/ioutil"
--	"log"
--	"strings"
--)
+-// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-360003.7.2 (step 1)
+-func (r RouterJSR311) detectDispatcher(requestPath string, dispatchers []*WebService) (*WebService, string, error) {
+-	filtered := &sortableDispatcherCandidates{}
+-	for _, each := range dispatchers {
+-		pathExpr := each.compiledPathExpression()
+-		matches := pathExpr.Matcher.FindStringSubmatch(requestPath)
+-		if matches != nil {
+-			filtered.candidates = append(filtered.candidates,
+-				dispatcherCandidate{each, matches[len(matches)-1], len(matches), pathExpr.LiteralCount, pathExpr.VarCount})
+-		}
+-	}
+-	if len(filtered.candidates) == 0 {
+-		if trace {
+-			traceLogger.Printf("no WebService was found to match URL path:%s\n", requestPath)
+-		}
+-		return nil, "", errors.New("not found")
+-	}
+-	sort.Sort(sort.Reverse(filtered))
+-	return filtered.candidates[0].dispatcher, filtered.candidates[0].finalMatch, nil
+-}
 -
--var logger *etcdLogger
+-// Types and functions to support the sorting of Routes
 -
--func SetLogger(l *log.Logger) {
--	logger = &etcdLogger{l}
+-type routeCandidate struct {
+-	route           Route
+-	matchesCount    int // the number of capturing groups
+-	literalCount    int // the number of literal characters (means those not resulting from template variable substitution)
+-	nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^  /]+?)’)
 -}
 -
--func GetLogger() *log.Logger {
--	return logger.log
+-func (r routeCandidate) expressionToMatch() string {
+-	return r.route.pathExpr.Source
 -}
 -
--type etcdLogger struct {
--	log *log.Logger
+-func (r routeCandidate) String() string {
+-	return fmt.Sprintf("(m=%d,l=%d,n=%d)", r.matchesCount, r.literalCount, r.nonDefaultCount)
 -}
 -
--func (p *etcdLogger) Debug(args ...interface{}) {
--	msg := "DEBUG: " + fmt.Sprint(args...)
--	p.log.Println(msg)
+-type sortableRouteCandidates struct {
+-	candidates []routeCandidate
 -}
 -
--func (p *etcdLogger) Debugf(f string, args ...interface{}) {
--	msg := "DEBUG: " + fmt.Sprintf(f, args...)
--	// Append newline if necessary
--	if !strings.HasSuffix(msg, "\n") {
--		msg = msg + "\n"
+-func (rcs *sortableRouteCandidates) Len() int {
+-	return len(rcs.candidates)
+-}
+-func (rcs *sortableRouteCandidates) Swap(i, j int) {
+-	rcs.candidates[i], rcs.candidates[j] = rcs.candidates[j], rcs.candidates[i]
+-}
+-func (rcs *sortableRouteCandidates) Less(i, j int) bool {
+-	ci := rcs.candidates[i]
+-	cj := rcs.candidates[j]
+-	// primary key
+-	if ci.literalCount < cj.literalCount {
+-		return true
 -	}
--	p.log.Print(msg)
+-	if ci.literalCount > cj.literalCount {
+-		return false
+-	}
+-	// secundary key
+-	if ci.matchesCount < cj.matchesCount {
+-		return true
+-	}
+-	if ci.matchesCount > cj.matchesCount {
+-		return false
+-	}
+-	// tertiary key
+-	if ci.nonDefaultCount < cj.nonDefaultCount {
+-		return true
+-	}
+-	if ci.nonDefaultCount > cj.nonDefaultCount {
+-		return false
+-	}
+-	// quaternary key ("source" is interpreted as Path)
+-	return ci.route.Path < cj.route.Path
 -}
 -
--func (p *etcdLogger) Warning(args ...interface{}) {
--	msg := "WARNING: " + fmt.Sprint(args...)
--	p.log.Println(msg)
--}
+-// Types and functions to support the sorting of Dispatchers
 -
--func (p *etcdLogger) Warningf(f string, args ...interface{}) {
--	msg := "WARNING: " + fmt.Sprintf(f, args...)
--	// Append newline if necessary
--	if !strings.HasSuffix(msg, "\n") {
--		msg = msg + "\n"
--	}
--	p.log.Print(msg)
+-type dispatcherCandidate struct {
+-	dispatcher      *WebService
+-	finalMatch      string
+-	matchesCount    int // the number of capturing groups
+-	literalCount    int // the number of literal characters (means those not resulting from template variable substitution)
+-	nonDefaultCount int // the number of capturing groups with non-default regular expressions (i.e. not ‘([^  /]+?)’)
+-}
+-type sortableDispatcherCandidates struct {
+-	candidates []dispatcherCandidate
 -}
 -
--func init() {
--	// Default logger uses the go default log.
--	SetLogger(log.New(ioutil.Discard, "go-etcd", log.LstdFlags))
+-func (dc *sortableDispatcherCandidates) Len() int {
+-	return len(dc.candidates)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug_test.go
+-func (dc *sortableDispatcherCandidates) Swap(i, j int) {
+-	dc.candidates[i], dc.candidates[j] = dc.candidates[j], dc.candidates[i]
+-}
+-func (dc *sortableDispatcherCandidates) Less(i, j int) bool {
+-	ci := dc.candidates[i]
+-	cj := dc.candidates[j]
+-	// primary key
+-	if ci.matchesCount < cj.matchesCount {
+-		return true
+-	}
+-	if ci.matchesCount > cj.matchesCount {
+-		return false
+-	}
+-	// secundary key
+-	if ci.literalCount < cj.literalCount {
+-		return true
+-	}
+-	if ci.literalCount > cj.literalCount {
+-		return false
+-	}
+-	// tertiary key
+-	return ci.nonDefaultCount < cj.nonDefaultCount
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go
 deleted file mode 100644
-index 97f6d11..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/debug_test.go
+index 8d54ed9..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/jsr311_test.go
 +++ /dev/null
-@@ -1,28 +0,0 @@
--package etcd
+@@ -1,231 +0,0 @@
+-package restful
 -
 -import (
+-	"io"
+-	"sort"
 -	"testing"
 -)
 -
--type Foo struct{}
--type Bar struct {
--	one string
--	two int
--}
--
--// Tests that logs don't panic with arbitrary interfaces
--func TestDebug(t *testing.T) {
--	f := &Foo{}
--	b := &Bar{"asfd", 3}
--	for _, test := range []interface{}{
--		1234,
--		"asdf",
--		f,
--		b,
--	} {
--		logger.Debug(test)
--		logger.Debugf("something, %s", test)
--		logger.Warning(test)
--		logger.Warningf("something, %s", test)
+-//
+-// Step 1 tests
+-//
+-var paths = []struct {
+-	// url with path (1) is handled by service with root (2) and last capturing group has value final (3)
+-	path, root, final string
+-}{
+-	{"/", "/", "/"},
+-	{"/p", "/p", ""},
+-	{"/p/x", "/p/{q}", ""},
+-	{"/q/x", "/q", "/x"},
+-	{"/p/x/", "/p/{q}", "/"},
+-	{"/p/x/y", "/p/{q}", "/y"},
+-	{"/q/x/y", "/q", "/x/y"},
+-	{"/z/q", "/{p}/q", ""},
+-	{"/a/b/c/q", "/", "/a/b/c/q"},
+-}
+-
+-func TestDetectDispatcher(t *testing.T) {
+-	ws1 := new(WebService).Path("/")
+-	ws2 := new(WebService).Path("/p")
+-	ws3 := new(WebService).Path("/q")
+-	ws4 := new(WebService).Path("/p/q")
+-	ws5 := new(WebService).Path("/p/{q}")
+-	ws6 := new(WebService).Path("/p/{q}/")
+-	ws7 := new(WebService).Path("/{p}/q")
+-	var dispatchers = []*WebService{ws1, ws2, ws3, ws4, ws5, ws6, ws7}
+-
+-	router := RouterJSR311{}
+-
+-	ok := true
+-	for i, fixture := range paths {
+-		who, final, err := router.detectDispatcher(fixture.path, dispatchers)
+-		if err != nil {
+-			t.Logf("error in detection:%v", err)
+-			ok = false
+-		}
+-		if who.RootPath() != fixture.root {
+-			t.Logf("[line:%v] Unexpected dispatcher, expected:%v, actual:%v", i, fixture.root, who.RootPath())
+-			ok = false
+-		}
+-		if final != fixture.final {
+-			t.Logf("[line:%v] Unexpected final, expected:%v, actual:%v", i, fixture.final, final)
+-			ok = false
+-		}
+-	}
+-	if !ok {
+-		t.Fail()
 -	}
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete.go
-deleted file mode 100644
-index b37accd..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete.go
-+++ /dev/null
-@@ -1,40 +0,0 @@
--package etcd
 -
--// Delete deletes the given key.
 -//
--// When recursive set to false, if the key points to a
--// directory the method will fail.
+-// Step 2 tests
 -//
--// When recursive set to true, if the key points to a file,
--// the file will be deleted; if the key points to a directory,
--// then everything under the directory (including all child directories)
--// will be deleted.
--func (c *Client) Delete(key string, recursive bool) (*Response, error) {
--	raw, err := c.RawDelete(key, recursive, false)
 -
--	if err != nil {
--		return nil, err
+-// go test -v -test.run TestISSUE_30 ...restful
+-func TestISSUE_30(t *testing.T) {
+-	ws1 := new(WebService).Path("/users")
+-	ws1.Route(ws1.GET("/{id}").To(dummy))
+-	ws1.Route(ws1.POST("/login").To(dummy))
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/login")
+-	if len(routes) != 2 {
+-		t.Fatal("expected 2 routes")
+-	}
+-	if routes[0].Path != "/users/login" {
+-		t.Error("first is", routes[0].Path)
+-		t.Logf("routes:%v", routes)
 -	}
--
--	return raw.Unmarshal()
 -}
 -
--// DeleteDir deletes an empty directory or a key value pair
--func (c *Client) DeleteDir(key string) (*Response, error) {
--	raw, err := c.RawDelete(key, false, true)
--
--	if err != nil {
--		return nil, err
+-// go test -v -test.run TestISSUE_34 ...restful
+-func TestISSUE_34(t *testing.T) {
+-	ws1 := new(WebService).Path("/")
+-	ws1.Route(ws1.GET("/{type}/{id}").To(dummy))
+-	ws1.Route(ws1.GET("/network/{id}").To(dummy))
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/network/12")
+-	if len(routes) != 2 {
+-		t.Fatal("expected 2 routes")
 -	}
+-	if routes[0].Path != "/network/{id}" {
+-		t.Error("first is", routes[0].Path)
+-		t.Logf("routes:%v", routes)
+-	}
+-}
 -
--	return raw.Unmarshal()
+-// go test -v -test.run TestISSUE_34_2 ...restful
+-func TestISSUE_34_2(t *testing.T) {
+-	ws1 := new(WebService).Path("/")
+-	// change the registration order
+-	ws1.Route(ws1.GET("/network/{id}").To(dummy))
+-	ws1.Route(ws1.GET("/{type}/{id}").To(dummy))
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/network/12")
+-	if len(routes) != 2 {
+-		t.Fatal("expected 2 routes")
+-	}
+-	if routes[0].Path != "/network/{id}" {
+-		t.Error("first is", routes[0].Path)
+-	}
 -}
 -
--func (c *Client) RawDelete(key string, recursive bool, dir bool) (*RawResponse, error) {
--	ops := Options{
--		"recursive": recursive,
--		"dir":       dir,
+-// go test -v -test.run TestISSUE_137 ...restful
+-func TestISSUE_137(t *testing.T) {
+-	ws1 := new(WebService)
+-	ws1.Route(ws1.GET("/hello").To(dummy))
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/")
+-	t.Log(routes)
+-	if len(routes) > 0 {
+-		t.Error("no route expected")
 -	}
+-}
 -
--	return c.delete(key, ops)
+-func TestSelectRoutesSlash(t *testing.T) {
+-	ws1 := new(WebService).Path("/")
+-	ws1.Route(ws1.GET("").To(dummy))
+-	ws1.Route(ws1.GET("/").To(dummy))
+-	ws1.Route(ws1.GET("/u").To(dummy))
+-	ws1.Route(ws1.POST("/u").To(dummy))
+-	ws1.Route(ws1.POST("/u/v").To(dummy))
+-	ws1.Route(ws1.POST("/u/{w}").To(dummy))
+-	ws1.Route(ws1.POST("/u/{w}/z").To(dummy))
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/u")
+-	checkRoutesContains(routes, "/u", t)
+-	checkRoutesContainsNo(routes, "/u/v", t)
+-	checkRoutesContainsNo(routes, "/", t)
+-	checkRoutesContainsNo(routes, "/u/{w}/z", t)
+-}
+-func TestSelectRoutesU(t *testing.T) {
+-	ws1 := new(WebService).Path("/u")
+-	ws1.Route(ws1.GET("").To(dummy))
+-	ws1.Route(ws1.GET("/").To(dummy))
+-	ws1.Route(ws1.GET("/v").To(dummy))
+-	ws1.Route(ws1.POST("/{w}").To(dummy))
+-	ws1.Route(ws1.POST("/{w}/z").To(dummy))          // so full path = /u/{w}/z
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/v") // test against /u/v
+-	checkRoutesContains(routes, "/u/{w}", t)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete_test.go
-deleted file mode 100644
-index 5904971..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/delete_test.go
-+++ /dev/null
-@@ -1,81 +0,0 @@
--package etcd
 -
--import (
--	"testing"
--)
+-func TestSelectRoutesUsers1(t *testing.T) {
+-	ws1 := new(WebService).Path("/users")
+-	ws1.Route(ws1.POST("").To(dummy))
+-	ws1.Route(ws1.POST("/").To(dummy))
+-	ws1.Route(ws1.PUT("/{id}").To(dummy))
+-	routes := RouterJSR311{}.selectRoutes(ws1, "/1")
+-	checkRoutesContains(routes, "/users/{id}", t)
+-}
+-func checkRoutesContains(routes []Route, path string, t *testing.T) {
+-	if !containsRoutePath(routes, path, t) {
+-		for _, r := range routes {
+-			t.Logf("route %v %v", r.Method, r.Path)
+-		}
+-		t.Fatalf("routes should include [%v]:", path)
+-	}
+-}
+-func checkRoutesContainsNo(routes []Route, path string, t *testing.T) {
+-	if containsRoutePath(routes, path, t) {
+-		for _, r := range routes {
+-			t.Logf("route %v %v", r.Method, r.Path)
+-		}
+-		t.Fatalf("routes should not include [%v]:", path)
+-	}
+-}
+-func containsRoutePath(routes []Route, path string, t *testing.T) bool {
+-	for _, each := range routes {
+-		if each.Path == path {
+-			return true
+-		}
+-	}
+-	return false
+-}
 -
--func TestDelete(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--	}()
+-var tempregexs = []struct {
+-	template, regex        string
+-	literalCount, varCount int
+-}{
+-	{"", "^(/.*)?$", 0, 0},
+-	{"/a/{b}/c/", "^/a/([^/]+?)/c(/.*)?$", 2, 1},
+-	{"/{a}/{b}/{c-d-e}/", "^/([^/]+?)/([^/]+?)/([^/]+?)(/.*)?$", 0, 3},
+-	{"/{p}/abcde", "^/([^/]+?)/abcde(/.*)?$", 5, 1},
+-}
 -
--	c.Set("foo", "bar", 5)
--	resp, err := c.Delete("foo", false)
--	if err != nil {
--		t.Fatal(err)
+-func TestTemplateToRegularExpression(t *testing.T) {
+-	ok := true
+-	for i, fixture := range tempregexs {
+-		actual, lCount, vCount, _ := templateToRegularExpression(fixture.template)
+-		if actual != fixture.regex {
+-			t.Logf("regex mismatch, expected:%v , actual:%v, line:%v\n", fixture.regex, actual, i) // 11 = where the data starts
+-			ok = false
+-		}
+-		if lCount != fixture.literalCount {
+-			t.Logf("literal count mismatch, expected:%v , actual:%v, line:%v\n", fixture.literalCount, lCount, i)
+-			ok = false
+-		}
+-		if vCount != fixture.varCount {
+-			t.Logf("variable count mismatch, expected:%v , actual:%v, line:%v\n", fixture.varCount, vCount, i)
+-			ok = false
+-		}
 -	}
--
--	if !(resp.Node.Value == "") {
--		t.Fatalf("Delete failed with %s", resp.Node.Value)
+-	if !ok {
+-		t.Fatal("one or more expression did not match")
 -	}
+-}
 -
--	if !(resp.PrevNode.Value == "bar") {
--		t.Fatalf("Delete PrevNode failed with %s", resp.Node.Value)
+-// go test -v -test.run TestSortableRouteCandidates ...restful
+-func TestSortableRouteCandidates(t *testing.T) {
+-	fixture := &sortableRouteCandidates{}
+-	r1 := routeCandidate{matchesCount: 0, literalCount: 0, nonDefaultCount: 0}
+-	r2 := routeCandidate{matchesCount: 0, literalCount: 0, nonDefaultCount: 1}
+-	r3 := routeCandidate{matchesCount: 0, literalCount: 1, nonDefaultCount: 1}
+-	r4 := routeCandidate{matchesCount: 1, literalCount: 1, nonDefaultCount: 0}
+-	r5 := routeCandidate{matchesCount: 1, literalCount: 0, nonDefaultCount: 0}
+-	fixture.candidates = append(fixture.candidates, r5, r4, r3, r2, r1)
+-	sort.Sort(sort.Reverse(fixture))
+-	first := fixture.candidates[0]
+-	if first.matchesCount != 1 && first.literalCount != 1 && first.nonDefaultCount != 0 {
+-		t.Fatal("expected r4")
 -	}
--
--	resp, err = c.Delete("foo", false)
--	if err == nil {
--		t.Fatalf("Delete should have failed because the key foo did not exist.  "+
--			"The response was: %v", resp)
+-	last := fixture.candidates[len(fixture.candidates)-1]
+-	if last.matchesCount != 0 && last.literalCount != 0 && last.nonDefaultCount != 0 {
+-		t.Fatal("expected r1")
 -	}
 -}
 -
--func TestDeleteAll(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--		c.Delete("fooDir", true)
--	}()
+-func dummy(req *Request, resp *Response) { io.WriteString(resp.ResponseWriter, "dummy") }
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/logger.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/logger.go
+deleted file mode 100644
+index 25d6a8e..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/logger.go
++++ /dev/null
+@@ -1,16 +0,0 @@
+-package restful
 -
--	c.SetDir("foo", 5)
--	// test delete an empty dir
--	resp, err := c.DeleteDir("foo")
--	if err != nil {
--		t.Fatal(err)
--	}
+-import "log"
 -
--	if !(resp.Node.Value == "") {
--		t.Fatalf("DeleteAll 1 failed: %#v", resp)
--	}
+-// Copyright 2014 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--	if !(resp.PrevNode.Dir == true && resp.PrevNode.Value == "") {
--		t.Fatalf("DeleteAll 1 PrevNode failed: %#v", resp)
--	}
+-var trace bool = false
+-var traceLogger *log.Logger
 -
--	c.CreateDir("fooDir", 5)
--	c.Set("fooDir/foo", "bar", 5)
--	_, err = c.DeleteDir("fooDir")
--	if err == nil {
--		t.Fatal("should not able to delete a non-empty dir with deletedir")
--	}
+-// TraceLogger enables detailed logging of Http request matching and filter invocation. Default no logger is set.
+-func TraceLogger(logger *log.Logger) {
+-	traceLogger = logger
+-	trace = logger != nil
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter.go
+deleted file mode 100644
+index bd5d0c2..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter.go
++++ /dev/null
+@@ -1,24 +0,0 @@
+-package restful
 -
--	resp, err = c.Delete("fooDir", true)
--	if err != nil {
--		t.Fatal(err)
--	}
+-import "strings"
 -
--	if !(resp.Node.Value == "") {
--		t.Fatalf("DeleteAll 2 failed: %#v", resp)
--	}
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--	if !(resp.PrevNode.Dir == true && resp.PrevNode.Value == "") {
--		t.Fatalf("DeleteAll 2 PrevNode failed: %#v", resp)
+-// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method
+-// and provides the response with a set of allowed methods for the request URL Path.
+-// As for any filter, you can also install it for a particular WebService within a Container
+-func (c Container) OPTIONSFilter(req *Request, resp *Response, chain *FilterChain) {
+-	if "OPTIONS" != req.Request.Method {
+-		chain.ProcessFilter(req, resp)
+-		return
 -	}
+-	resp.AddHeader(HEADER_Allow, strings.Join(c.computeAllowedMethods(req), ","))
+-}
 -
--	resp, err = c.Delete("foo", true)
--	if err == nil {
--		t.Fatalf("DeleteAll should have failed because the key foo did not exist.  "+
--			"The response was: %v", resp)
--	}
+-// OPTIONSFilter is a filter function that inspects the Http Request for the OPTIONS method
+-// and provides the response with a set of allowed methods for the request URL Path.
+-func OPTIONSFilter() FilterFunction {
+-	return DefaultContainer.OPTIONSFilter
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/error.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/error.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go
 deleted file mode 100644
-index 7e69287..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/error.go
+index f0fceb8..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/options_filter_test.go
 +++ /dev/null
-@@ -1,48 +0,0 @@
--package etcd
+@@ -1,34 +0,0 @@
+-package restful
 -
 -import (
--	"encoding/json"
--	"fmt"
+-	"net/http"
+-	"net/http/httptest"
+-	"testing"
 -)
 -
+-// go test -v -test.run TestOptionsFilter ...restful
+-func TestOptionsFilter(t *testing.T) {
+-	tearDown()
+-	ws := new(WebService)
+-	ws.Route(ws.GET("/candy/{kind}").To(dummy))
+-	ws.Route(ws.DELETE("/candy/{kind}").To(dummy))
+-	ws.Route(ws.POST("/candies").To(dummy))
+-	Add(ws)
+-	Filter(OPTIONSFilter())
+-
+-	httpRequest, _ := http.NewRequest("OPTIONS", "http://here.io/candy/gum", nil)
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	actual := httpWriter.Header().Get(HEADER_Allow)
+-	if "GET,DELETE" != actual {
+-		t.Fatal("expected: GET,DELETE but got:" + actual)
+-	}
+-
+-	httpRequest, _ = http.NewRequest("OPTIONS", "http://here.io/candies", nil)
+-	httpWriter = httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	actual = httpWriter.Header().Get(HEADER_Allow)
+-	if "POST" != actual {
+-		t.Fatal("expected: POST but got:" + actual)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/parameter.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/parameter.go
+deleted file mode 100644
+index 7f38a0a..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/parameter.go
++++ /dev/null
+@@ -1,95 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
 -const (
--	ErrCodeEtcdNotReachable = 501
--)
+-	// PathParameterKind = indicator of Request parameter type "path"
+-	PathParameterKind = iota
 -
--var (
--	errorMap = map[int]string{
--		ErrCodeEtcdNotReachable: "All the given peers are not reachable",
--	}
+-	// QueryParameterKind = indicator of Request parameter type "query"
+-	QueryParameterKind
+-
+-	// BodyParameterKind = indicator of Request parameter type "body"
+-	BodyParameterKind
+-
+-	// HeaderParameterKind = indicator of Request parameter type "header"
+-	HeaderParameterKind
+-
+-	// FormParameterKind = indicator of Request parameter type "form"
+-	FormParameterKind
 -)
 -
--type EtcdError struct {
--	ErrorCode int    `json:"errorCode"`
--	Message   string `json:"message"`
--	Cause     string `json:"cause,omitempty"`
--	Index     uint64 `json:"index"`
+-// Parameter is for documententing the parameter used in a Http Request
+-// ParameterData kinds are Path,Query and Body
+-type Parameter struct {
+-	data *ParameterData
 -}
 -
--func (e EtcdError) Error() string {
--	return fmt.Sprintf("%v: %v (%v) [%v]", e.ErrorCode, e.Message, e.Cause, e.Index)
+-// ParameterData represents the state of a Parameter.
+-// It is made public to make it accessible to e.g. the Swagger package.
+-type ParameterData struct {
+-	Name, Description, DataType string
+-	Kind                        int
+-	Required                    bool
+-	AllowableValues             map[string]string
+-	AllowMultiple               bool
 -}
 -
--func newError(errorCode int, cause string, index uint64) *EtcdError {
--	return &EtcdError{
--		ErrorCode: errorCode,
--		Message:   errorMap[errorCode],
--		Cause:     cause,
--		Index:     index,
--	}
+-// Data returns the state of the Parameter
+-func (p *Parameter) Data() ParameterData {
+-	return *p.data
 -}
 -
--func handleError(b []byte) error {
--	etcdErr := new(EtcdError)
+-// Kind returns the parameter type indicator (see const for valid values)
+-func (p *Parameter) Kind() int {
+-	return p.data.Kind
+-}
 -
--	err := json.Unmarshal(b, etcdErr)
--	if err != nil {
--		logger.Warningf("cannot unmarshal etcd error: %v", err)
--		return err
--	}
+-func (p *Parameter) bePath() *Parameter {
+-	p.data.Kind = PathParameterKind
+-	return p
+-}
+-func (p *Parameter) beQuery() *Parameter {
+-	p.data.Kind = QueryParameterKind
+-	return p
+-}
+-func (p *Parameter) beBody() *Parameter {
+-	p.data.Kind = BodyParameterKind
+-	return p
+-}
 -
--	return etcdErr
+-func (p *Parameter) beHeader() *Parameter {
+-	p.data.Kind = HeaderParameterKind
+-	return p
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get.go
-deleted file mode 100644
-index 976bf07..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get.go
-+++ /dev/null
-@@ -1,27 +0,0 @@
--package etcd
 -
--// Get gets the file or directory associated with the given key.
--// If the key points to a directory, files and directories under
--// it will be returned in sorted or unsorted order, depending on
--// the sort flag.
--// If recursive is set to false, contents under child directories
--// will not be returned.
--// If recursive is set to true, all the contents will be returned.
--func (c *Client) Get(key string, sort, recursive bool) (*Response, error) {
--	raw, err := c.RawGet(key, sort, recursive)
+-func (p *Parameter) beForm() *Parameter {
+-	p.data.Kind = FormParameterKind
+-	return p
+-}
 -
--	if err != nil {
--		return nil, err
--	}
+-// Required sets the required field and return the receiver
+-func (p *Parameter) Required(required bool) *Parameter {
+-	p.data.Required = required
+-	return p
+-}
 -
--	return raw.Unmarshal()
+-// AllowMultiple sets the allowMultiple field and return the receiver
+-func (p *Parameter) AllowMultiple(multiple bool) *Parameter {
+-	p.data.AllowMultiple = multiple
+-	return p
 -}
 -
--func (c *Client) RawGet(key string, sort, recursive bool) (*RawResponse, error) {
--	ops := Options{
--		"recursive": recursive,
--		"sorted":    sort,
--	}
+-// AllowableValues sets the allowableValues field and return the receiver
+-func (p *Parameter) AllowableValues(values map[string]string) *Parameter {
+-	p.data.AllowableValues = values
+-	return p
+-}
 -
--	return c.get(key, ops)
+-// DataType sets the dataType field and return the receiver
+-func (p *Parameter) DataType(typeName string) *Parameter {
+-	p.data.DataType = typeName
+-	return p
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get_test.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression.go
 deleted file mode 100644
-index 279c4e2..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/get_test.go
+index 8749cb5..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/path_expression.go
 +++ /dev/null
-@@ -1,131 +0,0 @@
--package etcd
+@@ -1,56 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
 -import (
--	"reflect"
--	"testing"
+-	"bytes"
+-	"regexp"
+-	"strings"
 -)
 -
--// cleanNode scrubs Expiration, ModifiedIndex and CreatedIndex of a node.
--func cleanNode(n *Node) {
--	n.Expiration = nil
--	n.ModifiedIndex = 0
--	n.CreatedIndex = 0
--}
--
--// cleanResult scrubs a result object two levels deep of Expiration,
--// ModifiedIndex and CreatedIndex.
--func cleanResult(result *Response) {
--	//  TODO(philips): make this recursive.
--	cleanNode(result.Node)
--	for i, _ := range result.Node.Nodes {
--		cleanNode(result.Node.Nodes[i])
--		for j, _ := range result.Node.Nodes[i].Nodes {
--			cleanNode(result.Node.Nodes[i].Nodes[j])
--		}
--	}
+-// PathExpression holds a compiled path expression (RegExp) needed to match against
+-// Http request paths and to extract path parameter values.
+-type pathExpression struct {
+-	LiteralCount int // the number of literal characters (means those not resulting from template variable substitution)
+-	VarCount     int // the number of named parameters (enclosed by {}) in the path
+-	Matcher      *regexp.Regexp
+-	Source       string // Path as defined by the RouteBuilder
+-	tokens       []string
 -}
 -
--func TestGet(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--	}()
--
--	c.Set("foo", "bar", 5)
--
--	result, err := c.Get("foo", false, false)
--
+-// NewPathExpression creates a PathExpression from the input URL path.
+-// Returns an error if the path is invalid.
+-func newPathExpression(path string) (*pathExpression, error) {
+-	expression, literalCount, varCount, tokens := templateToRegularExpression(path)
+-	compiled, err := regexp.Compile(expression)
 -	if err != nil {
--		t.Fatal(err)
--	}
--
--	if result.Node.Key != "/foo" || result.Node.Value != "bar" {
--		t.Fatalf("Get failed with %s %s %v", result.Node.Key, result.Node.Value, result.Node.TTL)
+-		return nil, err
 -	}
+-	return &pathExpression{literalCount, varCount, compiled, expression, tokens}, nil
+-}
 -
--	result, err = c.Get("goo", false, false)
--	if err == nil {
--		t.Fatalf("should not be able to get non-exist key")
+-// http://jsr311.java.net/nonav/releases/1.1/spec/spec3.html#x3-370003.7.3
+-func templateToRegularExpression(template string) (expression string, literalCount int, varCount int, tokens []string) {
+-	var buffer bytes.Buffer
+-	buffer.WriteString("^")
+-	//tokens = strings.Split(template, "/")
+-	tokens = tokenizePath(template)
+-	for _, each := range tokens {
+-		if each == "" {
+-			continue
+-		}
+-		buffer.WriteString("/")
+-		if strings.HasPrefix(each, "{") {
+-			// ignore var spec
+-			varCount += 1
+-			buffer.WriteString("([^/]+?)")
+-		} else {
+-			literalCount += len(each)
+-			encoded := each // TODO URI encode
+-			buffer.WriteString(regexp.QuoteMeta(encoded))
+-		}
 -	}
+-	return strings.TrimRight(buffer.String(), "/") + "(/.*)?$", literalCount, varCount, tokens
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/request.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/request.go
+deleted file mode 100644
+index 00a069f..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/request.go
++++ /dev/null
+@@ -1,135 +0,0 @@
+-package restful
 -
--func TestGetAll(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("fooDir", true)
--	}()
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--	c.CreateDir("fooDir", 5)
--	c.Set("fooDir/k0", "v0", 5)
--	c.Set("fooDir/k1", "v1", 5)
+-import (
+-	"bytes"
+-	"encoding/json"
+-	"encoding/xml"
+-	"io"
+-	"io/ioutil"
+-	"net/http"
+-	"strings"
+-)
 -
--	// Return kv-pairs in sorted order
--	result, err := c.Get("fooDir", true, false)
+-var defaultRequestContentType string
 -
--	if err != nil {
--		t.Fatal(err)
--	}
+-var doCacheReadEntityBytes = true
 -
--	expected := Nodes{
--		&Node{
--			Key:   "/fooDir/k0",
--			Value: "v0",
--			TTL:   5,
--		},
--		&Node{
--			Key:   "/fooDir/k1",
--			Value: "v1",
--			TTL:   5,
--		},
--	}
+-// Request is a wrapper for a http Request that provides convenience methods
+-type Request struct {
+-	Request           *http.Request
+-	bodyContent       *[]byte // to cache the request body for multiple reads of ReadEntity
+-	pathParameters    map[string]string
+-	attributes        map[string]interface{} // for storing request-scoped values
+-	selectedRoutePath string                 // root path + route path that matched the request, e.g. /meetings/{id}/attendees
+-}
 -
--	cleanResult(result)
+-func NewRequest(httpRequest *http.Request) *Request {
+-	return &Request{
+-		Request:        httpRequest,
+-		pathParameters: map[string]string{},
+-		attributes:     map[string]interface{}{},
+-	} // empty parameters, attributes
+-}
 -
--	if !reflect.DeepEqual(result.Node.Nodes, expected) {
--		t.Fatalf("(actual) %v != (expected) %v", result.Node.Nodes, expected)
--	}
+-// If ContentType is missing or */* is given then fall back to this type, otherwise
+-// a "Unable to unmarshal content of type:" response is returned.
+-// Valid values are restful.MIME_JSON and restful.MIME_XML
+-// Example:
+-// 	restful.DefaultRequestContentType(restful.MIME_JSON)
+-func DefaultRequestContentType(mime string) {
+-	defaultRequestContentType = mime
+-}
 -
--	// Test the `recursive` option
--	c.CreateDir("fooDir/childDir", 5)
--	c.Set("fooDir/childDir/k2", "v2", 5)
+-// SetCacheReadEntity controls whether the response data ([]byte) is cached such that ReadEntity is repeatable.
+-// Default is true (due to backwardcompatibility). For better performance, you should set it to false if you don't need it.
+-func SetCacheReadEntity(doCache bool) {
+-	doCacheReadEntityBytes = doCache
+-}
 -
--	// Return kv-pairs in sorted order
--	result, err = c.Get("fooDir", true, true)
+-// PathParameter accesses the Path parameter value by its name
+-func (r *Request) PathParameter(name string) string {
+-	return r.pathParameters[name]
+-}
 -
--	cleanResult(result)
+-// PathParameters accesses the Path parameter values
+-func (r *Request) PathParameters() map[string]string {
+-	return r.pathParameters
+-}
+-
+-// QueryParameter returns the (first) Query parameter value by its name
+-func (r *Request) QueryParameter(name string) string {
+-	return r.Request.FormValue(name)
+-}
 -
+-// BodyParameter parses the body of the request (once for typically a POST or a PUT) and returns the value of the given name or an error.
+-func (r *Request) BodyParameter(name string) (string, error) {
+-	err := r.Request.ParseForm()
 -	if err != nil {
--		t.Fatal(err)
+-		return "", err
 -	}
--
--	expected = Nodes{
--		&Node{
--			Key: "/fooDir/childDir",
--			Dir: true,
--			Nodes: Nodes{
--				&Node{
--					Key:   "/fooDir/childDir/k2",
--					Value: "v2",
--					TTL:   5,
--				},
--			},
--			TTL: 5,
--		},
--		&Node{
--			Key:   "/fooDir/k0",
--			Value: "v0",
--			TTL:   5,
--		},
--		&Node{
--			Key:   "/fooDir/k1",
--			Value: "v1",
--			TTL:   5,
--		},
+-	return r.Request.PostFormValue(name), nil
+-}
+-
+-// HeaderParameter returns the HTTP Header value of a Header name or empty if missing
+-func (r *Request) HeaderParameter(name string) string {
+-	return r.Request.Header.Get(name)
+-}
+-
+-// ReadEntity checks the Accept header and reads the content into the entityPointer
+-// May be called multiple times in the request-response flow
+-func (r *Request) ReadEntity(entityPointer interface{}) (err error) {
+-	contentType := r.Request.Header.Get(HEADER_ContentType)
+-	if doCacheReadEntityBytes {
+-		return r.cachingReadEntity(contentType, entityPointer)
 -	}
+-	// unmarshall directly from request Body
+-	return r.decodeEntity(r.Request.Body, contentType, entityPointer)
+-}
 -
--	cleanResult(result)
+-func (r *Request) cachingReadEntity(contentType string, entityPointer interface{}) (err error) {
+-	var buffer []byte
+-	if r.bodyContent != nil {
+-		buffer = *r.bodyContent
+-	} else {
+-		buffer, err = ioutil.ReadAll(r.Request.Body)
+-		if err != nil {
+-			return err
+-		}
+-		r.bodyContent = &buffer
+-	}
+-	return r.decodeEntity(bytes.NewReader(buffer), contentType, entityPointer)
+-}
 -
--	if !reflect.DeepEqual(result.Node.Nodes, expected) {
--		t.Fatalf("(actual) %v != (expected) %v", result.Node.Nodes, expected)
+-func (r *Request) decodeEntity(reader io.Reader, contentType string, entityPointer interface{}) (err error) {
+-	if strings.Contains(contentType, MIME_XML) {
+-		return xml.NewDecoder(reader).Decode(entityPointer)
+-	}
+-	if strings.Contains(contentType, MIME_JSON) || MIME_JSON == defaultRequestContentType {
+-		decoder := json.NewDecoder(reader)
+-		decoder.UseNumber()
+-		return decoder.Decode(entityPointer)
 -	}
+-	if MIME_XML == defaultRequestContentType {
+-		return xml.NewDecoder(reader).Decode(entityPointer)
+-	}
+-	return NewError(400, "Unable to unmarshal content of type:"+contentType)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/options.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/options.go
+-
+-// SetAttribute adds or replaces the attribute with the given value.
+-func (r *Request) SetAttribute(name string, value interface{}) {
+-	r.attributes[name] = value
+-}
+-
+-// Attribute returns the value associated to the given name. Returns nil if absent.
+-func (r Request) Attribute(name string) interface{} {
+-	return r.attributes[name]
+-}
+-
+-// SelectedRoutePath root path + route path that matched the request, e.g. /meetings/{id}/attendees
+-func (r Request) SelectedRoutePath() string {
+-	return r.selectedRoutePath
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go
 deleted file mode 100644
-index 701c9b3..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/options.go
+index 6e7c55b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/request_test.go
 +++ /dev/null
-@@ -1,72 +0,0 @@
--package etcd
+@@ -1,204 +0,0 @@
+-package restful
 -
 -import (
--	"fmt"
+-	"encoding/json"
+-	"net/http"
 -	"net/url"
--	"reflect"
+-	"strconv"
+-	"strings"
+-	"testing"
 -)
 -
--type Options map[string]interface{}
+-func TestQueryParameter(t *testing.T) {
+-	hreq := http.Request{Method: "GET"}
+-	hreq.URL, _ = url.Parse("http://www.google.com/search?q=foo&q=bar")
+-	rreq := Request{Request: &hreq}
+-	if rreq.QueryParameter("q") != "foo" {
+-		t.Errorf("q!=foo %#v", rreq)
+-	}
+-}
 -
--// An internally-used data structure that represents a mapping
--// between valid options and their kinds
--type validOptions map[string]reflect.Kind
+-type Anything map[string]interface{}
 -
--// Valid options for GET, PUT, POST, DELETE
--// Using CAPITALIZED_UNDERSCORE to emphasize that these
--// values are meant to be used as constants.
--var (
--	VALID_GET_OPTIONS = validOptions{
--		"recursive":  reflect.Bool,
--		"consistent": reflect.Bool,
--		"sorted":     reflect.Bool,
--		"wait":       reflect.Bool,
--		"waitIndex":  reflect.Uint64,
+-type Number struct {
+-	ValueFloat float64
+-	ValueInt   int64
+-}
+-
+-type Sample struct {
+-	Value string
+-}
+-
+-func TestReadEntityXml(t *testing.T) {
+-	SetCacheReadEntity(true)
+-	bodyReader := strings.NewReader("<Sample><Value>42</Value></Sample>")
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/xml")
+-	request := &Request{Request: httpRequest}
+-	sam := new(Sample)
+-	request.ReadEntity(sam)
+-	if sam.Value != "42" {
+-		t.Fatal("read failed")
+-	}
+-	if request.bodyContent == nil {
+-		t.Fatal("no expected cached bytes found")
 -	}
+-}
 -
--	VALID_PUT_OPTIONS = validOptions{
--		"prevValue": reflect.String,
--		"prevIndex": reflect.Uint64,
--		"prevExist": reflect.Bool,
--		"dir":       reflect.Bool,
+-func TestReadEntityXmlNonCached(t *testing.T) {
+-	SetCacheReadEntity(false)
+-	bodyReader := strings.NewReader("<Sample><Value>42</Value></Sample>")
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/xml")
+-	request := &Request{Request: httpRequest}
+-	sam := new(Sample)
+-	request.ReadEntity(sam)
+-	if sam.Value != "42" {
+-		t.Fatal("read failed")
 -	}
+-	if request.bodyContent != nil {
+-		t.Fatal("unexpected cached bytes found")
+-	}
+-}
 -
--	VALID_POST_OPTIONS = validOptions{}
+-func TestReadEntityJson(t *testing.T) {
+-	bodyReader := strings.NewReader(`{"Value" : "42"}`)
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/json")
+-	request := &Request{Request: httpRequest}
+-	sam := new(Sample)
+-	request.ReadEntity(sam)
+-	if sam.Value != "42" {
+-		t.Fatal("read failed")
+-	}
+-}
 -
--	VALID_DELETE_OPTIONS = validOptions{
--		"recursive": reflect.Bool,
--		"dir":       reflect.Bool,
--		"prevValue": reflect.String,
--		"prevIndex": reflect.Uint64,
+-func TestReadEntityJsonCharset(t *testing.T) {
+-	bodyReader := strings.NewReader(`{"Value" : "42"}`)
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/json; charset=UTF-8")
+-	request := NewRequest(httpRequest)
+-	sam := new(Sample)
+-	request.ReadEntity(sam)
+-	if sam.Value != "42" {
+-		t.Fatal("read failed")
 -	}
--)
+-}
 -
--// Convert options to a string of HTML parameters
--func (ops Options) toParameters(validOps validOptions) (string, error) {
--	p := "?"
--	values := url.Values{}
+-func TestReadEntityJsonNumber(t *testing.T) {
+-	SetCacheReadEntity(true)
+-	bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`)
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/json")
+-	request := &Request{Request: httpRequest}
+-	any := make(Anything)
+-	request.ReadEntity(&any)
+-	number, ok := any["Value"].(json.Number)
+-	if !ok {
+-		t.Fatal("read failed")
+-	}
+-	vint, err := number.Int64()
+-	if err != nil {
+-		t.Fatal("convert failed")
+-	}
+-	if vint != 4899710515899924123 {
+-		t.Fatal("read failed")
+-	}
+-	vfloat, err := number.Float64()
+-	if err != nil {
+-		t.Fatal("convert failed")
+-	}
+-	// match the default behaviour
+-	vstring := strconv.FormatFloat(vfloat, 'e', 15, 64)
+-	if vstring != "4.899710515899924e+18" {
+-		t.Fatal("convert float64 failed")
+-	}
+-}
 -
--	if ops == nil {
--		return "", nil
+-func TestReadEntityJsonNumberNonCached(t *testing.T) {
+-	SetCacheReadEntity(false)
+-	bodyReader := strings.NewReader(`{"Value" : 4899710515899924123}`)
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/json")
+-	request := &Request{Request: httpRequest}
+-	any := make(Anything)
+-	request.ReadEntity(&any)
+-	number, ok := any["Value"].(json.Number)
+-	if !ok {
+-		t.Fatal("read failed")
 -	}
+-	vint, err := number.Int64()
+-	if err != nil {
+-		t.Fatal("convert failed")
+-	}
+-	if vint != 4899710515899924123 {
+-		t.Fatal("read failed")
+-	}
+-	vfloat, err := number.Float64()
+-	if err != nil {
+-		t.Fatal("convert failed")
+-	}
+-	// match the default behaviour
+-	vstring := strconv.FormatFloat(vfloat, 'e', 15, 64)
+-	if vstring != "4.899710515899924e+18" {
+-		t.Fatal("convert float64 failed")
+-	}
+-}
 -
--	for k, v := range ops {
--		// Check if the given option is valid (that it exists)
--		kind := validOps[k]
--		if kind == reflect.Invalid {
--			return "", fmt.Errorf("Invalid option: %v", k)
--		}
+-func TestReadEntityJsonLong(t *testing.T) {
+-	bodyReader := strings.NewReader(`{"ValueFloat" : 4899710515899924123, "ValueInt": 4899710515899924123}`)
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/json")
+-	request := &Request{Request: httpRequest}
+-	number := new(Number)
+-	request.ReadEntity(&number)
+-	if number.ValueInt != 4899710515899924123 {
+-		t.Fatal("read failed")
+-	}
+-	// match the default behaviour
+-	vstring := strconv.FormatFloat(number.ValueFloat, 'e', 15, 64)
+-	if vstring != "4.899710515899924e+18" {
+-		t.Fatal("convert float64 failed")
+-	}
+-}
 -
--		// Check if the given option is of the valid type
--		t := reflect.TypeOf(v)
--		if kind != t.Kind() {
--			return "", fmt.Errorf("Option %s should be of %v kind, not of %v kind.",
--				k, kind, t.Kind())
--		}
+-func TestBodyParameter(t *testing.T) {
+-	bodyReader := strings.NewReader(`value1=42&value2=43`)
+-	httpRequest, _ := http.NewRequest("POST", "/test?value1=44", bodyReader) // POST and PUT body parameters take precedence over URL query string
+-	httpRequest.Header.Set("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
+-	request := NewRequest(httpRequest)
+-	v1, err := request.BodyParameter("value1")
+-	if err != nil {
+-		t.Error(err)
+-	}
+-	v2, err := request.BodyParameter("value2")
+-	if err != nil {
+-		t.Error(err)
+-	}
+-	if v1 != "42" || v2 != "43" {
+-		t.Fatal("read failed")
+-	}
+-}
 -
--		values.Set(k, fmt.Sprintf("%v", v))
+-func TestReadEntityUnkown(t *testing.T) {
+-	bodyReader := strings.NewReader("?")
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	httpRequest.Header.Set("Content-Type", "application/rubbish")
+-	request := NewRequest(httpRequest)
+-	sam := new(Sample)
+-	err := request.ReadEntity(sam)
+-	if err == nil {
+-		t.Fatal("read should be in error")
 -	}
+-}
 -
--	p += values.Encode()
--	return p, nil
+-func TestSetAttribute(t *testing.T) {
+-	bodyReader := strings.NewReader("?")
+-	httpRequest, _ := http.NewRequest("GET", "/test", bodyReader)
+-	request := NewRequest(httpRequest)
+-	request.SetAttribute("go", "there")
+-	there := request.Attribute("go")
+-	if there != "there" {
+-		t.Fatalf("missing request attribute:%v", there)
+-	}
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/requests.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/requests.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/response.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/response.go
 deleted file mode 100644
-index 5d8b45a..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/requests.go
+index 2b6d762..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/response.go
 +++ /dev/null
-@@ -1,377 +0,0 @@
--package etcd
+@@ -1,233 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
 -import (
--	"errors"
--	"fmt"
--	"io/ioutil"
--	"math/rand"
+-	"encoding/json"
+-	"encoding/xml"
 -	"net/http"
--	"net/url"
--	"path"
 -	"strings"
--	"sync"
--	"time"
 -)
 -
--// Errors introduced by handling requests
--var (
--	ErrRequestCancelled = errors.New("sending request is cancelled")
--)
+-// DEPRECATED, use DefaultResponseContentType(mime)
+-var DefaultResponseMimeType string
 -
--type RawRequest struct {
--	Method       string
--	RelativePath string
--	Values       url.Values
--	Cancel       <-chan bool
+-//PrettyPrintResponses controls the indentation feature of XML and JSON
+-//serialization in the response methods WriteEntity, WriteAsJson, and
+-//WriteAsXml.
+-var PrettyPrintResponses = true
+-
+-// Response is a wrapper on the actual http ResponseWriter
+-// It provides several convenience methods to prepare and write response content.
+-type Response struct {
+-	http.ResponseWriter
+-	requestAccept string   // mime-type what the Http Request says it wants to receive
+-	routeProduces []string // mime-types what the Route says it can produce
+-	statusCode    int      // HTTP status code that has been written explicity (if zero then net/http has written 200)
+-	contentLength int      // number of bytes written for the response body
 -}
 -
--// NewRawRequest returns a new RawRequest
--func NewRawRequest(method, relativePath string, values url.Values, cancel <-chan bool) *RawRequest {
--	return &RawRequest{
--		Method:       method,
--		RelativePath: relativePath,
--		Values:       values,
--		Cancel:       cancel,
+-// Creates a new response based on a http ResponseWriter.
+-func NewResponse(httpWriter http.ResponseWriter) *Response {
+-	return &Response{httpWriter, "", []string{}, http.StatusOK, 0} // empty content-types
+-}
+-
+-// If Accept header matching fails, fall back to this type, otherwise
+-// a "406: Not Acceptable" response is returned.
+-// Valid values are restful.MIME_JSON and restful.MIME_XML
+-// Example:
+-// 	restful.DefaultResponseContentType(restful.MIME_JSON)
+-func DefaultResponseContentType(mime string) {
+-	DefaultResponseMimeType = mime
+-}
+-
+-// InternalServerError writes the StatusInternalServerError header.
+-// DEPRECATED, use WriteErrorString(http.StatusInternalServerError,reason)
+-func (r Response) InternalServerError() Response {
+-	r.WriteHeader(http.StatusInternalServerError)
+-	return r
+-}
+-
+-// AddHeader is a shortcut for .Header().Add(header,value)
+-func (r Response) AddHeader(header string, value string) Response {
+-	r.Header().Add(header, value)
+-	return r
+-}
+-
+-// SetRequestAccepts tells the response what Mime-type(s) the HTTP request said it wants to accept. Exposed for testing.
+-func (r *Response) SetRequestAccepts(mime string) {
+-	r.requestAccept = mime
+-}
+-
+-// WriteEntity marshals the value using the representation denoted by the Accept Header (XML or JSON)
+-// If no Accept header is specified (or */*) then return the Content-Type as specified by the first in the Route.Produces.
+-// If an Accept header is specified then return the Content-Type as specified by the first in the Route.Produces that is matched with the Accept header.
+-// If the value is nil then nothing is written. You may want to call WriteHeader(http.StatusNotFound) instead.
+-// Current implementation ignores any q-parameters in the Accept Header.
+-func (r *Response) WriteEntity(value interface{}) error {
+-	if value == nil { // do not write a nil representation
+-		return nil
+-	}
+-	for _, qualifiedMime := range strings.Split(r.requestAccept, ",") {
+-		mime := strings.Trim(strings.Split(qualifiedMime, ";")[0], " ")
+-		if 0 == len(mime) || mime == "*/*" {
+-			for _, each := range r.routeProduces {
+-				if MIME_JSON == each {
+-					return r.WriteAsJson(value)
+-				}
+-				if MIME_XML == each {
+-					return r.WriteAsXml(value)
+-				}
+-			}
+-		} else { // mime is not blank; see if we have a match in Produces
+-			for _, each := range r.routeProduces {
+-				if mime == each {
+-					if MIME_JSON == each {
+-						return r.WriteAsJson(value)
+-					}
+-					if MIME_XML == each {
+-						return r.WriteAsXml(value)
+-					}
+-				}
+-			}
+-		}
+-	}
+-	if DefaultResponseMimeType == MIME_JSON {
+-		return r.WriteAsJson(value)
+-	} else if DefaultResponseMimeType == MIME_XML {
+-		return r.WriteAsXml(value)
+-	} else {
+-		if trace {
+-			traceLogger.Printf("mismatch in mime-types and no defaults; (http)Accept=%v,(route)Produces=%v\n", r.requestAccept, r.routeProduces)
+-		}
+-		r.WriteHeader(http.StatusNotAcceptable) // for recording only
+-		r.ResponseWriter.WriteHeader(http.StatusNotAcceptable)
+-		if _, err := r.Write([]byte("406: Not Acceptable")); err != nil {
+-			return err
+-		}
 -	}
+-	return nil
 -}
 -
--// getCancelable issues a cancelable GET request
--func (c *Client) getCancelable(key string, options Options,
--	cancel <-chan bool) (*RawResponse, error) {
--	logger.Debugf("get %s [%s]", key, c.cluster.Leader)
--	p := keyToPath(key)
+-// WriteAsXml is a convenience method for writing a value in xml (requires Xml tags on the value)
+-func (r *Response) WriteAsXml(value interface{}) error {
+-	var output []byte
+-	var err error
 -
--	// If consistency level is set to STRONG, append
--	// the `consistent` query string.
--	if c.config.Consistency == STRONG_CONSISTENCY {
--		options["consistent"] = true
+-	if value == nil { // do not write a nil representation
+-		return nil
+-	}
+-	if PrettyPrintResponses {
+-		output, err = xml.MarshalIndent(value, " ", " ")
+-	} else {
+-		output, err = xml.Marshal(value)
 -	}
 -
--	str, err := options.toParameters(VALID_GET_OPTIONS)
 -	if err != nil {
--		return nil, err
+-		return r.WriteError(http.StatusInternalServerError, err)
 -	}
--	p += str
+-	r.Header().Set(HEADER_ContentType, MIME_XML)
+-	if r.statusCode > 0 { // a WriteHeader was intercepted
+-		r.ResponseWriter.WriteHeader(r.statusCode)
+-	}
+-	_, err = r.Write([]byte(xml.Header))
+-	if err != nil {
+-		return err
+-	}
+-	if _, err = r.Write(output); err != nil {
+-		return err
+-	}
+-	return nil
+-}
 -
--	req := NewRawRequest("GET", p, nil, cancel)
--	resp, err := c.SendRequest(req)
+-// WriteAsJson is a convenience method for writing a value in json
+-func (r *Response) WriteAsJson(value interface{}) error {
+-	var output []byte
+-	var err error
+-
+-	if value == nil { // do not write a nil representation
+-		return nil
+-	}
+-	if PrettyPrintResponses {
+-		output, err = json.MarshalIndent(value, " ", " ")
+-	} else {
+-		output, err = json.Marshal(value)
+-	}
 -
 -	if err != nil {
--		return nil, err
+-		return r.WriteErrorString(http.StatusInternalServerError, err.Error())
 -	}
+-	r.Header().Set(HEADER_ContentType, MIME_JSON)
+-	if r.statusCode > 0 { // a WriteHeader was intercepted
+-		r.ResponseWriter.WriteHeader(r.statusCode)
+-	}
+-	if _, err = r.Write(output); err != nil {
+-		return err
+-	}
+-	return nil
+-}
 -
--	return resp, nil
+-// WriteError write the http status and the error string on the response.
+-func (r *Response) WriteError(httpStatus int, err error) error {
+-	return r.WriteErrorString(httpStatus, err.Error())
 -}
 -
--// get issues a GET request
--func (c *Client) get(key string, options Options) (*RawResponse, error) {
--	return c.getCancelable(key, options, nil)
+-// WriteServiceError is a convenience method for a responding with a ServiceError and a status
+-func (r *Response) WriteServiceError(httpStatus int, err ServiceError) error {
+-	r.WriteHeader(httpStatus) // for recording only
+-	return r.WriteEntity(err)
 -}
 -
--// put issues a PUT request
--func (c *Client) put(key string, value string, ttl uint64,
--	options Options) (*RawResponse, error) {
+-// WriteErrorString is a convenience method for an error status with the actual error
+-func (r *Response) WriteErrorString(status int, errorReason string) error {
+-	r.statusCode = status // for recording only
+-	r.ResponseWriter.WriteHeader(status)
+-	if _, err := r.Write([]byte(errorReason)); err != nil {
+-		return err
+-	}
+-	return nil
+-}
 -
--	logger.Debugf("put %s, %s, ttl: %d, [%s]", key, value, ttl, c.cluster.Leader)
--	p := keyToPath(key)
+-// WriteHeader is overridden to remember the Status Code that has been written.
+-// Note that using this method, the status value is only written when
+-// - calling WriteEntity
+-// - or directly WriteAsXml,WriteAsJson.
+-// - or if the status is 204 (http.StatusNoContent)
+-func (r *Response) WriteHeader(httpStatus int) {
+-	r.statusCode = httpStatus
+-	// if 204 then WriteEntity will not be called so we need to pass this code
+-	if http.StatusNoContent == httpStatus {
+-		r.ResponseWriter.WriteHeader(httpStatus)
+-	}
+-}
 -
--	str, err := options.toParameters(VALID_PUT_OPTIONS)
--	if err != nil {
--		return nil, err
+-// StatusCode returns the code that has been written using WriteHeader.
+-func (r Response) StatusCode() int {
+-	if 0 == r.statusCode {
+-		// no status code has been written yet; assume OK
+-		return http.StatusOK
 -	}
--	p += str
+-	return r.statusCode
+-}
 -
--	req := NewRawRequest("PUT", p, buildValues(value, ttl), nil)
--	resp, err := c.SendRequest(req)
+-// Write writes the data to the connection as part of an HTTP reply.
+-// Write is part of http.ResponseWriter interface.
+-func (r *Response) Write(bytes []byte) (int, error) {
+-	written, err := r.ResponseWriter.Write(bytes)
+-	r.contentLength += written
+-	return written, err
+-}
 -
--	if err != nil {
--		return nil, err
--	}
+-// ContentLength returns the number of bytes written for the response content.
+-// Note that this value is only correct if all data is written through the Response using its Write* methods.
+-// Data written directly using the underlying http.ResponseWriter is not accounted for.
+-func (r Response) ContentLength() int {
+-	return r.contentLength
+-}
 -
--	return resp, nil
+-// CloseNotify is part of http.CloseNotifier interface
+-func (r Response) CloseNotify() <-chan bool {
+-	return r.ResponseWriter.(http.CloseNotifier).CloseNotify()
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go
+deleted file mode 100644
+index 314a95a..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/response_test.go
++++ /dev/null
+@@ -1,137 +0,0 @@
+-package restful
 -
--// post issues a POST request
--func (c *Client) post(key string, value string, ttl uint64) (*RawResponse, error) {
--	logger.Debugf("post %s, %s, ttl: %d, [%s]", key, value, ttl, c.cluster.Leader)
--	p := keyToPath(key)
+-import (
+-	"errors"
+-	"net/http"
+-	"net/http/httptest"
+-	"testing"
+-)
 -
--	req := NewRawRequest("POST", p, buildValues(value, ttl), nil)
--	resp, err := c.SendRequest(req)
+-func TestWriteHeader(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0}
+-	resp.WriteHeader(123)
+-	if resp.StatusCode() != 123 {
+-		t.Errorf("Unexpected status code:%d", resp.StatusCode())
+-	}
+-}
 -
--	if err != nil {
--		return nil, err
+-func TestNoWriteHeader(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0}
+-	if resp.StatusCode() != http.StatusOK {
+-		t.Errorf("Unexpected status code:%d", resp.StatusCode())
 -	}
+-}
 -
--	return resp, nil
+-type food struct {
+-	Kind string
 -}
 -
--// delete issues a DELETE request
--func (c *Client) delete(key string, options Options) (*RawResponse, error) {
--	logger.Debugf("delete %s [%s]", key, c.cluster.Leader)
--	p := keyToPath(key)
+-// go test -v -test.run TestMeasureContentLengthXml ...restful
+-func TestMeasureContentLengthXml(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0}
+-	resp.WriteAsXml(food{"apple"})
+-	if resp.ContentLength() != 76 {
+-		t.Errorf("Incorrect measured length:%d", resp.ContentLength())
+-	}
+-}
 -
--	str, err := options.toParameters(VALID_DELETE_OPTIONS)
--	if err != nil {
--		return nil, err
+-// go test -v -test.run TestMeasureContentLengthJson ...restful
+-func TestMeasureContentLengthJson(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0}
+-	resp.WriteAsJson(food{"apple"})
+-	if resp.ContentLength() != 22 {
+-		t.Errorf("Incorrect measured length:%d", resp.ContentLength())
 -	}
--	p += str
+-}
 -
--	req := NewRawRequest("DELETE", p, nil, nil)
--	resp, err := c.SendRequest(req)
+-// go test -v -test.run TestMeasureContentLengthWriteErrorString ...restful
+-func TestMeasureContentLengthWriteErrorString(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "*/*", []string{"*/*"}, 0, 0}
+-	resp.WriteErrorString(404, "Invalid")
+-	if resp.ContentLength() != len("Invalid") {
+-		t.Errorf("Incorrect measured length:%d", resp.ContentLength())
+-	}
+-}
 -
--	if err != nil {
--		return nil, err
+-// go test -v -test.run TestStatusCreatedAndContentTypeJson_Issue54 ...restful
+-func TestStatusCreatedAndContentTypeJson_Issue54(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "application/json", []string{"application/json"}, 0, 0}
+-	resp.WriteHeader(201)
+-	resp.WriteAsJson(food{"Juicy"})
+-	if httpWriter.HeaderMap.Get("Content-Type") != "application/json" {
+-		t.Errorf("Expected content type json but got:%d", httpWriter.HeaderMap.Get("Content-Type"))
+-	}
+-	if httpWriter.Code != 201 {
+-		t.Errorf("Expected status 201 but got:%d", httpWriter.Code)
 -	}
+-}
 -
--	return resp, nil
+-type errorOnWriteRecorder struct {
+-	*httptest.ResponseRecorder
 -}
 -
--// SendRequest sends a HTTP request and returns a Response as defined by etcd
--func (c *Client) SendRequest(rr *RawRequest) (*RawResponse, error) {
+-func (e errorOnWriteRecorder) Write(bytes []byte) (int, error) {
+-	return 0, errors.New("fail")
+-}
 -
--	var req *http.Request
--	var resp *http.Response
--	var httpPath string
--	var err error
--	var respBody []byte
+-// go test -v -test.run TestLastWriteErrorCaught ...restful
+-func TestLastWriteErrorCaught(t *testing.T) {
+-	httpWriter := errorOnWriteRecorder{httptest.NewRecorder()}
+-	resp := Response{httpWriter, "application/json", []string{"application/json"}, 0, 0}
+-	err := resp.WriteAsJson(food{"Juicy"})
+-	if err.Error() != "fail" {
+-		t.Errorf("Unexpected error message:%v", err)
+-	}
+-}
 -
--	var numReqs = 1
+-// go test -v -test.run TestAcceptStarStar_Issue83 ...restful
+-func TestAcceptStarStar_Issue83(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	//								Accept									Produces
+-	resp := Response{httpWriter, "application/bogus,*/*;q=0.8", []string{"application/json"}, 0, 0}
+-	resp.WriteEntity(food{"Juicy"})
+-	ct := httpWriter.Header().Get("Content-Type")
+-	if "application/json" != ct {
+-		t.Errorf("Unexpected content type:%s", ct)
+-	}
+-}
 -
--	checkRetry := c.CheckRetry
--	if checkRetry == nil {
--		checkRetry = DefaultCheckRetry
+-// go test -v -test.run TestAcceptSkipStarStar_Issue83 ...restful
+-func TestAcceptSkipStarStar_Issue83(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	//								Accept									Produces
+-	resp := Response{httpWriter, " application/xml ,*/* ; q=0.8", []string{"application/json", "application/xml"}, 0, 0}
+-	resp.WriteEntity(food{"Juicy"})
+-	ct := httpWriter.Header().Get("Content-Type")
+-	if "application/xml" != ct {
+-		t.Errorf("Unexpected content type:%s", ct)
 -	}
+-}
 -
--	cancelled := make(chan bool, 1)
--	reqLock := new(sync.Mutex)
+-// go test -v -test.run TestAcceptXmlBeforeStarStar_Issue83 ...restful
+-func TestAcceptXmlBeforeStarStar_Issue83(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	//								Accept									Produces
+-	resp := Response{httpWriter, "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", []string{"application/json"}, 0, 0}
+-	resp.WriteEntity(food{"Juicy"})
+-	ct := httpWriter.Header().Get("Content-Type")
+-	if "application/json" != ct {
+-		t.Errorf("Unexpected content type:%s", ct)
+-	}
+-}
 -
--	if rr.Cancel != nil {
--		cancelRoutine := make(chan bool)
--		defer close(cancelRoutine)
+-// go test -v -test.run TestWriteHeaderNoContent_Issue124 ...restful
+-func TestWriteHeaderNoContent_Issue124(t *testing.T) {
+-	httpWriter := httptest.NewRecorder()
+-	resp := Response{httpWriter, "text/plain", []string{"text/plain"}, 0, 0}
+-	resp.WriteHeader(http.StatusNoContent)
+-	if httpWriter.Code != http.StatusNoContent {
+-		t.Errorf("got %d want %d", httpWriter.Code, http.StatusNoContent)
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/route.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/route.go
+deleted file mode 100644
+index 59d6e23..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/route.go
++++ /dev/null
+@@ -1,166 +0,0 @@
+-package restful
 -
--		go func() {
--			select {
--			case <-rr.Cancel:
--				cancelled <- true
--				logger.Debug("send.request is cancelled")
--			case <-cancelRoutine:
--				return
--			}
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--			// Repeat canceling request until this thread is stopped
--			// because we have no idea about whether it succeeds.
--			for {
--				reqLock.Lock()
--				c.httpClient.Transport.(*http.Transport).CancelRequest(req)
--				reqLock.Unlock()
+-import (
+-	"bytes"
+-	"net/http"
+-	"strings"
+-)
 -
--				select {
--				case <-time.After(100 * time.Millisecond):
--				case <-cancelRoutine:
--					return
--				}
--			}
--		}()
+-// RouteFunction declares the signature of a function that can be bound to a Route.
+-type RouteFunction func(*Request, *Response)
+-
+-// Route binds a HTTP Method,Path,Consumes combination to a RouteFunction.
+-type Route struct {
+-	Method   string
+-	Produces []string
+-	Consumes []string
+-	Path     string // webservice root path + described path
+-	Function RouteFunction
+-	Filters  []FilterFunction
+-
+-	// cached values for dispatching
+-	relativePath string
+-	pathParts    []string
+-	pathExpr     *pathExpression // cached compilation of relativePath as RegExp
+-
+-	// documentation
+-	Doc                     string
+-	Operation               string
+-	ParameterDocs           []*Parameter
+-	ResponseErrors          map[int]ResponseError
+-	ReadSample, WriteSample interface{} // structs that model an example request or response payload
+-}
+-
+-// Initialize for Route
+-func (r *Route) postBuild() {
+-	r.pathParts = tokenizePath(r.Path)
+-}
+-
+-// Create Request and Response from their http versions
+-func (r *Route) wrapRequestResponse(httpWriter http.ResponseWriter, httpRequest *http.Request) (*Request, *Response) {
+-	params := r.extractParameters(httpRequest.URL.Path)
+-	wrappedRequest := NewRequest(httpRequest)
+-	wrappedRequest.pathParameters = params
+-	wrappedRequest.selectedRoutePath = r.Path
+-	wrappedResponse := NewResponse(httpWriter)
+-	wrappedResponse.requestAccept = httpRequest.Header.Get(HEADER_Accept)
+-	wrappedResponse.routeProduces = r.Produces
+-	return wrappedRequest, wrappedResponse
+-}
+-
+-// dispatchWithFilters call the function after passing through its own filters
+-func (r *Route) dispatchWithFilters(wrappedRequest *Request, wrappedResponse *Response) {
+-	if len(r.Filters) > 0 {
+-		chain := FilterChain{Filters: r.Filters, Target: r.Function}
+-		chain.ProcessFilter(wrappedRequest, wrappedResponse)
+-	} else {
+-		// unfiltered
+-		r.Function(wrappedRequest, wrappedResponse)
 -	}
+-}
 -
--	// If we connect to a follower and consistency is required, retry until
--	// we connect to a leader
--	sleep := 25 * time.Millisecond
--	maxSleep := time.Second
--	for attempt := 0; ; attempt++ {
--		if attempt > 0 {
--			select {
--			case <-cancelled:
--				return nil, ErrRequestCancelled
--			case <-time.After(sleep):
--				sleep = sleep * 2
--				if sleep > maxSleep {
--					sleep = maxSleep
--				}
+-// Return whether the mimeType matches to what this Route can produce.
+-func (r Route) matchesAccept(mimeTypesWithQuality string) bool {
+-	parts := strings.Split(mimeTypesWithQuality, ",")
+-	for _, each := range parts {
+-		var withoutQuality string
+-		if strings.Contains(each, ";") {
+-			withoutQuality = strings.Split(each, ";")[0]
+-		} else {
+-			withoutQuality = each
+-		}
+-		// trim before compare
+-		withoutQuality = strings.Trim(withoutQuality, " ")
+-		if withoutQuality == "*/*" {
+-			return true
+-		}
+-		for _, other := range r.Produces {
+-			if other == withoutQuality {
+-				return true
 -			}
 -		}
+-	}
+-	return false
+-}
 -
--		logger.Debug("Connecting to etcd: attempt", attempt+1, "for", rr.RelativePath)
--
--		if rr.Method == "GET" && c.config.Consistency == WEAK_CONSISTENCY {
--			// If it's a GET and consistency level is set to WEAK,
--			// then use a random machine.
--			httpPath = c.getHttpPath(true, rr.RelativePath)
+-// Return whether the mimeType matches to what this Route can consume.
+-func (r Route) matchesContentType(mimeTypes string) bool {
+-	parts := strings.Split(mimeTypes, ",")
+-	for _, each := range parts {
+-		var contentType string
+-		if strings.Contains(each, ";") {
+-			contentType = strings.Split(each, ";")[0]
 -		} else {
--			// Else use the leader.
--			httpPath = c.getHttpPath(false, rr.RelativePath)
+-			contentType = each
 -		}
--
--		// Return a cURL command if curlChan is set
--		if c.cURLch != nil {
--			command := fmt.Sprintf("curl -X %s %s", rr.Method, httpPath)
--			for key, value := range rr.Values {
--				command += fmt.Sprintf(" -d %s=%s", key, value[0])
+-		// trim before compare
+-		contentType = strings.Trim(contentType, " ")
+-		for _, other := range r.Consumes {
+-			if other == "*/*" || other == contentType {
+-				return true
 -			}
--			c.sendCURL(command)
 -		}
+-	}
+-	return false
+-}
 -
--		logger.Debug("send.request.to ", httpPath, " | method ", rr.Method)
--
--		reqLock.Lock()
--		if rr.Values == nil {
--			if req, err = http.NewRequest(rr.Method, httpPath, nil); err != nil {
--				return nil, err
--			}
+-// Extract the parameters from the request url path
+-func (r Route) extractParameters(urlPath string) map[string]string {
+-	urlParts := tokenizePath(urlPath)
+-	pathParameters := map[string]string{}
+-	for i, key := range r.pathParts {
+-		var value string
+-		if i >= len(urlParts) {
+-			value = ""
 -		} else {
--			body := strings.NewReader(rr.Values.Encode())
--			if req, err = http.NewRequest(rr.Method, httpPath, body); err != nil {
--				return nil, err
+-			value = urlParts[i]
+-		}
+-		if strings.HasPrefix(key, "{") { // path-parameter
+-			if colon := strings.Index(key, ":"); colon != -1 {
+-				// extract by regex
+-				regPart := key[colon+1 : len(key)-1]
+-				keyPart := key[1:colon]
+-				if regPart == "*" {
+-					pathParameters[keyPart] = untokenizePath(i, urlParts)
+-					break
+-				} else {
+-					pathParameters[keyPart] = value
+-				}
+-			} else {
+-				// without enclosing {}
+-				pathParameters[key[1:len(key)-1]] = value
 -			}
+-		}
+-	}
+-	return pathParameters
+-}
 -
--			req.Header.Set("Content-Type",
--				"application/x-www-form-urlencoded; param=value")
+-// Untokenize back into an URL path using the slash separator
+-func untokenizePath(offset int, parts []string) string {
+-	var buffer bytes.Buffer
+-	for p := offset; p < len(parts); p++ {
+-		buffer.WriteString(parts[p])
+-		// do not end
+-		if p < len(parts)-1 {
+-			buffer.WriteString("/")
 -		}
--		reqLock.Unlock()
+-	}
+-	return buffer.String()
+-}
 -
--		resp, err = c.httpClient.Do(req)
--		defer func() {
--			if resp != nil {
--				resp.Body.Close()
--			}
--		}()
+-// Tokenize an URL path using the slash separator ; the result does not have empty tokens
+-func tokenizePath(path string) []string {
+-	if "/" == path {
+-		return []string{}
+-	}
+-	return strings.Split(strings.Trim(path, "/"), "/")
+-}
 -
--		// If the request was cancelled, return ErrRequestCancelled directly
--		select {
--		case <-cancelled:
--			return nil, ErrRequestCancelled
--		default:
--		}
+-// for debugging
+-func (r Route) String() string {
+-	return r.Method + " " + r.Path
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder.go
+deleted file mode 100644
+index 0046afb..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder.go
++++ /dev/null
+@@ -1,208 +0,0 @@
+-package restful
 -
--		numReqs++
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--		// network error, change a machine!
--		if err != nil {
--			logger.Debug("network error:", err.Error())
--			lastResp := http.Response{}
--			if checkErr := checkRetry(c.cluster, numReqs, lastResp, err); checkErr != nil {
--				return nil, checkErr
--			}
+-import (
+-	"log"
+-	"reflect"
+-	"strings"
+-)
 -
--			c.cluster.switchLeader(attempt % len(c.cluster.Machines))
--			continue
+-// RouteBuilder is a helper to construct Routes.
+-type RouteBuilder struct {
+-	rootPath    string
+-	currentPath string
+-	produces    []string
+-	consumes    []string
+-	httpMethod  string        // required
+-	function    RouteFunction // required
+-	filters     []FilterFunction
+-	// documentation
+-	doc                     string
+-	operation               string
+-	readSample, writeSample interface{}
+-	parameters              []*Parameter
+-	errorMap                map[int]ResponseError
+-}
+-
+-// Do evaluates each argument with the RouteBuilder itself.
+-// This allows you to follow DRY principles without breaking the fluent programming style.
+-// Example:
+-// 		ws.Route(ws.DELETE("/{name}").To(t.deletePerson).Do(Returns200, Returns500))
+-//
+-//		func Returns500(b *RouteBuilder) {
+-//			b.Returns(500, "Internal Server Error", restful.ServiceError{})
+-//		}
+-func (b *RouteBuilder) Do(oneArgBlocks ...func(*RouteBuilder)) *RouteBuilder {
+-	for _, each := range oneArgBlocks {
+-		each(b)
+-	}
+-	return b
+-}
+-
+-// To bind the route to a function.
+-// If this route is matched with the incoming Http Request then call this function with the *Request,*Response pair. Required.
+-func (b *RouteBuilder) To(function RouteFunction) *RouteBuilder {
+-	b.function = function
+-	return b
+-}
+-
+-// Method specifies what HTTP method to match. Required.
+-func (b *RouteBuilder) Method(method string) *RouteBuilder {
+-	b.httpMethod = method
+-	return b
+-}
+-
+-// Produces specifies what MIME types can be produced ; the matched one will appear in the Content-Type Http header.
+-func (b *RouteBuilder) Produces(mimeTypes ...string) *RouteBuilder {
+-	b.produces = mimeTypes
+-	return b
+-}
+-
+-// Consumes specifies what MIME types can be consumes ; the Accept Http header must matched any of these
+-func (b *RouteBuilder) Consumes(mimeTypes ...string) *RouteBuilder {
+-	b.consumes = mimeTypes
+-	return b
+-}
+-
+-// Path specifies the relative (w.r.t WebService root path) URL path to match. Default is "/".
+-func (b *RouteBuilder) Path(subPath string) *RouteBuilder {
+-	b.currentPath = subPath
+-	return b
+-}
+-
+-// Doc tells what this route is all about. Optional.
+-func (b *RouteBuilder) Doc(documentation string) *RouteBuilder {
+-	b.doc = documentation
+-	return b
+-}
+-
+-// Reads tells what resource type will be read from the request payload. Optional.
+-// A parameter of type "body" is added ,required is set to true and the dataType is set to the qualified name of the sample's type.
+-func (b *RouteBuilder) Reads(sample interface{}) *RouteBuilder {
+-	b.readSample = sample
+-	typeAsName := reflect.TypeOf(sample).String()
+-	bodyParameter := &Parameter{&ParameterData{Name: typeAsName}}
+-	bodyParameter.beBody()
+-	bodyParameter.Required(true)
+-	bodyParameter.DataType(typeAsName)
+-	b.Param(bodyParameter)
+-	return b
+-}
+-
+-// ParameterNamed returns a Parameter already known to the RouteBuilder. Returns nil if not.
+-// Use this to modify or extend information for the Parameter (through its Data()).
+-func (b RouteBuilder) ParameterNamed(name string) (p *Parameter) {
+-	for _, each := range b.parameters {
+-		if each.Data().Name == name {
+-			return each
 -		}
+-	}
+-	return p
+-}
+-
+-// Writes tells what resource type will be written as the response payload. Optional.
+-func (b *RouteBuilder) Writes(sample interface{}) *RouteBuilder {
+-	b.writeSample = sample
+-	return b
+-}
+-
+-// Param allows you to document the parameters of the Route. It adds a new Parameter (does not check for duplicates).
+-func (b *RouteBuilder) Param(parameter *Parameter) *RouteBuilder {
+-	if b.parameters == nil {
+-		b.parameters = []*Parameter{}
+-	}
+-	b.parameters = append(b.parameters, parameter)
+-	return b
+-}
+-
+-// Operation allows you to document what the acutal method/function call is of the Route.
+-func (b *RouteBuilder) Operation(name string) *RouteBuilder {
+-	b.operation = name
+-	return b
+-}
+-
+-// ReturnsError is deprecated, use Returns instead.
+-func (b *RouteBuilder) ReturnsError(code int, message string, model interface{}) *RouteBuilder {
+-	log.Println("ReturnsError is deprecated, use Returns instead.")
+-	return b.Returns(code, message, model)
+-}
+-
+-// Returns allows you to document what responses (errors or regular) can be expected.
+-// The model parameter is optional ; either pass a struct instance or use nil if not applicable.
+-func (b *RouteBuilder) Returns(code int, message string, model interface{}) *RouteBuilder {
+-	err := ResponseError{
+-		Code:    code,
+-		Message: message,
+-		Model:   model,
+-	}
+-	// lazy init because there is no NewRouteBuilder (yet)
+-	if b.errorMap == nil {
+-		b.errorMap = map[int]ResponseError{}
+-	}
+-	b.errorMap[code] = err
+-	return b
+-}
+-
+-type ResponseError struct {
+-	Code    int
+-	Message string
+-	Model   interface{}
+-}
+-
+-func (b *RouteBuilder) servicePath(path string) *RouteBuilder {
+-	b.rootPath = path
+-	return b
+-}
+-
+-// Filter appends a FilterFunction to the end of filters for this Route to build.
+-func (b *RouteBuilder) Filter(filter FilterFunction) *RouteBuilder {
+-	b.filters = append(b.filters, filter)
+-	return b
+-}
+-
+-// If no specific Route path then set to rootPath
+-// If no specific Produces then set to rootProduces
+-// If no specific Consumes then set to rootConsumes
+-func (b *RouteBuilder) copyDefaults(rootProduces, rootConsumes []string) {
+-	if len(b.produces) == 0 {
+-		b.produces = rootProduces
+-	}
+-	if len(b.consumes) == 0 {
+-		b.consumes = rootConsumes
+-	}
+-}
+-
+-// Build creates a new Route using the specification details collected by the RouteBuilder
+-func (b *RouteBuilder) Build() Route {
+-	pathExpr, err := newPathExpression(b.currentPath)
+-	if err != nil {
+-		log.Fatalf("[restful] Invalid path:%s because:%v", b.currentPath, err)
+-	}
+-	if b.function == nil {
+-		log.Fatalf("[restful] No function specified for route:" + b.currentPath)
+-	}
+-	route := Route{
+-		Method:         b.httpMethod,
+-		Path:           concatPath(b.rootPath, b.currentPath),
+-		Produces:       b.produces,
+-		Consumes:       b.consumes,
+-		Function:       b.function,
+-		Filters:        b.filters,
+-		relativePath:   b.currentPath,
+-		pathExpr:       pathExpr,
+-		Doc:            b.doc,
+-		Operation:      b.operation,
+-		ParameterDocs:  b.parameters,
+-		ResponseErrors: b.errorMap,
+-		ReadSample:     b.readSample,
+-		WriteSample:    b.writeSample}
+-	route.postBuild()
+-	return route
+-}
 -
--		// if there is no error, it should receive response
--		logger.Debug("recv.response.from", httpPath)
+-func concatPath(path1, path2 string) string {
+-	return strings.TrimRight(path1, "/") + "/" + strings.TrimLeft(path2, "/")
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go
+deleted file mode 100644
+index 42ec689..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_builder_test.go
++++ /dev/null
+@@ -1,55 +0,0 @@
+-package restful
 -
--		if validHttpStatusCode[resp.StatusCode] {
--			// try to read byte code and break the loop
--			respBody, err = ioutil.ReadAll(resp.Body)
--			if err == nil {
--				logger.Debug("recv.success.", httpPath)
--				break
--			}
--			// ReadAll error may be caused due to cancel request
--			select {
--			case <-cancelled:
--				return nil, ErrRequestCancelled
--			default:
--			}
--		}
+-import (
+-	"testing"
+-)
 -
--		// if resp is TemporaryRedirect, set the new leader and retry
--		if resp.StatusCode == http.StatusTemporaryRedirect {
--			u, err := resp.Location()
+-func TestRouteBuilder_PathParameter(t *testing.T) {
+-	p := &Parameter{&ParameterData{Name: "name", Description: "desc"}}
+-	p.AllowMultiple(true)
+-	p.DataType("int")
+-	p.Required(true)
+-	values := map[string]string{"a": "b"}
+-	p.AllowableValues(values)
+-	p.bePath()
 -
--			if err != nil {
--				logger.Warning(err)
--			} else {
--				// Update cluster leader based on redirect location
--				// because it should point to the leader address
--				c.cluster.updateLeaderFromURL(u)
--				logger.Debug("recv.response.relocate", u.String())
--			}
--			resp.Body.Close()
--			continue
--		}
+-	b := new(RouteBuilder)
+-	b.function = dummy
+-	b.Param(p)
+-	r := b.Build()
+-	if !r.ParameterDocs[0].Data().AllowMultiple {
+-		t.Error("AllowMultiple invalid")
+-	}
+-	if r.ParameterDocs[0].Data().DataType != "int" {
+-		t.Error("dataType invalid")
+-	}
+-	if !r.ParameterDocs[0].Data().Required {
+-		t.Error("required invalid")
+-	}
+-	if r.ParameterDocs[0].Data().Kind != PathParameterKind {
+-		t.Error("kind invalid")
+-	}
+-	if r.ParameterDocs[0].Data().AllowableValues["a"] != "b" {
+-		t.Error("allowableValues invalid")
+-	}
+-	if b.ParameterNamed("name") == nil {
+-		t.Error("access to parameter failed")
+-	}
+-}
 -
--		if checkErr := checkRetry(c.cluster, numReqs, *resp,
--			errors.New("Unexpected HTTP status code")); checkErr != nil {
--			return nil, checkErr
--		}
--		resp.Body.Close()
+-func TestRouteBuilder(t *testing.T) {
+-	json := "application/json"
+-	b := new(RouteBuilder)
+-	b.To(dummy)
+-	b.Path("/routes").Method("HEAD").Consumes(json).Produces(json)
+-	r := b.Build()
+-	if r.Path != "/routes" {
+-		t.Error("path invalid")
+-	}
+-	if r.Produces[0] != json {
+-		t.Error("produces invalid")
+-	}
+-	if r.Consumes[0] != json {
+-		t.Error("consumes invalid")
 -	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go
+deleted file mode 100644
+index a416576..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/route_test.go
++++ /dev/null
+@@ -1,108 +0,0 @@
+-package restful
 -
--	r := &RawResponse{
--		StatusCode: resp.StatusCode,
--		Body:       respBody,
--		Header:     resp.Header,
+-import (
+-	"testing"
+-)
+-
+-// accept should match produces
+-func TestMatchesAcceptStar(t *testing.T) {
+-	r := Route{Produces: []string{"application/xml"}}
+-	if !r.matchesAccept("*/*") {
+-		t.Errorf("accept should match star")
 -	}
+-}
 -
--	return r, nil
+-// accept should match produces
+-func TestMatchesAcceptIE(t *testing.T) {
+-	r := Route{Produces: []string{"application/xml"}}
+-	if !r.matchesAccept("text/html, application/xhtml+xml, */*") {
+-		t.Errorf("accept should match star")
+-	}
 -}
 -
--// DefaultCheckRetry defines the retrying behaviour for bad HTTP requests
--// If we have retried 2 * machine number, stop retrying.
--// If status code is InternalServerError, sleep for 200ms.
--func DefaultCheckRetry(cluster *Cluster, numReqs int, lastResp http.Response,
--	err error) error {
+-// accept should match produces
+-func TestMatchesAcceptXml(t *testing.T) {
+-	r := Route{Produces: []string{"application/xml"}}
+-	if r.matchesAccept("application/json") {
+-		t.Errorf("accept should not match json")
+-	}
+-	if !r.matchesAccept("application/xml") {
+-		t.Errorf("accept should match xml")
+-	}
+-}
 -
--	if numReqs >= 2*len(cluster.Machines) {
--		return newError(ErrCodeEtcdNotReachable,
--			"Tried to connect to each peer twice and failed", 0)
+-// content type should match consumes
+-func TestMatchesContentTypeXml(t *testing.T) {
+-	r := Route{Consumes: []string{"application/xml"}}
+-	if r.matchesContentType("application/json") {
+-		t.Errorf("accept should not match json")
+-	}
+-	if !r.matchesContentType("application/xml") {
+-		t.Errorf("accept should match xml")
 -	}
+-}
 -
--	code := lastResp.StatusCode
--	if code == http.StatusInternalServerError {
--		time.Sleep(time.Millisecond * 200)
+-// content type should match consumes
+-func TestMatchesContentTypeCharsetInformation(t *testing.T) {
+-	r := Route{Consumes: []string{"application/json"}}
+-	if !r.matchesContentType("application/json; charset=UTF-8") {
+-		t.Errorf("matchesContentType should ignore charset information")
+-	}
+-}
 -
+-func TestMatchesPath_OneParam(t *testing.T) {
+-	params := doExtractParams("/from/{source}", 2, "/from/here", t)
+-	if params["source"] != "here" {
+-		t.Errorf("parameter mismatch here")
 -	}
+-}
 -
--	logger.Warning("bad response status code", code)
--	return nil
+-func TestMatchesPath_Slash(t *testing.T) {
+-	params := doExtractParams("/", 0, "/", t)
+-	if len(params) != 0 {
+-		t.Errorf("expected empty parameters")
+-	}
 -}
 -
--func (c *Client) getHttpPath(random bool, s ...string) string {
--	var machine string
--	if random {
--		machine = c.cluster.Machines[rand.Intn(len(c.cluster.Machines))]
--	} else {
--		machine = c.cluster.Leader
+-func TestMatchesPath_SlashNonVar(t *testing.T) {
+-	params := doExtractParams("/any", 1, "/any", t)
+-	if len(params) != 0 {
+-		t.Errorf("expected empty parameters")
 -	}
+-}
 -
--	fullPath := machine + "/" + version
--	for _, seg := range s {
--		fullPath = fullPath + "/" + seg
+-func TestMatchesPath_TwoVars(t *testing.T) {
+-	params := doExtractParams("/from/{source}/to/{destination}", 4, "/from/AMS/to/NY", t)
+-	if params["source"] != "AMS" {
+-		t.Errorf("parameter mismatch AMS")
 -	}
+-}
 -
--	return fullPath
+-func TestMatchesPath_VarOnFront(t *testing.T) {
+-	params := doExtractParams("{what}/from/{source}/", 3, "who/from/SOS/", t)
+-	if params["source"] != "SOS" {
+-		t.Errorf("parameter mismatch SOS")
+-	}
 -}
 -
--// buildValues builds a url.Values map according to the given value and ttl
--func buildValues(value string, ttl uint64) url.Values {
--	v := url.Values{}
+-func TestExtractParameters_EmptyValue(t *testing.T) {
+-	params := doExtractParams("/fixed/{var}", 2, "/fixed/", t)
+-	if params["var"] != "" {
+-		t.Errorf("parameter mismatch var")
+-	}
+-}
 -
--	if value != "" {
--		v.Set("value", value)
+-func TestTokenizePath(t *testing.T) {
+-	if len(tokenizePath("/")) != 0 {
+-		t.Errorf("not empty path tokens")
 -	}
+-}
 -
--	if ttl > 0 {
--		v.Set("ttl", fmt.Sprintf("%v", ttl))
+-func doExtractParams(routePath string, size int, urlPath string, t *testing.T) map[string]string {
+-	r := Route{Path: routePath}
+-	r.postBuild()
+-	if len(r.pathParts) != size {
+-		t.Fatalf("len not %v %v, but %v", size, r.pathParts, len(r.pathParts))
 -	}
+-	return r.extractParameters(urlPath)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/router.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/router.go
+deleted file mode 100644
+index 9b32fb6..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/router.go
++++ /dev/null
+@@ -1,18 +0,0 @@
+-package restful
 -
--	return v
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
+-
+-import "net/http"
+-
+-// A RouteSelector finds the best matching Route given the input HTTP Request
+-type RouteSelector interface {
+-
+-	// SelectRoute finds a Route given the input HTTP Request and a list of WebServices.
+-	// It returns a selected Route and its containing WebService or an error indicating
+-	// a problem.
+-	SelectRoute(
+-		webServices []*WebService,
+-		httpRequest *http.Request) (selectedService *WebService, selected *Route, err error)
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/service_error.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/service_error.go
+deleted file mode 100644
+index 62d1108..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/service_error.go
++++ /dev/null
+@@ -1,23 +0,0 @@
+-package restful
 -
--// convert key string to http path exclude version
--// for example: key[foo] -> path[keys/foo]
--// key[/] -> path[keys/]
--func keyToPath(key string) string {
--	p := path.Join("keys", key)
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--	// corner case: if key is "/" or "//" ect
--	// path join will clear the tailing "/"
--	// we need to add it back
--	if p == "keys" {
--		p = "keys/"
--	}
+-import "fmt"
 -
--	return p
+-// ServiceError is a transport object to pass information about a non-Http error occurred in a WebService while processing a request.
+-type ServiceError struct {
+-	Code    int
+-	Message string
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/response.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/response.go
+-
+-// NewError returns a ServiceError using the code and reason
+-func NewError(code int, message string) ServiceError {
+-	return ServiceError{Code: code, Message: message}
+-}
+-
+-// Error returns a text representation of the service error
+-func (s ServiceError) Error() string {
+-	return fmt.Sprintf("[ServiceError:%v] %v", s.Code, s.Message)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/CHANGES.md b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/CHANGES.md
 deleted file mode 100644
-index 1fe9b4e..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/response.go
+index cae91f3..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/CHANGES.md
 +++ /dev/null
-@@ -1,89 +0,0 @@
--package etcd
+@@ -1,19 +0,0 @@
+-Change history of swagger
+-=
+-2014-05-29
+-- (api add) Ability to define custom http.Handler to serve swagger-ui static files
+-
+-2014-05-04
+-- (fix) include model for array element type of response
+-
+-2014-01-03
+-- (fix) do not add primitive type to the Api models
+-
+-2013-11-27
+-- (fix) make Swagger work for WebServices with root ("/" or "") paths
+-
+-2013-10-29
+-- (api add) package variable LogInfo to customize logging function
+-
+-2013-10-15
+-- upgraded to spec version 1.2 (https://github.com/wordnik/swagger-core/wiki/1.2-transition)
+\ No newline at end of file
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/README.md b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/README.md
+deleted file mode 100644
+index d4f4fc4..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/README.md
++++ /dev/null
+@@ -1,28 +0,0 @@
+-How to use Swagger UI with go-restful
+-=
+-
+-Get the Swagger UI sources (version 1.2 only)
+-
+-	git clone https://github.com/wordnik/swagger-ui.git
+-	
+-The project contains a "dist" folder.
+-Its contents has all the Swagger UI files you need.
+-
+-The `index.html` has an `url` set to `http://petstore.swagger.wordnik.com/api/api-docs`.
+-You need to change that to match your WebService JSON endpoint  e.g. `http://localhost:8080/apidocs.json`
+-
+-Now, you can install the Swagger WebService for serving the Swagger specification in JSON.
+-
+-	config := swagger.Config{
+-		WebServices:    restful.RegisteredWebServices(),
+-		WebServicesUrl: "http://localhost:8080",
+-		ApiPath:        "/apidocs.json",
+-		SwaggerPath:     "/apidocs/",
+-		SwaggerFilePath: "/Users/emicklei/Projects/swagger-ui/dist"}
+-	swagger.InstallSwaggerService(config)		
+-	
+-	
+-Notes
+---
+-- Use RouteBuilder.Operation(..) to set the Nickname field of the API spec
+-- The WebServices field of swagger.Config can be used to control which service you want to expose and document ; you can have multiple configs and therefore multiple endpoints.
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/config.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/config.go
+deleted file mode 100644
+index 4fca0fa..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/config.go
++++ /dev/null
+@@ -1,25 +0,0 @@
+-package swagger
 -
 -import (
--	"encoding/json"
 -	"net/http"
--	"strconv"
--	"time"
+-
+-	"github.com/emicklei/go-restful"
 -)
 -
--const (
--	rawResponse = iota
--	normalResponse
+-type Config struct {
+-	// url where the services are available, e.g. http://localhost:8080
+-	// if left empty then the basePath of Swagger is taken from the actual request
+-	WebServicesUrl string
+-	// path where the JSON api is avaiable , e.g. /apidocs
+-	ApiPath string
+-	// [optional] path where the swagger UI will be served, e.g. /swagger
+-	SwaggerPath string
+-	// [optional] location of folder containing Swagger HTML5 application index.html
+-	SwaggerFilePath string
+-	// api listing is constructed from this list of restful WebServices.
+-	WebServices []*restful.WebService
+-	// will serve all static content (scripts,pages,images)
+-	StaticHandler http.Handler
+-	// [optional] on default CORS (Cross-Origin-Resource-Sharing) is enabled.
+-	DisableCORS bool
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder.go
+deleted file mode 100644
+index 71a69e4..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder.go
++++ /dev/null
+@@ -1,265 +0,0 @@
+-package swagger
+-
+-import (
+-	"encoding/json"
+-	"reflect"
+-	"strings"
 -)
 -
--type responseType int
+-type modelBuilder struct {
+-	Models map[string]Model
+-}
 -
--type RawResponse struct {
--	StatusCode int
--	Body       []byte
--	Header     http.Header
+-func (b modelBuilder) addModel(st reflect.Type, nameOverride string) {
+-	modelName := b.keyFrom(st)
+-	if nameOverride != "" {
+-		modelName = nameOverride
+-	}
+-	// no models needed for primitive types
+-	if b.isPrimitiveType(modelName) {
+-		return
+-	}
+-	// see if we already have visited this model
+-	if _, ok := b.Models[modelName]; ok {
+-		return
+-	}
+-	sm := Model{
+-		Id:         modelName,
+-		Required:   []string{},
+-		Properties: map[string]ModelProperty{}}
+-
+-	// reference the model before further initializing (enables recursive structs)
+-	b.Models[modelName] = sm
+-
+-	// check for slice or array
+-	if st.Kind() == reflect.Slice || st.Kind() == reflect.Array {
+-		b.addModel(st.Elem(), "")
+-		return
+-	}
+-	// check for structure or primitive type
+-	if st.Kind() != reflect.Struct {
+-		return
+-	}
+-	for i := 0; i < st.NumField(); i++ {
+-		field := st.Field(i)
+-		jsonName, prop := b.buildProperty(field, &sm, modelName)
+-		// add if not ommitted
+-		if len(jsonName) != 0 {
+-			// update Required
+-			if b.isPropertyRequired(field) {
+-				sm.Required = append(sm.Required, jsonName)
+-			}
+-			sm.Properties[jsonName] = prop
+-		}
+-	}
+-
+-	// update model builder with completed model
+-	b.Models[modelName] = sm
 -}
 -
--var (
--	validHttpStatusCode = map[int]bool{
--		http.StatusCreated:            true,
--		http.StatusOK:                 true,
--		http.StatusBadRequest:         true,
--		http.StatusNotFound:           true,
--		http.StatusPreconditionFailed: true,
--		http.StatusForbidden:          true,
+-func (b modelBuilder) isPropertyRequired(field reflect.StructField) bool {
+-	required := true
+-	if jsonTag := field.Tag.Get("json"); jsonTag != "" {
+-		s := strings.Split(jsonTag, ",")
+-		if len(s) > 1 && s[1] == "omitempty" {
+-			return false
+-		}
 -	}
--)
+-	return required
+-}
 -
--// Unmarshal parses RawResponse and stores the result in Response
--func (rr *RawResponse) Unmarshal() (*Response, error) {
--	if rr.StatusCode != http.StatusOK && rr.StatusCode != http.StatusCreated {
--		return nil, handleError(rr.Body)
+-func (b modelBuilder) buildProperty(field reflect.StructField, model *Model, modelName string) (jsonName string, prop ModelProperty) {
+-	jsonName = b.jsonNameOfField(field)
+-	if len(jsonName) == 0 {
+-		// empty name signals skip property
+-		return "", prop
 -	}
+-	fieldType := field.Type
+-	fieldKind := fieldType.Kind()
 -
--	resp := new(Response)
+-	if jsonTag := field.Tag.Get("json"); jsonTag != "" {
+-		s := strings.Split(jsonTag, ",")
+-		if len(s) > 1 && s[1] == "string" {
+-			prop.Description = "(" + fieldType.String() + " as string)"
+-			fieldType = reflect.TypeOf("")
+-		}
+-	}
 -
--	err := json.Unmarshal(rr.Body, resp)
+-	var pType = b.jsonSchemaType(fieldType.String()) // may include pkg path
+-	prop.Type = &pType
+-	if b.isPrimitiveType(fieldType.String()) {
+-		prop.Format = b.jsonSchemaFormat(fieldType.String())
+-		return jsonName, prop
+-	}
 -
--	if err != nil {
--		return nil, err
+-	marshalerType := reflect.TypeOf((*json.Marshaler)(nil)).Elem()
+-	if fieldType.Implements(marshalerType) {
+-		var pType = "string"
+-		prop.Type = &pType
+-		return jsonName, prop
 -	}
 -
--	// attach index and term to response
--	resp.EtcdIndex, _ = strconv.ParseUint(rr.Header.Get("X-Etcd-Index"), 10, 64)
--	resp.RaftIndex, _ = strconv.ParseUint(rr.Header.Get("X-Raft-Index"), 10, 64)
--	resp.RaftTerm, _ = strconv.ParseUint(rr.Header.Get("X-Raft-Term"), 10, 64)
+-	if fieldKind == reflect.Struct {
+-		return b.buildStructTypeProperty(field, jsonName, model)
+-	}
 -
--	return resp, nil
+-	if fieldKind == reflect.Slice || fieldKind == reflect.Array {
+-		return b.buildArrayTypeProperty(field, jsonName, modelName)
+-	}
+-
+-	if fieldKind == reflect.Ptr {
+-		return b.buildPointerTypeProperty(field, jsonName, modelName)
+-	}
+-
+-	if fieldType.Name() == "" { // override type of anonymous structs
+-		nestedTypeName := modelName + "." + jsonName
+-		var pType = nestedTypeName
+-		prop.Type = &pType
+-		b.addModel(fieldType, nestedTypeName)
+-	}
+-	return jsonName, prop
 -}
 -
--type Response struct {
--	Action    string `json:"action"`
--	Node      *Node  `json:"node"`
--	PrevNode  *Node  `json:"prevNode,omitempty"`
--	EtcdIndex uint64 `json:"etcdIndex"`
--	RaftIndex uint64 `json:"raftIndex"`
--	RaftTerm  uint64 `json:"raftTerm"`
+-func (b modelBuilder) buildStructTypeProperty(field reflect.StructField, jsonName string, model *Model) (nameJson string, prop ModelProperty) {
+-	fieldType := field.Type
+-	// check for anonymous
+-	if len(fieldType.Name()) == 0 {
+-		// anonymous
+-		anonType := model.Id + "." + jsonName
+-		b.addModel(fieldType, anonType)
+-		prop.Type = &anonType
+-		return jsonName, prop
+-	}
+-	if field.Name == fieldType.Name() && field.Anonymous {
+-		// embedded struct
+-		sub := modelBuilder{map[string]Model{}}
+-		sub.addModel(fieldType, "")
+-		subKey := sub.keyFrom(fieldType)
+-		// merge properties from sub
+-		subModel := sub.Models[subKey]
+-		for k, v := range subModel.Properties {
+-			model.Properties[k] = v
+-			model.Required = append(model.Required, k)
+-		}
+-		// empty name signals skip property
+-		return "", prop
+-	}
+-	// simple struct
+-	b.addModel(fieldType, "")
+-	var pType = fieldType.String()
+-	prop.Type = &pType
+-	return jsonName, prop
 -}
 -
--type Node struct {
--	Key           string     `json:"key, omitempty"`
--	Value         string     `json:"value,omitempty"`
--	Dir           bool       `json:"dir,omitempty"`
--	Expiration    *time.Time `json:"expiration,omitempty"`
--	TTL           int64      `json:"ttl,omitempty"`
--	Nodes         Nodes      `json:"nodes,omitempty"`
--	ModifiedIndex uint64     `json:"modifiedIndex,omitempty"`
--	CreatedIndex  uint64     `json:"createdIndex,omitempty"`
+-func (b modelBuilder) buildArrayTypeProperty(field reflect.StructField, jsonName, modelName string) (nameJson string, prop ModelProperty) {
+-	fieldType := field.Type
+-	var pType = "array"
+-	prop.Type = &pType
+-	elemName := b.getElementTypeName(modelName, jsonName, fieldType.Elem())
+-	prop.Items = []Item{Item{Ref: &elemName}}
+-	// add|overwrite model for element type
+-	b.addModel(fieldType.Elem(), elemName)
+-	return jsonName, prop
 -}
 -
--type Nodes []*Node
+-func (b modelBuilder) buildPointerTypeProperty(field reflect.StructField, jsonName, modelName string) (nameJson string, prop ModelProperty) {
+-	fieldType := field.Type
 -
--// interfaces for sorting
--func (ns Nodes) Len() int {
--	return len(ns)
+-	// override type of pointer to list-likes
+-	if fieldType.Elem().Kind() == reflect.Slice || fieldType.Elem().Kind() == reflect.Array {
+-		var pType = "array"
+-		prop.Type = &pType
+-		elemName := b.getElementTypeName(modelName, jsonName, fieldType.Elem().Elem())
+-		prop.Items = []Item{Item{Ref: &elemName}}
+-		// add|overwrite model for element type
+-		b.addModel(fieldType.Elem().Elem(), elemName)
+-	} else {
+-		// non-array, pointer type
+-		var pType = fieldType.String()[1:] // no star, include pkg path
+-		prop.Type = &pType
+-		elemName := ""
+-		if fieldType.Elem().Name() == "" {
+-			elemName = modelName + "." + jsonName
+-			prop.Type = &elemName
+-		}
+-		b.addModel(fieldType.Elem(), elemName)
+-	}
+-	return jsonName, prop
 -}
 -
--func (ns Nodes) Less(i, j int) bool {
--	return ns[i].Key < ns[j].Key
+-func (b modelBuilder) getElementTypeName(modelName, jsonName string, t reflect.Type) string {
+-	if t.Name() == "" {
+-		return modelName + "." + jsonName
+-	}
+-	if b.isPrimitiveType(t.Name()) {
+-		return b.jsonSchemaType(t.Name())
+-	}
+-	return b.keyFrom(t)
 -}
 -
--func (ns Nodes) Swap(i, j int) {
--	ns[i], ns[j] = ns[j], ns[i]
+-func (b modelBuilder) keyFrom(st reflect.Type) string {
+-	key := st.String()
+-	if len(st.Name()) == 0 { // unnamed type
+-		// Swagger UI has special meaning for [
+-		key = strings.Replace(key, "[]", "||", -1)
+-	}
+-	return key
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go
+-
+-func (b modelBuilder) isPrimitiveType(modelName string) bool {
+-	return strings.Contains("uint8 int int32 int64 float32 float64 bool string byte time.Time", modelName)
+-}
+-
+-// jsonNameOfField returns the name of the field as it should appear in JSON format
+-// An empty string indicates that this field is not part of the JSON representation
+-func (b modelBuilder) jsonNameOfField(field reflect.StructField) string {
+-	if jsonTag := field.Tag.Get("json"); jsonTag != "" {
+-		s := strings.Split(jsonTag, ",")
+-		if s[0] == "-" {
+-			// empty name signals skip property
+-			return ""
+-		} else if s[0] != "" {
+-			return s[0]
+-		}
+-	}
+-	return field.Name
+-}
+-
+-func (b modelBuilder) jsonSchemaType(modelName string) string {
+-	schemaMap := map[string]string{
+-		"uint8":     "integer",
+-		"int":       "integer",
+-		"int32":     "integer",
+-		"int64":     "integer",
+-		"byte":      "string",
+-		"float64":   "number",
+-		"float32":   "number",
+-		"bool":      "boolean",
+-		"time.Time": "string",
+-	}
+-	mapped, ok := schemaMap[modelName]
+-	if ok {
+-		return mapped
+-	} else {
+-		return modelName // use as is (custom or struct)
+-	}
+-}
+-
+-func (b modelBuilder) jsonSchemaFormat(modelName string) string {
+-	schemaMap := map[string]string{
+-		"int":       "int32",
+-		"int32":     "int32",
+-		"int64":     "int64",
+-		"byte":      "byte",
+-		"uint8":     "byte",
+-		"float64":   "double",
+-		"float32":   "float",
+-		"time.Time": "date-time",
+-	}
+-	mapped, ok := schemaMap[modelName]
+-	if ok {
+-		return mapped
+-	} else {
+-		return "" // no format
+-	}
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go
 deleted file mode 100644
-index 756e317..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_curl_chan_test.go
+index 8dc8073..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/model_builder_test.go
 +++ /dev/null
-@@ -1,42 +0,0 @@
--package etcd
+@@ -1,716 +0,0 @@
+-package swagger
 -
 -import (
--	"fmt"
 -	"testing"
+-	"time"
 -)
 -
--func TestSetCurlChan(t *testing.T) {
--	c := NewClient(nil)
--	c.OpenCURL()
+-type YesNo bool
 -
--	defer func() {
--		c.Delete("foo", true)
--	}()
+-func (y YesNo) MarshalJSON() ([]byte, error) {
+-	if y {
+-		return []byte("yes"), nil
+-	}
+-	return []byte("no"), nil
+-}
 -
--	_, err := c.Set("foo", "bar", 5)
--	if err != nil {
--		t.Fatal(err)
+-// clear && go test -v -test.run TestCustomMarshaller_Issue96 ...swagger
+-func TestCustomMarshaller_Issue96(t *testing.T) {
+-	type Vote struct {
+-		What YesNo
 -	}
+-	testJsonFromStruct(t, Vote{}, `{
+-  "swagger.Vote": {
+-   "id": "swagger.Vote",
+-   "required": [
+-    "What"
+-   ],
+-   "properties": {
+-    "What": {
+-     "type": "string"
+-    }
+-   }
+-  }
+- }`)
+-}
 -
--	expected := fmt.Sprintf("curl -X PUT %s/v2/keys/foo -d value=bar -d ttl=5",
--		c.cluster.Leader)
--	actual := c.RecvCURL()
--	if expected != actual {
--		t.Fatalf(`Command "%s" is not equal to expected value "%s"`,
--			actual, expected)
+-// clear && go test -v -test.run TestPrimitiveTypes ...swagger
+-func TestPrimitiveTypes(t *testing.T) {
+-	type Prims struct {
+-		f float64
+-		t time.Time
 -	}
+-	testJsonFromStruct(t, Prims{}, `{
+-  "swagger.Prims": {
+-   "id": "swagger.Prims",
+-   "required": [
+-    "f",
+-    "t"
+-   ],
+-   "properties": {
+-    "f": {
+-     "type": "number",
+-     "format": "double"
+-    },
+-    "t": {
+-     "type": "string",
+-     "format": "date-time"
+-    }
+-   }
+-  }
+- }`)
+-}
 -
--	c.SetConsistency(STRONG_CONSISTENCY)
--	_, err = c.Get("foo", false, false)
--	if err != nil {
--		t.Fatal(err)
+-// clear && go test -v -test.run TestS1 ...swagger
+-func TestS1(t *testing.T) {
+-	type S1 struct {
+-		Id string
 -	}
+-	testJsonFromStruct(t, S1{}, `{
+-  "swagger.S1": {
+-   "id": "swagger.S1",
+-   "required": [
+-    "Id"
+-   ],
+-   "properties": {
+-    "Id": {
+-     "type": "string"
+-    }
+-   }
+-  }
+- }`)
+-}
 -
--	expected = fmt.Sprintf("curl -X GET %s/v2/keys/foo?consistent=true&recursive=false&sorted=false",
--		c.cluster.Leader)
--	actual = c.RecvCURL()
--	if expected != actual {
--		t.Fatalf(`Command "%s" is not equal to expected value "%s"`,
--			actual, expected)
+-// clear && go test -v -test.run TestS2 ...swagger
+-func TestS2(t *testing.T) {
+-	type S2 struct {
+-		Ids []string
 -	}
+-	testJsonFromStruct(t, S2{}, `{
+-  "swagger.S2": {
+-   "id": "swagger.S2",
+-   "required": [
+-    "Ids"
+-   ],
+-   "properties": {
+-    "Ids": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "string"
+-      }
+-     ]
+-    }
+-   }
+-  }
+- }`)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create.go
-deleted file mode 100644
-index cb0d567..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create.go
-+++ /dev/null
-@@ -1,137 +0,0 @@
--package etcd
 -
--// Set sets the given key to the given value.
--// It will create a new key value pair or replace the old one.
--// It will not replace a existing directory.
--func (c *Client) Set(key string, value string, ttl uint64) (*Response, error) {
--	raw, err := c.RawSet(key, value, ttl)
+-// clear && go test -v -test.run TestS3 ...swagger
+-func TestS3(t *testing.T) {
+-	type NestedS3 struct {
+-		Id string
+-	}
+-	type S3 struct {
+-		Nested NestedS3
+-	}
+-	testJsonFromStruct(t, S3{}, `{
+-  "swagger.NestedS3": {
+-   "id": "swagger.NestedS3",
+-   "required": [
+-    "Id"
+-   ],
+-   "properties": {
+-    "Id": {
+-     "type": "string"
+-    }
+-   }
+-  },
+-  "swagger.S3": {
+-   "id": "swagger.S3",
+-   "required": [
+-    "Nested"
+-   ],
+-   "properties": {
+-    "Nested": {
+-     "type": "swagger.NestedS3"
+-    }
+-   }
+-  }
+- }`)
+-}
 -
--	if err != nil {
--		return nil, err
+-type sample struct {
+-	id       string `swagger:"required"` // TODO
+-	items    []item
+-	rootItem item `json:"root"`
+-}
+-
+-type item struct {
+-	itemName string `json:"name"`
+-}
+-
+-// clear && go test -v -test.run TestSampleToModelAsJson ...swagger
+-func TestSampleToModelAsJson(t *testing.T) {
+-	testJsonFromStruct(t, sample{items: []item{}}, `{
+-  "swagger.item": {
+-   "id": "swagger.item",
+-   "required": [
+-    "name"
+-   ],
+-   "properties": {
+-    "name": {
+-     "type": "string"
+-    }
+-   }
+-  },
+-  "swagger.sample": {
+-   "id": "swagger.sample",
+-   "required": [
+-    "id",
+-    "items",
+-    "root"
+-   ],
+-   "properties": {
+-    "id": {
+-     "type": "string"
+-    },
+-    "items": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "swagger.item"
+-      }
+-     ]
+-    },
+-    "root": {
+-     "type": "swagger.item"
+-    }
+-   }
+-  }
+- }`)
+-}
+-
+-func TestJsonTags(t *testing.T) {
+-	type X struct {
+-		A string
+-		B string `json:"-"`
+-		C int    `json:",string"`
+-		D int    `json:","`
 -	}
 -
--	return raw.Unmarshal()
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "A",
+-    "C",
+-    "D"
+-   ],
+-   "properties": {
+-    "A": {
+-     "type": "string"
+-    },
+-    "C": {
+-     "type": "string",
+-     "description": "(int as string)"
+-    },
+-    "D": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`
+-
+-	testJsonFromStruct(t, X{}, expected)
 -}
 -
--// Set sets the given key to a directory.
--// It will create a new directory or replace the old key value pair by a directory.
--// It will not replace a existing directory.
--func (c *Client) SetDir(key string, ttl uint64) (*Response, error) {
--	raw, err := c.RawSetDir(key, ttl)
+-func TestJsonTagOmitempty(t *testing.T) {
+-	type X struct {
+-		A int `json:",omitempty"`
+-		B int `json:"C,omitempty"`
+-	}
 -
--	if err != nil {
--		return nil, err
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "properties": {
+-    "A": {
+-     "type": "integer",
+-     "format": "int32"
+-    },
+-    "C": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`
+-
+-	testJsonFromStruct(t, X{}, expected)
+-}
+-
+-func TestJsonTagName(t *testing.T) {
+-	type X struct {
+-		A string `json:"B"`
 -	}
 -
--	return raw.Unmarshal()
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "string"
+-    }
+-   }
+-  }
+- }`
+-
+-	testJsonFromStruct(t, X{}, expected)
+-}
+-
+-func TestAnonymousStruct(t *testing.T) {
+-	type X struct {
+-		A struct {
+-			B int
+-		}
+-	}
+-
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "A"
+-   ],
+-   "properties": {
+-    "A": {
+-     "type": "swagger.X.A"
+-    }
+-   }
+-  },
+-  "swagger.X.A": {
+-   "id": "swagger.X.A",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`
+-
+-	testJsonFromStruct(t, X{}, expected)
+-}
+-
+-func TestAnonymousPtrStruct(t *testing.T) {
+-	type X struct {
+-		A *struct {
+-			B int
+-		}
+-	}
+-
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "A"
+-   ],
+-   "properties": {
+-    "A": {
+-     "type": "swagger.X.A"
+-    }
+-   }
+-  },
+-  "swagger.X.A": {
+-   "id": "swagger.X.A",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`
+-
+-	testJsonFromStruct(t, X{}, expected)
 -}
 -
--// CreateDir creates a directory. It succeeds only if
--// the given key does not yet exist.
--func (c *Client) CreateDir(key string, ttl uint64) (*Response, error) {
--	raw, err := c.RawCreateDir(key, ttl)
+-func TestAnonymousArrayStruct(t *testing.T) {
+-	type X struct {
+-		A []struct {
+-			B int
+-		}
+-	}
+-
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "A"
+-   ],
+-   "properties": {
+-    "A": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "swagger.X.A"
+-      }
+-     ]
+-    }
+-   }
+-  },
+-  "swagger.X.A": {
+-   "id": "swagger.X.A",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`
+-
+-	testJsonFromStruct(t, X{}, expected)
+-}
 -
--	if err != nil {
--		return nil, err
+-func TestAnonymousPtrArrayStruct(t *testing.T) {
+-	type X struct {
+-		A *[]struct {
+-			B int
+-		}
 -	}
 -
--	return raw.Unmarshal()
--}
+-	expected := `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "A"
+-   ],
+-   "properties": {
+-    "A": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "swagger.X.A"
+-      }
+-     ]
+-    }
+-   }
+-  },
+-  "swagger.X.A": {
+-   "id": "swagger.X.A",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`
 -
--// UpdateDir updates the given directory. It succeeds only if the
--// given key already exists.
--func (c *Client) UpdateDir(key string, ttl uint64) (*Response, error) {
--	raw, err := c.RawUpdateDir(key, ttl)
+-	testJsonFromStruct(t, X{}, expected)
+-}
 -
--	if err != nil {
--		return nil, err
+-// go test -v -test.run TestEmbeddedStruct_Issue98 ...swagger
+-func TestEmbeddedStruct_Issue98(t *testing.T) {
+-	type Y struct {
+-		A int
 -	}
--
--	return raw.Unmarshal()
+-	type X struct {
+-		Y
+-	}
+-	testJsonFromStruct(t, X{}, `{
+-  "swagger.X": {
+-   "id": "swagger.X",
+-   "required": [
+-    "A"
+-   ],
+-   "properties": {
+-    "A": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`)
 -}
 -
--// Create creates a file with the given value under the given key.  It succeeds
--// only if the given key does not yet exist.
--func (c *Client) Create(key string, value string, ttl uint64) (*Response, error) {
--	raw, err := c.RawCreate(key, value, ttl)
--
--	if err != nil {
--		return nil, err
--	}
+-type Dataset struct {
+-	Names []string
+-}
 -
--	return raw.Unmarshal()
+-// clear && go test -v -test.run TestIssue85 ...swagger
+-func TestIssue85(t *testing.T) {
+-	anon := struct{ Datasets []Dataset }{}
+-	testJsonFromStruct(t, anon, `{
+-  "struct { Datasets ||swagger.Dataset }": {
+-   "id": "struct { Datasets ||swagger.Dataset }",
+-   "required": [
+-    "Datasets"
+-   ],
+-   "properties": {
+-    "Datasets": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "swagger.Dataset"
+-      }
+-     ]
+-    }
+-   }
+-  },
+-  "swagger.Dataset": {
+-   "id": "swagger.Dataset",
+-   "required": [
+-    "Names"
+-   ],
+-   "properties": {
+-    "Names": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "string"
+-      }
+-     ]
+-    }
+-   }
+-  }
+- }`)
 -}
 -
--// CreateInOrder creates a file with a key that's guaranteed to be higher than other
--// keys in the given directory. It is useful for creating queues.
--func (c *Client) CreateInOrder(dir string, value string, ttl uint64) (*Response, error) {
--	raw, err := c.RawCreateInOrder(dir, value, ttl)
+-type File struct {
+-	History     []File
+-	HistoryPtrs []*File
+-}
+-
+-// go test -v -test.run TestRecursiveStructure ...swagger
+-func TestRecursiveStructure(t *testing.T) {
+-	testJsonFromStruct(t, File{}, `{
+-  "swagger.File": {
+-   "id": "swagger.File",
+-   "required": [
+-    "History",
+-    "HistoryPtrs"
+-   ],
+-   "properties": {
+-    "History": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "swagger.File"
+-      }
+-     ]
+-    },
+-    "HistoryPtrs": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "swagger.File.HistoryPtrs"
+-      }
+-     ]
+-    }
+-   }
+-  },
+-  "swagger.File.HistoryPtrs": {
+-   "id": "swagger.File.HistoryPtrs",
+-   "properties": {}
+-  }
+- }`)
+-}
 -
--	if err != nil {
--		return nil, err
+-type A1 struct {
+-	B struct {
+-		Id int
 -	}
+-}
 -
--	return raw.Unmarshal()
+-// go test -v -test.run TestEmbeddedStructA1 ...swagger
+-func TestEmbeddedStructA1(t *testing.T) {
+-	testJsonFromStruct(t, A1{}, `{
+-  "swagger.A1": {
+-   "id": "swagger.A1",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "swagger.A1.B"
+-    }
+-   }
+-  },
+-  "swagger.A1.B": {
+-   "id": "swagger.A1.B",
+-   "required": [
+-    "Id"
+-   ],
+-   "properties": {
+-    "Id": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`)
 -}
 -
--// Update updates the given key to the given value.  It succeeds only if the
--// given key already exists.
--func (c *Client) Update(key string, value string, ttl uint64) (*Response, error) {
--	raw, err := c.RawUpdate(key, value, ttl)
+-type A2 struct {
+-	C
+-}
+-type C struct {
+-	Id int `json:"B"`
+-}
 -
--	if err != nil {
--		return nil, err
--	}
+-// go test -v -test.run TestEmbeddedStructA2 ...swagger
+-func TestEmbeddedStructA2(t *testing.T) {
+-	testJsonFromStruct(t, A2{}, `{
+-  "swagger.A2": {
+-   "id": "swagger.A2",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`)
+-}
 -
--	return raw.Unmarshal()
+-type A3 struct {
+-	B D
 -}
 -
--func (c *Client) RawUpdateDir(key string, ttl uint64) (*RawResponse, error) {
--	ops := Options{
--		"prevExist": true,
--		"dir":       true,
--	}
+-type D struct {
+-	Id int
+-}
 -
--	return c.put(key, "", ttl, ops)
+-// clear && go test -v -test.run TestStructA3 ...swagger
+-func TestStructA3(t *testing.T) {
+-	testJsonFromStruct(t, A3{}, `{
+-  "swagger.A3": {
+-   "id": "swagger.A3",
+-   "required": [
+-    "B"
+-   ],
+-   "properties": {
+-    "B": {
+-     "type": "swagger.D"
+-    }
+-   }
+-  },
+-  "swagger.D": {
+-   "id": "swagger.D",
+-   "required": [
+-    "Id"
+-   ],
+-   "properties": {
+-    "Id": {
+-     "type": "integer",
+-     "format": "int32"
+-    }
+-   }
+-  }
+- }`)
 -}
 -
--func (c *Client) RawCreateDir(key string, ttl uint64) (*RawResponse, error) {
--	ops := Options{
--		"prevExist": false,
--		"dir":       true,
--	}
+-type ObjectId []byte
 -
--	return c.put(key, "", ttl, ops)
+-type Region struct {
+-	Id   ObjectId `bson:"_id" json:"id"`
+-	Name string   `bson:"name" json:"name"`
+-	Type string   `bson:"type" json:"type"`
 -}
 -
--func (c *Client) RawSet(key string, value string, ttl uint64) (*RawResponse, error) {
--	return c.put(key, value, ttl, nil)
+-// clear && go test -v -test.run TestRegion_Issue113 ...swagger
+-func TestRegion_Issue113(t *testing.T) {
+-	testJsonFromStruct(t, []Region{}, `{
+-  "integer": {
+-   "id": "integer",
+-   "properties": {}
+-  },
+-  "swagger.Region": {
+-   "id": "swagger.Region",
+-   "required": [
+-    "id",
+-    "name",
+-    "type"
+-   ],
+-   "properties": {
+-    "id": {
+-     "type": "array",
+-     "items": [
+-      {
+-       "$ref": "integer"
+-      }
+-     ]
+-    },
+-    "name": {
+-     "type": "string"
+-    },
+-    "type": {
+-     "type": "string"
+-    }
+-   }
+-  },
+-  "||swagger.Region": {
+-   "id": "||swagger.Region",
+-   "properties": {}
+-  }
+- }`)
 -}
 -
--func (c *Client) RawSetDir(key string, ttl uint64) (*RawResponse, error) {
--	ops := Options{
--		"dir": true,
+-// clear && go test -v -test.run TestIssue158 ...swagger
+-func TestIssue158(t *testing.T) {
+-	type Address struct {
+-		Country string `json:"country,omitempty"`
 -	}
 -
--	return c.put(key, "", ttl, ops)
+-	type Customer struct {
+-		Name    string  `json:"name"`
+-		Address Address `json:"address"`
+-	}
+-	expected := `{
+-  "swagger.Address": {
+-   "id": "swagger.Address",
+-   "properties": {
+-    "country": {
+-     "type": "string"
+-    }
+-   }
+-  },
+-  "swagger.Customer": {
+-   "id": "swagger.Customer",
+-   "required": [
+-    "name",
+-    "address"
+-   ],
+-   "properties": {
+-    "address": {
+-     "type": "swagger.Address"
+-    },
+-    "name": {
+-     "type": "string"
+-    }
+-   }
+-  }
+- }`
+-	testJsonFromStruct(t, Customer{}, expected)
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger.go
+deleted file mode 100644
+index 9f2fe4b..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger.go
++++ /dev/null
+@@ -1,184 +0,0 @@
+-// Package swagger implements the structures of the Swagger
+-// https://github.com/wordnik/swagger-spec/blob/master/versions/1.2.md
+-package swagger
+-
+-const swaggerVersion = "1.2"
 -
--func (c *Client) RawUpdate(key string, value string, ttl uint64) (*RawResponse, error) {
--	ops := Options{
--		"prevExist": true,
--	}
+-// 4.3.3 Data Type Fields
+-type DataTypeFields struct {
+-	Type         *string  `json:"type,omitempty"` // if Ref not used
+-	Ref          *string  `json:"$ref,omitempty"` // if Type not used
+-	Format       string   `json:"format,omitempty"`
+-	DefaultValue Special  `json:"defaultValue,omitempty"`
+-	Enum         []string `json:"enum,omitempty"`
+-	Minimum      string   `json:"minimum,omitempty"`
+-	Maximum      string   `json:"maximum,omitempty"`
+-	Items        []Item   `json:"items,omitempty"`
+-	UniqueItems  *bool    `json:"uniqueItems,omitempty"`
+-}
+-
+-type Special string
+-
+-// 4.3.4 Items Object
+-type Item struct {
+-	Type   *string `json:"type,omitempty"`
+-	Ref    *string `json:"$ref,omitempty"`
+-	Format string  `json:"format,omitempty"`
+-}
+-
+-// 5.1 Resource Listing
+-type ResourceListing struct {
+-	SwaggerVersion string          `json:"swaggerVersion"` // e.g 1.2
+-	Apis           []Resource      `json:"apis"`
+-	ApiVersion     string          `json:"apiVersion"`
+-	Info           Info            `json:"info"`
+-	Authorizations []Authorization `json:"authorizations,omitempty"`
+-}
+-
+-// 5.1.2 Resource Object
+-type Resource struct {
+-	Path        string `json:"path"` // relative or absolute, must start with /
+-	Description string `json:"description"`
+-}
+-
+-// 5.1.3 Info Object
+-type Info struct {
+-	Title             string `json:"title"`
+-	Description       string `json:"description"`
+-	TermsOfServiceUrl string `json:"termsOfServiceUrl,omitempty"`
+-	Contact           string `json:"contact,omitempty"`
+-	License           string `json:"license,omitempty"`
+-	LicensUrl         string `json:"licensUrl,omitempty"`
+-}
+-
+-// 5.1.5
+-type Authorization struct {
+-	Type       string      `json:"type"`
+-	PassAs     string      `json:"passAs"`
+-	Keyname    string      `json:"keyname"`
+-	Scopes     []Scope     `json:"scopes"`
+-	GrantTypes []GrantType `json:"grandTypes"`
+-}
+-
+-// 5.1.6, 5.2.11
+-type Scope struct {
+-	// Required. The name of the scope.
+-	Scope string `json:"scope"`
+-	// Recommended. A short description of the scope.
+-	Description string `json:"description"`
+-}
+-
+-// 5.1.7
+-type GrantType struct {
+-	Implicit          Implicit          `json:"implicit"`
+-	AuthorizationCode AuthorizationCode `json:"authorization_code"`
+-}
+-
+-// 5.1.8 Implicit Object
+-type Implicit struct {
+-	// Required. The login endpoint definition.
+-	loginEndpoint LoginEndpoint `json:"loginEndpoint"`
+-	// An optional alternative name to standard "access_token" OAuth2 parameter.
+-	TokenName string `json:"tokenName"`
+-}
+-
+-// 5.1.9 Authorization Code Object
+-type AuthorizationCode struct {
+-	TokenRequestEndpoint TokenRequestEndpoint `json:"tokenRequestEndpoint"`
+-	TokenEndpoint        TokenEndpoint        `json:"tokenEndpoint"`
+-}
+-
+-// 5.1.10 Login Endpoint Object
+-type LoginEndpoint struct {
+-	// Required. The URL of the authorization endpoint for the implicit grant flow. The value SHOULD be in a URL format.
+-	Url string `json:"url"`
+-}
+-
+-// 5.1.11 Token Request Endpoint Object
+-type TokenRequestEndpoint struct {
+-	// Required. The URL of the authorization endpoint for the authentication code grant flow. The value SHOULD be in a URL format.
+-	Url string `json:"url"`
+-	// An optional alternative name to standard "client_id" OAuth2 parameter.
+-	ClientIdName string `json:"clientIdName"`
+-	// An optional alternative name to the standard "client_secret" OAuth2 parameter.
+-	ClientSecretName string `json:"clientSecretName"`
+-}
 -
--	return c.put(key, value, ttl, ops)
+-// 5.1.12 Token Endpoint Object
+-type TokenEndpoint struct {
+-	// Required. The URL of the token endpoint for the authentication code grant flow. The value SHOULD be in a URL format.
+-	Url string `json:"url"`
+-	// An optional alternative name to standard "access_token" OAuth2 parameter.
+-	TokenName string `json:"tokenName"`
 -}
 -
--func (c *Client) RawCreate(key string, value string, ttl uint64) (*RawResponse, error) {
--	ops := Options{
--		"prevExist": false,
--	}
+-// 5.2 API Declaration
+-type ApiDeclaration struct {
+-	SwaggerVersion string           `json:"swaggerVersion"`
+-	ApiVersion     string           `json:"apiVersion"`
+-	BasePath       string           `json:"basePath"`
+-	ResourcePath   string           `json:"resourcePath"` // must start with /
+-	Apis           []Api            `json:"apis,omitempty"`
+-	Models         map[string]Model `json:"models,omitempty"`
+-	Produces       []string         `json:"produces,omitempty"`
+-	Consumes       []string         `json:"consumes,omitempty"`
+-	Authorizations []Authorization  `json:"authorizations,omitempty"`
+-}
 -
--	return c.put(key, value, ttl, ops)
+-// 5.2.2 API Object
+-type Api struct {
+-	Path        string      `json:"path"` // relative or absolute, must start with /
+-	Description string      `json:"description"`
+-	Operations  []Operation `json:"operations,omitempty"`
 -}
 -
--func (c *Client) RawCreateInOrder(dir string, value string, ttl uint64) (*RawResponse, error) {
--	return c.post(dir, value, ttl)
+-// 5.2.3 Operation Object
+-type Operation struct {
+-	Type             string            `json:"type"`
+-	Method           string            `json:"method"`
+-	Summary          string            `json:"summary,omitempty"`
+-	Notes            string            `json:"notes,omitempty"`
+-	Nickname         string            `json:"nickname"`
+-	Authorizations   []Authorization   `json:"authorizations,omitempty"`
+-	Parameters       []Parameter       `json:"parameters"`
+-	ResponseMessages []ResponseMessage `json:"responseMessages,omitempty"` // optional
+-	Produces         []string          `json:"produces,omitempty"`
+-	Consumes         []string          `json:"consumes,omitempty"`
+-	Deprecated       string            `json:"deprecated,omitempty"`
+-}
+-
+-// 5.2.4 Parameter Object
+-type Parameter struct {
+-	DataTypeFields
+-	ParamType     string `json:"paramType"` // path,query,body,header,form
+-	Name          string `json:"name"`
+-	Description   string `json:"description"`
+-	Required      bool   `json:"required"`
+-	AllowMultiple bool   `json:"allowMultiple"`
+-}
+-
+-// 5.2.5 Response Message Object
+-type ResponseMessage struct {
+-	Code          int    `json:"code"`
+-	Message       string `json:"message"`
+-	ResponseModel string `json:"responseModel,omitempty"`
+-}
+-
+-// 5.2.6, 5.2.7 Models Object
+-type Model struct {
+-	Id            string                   `json:"id"`
+-	Description   string                   `json:"description,omitempty"`
+-	Required      []string                 `json:"required,omitempty"`
+-	Properties    map[string]ModelProperty `json:"properties"`
+-	SubTypes      []string                 `json:"subTypes,omitempty"`
+-	Discriminator string                   `json:"discriminator,omitempty"`
+-}
+-
+-// 5.2.8 Properties Object
+-type ModelProperty struct {
+-	DataTypeFields
+-	Description string `json:"description,omitempty"`
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create_test.go
+-
+-// 5.2.10
+-type Authorizations map[string]Authorization
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go
 deleted file mode 100644
-index ced0f06..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/set_update_create_test.go
+index 12f4e14..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_test.go
 +++ /dev/null
-@@ -1,241 +0,0 @@
--package etcd
+@@ -1,115 +0,0 @@
+-package swagger
 -
 -import (
+-	"encoding/json"
+-	"fmt"
 -	"testing"
--)
 -
--func TestSet(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--	}()
+-	"github.com/emicklei/go-restful"
+-)
 -
--	resp, err := c.Set("foo", "bar", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
--	if resp.Node.Key != "/foo" || resp.Node.Value != "bar" || resp.Node.TTL != 5 {
--		t.Fatalf("Set 1 failed: %#v", resp)
--	}
--	if resp.PrevNode != nil {
--		t.Fatalf("Set 1 PrevNode failed: %#v", resp)
--	}
+-// go test -v -test.run TestApi ...swagger
+-func TestApi(t *testing.T) {
+-	value := Api{Path: "/", Description: "Some Path", Operations: []Operation{}}
+-	compareJson(t, true, value, `{"path":"/","description":"Some Path"}`)
+-}
 -
--	resp, err = c.Set("foo", "bar2", 5)
+-// go test -v -test.run TestServiceToApi ...swagger
+-func TestServiceToApi(t *testing.T) {
+-	ws := new(restful.WebService)
+-	ws.Path("/tests")
+-	ws.Consumes(restful.MIME_JSON)
+-	ws.Produces(restful.MIME_XML)
+-	ws.Route(ws.GET("/all").To(dummy).Writes(sample{}))
+-	cfg := Config{
+-		WebServicesUrl: "http://here.com",
+-		ApiPath:        "/apipath",
+-		WebServices:    []*restful.WebService{ws}}
+-	sws := newSwaggerService(cfg)
+-	decl := sws.composeDeclaration(ws, "/tests")
+-	data, err := json.MarshalIndent(decl, " ", " ")
 -	if err != nil {
--		t.Fatal(err)
--	}
--	if !(resp.Node.Key == "/foo" && resp.Node.Value == "bar2" && resp.Node.TTL == 5) {
--		t.Fatalf("Set 2 failed: %#v", resp)
--	}
--	if resp.PrevNode.Key != "/foo" || resp.PrevNode.Value != "bar" || resp.Node.TTL != 5 {
--		t.Fatalf("Set 2 PrevNode failed: %#v", resp)
+-		t.Fatal(err.Error())
 -	}
+-	// for visual inspection only
+-	fmt.Println(string(data))
 -}
 -
--func TestUpdate(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--		c.Delete("nonexistent", true)
--	}()
--
--	resp, err := c.Set("foo", "bar", 5)
--
--	if err != nil {
--		t.Fatal(err)
--	}
+-func dummy(i *restful.Request, o *restful.Response) {}
 -
--	// This should succeed.
--	resp, err = c.Update("foo", "wakawaka", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-// go test -v -test.run TestIssue78 ...swagger
+-type Response struct {
+-	Code  int
+-	Users *[]User
+-	Items *[]TestItem
+-}
+-type User struct {
+-	Id, Name string
+-}
+-type TestItem struct {
+-	Id, Name string
+-}
 -
--	if !(resp.Action == "update" && resp.Node.Key == "/foo" && resp.Node.TTL == 5) {
--		t.Fatalf("Update 1 failed: %#v", resp)
--	}
--	if !(resp.PrevNode.Key == "/foo" && resp.PrevNode.Value == "bar" && resp.Node.TTL == 5) {
--		t.Fatalf("Update 1 prevValue failed: %#v", resp)
+-// clear && go test -v -test.run TestComposeResponseMessages ...swagger
+-func TestComposeResponseMessages(t *testing.T) {
+-	responseErrors := map[int]restful.ResponseError{}
+-	responseErrors[400] = restful.ResponseError{Code: 400, Message: "Bad Request", Model: TestItem{}}
+-	route := restful.Route{ResponseErrors: responseErrors}
+-	decl := new(ApiDeclaration)
+-	decl.Models = map[string]Model{}
+-	msgs := composeResponseMessages(route, decl)
+-	if msgs[0].ResponseModel != "swagger.TestItem" {
+-		t.Errorf("got %s want swagger.TestItem", msgs[0].ResponseModel)
 -	}
+-}
 -
--	// This should fail because the key does not exist.
--	resp, err = c.Update("nonexistent", "whatever", 5)
--	if err == nil {
--		t.Fatalf("The key %v did not exist, so the update should have failed."+
--			"The response was: %#v", resp.Node.Key, resp)
+-// clear && go test -v -test.run TestComposeResponseMessageArray ...swagger
+-func TestComposeResponseMessageArray(t *testing.T) {
+-	responseErrors := map[int]restful.ResponseError{}
+-	responseErrors[400] = restful.ResponseError{Code: 400, Message: "Bad Request", Model: []TestItem{}}
+-	route := restful.Route{ResponseErrors: responseErrors}
+-	decl := new(ApiDeclaration)
+-	decl.Models = map[string]Model{}
+-	msgs := composeResponseMessages(route, decl)
+-	if msgs[0].ResponseModel != "array[swagger.TestItem]" {
+-		t.Errorf("got %s want swagger.TestItem", msgs[0].ResponseModel)
 -	}
 -}
 -
--func TestCreate(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("newKey", true)
--	}()
--
--	newKey := "/newKey"
--	newValue := "/newValue"
--
--	// This should succeed
--	resp, err := c.Create(newKey, newValue, 5)
--	if err != nil {
--		t.Fatal(err)
+-func TestIssue78(t *testing.T) {
+-	sws := newSwaggerService(Config{})
+-	models := map[string]Model{}
+-	sws.addModelFromSampleTo(&Operation{}, true, Response{Items: &[]TestItem{}}, models)
+-	model, ok := models["swagger.Response"]
+-	if !ok {
+-		t.Fatal("missing response model")
 -	}
--
--	if !(resp.Action == "create" && resp.Node.Key == newKey &&
--		resp.Node.Value == newValue && resp.Node.TTL == 5) {
--		t.Fatalf("Create 1 failed: %#v", resp)
+-	if "swagger.Response" != model.Id {
+-		t.Fatal("wrong model id:" + model.Id)
 -	}
--	if resp.PrevNode != nil {
--		t.Fatalf("Create 1 PrevNode failed: %#v", resp)
+-	code, ok := model.Properties["Code"]
+-	if !ok {
+-		t.Fatal("missing code")
 -	}
--
--	// This should fail, because the key is already there
--	resp, err = c.Create(newKey, newValue, 5)
--	if err == nil {
--		t.Fatalf("The key %v did exist, so the creation should have failed."+
--			"The response was: %#v", resp.Node.Key, resp)
+-	if "integer" != *code.Type {
+-		t.Fatal("wrong code type:" + *code.Type)
 -	}
--}
--
--func TestCreateInOrder(t *testing.T) {
--	c := NewClient(nil)
--	dir := "/queue"
--	defer func() {
--		c.DeleteDir(dir)
--	}()
--
--	var firstKey, secondKey string
--
--	resp, err := c.CreateInOrder(dir, "1", 5)
--	if err != nil {
--		t.Fatal(err)
+-	items, ok := model.Properties["Items"]
+-	if !ok {
+-		t.Fatal("missing items")
 -	}
--
--	if !(resp.Action == "create" && resp.Node.Value == "1" && resp.Node.TTL == 5) {
--		t.Fatalf("Create 1 failed: %#v", resp)
+-	if "array" != *items.Type {
+-		t.Fatal("wrong items type:" + *items.Type)
 -	}
--
--	firstKey = resp.Node.Key
--
--	resp, err = c.CreateInOrder(dir, "2", 5)
--	if err != nil {
--		t.Fatal(err)
+-	items_items := items.Items
+-	if len(items_items) == 0 {
+-		t.Fatal("missing items->items")
 -	}
--
--	if !(resp.Action == "create" && resp.Node.Value == "2" && resp.Node.TTL == 5) {
--		t.Fatalf("Create 2 failed: %#v", resp)
+-	ref := items_items[0].Ref
+-	if ref == nil {
+-		t.Fatal("missing $ref")
 -	}
--
--	secondKey = resp.Node.Key
--
--	if firstKey >= secondKey {
--		t.Fatalf("Expected first key to be greater than second key, but %s is not greater than %s",
--			firstKey, secondKey)
+-	if *ref != "swagger.TestItem" {
+-		t.Fatal("wrong $ref:" + *ref)
 -	}
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_webservice.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_webservice.go
+deleted file mode 100644
+index c20de2e..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/swagger_webservice.go
++++ /dev/null
+@@ -1,349 +0,0 @@
+-package swagger
 -
--func TestSetDir(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("foo", true)
--		c.Delete("fooDir", true)
--	}()
--
--	resp, err := c.CreateDir("fooDir", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
--	if !(resp.Node.Key == "/fooDir" && resp.Node.Value == "" && resp.Node.TTL == 5) {
--		t.Fatalf("SetDir 1 failed: %#v", resp)
--	}
--	if resp.PrevNode != nil {
--		t.Fatalf("SetDir 1 PrevNode failed: %#v", resp)
--	}
+-import (
+-	"fmt"
+-	"github.com/emicklei/go-restful"
+-	// "github.com/emicklei/hopwatch"
+-	"log"
+-	"net/http"
+-	"reflect"
+-	"sort"
+-	"strings"
+-)
 -
--	// This should fail because /fooDir already points to a directory
--	resp, err = c.CreateDir("/fooDir", 5)
--	if err == nil {
--		t.Fatalf("fooDir already points to a directory, so SetDir should have failed."+
--			"The response was: %#v", resp)
+-type SwaggerService struct {
+-	config            Config
+-	apiDeclarationMap map[string]ApiDeclaration
+-}
+-
+-func newSwaggerService(config Config) *SwaggerService {
+-	return &SwaggerService{
+-		config:            config,
+-		apiDeclarationMap: map[string]ApiDeclaration{}}
+-}
+-
+-// LogInfo is the function that is called when this package needs to log. It defaults to log.Printf
+-var LogInfo = log.Printf
+-
+-// InstallSwaggerService add the WebService that provides the API documentation of all services
+-// conform the Swagger documentation specifcation. (https://github.com/wordnik/swagger-core/wiki).
+-func InstallSwaggerService(aSwaggerConfig Config) {
+-	RegisterSwaggerService(aSwaggerConfig, restful.DefaultContainer)
+-}
+-
+-// RegisterSwaggerService add the WebService that provides the API documentation of all services
+-// conform the Swagger documentation specifcation. (https://github.com/wordnik/swagger-core/wiki).
+-func RegisterSwaggerService(config Config, wsContainer *restful.Container) {
+-	sws := newSwaggerService(config)
+-	ws := new(restful.WebService)
+-	ws.Path(config.ApiPath)
+-	ws.Produces(restful.MIME_JSON)
+-	if config.DisableCORS {
+-		ws.Filter(enableCORS)
+-	}
+-	ws.Route(ws.GET("/").To(sws.getListing))
+-	ws.Route(ws.GET("/{a}").To(sws.getDeclarations))
+-	ws.Route(ws.GET("/{a}/{b}").To(sws.getDeclarations))
+-	ws.Route(ws.GET("/{a}/{b}/{c}").To(sws.getDeclarations))
+-	ws.Route(ws.GET("/{a}/{b}/{c}/{d}").To(sws.getDeclarations))
+-	ws.Route(ws.GET("/{a}/{b}/{c}/{d}/{e}").To(sws.getDeclarations))
+-	ws.Route(ws.GET("/{a}/{b}/{c}/{d}/{e}/{f}").To(sws.getDeclarations))
+-	ws.Route(ws.GET("/{a}/{b}/{c}/{d}/{e}/{f}/{g}").To(sws.getDeclarations))
+-	LogInfo("[restful/swagger] listing is available at %v%v", config.WebServicesUrl, config.ApiPath)
+-	wsContainer.Add(ws)
+-
+-	// Build all ApiDeclarations
+-	for _, each := range config.WebServices {
+-		rootPath := each.RootPath()
+-		// skip the api service itself
+-		if rootPath != config.ApiPath {
+-			if rootPath == "" || rootPath == "/" {
+-				// use routes
+-				for _, route := range each.Routes() {
+-					entry := staticPathFromRoute(route)
+-					_, exists := sws.apiDeclarationMap[entry]
+-					if !exists {
+-						sws.apiDeclarationMap[entry] = sws.composeDeclaration(each, entry)
+-					}
+-				}
+-			} else { // use root path
+-				sws.apiDeclarationMap[each.RootPath()] = sws.composeDeclaration(each, each.RootPath())
+-			}
+-		}
 -	}
 -
--	_, err = c.Set("foo", "bar", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-	// Check paths for UI serving
+-	if config.StaticHandler == nil && config.SwaggerFilePath != "" && config.SwaggerPath != "" {
+-		swaggerPathSlash := config.SwaggerPath
+-		// path must end with slash /
+-		if "/" != config.SwaggerPath[len(config.SwaggerPath)-1:] {
+-			LogInfo("[restful/swagger] use corrected SwaggerPath ; must end with slash (/)")
+-			swaggerPathSlash += "/"
+-		}
 -
--	// This should succeed
--	// It should replace the key
--	resp, err = c.SetDir("foo", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
--	if !(resp.Node.Key == "/foo" && resp.Node.Value == "" && resp.Node.TTL == 5) {
--		t.Fatalf("SetDir 2 failed: %#v", resp)
--	}
--	if !(resp.PrevNode.Key == "/foo" && resp.PrevNode.Value == "bar" && resp.PrevNode.TTL == 5) {
--		t.Fatalf("SetDir 2 failed: %#v", resp)
--	}
--}
+-		LogInfo("[restful/swagger] %v%v is mapped to folder %v", config.WebServicesUrl, swaggerPathSlash, config.SwaggerFilePath)
+-		wsContainer.Handle(swaggerPathSlash, http.StripPrefix(swaggerPathSlash, http.FileServer(http.Dir(config.SwaggerFilePath))))
 -
--func TestUpdateDir(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("fooDir", true)
--	}()
+-		//if we define a custom static handler use it
+-	} else if config.StaticHandler != nil && config.SwaggerPath != "" {
+-		swaggerPathSlash := config.SwaggerPath
+-		// path must end with slash /
+-		if "/" != config.SwaggerPath[len(config.SwaggerPath)-1:] {
+-			LogInfo("[restful/swagger] use corrected SwaggerFilePath ; must end with slash (/)")
+-			swaggerPathSlash += "/"
 -
--	resp, err := c.CreateDir("fooDir", 5)
--	if err != nil {
--		t.Fatal(err)
--	}
+-		}
+-		LogInfo("[restful/swagger] %v%v is mapped to custom Handler %T", config.WebServicesUrl, swaggerPathSlash, config.StaticHandler)
+-		wsContainer.Handle(swaggerPathSlash, config.StaticHandler)
 -
--	// This should succeed.
--	resp, err = c.UpdateDir("fooDir", 5)
--	if err != nil {
--		t.Fatal(err)
+-	} else {
+-		LogInfo("[restful/swagger] Swagger(File)Path is empty ; no UI is served")
 -	}
+-}
 -
--	if !(resp.Action == "update" && resp.Node.Key == "/fooDir" &&
--		resp.Node.Value == "" && resp.Node.TTL == 5) {
--		t.Fatalf("UpdateDir 1 failed: %#v", resp)
+-func staticPathFromRoute(r restful.Route) string {
+-	static := r.Path
+-	bracket := strings.Index(static, "{")
+-	if bracket <= 1 { // result cannot be empty
+-		return static
 -	}
--	if !(resp.PrevNode.Key == "/fooDir" && resp.PrevNode.Dir == true && resp.PrevNode.TTL == 5) {
--		t.Fatalf("UpdateDir 1 PrevNode failed: %#v", resp)
+-	if bracket != -1 {
+-		static = r.Path[:bracket]
 -	}
--
--	// This should fail because the key does not exist.
--	resp, err = c.UpdateDir("nonexistentDir", 5)
--	if err == nil {
--		t.Fatalf("The key %v did not exist, so the update should have failed."+
--			"The response was: %#v", resp.Node.Key, resp)
+-	if strings.HasSuffix(static, "/") {
+-		return static[:len(static)-1]
+-	} else {
+-		return static
 -	}
 -}
 -
--func TestCreateDir(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("fooDir", true)
--	}()
--
--	// This should succeed
--	resp, err := c.CreateDir("fooDir", 5)
--	if err != nil {
--		t.Fatal(err)
+-func enableCORS(req *restful.Request, resp *restful.Response, chain *restful.FilterChain) {
+-	if origin := req.HeaderParameter(restful.HEADER_Origin); origin != "" {
+-		// prevent duplicate header
+-		if len(resp.Header().Get(restful.HEADER_AccessControlAllowOrigin)) == 0 {
+-			resp.AddHeader(restful.HEADER_AccessControlAllowOrigin, origin)
+-		}
 -	}
+-	chain.ProcessFilter(req, resp)
+-}
 -
--	if !(resp.Action == "create" && resp.Node.Key == "/fooDir" &&
--		resp.Node.Value == "" && resp.Node.TTL == 5) {
--		t.Fatalf("CreateDir 1 failed: %#v", resp)
--	}
--	if resp.PrevNode != nil {
--		t.Fatalf("CreateDir 1 PrevNode failed: %#v", resp)
+-func (sws SwaggerService) getListing(req *restful.Request, resp *restful.Response) {
+-	listing := ResourceListing{SwaggerVersion: swaggerVersion}
+-	for k, v := range sws.apiDeclarationMap {
+-		ref := Resource{Path: k}
+-		if len(v.Apis) > 0 { // use description of first (could still be empty)
+-			ref.Description = v.Apis[0].Description
+-		}
+-		listing.Apis = append(listing.Apis, ref)
 -	}
+-	resp.WriteAsJson(listing)
+-}
 -
--	// This should fail, because the key is already there
--	resp, err = c.CreateDir("fooDir", 5)
--	if err == nil {
--		t.Fatalf("The key %v did exist, so the creation should have failed."+
--			"The response was: %#v", resp.Node.Key, resp)
+-func (sws SwaggerService) getDeclarations(req *restful.Request, resp *restful.Response) {
+-	decl := sws.apiDeclarationMap[composeRootPath(req)]
+-	// unless WebServicesUrl is given
+-	if len(sws.config.WebServicesUrl) == 0 {
+-		// update base path from the actual request
+-		// TODO how to detect https? assume http for now
+-		(&decl).BasePath = fmt.Sprintf("http://%s", req.Request.Host)
 -	}
+-	resp.WriteAsJson(decl)
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/version.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/version.go
-deleted file mode 100644
-index b3d05df..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/version.go
-+++ /dev/null
-@@ -1,3 +0,0 @@
--package etcd
--
--const version = "v2"
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch.go
-deleted file mode 100644
-index aa8d3df..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch.go
-+++ /dev/null
-@@ -1,103 +0,0 @@
--package etcd
--
--import (
--	"errors"
--)
--
--// Errors introduced by the Watch command.
--var (
--	ErrWatchStoppedByUser = errors.New("Watch stopped by the user via stop channel")
--)
--
--// If recursive is set to true the watch returns the first change under the given
--// prefix since the given index.
--//
--// If recursive is set to false the watch returns the first change to the given key
--// since the given index.
--//
--// To watch for the latest change, set waitIndex = 0.
--//
--// If a receiver channel is given, it will be a long-term watch. Watch will block at the
--//channel. After someone receives the channel, it will go on to watch that
--// prefix.  If a stop channel is given, the client can close long-term watch using
--// the stop channel.
--func (c *Client) Watch(prefix string, waitIndex uint64, recursive bool,
--	receiver chan *Response, stop chan bool) (*Response, error) {
--	logger.Debugf("watch %s [%s]", prefix, c.cluster.Leader)
--	if receiver == nil {
--		raw, err := c.watchOnce(prefix, waitIndex, recursive, stop)
 -
--		if err != nil {
--			return nil, err
--		}
+-func (sws SwaggerService) composeDeclaration(ws *restful.WebService, pathPrefix string) ApiDeclaration {
+-	decl := ApiDeclaration{
+-		SwaggerVersion: swaggerVersion,
+-		BasePath:       sws.config.WebServicesUrl,
+-		ResourcePath:   ws.RootPath(),
+-		Models:         map[string]Model{}}
 -
--		return raw.Unmarshal()
+-	// collect any path parameters
+-	rootParams := []Parameter{}
+-	for _, param := range ws.PathParameters() {
+-		rootParams = append(rootParams, asSwaggerParameter(param.Data()))
 -	}
--	defer close(receiver)
--
--	for {
--		raw, err := c.watchOnce(prefix, waitIndex, recursive, stop)
--
--		if err != nil {
--			return nil, err
--		}
--
--		resp, err := raw.Unmarshal()
--
--		if err != nil {
--			return nil, err
--		}
--
--		waitIndex = resp.Node.ModifiedIndex + 1
--		receiver <- resp
+-	// aggregate by path
+-	pathToRoutes := map[string][]restful.Route{}
+-	for _, other := range ws.Routes() {
+-		if strings.HasPrefix(other.Path, pathPrefix) {
+-			routes := pathToRoutes[other.Path]
+-			pathToRoutes[other.Path] = append(routes, other)
+-		}
 -	}
--}
+-	for path, routes := range pathToRoutes {
+-		api := Api{Path: strings.TrimSuffix(path, "/"), Description: ws.Documentation()}
+-		for _, route := range routes {
+-			operation := Operation{
+-				Method:           route.Method,
+-				Summary:          route.Doc,
+-				Type:             asDataType(route.WriteSample),
+-				Parameters:       []Parameter{},
+-				Nickname:         route.Operation,
+-				ResponseMessages: composeResponseMessages(route, &decl)}
 -
--func (c *Client) RawWatch(prefix string, waitIndex uint64, recursive bool,
--	receiver chan *RawResponse, stop chan bool) (*RawResponse, error) {
+-			operation.Consumes = route.Consumes
+-			operation.Produces = route.Produces
 -
--	logger.Debugf("rawWatch %s [%s]", prefix, c.cluster.Leader)
--	if receiver == nil {
--		return c.watchOnce(prefix, waitIndex, recursive, stop)
+-			// share root params if any
+-			for _, swparam := range rootParams {
+-				operation.Parameters = append(operation.Parameters, swparam)
+-			}
+-			// route specific params
+-			for _, param := range route.ParameterDocs {
+-				operation.Parameters = append(operation.Parameters, asSwaggerParameter(param.Data()))
+-			}
+-			sws.addModelsFromRouteTo(&operation, route, &decl)
+-			api.Operations = append(api.Operations, operation)
+-		}
+-		decl.Apis = append(decl.Apis, api)
 -	}
+-	return decl
+-}
 -
--	for {
--		raw, err := c.watchOnce(prefix, waitIndex, recursive, stop)
--
--		if err != nil {
--			return nil, err
+-// composeResponseMessages takes the ResponseErrors (if any) and creates ResponseMessages from them.
+-func composeResponseMessages(route restful.Route, decl *ApiDeclaration) (messages []ResponseMessage) {
+-	if route.ResponseErrors == nil {
+-		return messages
+-	}
+-	// sort by code
+-	codes := sort.IntSlice{}
+-	for code, _ := range route.ResponseErrors {
+-		codes = append(codes, code)
+-	}
+-	codes.Sort()
+-	for _, code := range codes {
+-		each := route.ResponseErrors[code]
+-		message := ResponseMessage{
+-			Code:    code,
+-			Message: each.Message,
+-		}
+-		if each.Model != nil {
+-			st := reflect.TypeOf(each.Model)
+-			isCollection, st := detectCollectionType(st)
+-			modelName := modelBuilder{}.keyFrom(st)
+-			if isCollection {
+-				modelName = "array[" + modelName + "]"
+-			}
+-			modelBuilder{decl.Models}.addModel(st, "")
+-			// reference the model
+-			message.ResponseModel = modelName
 -		}
+-		messages = append(messages, message)
+-	}
+-	return
+-}
 -
--		resp, err := raw.Unmarshal()
+-// addModelsFromRoute takes any read or write sample from the Route and creates a Swagger model from it.
+-func (sws SwaggerService) addModelsFromRouteTo(operation *Operation, route restful.Route, decl *ApiDeclaration) {
+-	if route.ReadSample != nil {
+-		sws.addModelFromSampleTo(operation, false, route.ReadSample, decl.Models)
+-	}
+-	if route.WriteSample != nil {
+-		sws.addModelFromSampleTo(operation, true, route.WriteSample, decl.Models)
+-	}
+-}
 -
--		if err != nil {
--			return nil, err
+-func detectCollectionType(st reflect.Type) (bool, reflect.Type) {
+-	isCollection := false
+-	if st.Kind() == reflect.Slice || st.Kind() == reflect.Array {
+-		st = st.Elem()
+-		isCollection = true
+-	} else {
+-		if st.Kind() == reflect.Ptr {
+-			if st.Elem().Kind() == reflect.Slice || st.Elem().Kind() == reflect.Array {
+-				st = st.Elem().Elem()
+-				isCollection = true
+-			}
 -		}
+-	}
+-	return isCollection, st
+-}
 -
--		waitIndex = resp.Node.ModifiedIndex + 1
--		receiver <- raw
+-// addModelFromSample creates and adds (or overwrites) a Model from a sample resource
+-func (sws SwaggerService) addModelFromSampleTo(operation *Operation, isResponse bool, sample interface{}, models map[string]Model) {
+-	st := reflect.TypeOf(sample)
+-	isCollection, st := detectCollectionType(st)
+-	modelName := modelBuilder{}.keyFrom(st)
+-	if isResponse {
+-		if isCollection {
+-			modelName = "array[" + modelName + "]"
+-		}
+-		operation.Type = modelName
 -	}
+-	modelBuilder{models}.addModel(reflect.TypeOf(sample), "")
 -}
 -
--// helper func
--// return when there is change under the given prefix
--func (c *Client) watchOnce(key string, waitIndex uint64, recursive bool, stop chan bool) (*RawResponse, error) {
+-func asSwaggerParameter(param restful.ParameterData) Parameter {
+-	return Parameter{
+-		DataTypeFields: DataTypeFields{
+-			Type:   &param.DataType,
+-			Format: asFormat(param.DataType),
+-		},
+-		Name:        param.Name,
+-		Description: param.Description,
+-		ParamType:   asParamType(param.Kind),
 -
--	options := Options{
--		"wait": true,
+-		Required: param.Required}
+-}
+-
+-// Between 1..7 path parameters is supported
+-func composeRootPath(req *restful.Request) string {
+-	path := "/" + req.PathParameter("a")
+-	b := req.PathParameter("b")
+-	if b == "" {
+-		return path
 -	}
--	if waitIndex > 0 {
--		options["waitIndex"] = waitIndex
+-	path = path + "/" + b
+-	c := req.PathParameter("c")
+-	if c == "" {
+-		return path
 -	}
--	if recursive {
--		options["recursive"] = true
+-	path = path + "/" + c
+-	d := req.PathParameter("d")
+-	if d == "" {
+-		return path
 -	}
+-	path = path + "/" + d
+-	e := req.PathParameter("e")
+-	if e == "" {
+-		return path
+-	}
+-	path = path + "/" + e
+-	f := req.PathParameter("f")
+-	if f == "" {
+-		return path
+-	}
+-	path = path + "/" + f
+-	g := req.PathParameter("g")
+-	if g == "" {
+-		return path
+-	}
+-	return path + "/" + g
+-}
 -
--	resp, err := c.getCancelable(key, options, stop)
+-func asFormat(name string) string {
+-	return "" // TODO
+-}
 -
--	if err == ErrRequestCancelled {
--		return nil, ErrWatchStoppedByUser
+-func asParamType(kind int) string {
+-	switch {
+-	case kind == restful.PathParameterKind:
+-		return "path"
+-	case kind == restful.QueryParameterKind:
+-		return "query"
+-	case kind == restful.BodyParameterKind:
+-		return "body"
+-	case kind == restful.HeaderParameterKind:
+-		return "header"
+-	case kind == restful.FormParameterKind:
+-		return "form"
 -	}
+-	return ""
+-}
 -
--	return resp, err
+-func asDataType(any interface{}) string {
+-	if any == nil {
+-		return "void"
+-	}
+-	return reflect.TypeOf(any).Name()
 -}
-diff --git a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch_test.go b/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch_test.go
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go
 deleted file mode 100644
-index 43e1dfe..0000000
---- a/Godeps/_workspace/src/github.com/coreos/go-etcd/etcd/watch_test.go
+index 6127bd5..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/swagger/utils_test.go
 +++ /dev/null
-@@ -1,119 +0,0 @@
--package etcd
+@@ -1,70 +0,0 @@
+-package swagger
 -
 -import (
+-	"bytes"
+-	"encoding/json"
 -	"fmt"
--	"runtime"
+-	"reflect"
+-	"strings"
 -	"testing"
--	"time"
 -)
 -
--func TestWatch(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("watch_foo", true)
--	}()
+-func testJsonFromStruct(t *testing.T, sample interface{}, expectedJson string) {
+-	compareJson(t, false, modelsFromStruct(sample), expectedJson)
+-}
 -
--	go setHelper("watch_foo", "bar", c)
+-func modelsFromStruct(sample interface{}) map[string]Model {
+-	models := map[string]Model{}
+-	builder := modelBuilder{models}
+-	builder.addModel(reflect.TypeOf(sample), "")
+-	return models
+-}
 -
--	resp, err := c.Watch("watch_foo", 0, false, nil, nil)
+-func compareJson(t *testing.T, flatCompare bool, value interface{}, expectedJsonAsString string) {
+-	var output []byte
+-	var err error
+-	if flatCompare {
+-		output, err = json.Marshal(value)
+-	} else {
+-		output, err = json.MarshalIndent(value, " ", " ")
+-	}
 -	if err != nil {
--		t.Fatal(err)
+-		t.Error(err.Error())
+-		return
 -	}
--	if !(resp.Node.Key == "/watch_foo" && resp.Node.Value == "bar") {
--		t.Fatalf("Watch 1 failed: %#v", resp)
+-	actual := string(output)
+-	if actual != expectedJsonAsString {
+-		t.Errorf("First mismatch JSON doc at line:%d", indexOfNonMatchingLine(actual, expectedJsonAsString))
+-		// Use simple fmt to create a pastable output :-)
+-		fmt.Println("---- expected -----")
+-		fmt.Println(withLineNumbers(expectedJsonAsString))
+-		fmt.Println("---- actual -----")
+-		fmt.Println(withLineNumbers(actual))
+-		fmt.Println("---- raw -----")
+-		fmt.Println(actual)
 -	}
+-}
 -
--	go setHelper("watch_foo", "bar", c)
--
--	resp, err = c.Watch("watch_foo", resp.Node.ModifiedIndex+1, false, nil, nil)
--	if err != nil {
--		t.Fatal(err)
+-func indexOfNonMatchingLine(actual, expected string) int {
+-	a := strings.Split(actual, "\n")
+-	e := strings.Split(expected, "\n")
+-	size := len(a)
+-	if len(e) < len(a) {
+-		size = len(e)
 -	}
--	if !(resp.Node.Key == "/watch_foo" && resp.Node.Value == "bar") {
--		t.Fatalf("Watch 2 failed: %#v", resp)
+-	for i := 0; i < size; i++ {
+-		if a[i] != e[i] {
+-			return i
+-		}
 -	}
+-	return -1
+-}
 -
--	routineNum := runtime.NumGoroutine()
--
--	ch := make(chan *Response, 10)
--	stop := make(chan bool, 1)
--
--	go setLoop("watch_foo", "bar", c)
+-func withLineNumbers(content string) string {
+-	var buffer bytes.Buffer
+-	lines := strings.Split(content, "\n")
+-	for i, each := range lines {
+-		buffer.WriteString(fmt.Sprintf("%d:%s\n", i, each))
+-	}
+-	return buffer.String()
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service.go
+deleted file mode 100644
+index ce261b5..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service.go
++++ /dev/null
+@@ -1,184 +0,0 @@
+-package restful
 -
--	go receiver(ch, stop)
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
--	_, err = c.Watch("watch_foo", 0, false, ch, stop)
--	if err != ErrWatchStoppedByUser {
--		t.Fatalf("Watch returned a non-user stop error")
--	}
+-import (
+-	"log"
+-)
 -
--	if newRoutineNum := runtime.NumGoroutine(); newRoutineNum != routineNum {
--		t.Fatalf("Routine numbers differ after watch stop: %v, %v", routineNum, newRoutineNum)
+-// WebService holds a collection of Route values that bind a Http Method + URL Path to a function.
+-type WebService struct {
+-	rootPath       string
+-	pathExpr       *pathExpression // cached compilation of rootPath as RegExp
+-	routes         []Route
+-	produces       []string
+-	consumes       []string
+-	pathParameters []*Parameter
+-	filters        []FilterFunction
+-	documentation  string
+-}
+-
+-// compiledPathExpression ensures that the path is compiled into a RegEx for those routers that need it.
+-func (w *WebService) compiledPathExpression() *pathExpression {
+-	if w.pathExpr == nil {
+-		if len(w.rootPath) == 0 {
+-			w.Path("/") // lazy initialize path
+-		}
+-		compiled, err := newPathExpression(w.rootPath)
+-		if err != nil {
+-			log.Fatalf("[restful] Invalid path:%s because:%v", w.rootPath, err)
+-		}
+-		w.pathExpr = compiled
 -	}
+-	return w.pathExpr
 -}
 -
--func TestWatchAll(t *testing.T) {
--	c := NewClient(nil)
--	defer func() {
--		c.Delete("watch_foo", true)
--	}()
--
--	go setHelper("watch_foo/foo", "bar", c)
+-// Path specifies the root URL template path of the WebService.
+-// All Routes will be relative to this path.
+-func (w *WebService) Path(root string) *WebService {
+-	w.rootPath = root
+-	return w
+-}
 -
--	resp, err := c.Watch("watch_foo", 0, true, nil, nil)
--	if err != nil {
--		t.Fatal(err)
--	}
--	if !(resp.Node.Key == "/watch_foo/foo" && resp.Node.Value == "bar") {
--		t.Fatalf("WatchAll 1 failed: %#v", resp)
+-// Param adds a PathParameter to document parameters used in the root path.
+-func (w *WebService) Param(parameter *Parameter) *WebService {
+-	if w.pathParameters == nil {
+-		w.pathParameters = []*Parameter{}
 -	}
+-	w.pathParameters = append(w.pathParameters, parameter)
+-	return w
+-}
 -
--	go setHelper("watch_foo/foo", "bar", c)
+-// PathParameter creates a new Parameter of kind Path for documentation purposes.
+-// It is initialized as required with string as its DataType.
+-func (w *WebService) PathParameter(name, description string) *Parameter {
+-	p := &Parameter{&ParameterData{Name: name, Description: description, Required: true, DataType: "string"}}
+-	p.bePath()
+-	return p
+-}
 -
--	resp, err = c.Watch("watch_foo", resp.Node.ModifiedIndex+1, true, nil, nil)
--	if err != nil {
--		t.Fatal(err)
--	}
--	if !(resp.Node.Key == "/watch_foo/foo" && resp.Node.Value == "bar") {
--		t.Fatalf("WatchAll 2 failed: %#v", resp)
--	}
+-// QueryParameter creates a new Parameter of kind Query for documentation purposes.
+-// It is initialized as not required with string as its DataType.
+-func (w *WebService) QueryParameter(name, description string) *Parameter {
+-	p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}}
+-	p.beQuery()
+-	return p
+-}
 -
--	ch := make(chan *Response, 10)
--	stop := make(chan bool, 1)
+-// BodyParameter creates a new Parameter of kind Body for documentation purposes.
+-// It is initialized as required without a DataType.
+-func (w *WebService) BodyParameter(name, description string) *Parameter {
+-	p := &Parameter{&ParameterData{Name: name, Description: description, Required: true}}
+-	p.beBody()
+-	return p
+-}
 -
--	routineNum := runtime.NumGoroutine()
+-// HeaderParameter creates a new Parameter of kind (Http) Header for documentation purposes.
+-// It is initialized as not required with string as its DataType.
+-func (w *WebService) HeaderParameter(name, description string) *Parameter {
+-	p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}}
+-	p.beHeader()
+-	return p
+-}
 -
--	go setLoop("watch_foo/foo", "bar", c)
+-// FormParameter creates a new Parameter of kind Form (using application/x-www-form-urlencoded) for documentation purposes.
+-// It is initialized as required with string as its DataType.
+-func (w *WebService) FormParameter(name, description string) *Parameter {
+-	p := &Parameter{&ParameterData{Name: name, Description: description, Required: false, DataType: "string"}}
+-	p.beForm()
+-	return p
+-}
 -
--	go receiver(ch, stop)
+-// Route creates a new Route using the RouteBuilder and add to the ordered list of Routes.
+-func (w *WebService) Route(builder *RouteBuilder) *WebService {
+-	builder.copyDefaults(w.produces, w.consumes)
+-	w.routes = append(w.routes, builder.Build())
+-	return w
+-}
 -
--	_, err = c.Watch("watch_foo", 0, true, ch, stop)
--	if err != ErrWatchStoppedByUser {
--		t.Fatalf("Watch returned a non-user stop error")
--	}
+-// Method creates a new RouteBuilder and initialize its http method
+-func (w *WebService) Method(httpMethod string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method(httpMethod)
+-}
 -
--	if newRoutineNum := runtime.NumGoroutine(); newRoutineNum != routineNum {
--		t.Fatalf("Routine numbers differ after watch stop: %v, %v", routineNum, newRoutineNum)
--	}
+-// Produces specifies that this WebService can produce one or more MIME types.
+-// Http requests must have one of these values set for the Accept header.
+-func (w *WebService) Produces(contentTypes ...string) *WebService {
+-	w.produces = contentTypes
+-	return w
 -}
 -
--func setHelper(key, value string, c *Client) {
--	time.Sleep(time.Second)
--	c.Set(key, value, 100)
+-// Consumes specifies that this WebService can consume one or more MIME types.
+-// Http requests must have one of these values set for the Content-Type header.
+-func (w *WebService) Consumes(accepts ...string) *WebService {
+-	w.consumes = accepts
+-	return w
 -}
 -
--func setLoop(key, value string, c *Client) {
--	time.Sleep(time.Second)
--	for i := 0; i < 10; i++ {
--		newValue := fmt.Sprintf("%s_%v", value, i)
--		c.Set(key, newValue, 100)
--		time.Sleep(time.Second / 10)
--	}
+-// Routes returns the Routes associated with this WebService
+-func (w WebService) Routes() []Route {
+-	return w.routes
 -}
 -
--func receiver(c chan *Response, stop chan bool) {
--	for i := 0; i < 10; i++ {
--		<-c
--	}
--	stop <- true
+-// RootPath returns the RootPath associated with this WebService. Default "/"
+-func (w WebService) RootPath() string {
+-	return w.rootPath
 -}
-diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE
-deleted file mode 100644
-index 5782c72..0000000
---- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/LICENSE
-+++ /dev/null
-@@ -1,23 +0,0 @@
--Copyright (c) 2014, Elazar Leibovich
--All rights reserved.
 -
--Redistribution and use in source and binary forms, with or without
--modification, are permitted provided that the following conditions are met:
+-// PathParameters return the path parameter names for (shared amoung its Routes)
+-func (w WebService) PathParameters() []*Parameter {
+-	return w.pathParameters
+-}
 -
--* Redistributions of source code must retain the above copyright notice, this
--  list of conditions and the following disclaimer.
+-// Filter adds a filter function to the chain of filters applicable to all its Routes
+-func (w *WebService) Filter(filter FilterFunction) *WebService {
+-	w.filters = append(w.filters, filter)
+-	return w
+-}
 -
--* Redistributions in binary form must reproduce the above copyright notice,
--  this list of conditions and the following disclaimer in the documentation
--  and/or other materials provided with the distribution.
+-// Doc is used to set the documentation of this service.
+-func (w *WebService) Doc(plainText string) *WebService {
+-	w.documentation = plainText
+-	return w
+-}
 -
--THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
--AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
--IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
--DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
--FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
--DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
--SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
--CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
--OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
--OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md
-deleted file mode 100644
-index a3929a8..0000000
---- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/README.md
-+++ /dev/null
-@@ -1,18 +0,0 @@
--go-bindata-http
--===============
+-// Documentation returns it.
+-func (w WebService) Documentation() string {
+-	return w.documentation
+-}
 -
--Serve embedded files from [jteeuwen/go-bindata](https://github.com/jteeuwen/go-bindata) with `net/http`.
+-/*
+-	Convenience methods
+-*/
 -
--[GoDoc](http://godoc.org/github.com/elazarl/go-bindata-assetfs)
+-// HEAD is a shortcut for .Method("HEAD").Path(subPath)
+-func (w *WebService) HEAD(subPath string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method("HEAD").Path(subPath)
+-}
 -
--After running
+-// GET is a shortcut for .Method("GET").Path(subPath)
+-func (w *WebService) GET(subPath string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method("GET").Path(subPath)
+-}
 -
--    $ go-bindata data/...
+-// POST is a shortcut for .Method("POST").Path(subPath)
+-func (w *WebService) POST(subPath string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method("POST").Path(subPath)
+-}
 -
--Use
+-// PUT is a shortcut for .Method("PUT").Path(subPath)
+-func (w *WebService) PUT(subPath string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method("PUT").Path(subPath)
+-}
 -
--     http.Handle("/",
--        http.FileServer(
--        &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"}))
+-// PATCH is a shortcut for .Method("PATCH").Path(subPath)
+-func (w *WebService) PATCH(subPath string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method("PATCH").Path(subPath)
+-}
 -
--to serve files embedded from the `data` directory.
-diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go
+-// DELETE is a shortcut for .Method("DELETE").Path(subPath)
+-func (w *WebService) DELETE(subPath string) *RouteBuilder {
+-	return new(RouteBuilder).servicePath(w.rootPath).Method("DELETE").Path(subPath)
+-}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_container.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_container.go
 deleted file mode 100644
-index 83cd94d..0000000
---- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/assetfs.go
+index c9d31b0..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_container.go
 +++ /dev/null
-@@ -1,141 +0,0 @@
--package assetfs
+@@ -1,39 +0,0 @@
+-package restful
+-
+-// Copyright 2013 Ernest Micklei. All rights reserved.
+-// Use of this source code is governed by a license
+-// that can be found in the LICENSE file.
 -
 -import (
--	"bytes"
--	"errors"
--	"fmt"
--	"io"
--	"io/ioutil"
 -	"net/http"
--	"os"
--	"path"
--	"path/filepath"
--	"time"
 -)
 -
--// FakeFile implements os.FileInfo interface for a given path and size
--type FakeFile struct {
--	// Path is the path of this file
--	Path string
--	// Dir marks of the path is a directory
--	Dir bool
--	// Len is the length of the fake file, zero if it is a directory
--	Len int64
--}
+-// DefaultContainer is a restful.Container that uses http.DefaultServeMux
+-var DefaultContainer *Container
 -
--func (f *FakeFile) Name() string {
--	_, name := filepath.Split(f.Path)
--	return name
+-func init() {
+-	DefaultContainer = NewContainer()
+-	DefaultContainer.ServeMux = http.DefaultServeMux
 -}
 -
--func (f *FakeFile) Mode() os.FileMode {
--	mode := os.FileMode(0644)
--	if f.Dir {
--		return mode | os.ModeDir
--	}
--	return mode
--}
+-// If set the true then panics will not be caught to return HTTP 500.
+-// In that case, Route functions are responsible for handling any error situation.
+-// Default value is false = recover from panics. This has performance implications.
+-// OBSOLETE ; use restful.DefaultContainer.DoNotRecover(true)
+-var DoNotRecover = false
 -
--func (f *FakeFile) ModTime() time.Time {
--	return time.Unix(0, 0)
+-// Add registers a new WebService add it to the DefaultContainer.
+-func Add(service *WebService) {
+-	DefaultContainer.Add(service)
 -}
 -
--func (f *FakeFile) Size() int64 {
--	return f.Len
+-// Filter appends a container FilterFunction from the DefaultContainer.
+-// These are called before dispatching a http.Request to a WebService.
+-func Filter(filter FilterFunction) {
+-	DefaultContainer.Filter(filter)
 -}
 -
--func (f *FakeFile) IsDir() bool {
--	return f.Mode().IsDir()
+-// RegisteredWebServices returns the collections of WebServices from the DefaultContainer
+-func RegisteredWebServices() []*WebService {
+-	return DefaultContainer.RegisteredWebServices()
 -}
+diff --git a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go b/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go
+deleted file mode 100644
+index e200979..0000000
+--- a/Godeps/_workspace/src/github.com/emicklei/go-restful/web_service_test.go
++++ /dev/null
+@@ -1,115 +0,0 @@
+-package restful
 -
--func (f *FakeFile) Sys() interface{} {
--	return nil
--}
+-import (
+-	"net/http"
+-	"net/http/httptest"
+-	"testing"
+-)
 -
--// AssetFile implements http.File interface for a no-directory file with content
--type AssetFile struct {
--	*bytes.Reader
--	io.Closer
--	FakeFile
--}
+-const (
+-	pathGetFriends = "/get/{userId}/friends"
+-)
 -
--func NewAssetFile(name string, content []byte) *AssetFile {
--	return &AssetFile{
--		bytes.NewReader(content),
--		ioutil.NopCloser(nil),
--		FakeFile{name, false, int64(len(content))}}
--}
+-func TestParameter(t *testing.T) {
+-	p := &Parameter{&ParameterData{Name: "name", Description: "desc"}}
+-	p.AllowMultiple(true)
+-	p.DataType("int")
+-	p.Required(true)
+-	values := map[string]string{"a": "b"}
+-	p.AllowableValues(values)
+-	p.bePath()
 -
--func (f *AssetFile) Readdir(count int) ([]os.FileInfo, error) {
--	return nil, errors.New("not a directory")
+-	ws := new(WebService)
+-	ws.Param(p)
+-	if ws.pathParameters[0].Data().Name != "name" {
+-		t.Error("path parameter (or name) invalid")
+-	}
 -}
--
--func (f *AssetFile) Stat() (os.FileInfo, error) {
--	return f, nil
+-func TestWebService_CanCreateParameterKinds(t *testing.T) {
+-	ws := new(WebService)
+-	if ws.BodyParameter("b", "b").Kind() != BodyParameterKind {
+-		t.Error("body parameter expected")
+-	}
+-	if ws.PathParameter("p", "p").Kind() != PathParameterKind {
+-		t.Error("path parameter expected")
+-	}
+-	if ws.QueryParameter("q", "q").Kind() != QueryParameterKind {
+-		t.Error("query parameter expected")
+-	}
 -}
 -
--// AssetDirectory implements http.File interface for a directory
--type AssetDirectory struct {
--	AssetFile
--	ChildrenRead int
--	Children     []os.FileInfo
+-func TestCapturePanic(t *testing.T) {
+-	tearDown()
+-	Add(newPanicingService())
+-	httpRequest, _ := http.NewRequest("GET", "http://here.com/fire", nil)
+-	httpRequest.Header.Set("Accept", "*/*")
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	if 500 != httpWriter.Code {
+-		t.Error("500 expected on fire")
+-	}
 -}
 -
--func NewAssetDirectory(name string, children []string, fs *AssetFS) *AssetDirectory {
--	fileinfos := make([]os.FileInfo, 0, len(children))
--	for _, child := range children {
--		_, err := fs.AssetDir(filepath.Join(name, child))
--		fileinfos = append(fileinfos, &FakeFile{child, err == nil, 0})
+-func TestNotFound(t *testing.T) {
+-	tearDown()
+-	httpRequest, _ := http.NewRequest("GET", "http://here.com/missing", nil)
+-	httpRequest.Header.Set("Accept", "*/*")
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	if 404 != httpWriter.Code {
+-		t.Error("404 expected on missing")
 -	}
--	return &AssetDirectory{
--		AssetFile{
--			bytes.NewReader(nil),
--			ioutil.NopCloser(nil),
--			FakeFile{name, true, 0},
--		},
--		0,
--		fileinfos}
 -}
 -
--func (f *AssetDirectory) Readdir(count int) ([]os.FileInfo, error) {
--	fmt.Println(f, count)
--	if count <= 0 {
--		return f.Children, nil
+-func TestMethodNotAllowed(t *testing.T) {
+-	tearDown()
+-	Add(newGetOnlyService())
+-	httpRequest, _ := http.NewRequest("POST", "http://here.com/get", nil)
+-	httpRequest.Header.Set("Accept", "*/*")
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	if 405 != httpWriter.Code {
+-		t.Error("405 expected method not allowed")
 -	}
--	if f.ChildrenRead+count > len(f.Children) {
--		count = len(f.Children) - f.ChildrenRead
+-}
+-
+-func TestSelectedRoutePath_Issue100(t *testing.T) {
+-	tearDown()
+-	Add(newSelectedRouteTestingService())
+-	httpRequest, _ := http.NewRequest("GET", "http://here.com/get/232452/friends", nil)
+-	httpRequest.Header.Set("Accept", "*/*")
+-	httpWriter := httptest.NewRecorder()
+-	DefaultContainer.dispatch(httpWriter, httpRequest)
+-	if http.StatusOK != httpWriter.Code {
+-		t.Error(http.StatusOK, "expected,", httpWriter.Code, "received.")
 -	}
--	rv := f.Children[f.ChildrenRead : f.ChildrenRead+count]
--	f.ChildrenRead += count
--	return rv, nil
 -}
 -
--func (f *AssetDirectory) Stat() (os.FileInfo, error) {
--	return f, nil
+-func newPanicingService() *WebService {
+-	ws := new(WebService).Path("")
+-	ws.Route(ws.GET("/fire").To(doPanic))
+-	return ws
 -}
 -
--// AssetFS implements http.FileSystem, allowing
--// embedded files to be served from net/http package.
--type AssetFS struct {
--	// Asset should return content of file in path if exists
--	Asset func(path string) ([]byte, error)
--	// AssetDir should return list of files in the path
--	AssetDir func(path string) ([]string, error)
--	// Prefix would be prepended to http requests
--	Prefix string
+-func newGetOnlyService() *WebService {
+-	ws := new(WebService).Path("")
+-	ws.Route(ws.GET("/get").To(doPanic))
+-	return ws
 -}
 -
--func (fs *AssetFS) Open(name string) (http.File, error) {
--	name = path.Join(fs.Prefix, name)
--	if len(name) > 0 && name[0] == '/' {
--		name = name[1:]
--	}
--	if children, err := fs.AssetDir(name); err == nil {
--		return NewAssetDirectory(name, children, fs), nil
--	}
--	b, err := fs.Asset(name)
--	if err != nil {
--		return nil, err
+-func newSelectedRouteTestingService() *WebService {
+-	ws := new(WebService).Path("")
+-	ws.Route(ws.GET(pathGetFriends).To(selectedRouteChecker))
+-	return ws
+-}
+-
+-func selectedRouteChecker(req *Request, resp *Response) {
+-	if req.SelectedRoutePath() != pathGetFriends {
+-		resp.InternalServerError()
 -	}
--	return NewAssetFile(name, b), nil
 -}
-diff --git a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go b/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go
-deleted file mode 100644
-index a664249..0000000
---- a/Godeps/_workspace/src/github.com/elazarl/go-bindata-assetfs/doc.go
-+++ /dev/null
-@@ -1,13 +0,0 @@
--// assetfs allows packages to serve static content embedded
--// with the go-bindata tool with the standard net/http package.
--//
--// See https://github.com/jteeuwen/go-bindata for more information
--// about embedding binary data with go-bindata.
--//
--// Usage example, after running
--//    $ go-bindata data/...
--// use:
--//     http.Handle("/",
--//        http.FileServer(
--//        &assetfs.AssetFS{Asset: Asset, AssetDir: AssetDir, Prefix: "data"}))
--package assetfs
+-
+-func doPanic(req *Request, resp *Response) {
+-	println("lightning...")
+-	panic("fire")
+-}
 diff --git a/Godeps/_workspace/src/github.com/fsouza/go-dockerclient/.travis.yml b/Godeps/_workspace/src/github.com/fsouza/go-dockerclient/.travis.yml
 deleted file mode 100644
 index ad1dff7..0000000
@@ -80260,12 +93223,72 @@ index 0fb376e..0000000
 -		logging.putBuffer(buf)
 -	}
 -}
+diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/client/README.md b/Godeps/_workspace/src/github.com/google/cadvisor/client/README.md
+deleted file mode 100644
+index fededef..0000000
+--- a/Godeps/_workspace/src/github.com/google/cadvisor/client/README.md
++++ /dev/null
+@@ -1,54 +0,0 @@
+-# Example REST API Client
+-
+-This is an implementation of a cAdvisor REST API in Go.  You can use it like this:
+-
+-```go
+-client, err := client.NewClient("http://192.168.59.103:8080/")
+-```
+-
+-Obviously, replace the URL with the path to your actual cAdvisor REST endpoint.
+-
+-
+-### MachineInfo
+-
+-```go
+-client.MachineInfo()
+-```
+-
+-This method returns a cadvisor/info.MachineInfo struct with all the fields filled in.  Here is an example return value:
+-
+-```
+-(*info.MachineInfo)(0xc208022b10)({
+- NumCores: (int) 4,
+- MemoryCapacity: (int64) 2106028032,
+- Filesystems: ([]info.FsInfo) (len=1 cap=4) {
+-  (info.FsInfo) {
+-   Device: (string) (len=9) "/dev/sda1",
+-   Capacity: (uint64) 19507089408
+-  }
+- }
+-})
+-```
+-
+-You can see the full specification of the [MachineInfo struct in the source](../info/container.go)
+-
+-### ContainerInfo
+-
+-Given a container name and a ContainerInfoRequest, will return all information about the specified container.  The ContainerInfoRequest struct just has one field, NumStats, which is the number of stat entries that you want returned.
+-
+-```go
+-request := info.ContainerInfoRequest{10}
+-sInfo, err := client.ContainerInfo("/docker/d9d3eb10179e6f93a...", &request)
+-```
+-Returns a [ContainerInfo struct](../info/container.go)
+-
+-### SubcontainersInfo
+-
+-Given a container name and a ContainerInfoRequest, will recursively return all info about the container and all subcontainers contained within the container.  The ContainerInfoRequest struct just has one field, NumStats, which is the number of stat entries that you want returned.
+-
+-```go
+-request := info.ContainerInfoRequest{10}
+-sInfo, err := client.SubcontainersInfo("/docker", &request)
+-```
+-
+-Returns a [ContainerInfo struct](../info/container.go) with the Subcontainers field populated.
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/client/client.go b/Godeps/_workspace/src/github.com/google/cadvisor/client/client.go
 deleted file mode 100644
-index f49176e..0000000
+index c1117d2..0000000
 --- a/Godeps/_workspace/src/github.com/google/cadvisor/client/client.go
 +++ /dev/null
-@@ -1,106 +0,0 @@
+@@ -1,123 +0,0 @@
 -// Copyright 2014 Google Inc. All Rights Reserved.
 -//
 -// Licensed under the Apache License, Version 2.0 (the "License");
@@ -80280,7 +93303,8 @@ index f49176e..0000000
 -// See the License for the specific language governing permissions and
 -// limitations under the License.
 -
--package cadvisor
+-// TODO(cAdvisor): Package comment.
+-package client
 -
 -import (
 -	"bytes"
@@ -80288,45 +93312,75 @@ index f49176e..0000000
 -	"fmt"
 -	"io/ioutil"
 -	"net/http"
+-	"path"
 -	"strings"
 -
 -	"github.com/google/cadvisor/info"
 -)
 -
+-// Client represents the base URL for a cAdvisor client.
 -type Client struct {
 -	baseUrl string
 -}
 -
--func NewClient(URL string) (*Client, error) {
--	c := &Client{
--		baseUrl: strings.Join([]string{
--			URL,
--			"api/v1.0",
--		}, "/"),
+-// NewClient returns a new client with the specified base URL.
+-func NewClient(url string) (*Client, error) {
+-	if !strings.HasSuffix(url, "/") {
+-		url += "/"
 -	}
--	return c, nil
--}
 -
--func (self *Client) machineInfoUrl() string {
--	return strings.Join([]string{self.baseUrl, "machine"}, "/")
+-	return &Client{
+-		baseUrl: fmt.Sprintf("%sapi/v1.1/", url),
+-	}, nil
 -}
 -
+-// MachineInfo returns the JSON machine information for this client.
+-// A non-nil error result indicates a problem with obtaining
+-// the JSON machine information data.
 -func (self *Client) MachineInfo() (minfo *info.MachineInfo, err error) {
 -	u := self.machineInfoUrl()
 -	ret := new(info.MachineInfo)
--	err = self.httpGetJsonData(ret, nil, u, "machine info")
--	if err != nil {
+-	if err = self.httpGetJsonData(ret, nil, u, "machine info"); err != nil {
 -		return
 -	}
 -	minfo = ret
 -	return
 -}
 -
--func (self *Client) containerInfoUrl(name string) string {
--	if name[0] == '/' {
--		name = name[1:]
+-// ContainerInfo returns the JSON container information for the specified
+-// container and request.
+-func (self *Client) ContainerInfo(name string, query *info.ContainerInfoRequest) (cinfo *info.ContainerInfo, err error) {
+-	u := self.containerInfoUrl(name)
+-	ret := new(info.ContainerInfo)
+-	if err = self.httpGetJsonData(ret, query, u, fmt.Sprintf("container info for %q", name)); err != nil {
+-		return
+-	}
+-	cinfo = ret
+-	return
+-}
+-
+-// Returns the information about all subcontainers (recursive) of the specified container (including itself).
+-func (self *Client) SubcontainersInfo(name string, query *info.ContainerInfoRequest) ([]info.ContainerInfo, error) {
+-	var response []info.ContainerInfo
+-	url := self.subcontainersInfoUrl(name)
+-	err := self.httpGetJsonData(&response, query, url, fmt.Sprintf("subcontainers container info for %q", name))
+-	if err != nil {
+-		return []info.ContainerInfo{}, err
+-
 -	}
--	return strings.Join([]string{self.baseUrl, "containers", name}, "/")
+-	return response, nil
+-}
+-
+-func (self *Client) machineInfoUrl() string {
+-	return self.baseUrl + path.Join("machine")
+-}
+-
+-func (self *Client) containerInfoUrl(name string) string {
+-	return self.baseUrl + path.Join("containers", name)
+-}
+-
+-func (self *Client) subcontainersInfoUrl(name string) string {
+-	return self.baseUrl + path.Join("subcontainers", name)
 -}
 -
 -func (self *Client) httpGetJsonData(data, postData interface{}, url, infoName string) error {
@@ -80352,32 +93406,18 @@ index f49176e..0000000
 -		err = fmt.Errorf("unable to read all %v: %v", infoName, err)
 -		return err
 -	}
--	err = json.Unmarshal(body, data)
--	if err != nil {
+-	if err = json.Unmarshal(body, data); err != nil {
 -		err = fmt.Errorf("unable to unmarshal %v (%v): %v", infoName, string(body), err)
 -		return err
 -	}
 -	return nil
 -}
--
--func (self *Client) ContainerInfo(
--	name string,
--	query *info.ContainerInfoRequest) (cinfo *info.ContainerInfo, err error) {
--	u := self.containerInfoUrl(name)
--	ret := new(info.ContainerInfo)
--	err = self.httpGetJsonData(ret, query, u, fmt.Sprintf("container info for %v", name))
--	if err != nil {
--		return
--	}
--	cinfo = ret
--	return
--}
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/client/client_test.go b/Godeps/_workspace/src/github.com/google/cadvisor/client/client_test.go
 deleted file mode 100644
-index eb6b7a4..0000000
+index 35a75ad..0000000
 --- a/Godeps/_workspace/src/github.com/google/cadvisor/client/client_test.go
 +++ /dev/null
-@@ -1,113 +0,0 @@
+@@ -1,154 +0,0 @@
 -// Copyright 2014 Google Inc. All Rights Reserved.
 -//
 -// Licensed under the Apache License, Version 2.0 (the "License");
@@ -80392,13 +93432,14 @@ index eb6b7a4..0000000
 -// See the License for the specific language governing permissions and
 -// limitations under the License.
 -
--package cadvisor
+-package client
 -
 -import (
 -	"encoding/json"
 -	"fmt"
 -	"net/http"
 -	"net/http/httptest"
+-	"path"
 -	"reflect"
 -	"testing"
 -	"time"
@@ -80427,8 +93468,7 @@ index eb6b7a4..0000000
 -		if r.URL.Path == path {
 -			if expectedPostObj != nil {
 -				decoder := json.NewDecoder(r.Body)
--				err := decoder.Decode(expectedPostObjEmpty)
--				if err != nil {
+-				if err := decoder.Decode(expectedPostObjEmpty); err != nil {
 -					t.Errorf("Received invalid object: %v", err)
 -				}
 -				if !reflect.DeepEqual(expectedPostObj, expectedPostObjEmpty) {
@@ -80437,7 +93477,7 @@ index eb6b7a4..0000000
 -			}
 -			encoder := json.NewEncoder(w)
 -			encoder.Encode(replyObj)
--		} else if r.URL.Path == "/api/v1.0/machine" {
+-		} else if r.URL.Path == "/api/v1.1/machine" {
 -			fmt.Fprint(w, `{"num_cores":8,"memory_capacity":31625871360}`)
 -		} else {
 -			w.WriteHeader(http.StatusNotFound)
@@ -80452,12 +93492,14 @@ index eb6b7a4..0000000
 -	return client, ts, err
 -}
 -
+-// TestGetMachineInfo performs one test to check if MachineInfo()
+-// in a cAdvisor client returns the correct result.
 -func TestGetMachineinfo(t *testing.T) {
 -	minfo := &info.MachineInfo{
 -		NumCores:       8,
 -		MemoryCapacity: 31625871360,
 -	}
--	client, server, err := cadvisorTestClient("/api/v1.0/machine", nil, nil, minfo, t)
+-	client, server, err := cadvisorTestClient("/api/v1.1/machine", nil, nil, minfo, t)
 -	if err != nil {
 -		t.Fatalf("unable to get a client %v", err)
 -	}
@@ -80471,13 +93513,15 @@ index eb6b7a4..0000000
 -	}
 -}
 -
+-// TestGetContainerInfo generates a random container information object
+-// and then checks that ContainerInfo returns the expected result.
 -func TestGetContainerInfo(t *testing.T) {
 -	query := &info.ContainerInfoRequest{
 -		NumStats: 3,
 -	}
 -	containerName := "/some/container"
 -	cinfo := itest.GenerateRandomContainerInfo(containerName, 4, query, 1*time.Second)
--	client, server, err := cadvisorTestClient(fmt.Sprintf("/api/v1.0/containers%v", containerName), query, &info.ContainerInfoRequest{}, cinfo, t)
+-	client, server, err := cadvisorTestClient(fmt.Sprintf("/api/v1.1/containers%v", containerName), query, &info.ContainerInfoRequest{}, cinfo, t)
 -	if err != nil {
 -		t.Fatalf("unable to get a client %v", err)
 -	}
@@ -80491,6 +93535,43 @@ index eb6b7a4..0000000
 -		t.Error("received unexpected ContainerInfo")
 -	}
 -}
+-
+-func TestGetSubcontainersInfo(t *testing.T) {
+-	query := &info.ContainerInfoRequest{
+-		NumStats: 3,
+-	}
+-	containerName := "/some/container"
+-	cinfo := itest.GenerateRandomContainerInfo(containerName, 4, query, 1*time.Second)
+-	cinfo1 := itest.GenerateRandomContainerInfo(path.Join(containerName, "sub1"), 4, query, 1*time.Second)
+-	cinfo2 := itest.GenerateRandomContainerInfo(path.Join(containerName, "sub2"), 4, query, 1*time.Second)
+-	response := []info.ContainerInfo{
+-		*cinfo,
+-		*cinfo1,
+-		*cinfo2,
+-	}
+-	client, server, err := cadvisorTestClient(fmt.Sprintf("/api/v1.1/subcontainers%v", containerName), query, &info.ContainerInfoRequest{}, response, t)
+-	if err != nil {
+-		t.Fatalf("unable to get a client %v", err)
+-	}
+-	defer server.Close()
+-	returned, err := client.SubcontainersInfo(containerName, query)
+-	if err != nil {
+-		t.Fatal(err)
+-	}
+-
+-	if len(returned) != 3 {
+-		t.Errorf("unexpected number of results: got %d, expected 3", len(returned))
+-	}
+-	if !returned[0].Eq(cinfo) {
+-		t.Error("received unexpected ContainerInfo")
+-	}
+-	if !returned[1].Eq(cinfo1) {
+-		t.Error("received unexpected ContainerInfo")
+-	}
+-	if !returned[2].Eq(cinfo2) {
+-		t.Error("received unexpected ContainerInfo")
+-	}
+-}
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/advice.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/advice.go
 deleted file mode 100644
 index 8084cf4..0000000
@@ -80533,10 +93614,10 @@ index 8084cf4..0000000
 -}
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/container.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/container.go
 deleted file mode 100644
-index 7858fa5..0000000
+index 5eaacb5..0000000
 --- a/Godeps/_workspace/src/github.com/google/cadvisor/info/container.go
 +++ /dev/null
-@@ -1,312 +0,0 @@
+@@ -1,346 +0,0 @@
 -// Copyright 2014 Google Inc. All Rights Reserved.
 -//
 -// Licensed under the Apache License, Version 2.0 (the "License");
@@ -80579,8 +93660,15 @@ index 7858fa5..0000000
 -}
 -
 -type ContainerSpec struct {
--	Cpu    *CpuSpec    `json:"cpu,omitempty"`
--	Memory *MemorySpec `json:"memory,omitempty"`
+-	HasCpu bool    `json:"has_cpu"`
+-	Cpu    CpuSpec `json:"cpu,omitempty"`
+-
+-	HasMemory bool       `json:"has_memory"`
+-	Memory    MemorySpec `json:"memory,omitempty"`
+-
+-	HasNetwork bool `json:"has_network"`
+-
+-	HasFilesystem bool `json:"has_filesystem"`
 -}
 -
 -// Container reference contains enough information to uniquely identify a container
@@ -80605,7 +93693,7 @@ index 7858fa5..0000000
 -	Subcontainers []ContainerReference `json:"subcontainers,omitempty"`
 -
 -	// The isolation used in the container.
--	Spec *ContainerSpec `json:"spec,omitempty"`
+-	Spec ContainerSpec `json:"spec,omitempty"`
 -
 -	// Historical statistics gathered from the container.
 -	Stats []*ContainerStats `json:"stats,omitempty"`
@@ -80705,6 +93793,19 @@ index 7858fa5..0000000
 -	Load int32 `json:"load"`
 -}
 -
+-type PerDiskStats struct {
+-	Major uint64            `json:"major"`
+-	Minor uint64            `json:"minor"`
+-	Stats map[string]uint64 `json:"stats"`
+-}
+-
+-type DiskIoStats struct {
+-	IoServiceBytes []PerDiskStats `json:"io_service_bytes,omitempty"`
+-	IoServiced     []PerDiskStats `json:"io_serviced,omitempty"`
+-	IoQueued       []PerDiskStats `json:"io_queued,omitempty"`
+-	Sectors        []PerDiskStats `json:"sectors,omitempty"`
+-}
+-
 -type MemoryStats struct {
 -	// Memory limit, equivalent to "limit" in MemorySpec.
 -	// Units: Bytes.
@@ -80750,12 +93851,26 @@ index 7858fa5..0000000
 -	TxDropped uint64 `json:"tx_dropped"`
 -}
 -
+-type FsStats struct {
+-	// The block device name associated with the filesystem.
+-	Device string `json:"device,omitempty"`
+-
+-	// Number of bytes that can be consumed by the container on this filesystem.
+-	Limit uint64 `json:"capacity"`
+-
+-	// Number of bytes that is consumed by the container on this filesystem.
+-	Usage uint64 `json:"usage"`
+-}
+-
 -type ContainerStats struct {
 -	// The time of this stat point.
 -	Timestamp time.Time     `json:"timestamp"`
 -	Cpu       *CpuStats     `json:"cpu,omitempty"`
+-	DiskIo    DiskIoStats   `json:"diskio,omitempty"`
 -	Memory    *MemoryStats  `json:"memory,omitempty"`
 -	Network   *NetworkStats `json:"network,omitempty"`
+-	// Filesystem statistics
+-	Filesystem []FsStats `json:"filesystem,omitempty"`
 -}
 -
 -// Makes a deep copy of the ContainerStats and returns a pointer to the new
@@ -80958,10 +94073,10 @@ index bd730c1..0000000
 -}
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/machine.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/machine.go
 deleted file mode 100644
-index 7415dc9..0000000
+index 0e73a8e..0000000
 --- a/Godeps/_workspace/src/github.com/google/cadvisor/info/machine.go
 +++ /dev/null
-@@ -1,42 +0,0 @@
+@@ -1,53 +0,0 @@
 -// Copyright 2014 Google Inc. All Rights Reserved.
 -//
 -// Licensed under the Apache License, Version 2.0 (the "License");
@@ -80978,12 +94093,23 @@ index 7415dc9..0000000
 -
 -package info
 -
+-type FsInfo struct {
+-	// Block device associated with the filesystem.
+-	Device string `json:"device"`
+-
+-	// Total number of bytes available on the filesystem.
+-	Capacity uint64 `json:"capacity"`
+-}
+-
 -type MachineInfo struct {
 -	// The number of cores in this machine.
 -	NumCores int `json:"num_cores"`
 -
 -	// The amount of memory (in bytes) in this machine
 -	MemoryCapacity int64 `json:"memory_capacity"`
+-
+-	// Filesystems on this machine.
+-	Filesystems []FsInfo `json:"filesystems"`
 -}
 -
 -type VersionInfo struct {
@@ -81006,7 +94132,7 @@ index 7415dc9..0000000
 -}
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/test/datagen.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/test/datagen.go
 deleted file mode 100644
-index 5d43ae5..0000000
+index bb0b2ff..0000000
 --- a/Godeps/_workspace/src/github.com/google/cadvisor/info/test/datagen.go
 +++ /dev/null
 @@ -1,78 +0,0 @@
@@ -81063,10 +94189,10 @@ index 5d43ae5..0000000
 -	return ret
 -}
 -
--func GenerateRandomContainerSpec(numCores int) *info.ContainerSpec {
--	ret := &info.ContainerSpec{
--		Cpu:    &info.CpuSpec{},
--		Memory: &info.MemorySpec{},
+-func GenerateRandomContainerSpec(numCores int) info.ContainerSpec {
+-	ret := info.ContainerSpec{
+-		Cpu:    info.CpuSpec{},
+-		Memory: info.MemorySpec{},
 -	}
 -	ret.Cpu.Limit = uint64(1000 + rand.Int63n(2000))
 -	ret.Cpu.MaxLimit = uint64(1000 + rand.Int63n(2000))
@@ -81090,7 +94216,7 @@ index 5d43ae5..0000000
 -}
 diff --git a/Godeps/_workspace/src/github.com/google/cadvisor/info/version.go b/Godeps/_workspace/src/github.com/google/cadvisor/info/version.go
 deleted file mode 100644
-index 8675734..0000000
+index 8ae9b22..0000000
 --- a/Godeps/_workspace/src/github.com/google/cadvisor/info/version.go
 +++ /dev/null
 @@ -1,18 +0,0 @@
@@ -81111,7 +94237,7 @@ index 8675734..0000000
 -package info
 -
 -// Version of cAdvisor.
--const VERSION = "0.4.0"
+-const VERSION = "0.5.0"
 diff --git a/Godeps/_workspace/src/github.com/google/gofuzz/.travis.yml b/Godeps/_workspace/src/github.com/google/gofuzz/.travis.yml
 deleted file mode 100644
 index 9384a54..0000000
diff --git a/getsource.sh b/getsource.sh
index d3e788d..72ff28d 100755
--- a/getsource.sh
+++ b/getsource.sh
@@ -1,6 +1,7 @@
 #!/bin/sh
 
 KUBE_GIT_COMMIT="$1"
+KUBE_GIT_SHORT="${KUBE_GIT_COMMIT:0:7}"
 KUBE_GIT_VERSION="$2"
 
 set -o errexit
@@ -9,7 +10,7 @@ set -o pipefail
 
 SPEC=kubernetes.spec
 
-wget https://github.com/GoogleCloudPlatform/kubernetes/archive/${KUBE_GIT_COMMIT}/kubernetes-${KUBE_GIT_COMMIT:0:7}.tar.gz
+curl -s -L https://github.com/GoogleCloudPlatform/kubernetes/archive/${KUBE_GIT_COMMIT}.tar.gz > kubernetes-${KUBE_GIT_SHORT}.tar.gz
 
 since_tag=0
 if [[ "${KUBE_GIT_VERSION}" =~ ^v([0-9]+)\.([0-9]+)\-([0-9]+)\-(.*)?$ ]]; then
@@ -34,4 +35,4 @@ sed -i -e "s/export KUBE_GIT_VERSION=v.*/export KUBE_GIT_VERSION=${KUBE_GIT_VERS
 
 fedpkg clog
 
-echo "****Don't forget to run: fedpkg new-sources kubernetes-${KUBE_GIT_COMMIT:0:7}.tar.gz"
+echo "****Don't forget to run: fedpkg new-sources kubernetes-${KUBE_GIT_SHORT}.tar.gz"
diff --git a/kubernetes.spec b/kubernetes.spec
index 1370554..2d6e3db 100644
--- a/kubernetes.spec
+++ b/kubernetes.spec
@@ -1,24 +1,17 @@
 #debuginfo not supported with Go
 %global debug_package	%{nil}
 %global import_path	github.com/GoogleCloudPlatform/kubernetes
-%global commit		30fcf241312f6d0767c7d9305b4c462f1655f790
+%global commit		df0981bc01c5782ad30fc45cb6f510f365737fc1
 %global shortcommit	%(c=%{commit}; echo ${c:0:7})
 
-#binaries which should be called kube-*
-%global prefixed_binaries proxy apiserver controller-manager scheduler
-#binaries which should not be renamed at all
-%global nonprefixed_binaries kubelet kubectl
-#all of the above
-%global binaries	%{prefixed_binaries} %{nonprefixed_binaries}
-
 #I really need this, otherwise "version_ldflags=$(kube::version_ldflags)"
 # does not work
 %global _buildshell	/bin/bash
 %global _checkshell	/bin/bash
 
 Name:		kubernetes
-Version:	0.4
-Release:	680.0.git%{shortcommit}%{?dist}
+Version:	0.5
+Release:	14.0.git%{shortcommit}%{?dist}
 Summary:	Container cluster management
 License:	ASL 2.0
 URL:		https://github.com/GoogleCloudPlatform/kubernetes
@@ -87,7 +80,7 @@ BuildRequires:	golang(gopkg.in/v1/yaml)
 
 %build
 export KUBE_GIT_COMMIT=%{commit}
-export KUBE_GIT_VERSION=v0.4-680-g30fcf241312f6d
+export KUBE_GIT_VERSION=v0.5-14-gdf0981bc01c578
 
 %if 0%{?fedora}
 export KUBE_GIT_TREE_STATE="dirty"
@@ -122,14 +115,11 @@ kube::golang::setup_env
 
 output_path="${KUBE_OUTPUT_BINPATH}/$(kube::golang::current_platform)"
 
+binaries=(kube-apiserver kube-controller-manager kube-scheduler kube-proxy kubelet kubectl)
 install -m 755 -d %{buildroot}%{_bindir}
-for bin in %{prefixed_binaries}; do
-  echo "+++ INSTALLING ${bin}"
-  install -p -m 755 ${output_path}/${bin} %{buildroot}%{_bindir}/kube-${bin}
-done
-for bin in %{nonprefixed_binaries}; do
+for bin in "${binaries[@]}"; do
   echo "+++ INSTALLING ${bin}"
-  install -p -m 755 ${output_path}/${bin} %{buildroot}%{_bindir}/${bin}
+  install -p -m 755 -t %{buildroot}%{_bindir} ${output_path}/${bin}
 done
 
 # install the bash completion
@@ -189,6 +179,9 @@ getent passwd kube >/dev/null || useradd -r -g kube -d / -s /sbin/nologin \
 %systemd_postun
 
 %changelog
+* Tue Nov 18 2014 Eric Paris <eparis at redhat.com> - 0.5-14.0.gitdf0981b
+- Bump to upstream df0981bc01c5782ad30fc45cb6f510f365737fc1
+
 * Tue Nov 11 2014 Eric Paris <eparis at redhat.com> - 0.4-680.0.git30fcf24
 - Bump to upstream 30fcf241312f6d0767c7d9305b4c462f1655f790
 
diff --git a/sources b/sources
index f5cfb20..a8c9072 100644
--- a/sources
+++ b/sources
@@ -1 +1 @@
-1c6192c082431fc55d7abaf8d36e123e  kubernetes-30fcf24.tar.gz
+697f941606cb89c0170f2218e8ecbbfe  kubernetes-df0981b.tar.gz


More information about the scm-commits mailing list