Add in the abilitiy to run from a local static (as opposed to cached) discovery document. Also added sample for same.
diff --git a/apiclient/discovery.py b/apiclient/discovery.py
index fb9b7c5..b39e1b2 100644
--- a/apiclient/discovery.py
+++ b/apiclient/discovery.py
@@ -83,17 +83,48 @@
       serviceName, "future.json")
   try:
     f = file(fn, "r")
-    d = simplejson.load(f)
+    future = f.read()
     f.close()
-    future = d['resources']
-    auth_discovery = d['auth']
   except IOError:
+    future = None
+
+  return build_from_document(content, discoveryServiceUrl, future,
+      http, developerKey, model, requestBuilder)
+
+def build_from_document(
+    service,
+    base,
+    future=None,
+    http=None,
+    developerKey=None,
+    model=JsonModel(),
+    requestBuilder=HttpRequest):
+  """
+  Args:
+    service: string, discovery document
+    base: string, base URI for all HTTP requests, usually the discovery URI
+    future: string, discovery document with future capabilities
+    auth_discovery: dict, information about the authentication the API supports
+    http: httplib2.Http, An instance of httplib2.Http or something that acts like
+      it that HTTP requests will be made through.
+    developerKey: string, Key for controlling API usage, generated
+      from the API Console.
+    model: Model class instance that serializes and
+      de-serializes requests and responses.
+    requestBuilder: Takes an http request and packages it up to be executed.
+  """
+
+  service = simplejson.loads(service)
+  base = urlparse.urljoin(base, service['restBasePath'])
+  resources = service['resources']
+  if future:
+    doc = simplejson.loads(future)
+    future = doc['resources']
+    auth_discovery = doc.get('auth', {})
+  else:
     future = {}
     auth_discovery = {}
 
-  base = urlparse.urljoin(discoveryServiceUrl, service['restBasePath'])
-  resources = service['resources']
-
   class Service(object):
     """Top level interface for a service"""
 
diff --git a/samples/localdiscovery/buzz.json b/samples/localdiscovery/buzz.json
new file mode 100644
index 0000000..083d086
--- /dev/null
+++ b/samples/localdiscovery/buzz.json
@@ -0,0 +1,1429 @@
+{
+ "name": "buzz",
+ "version": "v1",
+ "description": "Buzz APIs for Buzz Posts, etc.",
+ "restBasePath": "/buzz/v1/",
+ "rpcPath": "/rpc",
+ "resources": {
+  "activities": {
+   "methods": {
+    "count": {
+     "restPath": "activities/count",
+     "rpcMethod": "chili.activities.count",
+     "httpMethod": "GET",
+     "parameters": {
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      }
+     }
+    },
+    "delete": {
+     "restPath": "activities/{userId}/{scope}/{postId}",
+     "rpcMethod": "chili.activities.delete",
+     "httpMethod": "DELETE",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "extractPeopleFromSearch": {
+     "restPath": "activities/search/@people",
+     "rpcMethod": "chili.activities.extractPeopleFromSearch",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "bbox": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "lat": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "lon": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "pid": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "q": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "radius": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      }
+     }
+    },
+    "get": {
+     "restPath": "activities/{userId}/@self/{postId}",
+     "rpcMethod": "chili.activities.get",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "targetLang": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "truncateAtom": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "insert": {
+     "restPath": "activities/{userId}/@self",
+     "rpcMethod": "chili.activities.insert",
+     "httpMethod": "POST",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "preview": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "list": {
+     "restPath": "activities/{userId}/{scope}",
+     "rpcMethod": "chili.activities.list",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-comments": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-liked": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@(self|public|consumption|liked|comments)*",
+       "required": true,
+       "repeated": false
+      },
+      "targetLang": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "truncateAtom": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "search": {
+     "restPath": "activities/search",
+     "rpcMethod": "chili.activities.search",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "bbox": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "lat": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "lon": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "pid": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "q": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "radius": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "targetLang": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "truncateAtom": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      }
+     }
+    },
+    "track": {
+     "restPath": "activities/track",
+     "rpcMethod": "chili.activities.track",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "bbox": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "lat": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "lon": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "pid": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "q": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "radius": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      }
+     }
+    },
+    "update": {
+     "restPath": "activities/{userId}/{scope}/{postId}",
+     "rpcMethod": "chili.activities.update",
+     "httpMethod": "PUT",
+     "parameters": {
+      "abuseType": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  },
+  "comments": {
+   "methods": {
+    "delete": {
+     "restPath": "activities/{userId}/@self/{postId}/@comments/{commentId}",
+     "rpcMethod": "chili.comments.delete",
+     "httpMethod": "DELETE",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "commentId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "get": {
+     "restPath": "activities/{userId}/@self/{postId}/@comments/{commentId}",
+     "rpcMethod": "chili.comments.get",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "commentId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "targetLang": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "insert": {
+     "restPath": "activities/{userId}/@self/{postId}/@comments",
+     "rpcMethod": "chili.comments.insert",
+     "httpMethod": "POST",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "list": {
+     "restPath": "activities/{userId}/{scope}/{postId}/@comments",
+     "rpcMethod": "chili.comments.list",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "targetLang": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "update": {
+     "restPath": "activities/{userId}/{scope}/{postId}/@comments/{commentId}",
+     "rpcMethod": "chili.comments.update",
+     "httpMethod": "PUT",
+     "parameters": {
+      "abuseType": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "commentId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  },
+  "groups": {
+   "methods": {
+    "delete": {
+     "restPath": "people/{userId}/@groups/{groupId}",
+     "rpcMethod": "chili.groups.delete",
+     "httpMethod": "DELETE",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "get": {
+     "restPath": "people/{userId}/@groups/{groupId}/@self",
+     "rpcMethod": "chili.groups.get",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "insert": {
+     "restPath": "people/{userId}/@groups",
+     "rpcMethod": "chili.groups.insert",
+     "httpMethod": "POST",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "list": {
+     "restPath": "people/{userId}/@groups",
+     "rpcMethod": "chili.groups.list",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "update": {
+     "restPath": "people/{userId}/@groups/{groupId}/@self",
+     "rpcMethod": "chili.groups.update",
+     "httpMethod": "PUT",
+     "parameters": {
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  },
+  "people": {
+   "methods": {
+    "delete": {
+     "restPath": "people/{userId}/@groups/{groupId}/{personId}",
+     "rpcMethod": "chili.people.delete",
+     "httpMethod": "DELETE",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "personId": {
+       "restParameterType": "path",
+       "pattern": "(?!@self).*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "get": {
+     "restPath": "people/{userId}/@self",
+     "rpcMethod": "chili.people.get",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "liked": {
+     "restPath": "activities/{userId}/{scope}/{postId}/{groupId}",
+     "rpcMethod": "chili.people.liked",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "@liked",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "list": {
+     "restPath": "people/{userId}/@groups/{groupId}",
+     "rpcMethod": "chili.people.list",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "relatedToUri": {
+     "restPath": "people/{userId}/@related",
+     "rpcMethod": "chili.people.relatedToUri",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "uri": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "reshared": {
+     "restPath": "activities/{userId}/{scope}/{postId}/{groupId}",
+     "rpcMethod": "chili.people.reshared",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "@reshared",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "search": {
+     "restPath": "people/search",
+     "rpcMethod": "chili.people.search",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "q": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      }
+     }
+    },
+    "update": {
+     "restPath": "people/{userId}/@groups/{groupId}/{personId}",
+     "rpcMethod": "chili.people.update",
+     "httpMethod": "PUT",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "groupId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "personId": {
+       "restParameterType": "path",
+       "pattern": "(?!@self).*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  },
+  "photoAlbums": {
+   "methods": {
+    "delete": {
+     "restPath": "photos/{userId}/@self/{albumId}",
+     "rpcMethod": "chili.photoAlbums.delete",
+     "httpMethod": "DELETE",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "get": {
+     "restPath": "photos/{userId}/@self/{albumId}",
+     "rpcMethod": "chili.photoAlbums.get",
+     "httpMethod": "GET",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "insert": {
+     "restPath": "photos/{userId}/@self",
+     "rpcMethod": "chili.photoAlbums.insert",
+     "httpMethod": "POST",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "list": {
+     "restPath": "photos/{userId}/{scope}",
+     "rpcMethod": "chili.photoAlbums.list",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@(self)*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  },
+  "photos": {
+   "methods": {
+    "delete": {
+     "restPath": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
+     "rpcMethod": "chili.photos.delete",
+     "httpMethod": "DELETE",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "photoId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "get": {
+     "restPath": "photos/{userId}/@self/{albumId}/@photos/{photoId}",
+     "rpcMethod": "chili.photos.get",
+     "httpMethod": "GET",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "photoId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "insert": {
+     "restPath": "photos/{userId}/{albumId}",
+     "rpcMethod": "chili.photos.insert",
+     "httpMethod": "POST",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "(@new|[^@].*)",
+       "required": true,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "insert2": {
+     "restPath": "photos/{userId}/@self/{albumId}/@photos",
+     "rpcMethod": "chili.photos.insert2",
+     "httpMethod": "GET",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "listByAlbum": {
+     "restPath": "photos/{userId}/@self/{albumId}/@photos",
+     "rpcMethod": "chili.photos.listByAlbum",
+     "httpMethod": "GET",
+     "parameters": {
+      "albumId": {
+       "restParameterType": "path",
+       "pattern": "[^@].*",
+       "required": true,
+       "repeated": false
+      },
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    },
+    "listByScope": {
+     "restPath": "photos/{userId}/@self/{scope}/@photos",
+     "rpcMethod": "chili.photos.listByScope",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  },
+  "related": {
+   "methods": {
+    "list": {
+     "restPath": "activities/{userId}/{scope}/{postId}/@related",
+     "rpcMethod": "chili.related.list",
+     "httpMethod": "GET",
+     "parameters": {
+      "alt": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "c": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "hl": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "max-results": {
+       "restParameterType": "query",
+       "required": false,
+       "repeated": false
+      },
+      "postId": {
+       "restParameterType": "path",
+       "pattern": ".*",
+       "required": true,
+       "repeated": false
+      },
+      "scope": {
+       "restParameterType": "path",
+       "pattern": "@.*",
+       "required": true,
+       "repeated": false
+      },
+      "userId": {
+       "restParameterType": "path",
+       "pattern": "[^/]+",
+       "required": true,
+       "repeated": false
+      }
+     }
+    }
+   }
+  }
+ }
+}
diff --git a/samples/localdiscovery/buzz.py b/samples/localdiscovery/buzz.py
new file mode 100644
index 0000000..416f58c
--- /dev/null
+++ b/samples/localdiscovery/buzz.py
@@ -0,0 +1,90 @@
+#!/usr/bin/python2.4
+# -*- coding: utf-8 -*-
+#
+# Copyright 2010 Google Inc. All Rights Reserved.
+
+"""Simple command-line example for Buzz.
+
+Command-line application that retrieves the users
+latest content and then adds a new entry.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+from apiclient.discovery import build_from_document
+
+import httplib2
+import pickle
+import pprint
+
+# Uncomment the next line to get very detailed logging
+#httplib2.debuglevel = 4
+
+
+def main():
+  # Load the credentials and authorize
+  f = open("buzz.dat", "r")
+  credentials = pickle.loads(f.read())
+  f.close()
+
+  http = httplib2.Http()
+  http = credentials.authorize(http)
+
+  # Load the local copy of the discovery document
+  f = file("buzz.json", "r")
+  discovery = f.read()
+  f.close()
+
+  # Optionally load a futures discovery document
+  f = file("../../apiclient/contrib/buzz/future.json", "r")
+  future = f.read()
+  f.close()
+
+  # Construct a service from the local documents
+  p = build_from_document(discovery,
+      base="https://www.googleapis.com/",
+      future=future,
+      http=http,
+      developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
+  activities = p.activities()
+
+  # Retrieve the first two activities
+  activitylist = activities.list(
+      max_results='2', scope='@self', userId='@me').execute()
+  print "Retrieved the first two activities"
+
+  # Retrieve the next two activities
+  if activitylist:
+    activitylist = activities.list_next(activitylist).execute()
+    print "Retrieved the next two activities"
+
+  # Add a new activity
+  new_activity_body = {
+      "data": {
+        'title': 'Testing insert',
+        'object': {
+          'content': u'Just a short note to show that insert is working. ☄',
+          'type': 'note'}
+        }
+      }
+  activity = activities.insert(userId='@me', body=new_activity_body).execute()
+  print "Added a new activity"
+
+  activitylist = activities.list(
+      max_results='2', scope='@self', userId='@me').execute()
+
+  # Add a comment to that activity
+  comment_body = {
+      "data": {
+          "content": "This is a comment"
+          }
+      }
+  item = activitylist['items'][0]
+  comment = p.comments().insert(
+      userId=item['actor']['id'], postId=item['id'], body=comment_body
+      ).execute()
+  print 'Added a comment to the new activity'
+  pprint.pprint(comment)
+
+if __name__ == '__main__':
+  main()
diff --git a/samples/localdiscovery/three_legged_dance.py b/samples/localdiscovery/three_legged_dance.py
new file mode 100644
index 0000000..2dc26e5
--- /dev/null
+++ b/samples/localdiscovery/three_legged_dance.py
@@ -0,0 +1,40 @@
+# Copyright (C) 2010 Google Inc.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Do the OAuth 1.0a three legged dance.
+
+Do the OAuth 1.0a three legged dance for
+a Buzz command line application. Store the generated
+credentials in a common file that is used by
+other example apps in the same directory.
+"""
+
+__author__ = 'jcgregorio@google.com (Joe Gregorio)'
+
+from apiclient.discovery import build
+from apiclient.oauth import FlowThreeLegged
+from apiclient.ext.authtools import run
+
+
+buzz_discovery = build("buzz", "v1").auth_discovery()
+
+flow = FlowThreeLegged(buzz_discovery,
+                       consumer_key='anonymous',
+                       consumer_secret='anonymous',
+                       user_agent='google-api-client-python-buzz-cmdline/1.0',
+                       domain='anonymous',
+                       scope='https://www.googleapis.com/auth/buzz',
+                       xoauth_displayname='Google API Client Example App')
+
+run(flow, 'buzz.dat')