diff --git a/samples/appengine/main.py b/samples/appengine/main.py
index 89805aa..087a136 100755
--- a/samples/appengine/main.py
+++ b/samples/appengine/main.py
@@ -21,11 +21,13 @@
 import httplib2
 import logging
 import os
+import pickle
 
 from apiclient.discovery import build
-from apiclient.ext.appengine import FlowThreeLeggedProperty
-from apiclient.ext.appengine import OAuthCredentialsProperty
-from apiclient.oauth import FlowThreeLegged
+from oauth2client.appengine import CredentialsProperty
+from oauth2client.appengine import StorageByKeyName
+from oauth2client.client import OAuth2WebServerFlow
+from google.appengine.api import memcache
 from google.appengine.api import users
 from google.appengine.ext import db
 from google.appengine.ext import webapp
@@ -34,13 +36,8 @@
 from google.appengine.ext.webapp.util import login_required
 
 
-class Flow(db.Model):
-  # FlowThreeLegged could also be stored in memcache.
-  flow = FlowThreeLeggedProperty()
-
-
 class Credentials(db.Model):
-  credentials = OAuthCredentialsProperty()
+  credentials = CredentialsProperty()
 
 
 class MainHandler(webapp.RequestHandler):
@@ -48,16 +45,32 @@
   @login_required
   def get(self):
     user = users.get_current_user()
-    c = Credentials.get_by_key_name(user.user_id())
+    credentials = StorageByKeyName(
+        Credentials, user.user_id(), 'credentials').get()
 
-    if c:
+    if credentials is None or credentials.invalid == True:
+      flow = OAuth2WebServerFlow(
+          # Visit https://code.google.com/apis/console to
+          # generate your client_id, client_secret and to
+          # register your redirect_uri.
+          client_id='<YOUR CLIENT ID HERE>',
+          client_secret='<YOUR CLIENT SECRET HERE>',
+          scope='https://www.googleapis.com/auth/buzz',
+          user_agent='buzz-cmdline-sample/1.0',
+          domain='anonymous',
+          xoauth_displayname='Google App Engine Example App')
+
+      callback = self.request.relative_url('/auth_return')
+      authorize_url = flow.step1_get_authorize_url(callback)
+      memcache.set(user.user_id(), pickle.dumps(flow))
+      self.redirect(authorize_url)
+    else:
       http = httplib2.Http()
-      http = c.credentials.authorize(http)
+      http = credentials.authorize(http)
       service = build("buzz", "v1", http=http)
       activities = service.activities()
       activitylist = activities.list(scope='@consumption',
                                      userId='@me').execute()
-      logging.info(activitylist)
       path = os.path.join(os.path.dirname(__file__), 'welcome.html')
       logout = users.create_logout_url('/')
       self.response.out.write(
@@ -65,21 +78,6 @@
               path, {'activitylist': activitylist,
                      'logout': logout
                      }))
-    else:
-      p = build("buzz", "v1")
-      flow = FlowThreeLegged(p.auth_discovery(),
-                     consumer_key='anonymous',
-                     consumer_secret='anonymous',
-                     user_agent='google-api-client-python-buzz-webapp/1.0',
-                     domain='anonymous',
-                     scope='https://www.googleapis.com/auth/buzz',
-                     xoauth_displayname='Example Web App')
-
-      callback = self.request.relative_url('/auth_return')
-      authorize_url = flow.step1_get_authorize_url(callback)
-      f = Flow(key_name=user.user_id(), flow=flow)
-      f.put()
-      self.redirect(authorize_url)
 
 
 class OAuthHandler(webapp.RequestHandler):
@@ -87,12 +85,11 @@
   @login_required
   def get(self):
     user = users.get_current_user()
-    f = Flow.get_by_key_name(user.user_id())
-    if f:
-      credentials = f.flow.step2_exchange(self.request.params)
-      c = Credentials(key_name=user.user_id(), credentials=credentials)
-      c.put()
-      f.delete()
+    flow = pickle.loads(memcache.get(user.user_id()))
+    if flow:
+      credentials = flow.step2_exchange(self.request.params)
+      StorageByKeyName(
+          Credentials, user.user_id(), 'credentials').put(credentials)
       self.redirect("/")
     else:
       pass
diff --git a/samples/buzz/buzz.py b/samples/buzz/buzz.py
index f093f20..74ee3a4 100644
--- a/samples/buzz/buzz.py
+++ b/samples/buzz/buzz.py
@@ -11,85 +11,85 @@
 
 __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 
-from apiclient.discovery import build
-from apiclient.oauth import FlowThreeLegged
-from apiclient.ext.authtools import run
-from apiclient.ext.file import Storage
-from apiclient.oauth import CredentialsInvalidError
-
+import gflags
 import httplib2
+import logging
 import pprint
+import sys
 
-# Uncomment the next line to get very detailed logging
-#httplib2.debuglevel = 4
+from apiclient.discovery import build
+from oauth2client.file import Storage
+from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.tools import run
+
+FLAGS = gflags.FLAGS
+FLOW = OAuth2WebServerFlow(
+    client_id='433807057907.apps.googleusercontent.com',
+    client_secret='jigtZpMApkRxncxikFpR+SFg',
+    scope='https://www.googleapis.com/auth/buzz',
+    user_agent='buzz-cmdline-sample/1.0')
+
+gflags.DEFINE_enum('logging_level', 'ERROR',
+    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+    'Set the level of logging detail.')
 
 
-def main():
+def main(argv):
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
+    sys.exit(1)
+
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
   storage = Storage('buzz.dat')
   credentials = storage.get()
   if credentials is None or credentials.invalid == True:
-    buzz_discovery = build("buzz", "v1").auth_discovery()
-
-    flow = FlowThreeLegged(buzz_discovery,
-                           consumer_key='anonymous',
-                           consumer_secret='anonymous',
-                           user_agent='python-buzz-sample/1.0',
-                           domain='anonymous',
-                           scope='https://www.googleapis.com/auth/buzz',
-                           xoauth_displayname='Google API Client Example App')
-
-    credentials = run(flow, storage)
+    credentials = run(FLOW, storage)
 
   http = httplib2.Http()
   http = credentials.authorize(http)
 
+  # Build the Buzz service
   service = build("buzz", "v1", http=http,
-      developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
+            developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
   activities = service.activities()
 
-  try:
-    # Retrieve the first two activities
-    activitylist = activities.list(
-        max_results='2', scope='@self', userId='@me').execute()
-    print "Retrieved the first two 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"
+  # 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"
+  # Add a new activity
+  new_activity_body = {
+      '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()
+  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 = service.comments().insert(
-        userId=item['actor']['id'], postId=item['id'], body=comment_body
-        ).execute()
-    print 'Added a comment to the new activity'
-    pprint.pprint(comment)
-  except CredentialsInvalidError:
-    print 'Your credentials are no longer valid.'
-    print 'Please re-run this application to re-authorize.'
+  # Add a comment to that activity
+  comment_body = {
+      "content": "This is a comment"
+      }
+  item = activitylist['items'][0]
+  comment = service.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()
+  main(sys.argv)
diff --git a/samples/django_sample/buzz/models.py b/samples/django_sample/buzz/models.py
index 11a408d..69c180c 100644
--- a/samples/django_sample/buzz/models.py
+++ b/samples/django_sample/buzz/models.py
@@ -5,23 +5,23 @@
 from django.contrib.auth.models import User
 from django.db import models
 
-from apiclient.ext.django_orm import FlowThreeLeggedField
-from apiclient.ext.django_orm import OAuthCredentialsField
+from oauth2client.django_orm import FlowField
+from oauth2client.django_orm import CredentialsField
 
 # The Flow could also be stored in memcache since it is short lived.
 
 
-class Flow(models.Model):
+class FlowModel(models.Model):
   id = models.ForeignKey(User, primary_key=True)
-  flow = FlowThreeLeggedField()
+  flow = FlowField()
 
 
-class Credential(models.Model):
+class CredentialsModel(models.Model):
   id = models.ForeignKey(User, primary_key=True)
-  credential = OAuthCredentialsField()
+  credential = CredentialsField()
 
 
-class CredentialAdmin(admin.ModelAdmin):
+class CredentialsAdmin(admin.ModelAdmin):
     pass
 
 
@@ -29,5 +29,5 @@
     pass
 
 
-admin.site.register(Credential, CredentialAdmin)
-admin.site.register(Flow, FlowAdmin)
+admin.site.register(CredentialsModel, CredentialsAdmin)
+admin.site.register(FlowModel, FlowAdmin)
diff --git a/samples/django_sample/buzz/views.py b/samples/django_sample/buzz/views.py
index 0205c4f..c942aaf 100644
--- a/samples/django_sample/buzz/views.py
+++ b/samples/django_sample/buzz/views.py
@@ -5,9 +5,13 @@
 from django.http import HttpResponse
 from django.core.urlresolvers import reverse
 from django.contrib.auth.decorators import login_required
-from django_sample.buzz.models import Credential, Flow
+
+from oauth2client.django_orm import Storage
+from oauth2client.client import OAuth2WebServerFlow
+from django_sample.buzz.models import CredentialsModel
+from django_sample.buzz.models import FlowModel
 from apiclient.discovery import build
-from apiclient.oauth import FlowThreeLegged
+
 from django.http import HttpResponseRedirect
 from django.shortcuts import render_to_response
 
@@ -16,10 +20,23 @@
 
 @login_required
 def index(request):
-  try:
-    c = Credential.objects.get(id=request.user)
+  storage = Storage(CredentialsModel, 'id', request.user, 'credential')
+  credential = storage.get()
+  if credential is None or credential.invalid == True:
+    flow = OAuth2WebServerFlow(
+        client_id='837647042410.apps.googleusercontent.com',
+        client_secret='+SWwMCL9d8gWtzPRa1lXw5R8',
+        scope='https://www.googleapis.com/auth/buzz',
+        user_agent='buzz-django-sample/1.0',
+        )
+
+    authorize_url = flow.step1_get_authorize_url(STEP2_URI)
+    f = FlowModel(id=request.user, flow=flow)
+    f.save()
+    return HttpResponseRedirect(authorize_url)
+  else:
     http = httplib2.Http()
-    http = c.credential.authorize(http)
+    http = credential.authorize(http)
     service = build("buzz", "v1", http=http)
     activities = service.activities()
     activitylist = activities.list(scope='@consumption',
@@ -30,30 +47,15 @@
                 'activitylist': activitylist,
                 })
 
-  except Credential.DoesNotExist:
-    service = build("buzz", "v1")
-    flow = FlowThreeLegged(service.auth_discovery(),
-                   consumer_key='anonymous',
-                   consumer_secret='anonymous',
-                   user_agent='google-api-client-python-buzz-django/1.0',
-                   domain='anonymous',
-                   scope='https://www.googleapis.com/auth/buzz',
-                   xoauth_displayname='Django Example Web App')
-
-    authorize_url = flow.step1_get_authorize_url(STEP2_URI)
-    f = Flow(id=request.user, flow=flow)
-    f.save()
-    return HttpResponseRedirect(authorize_url)
-
 
 @login_required
 def auth_return(request):
     try:
-      f = Flow.objects.get(id=request.user)
+      f = FlowModel.objects.get(id=request.user)
       credential = f.flow.step2_exchange(request.REQUEST)
-      c = Credential(id=request.user, credential=credential)
-      c.save()
+      storage = Storage(CredentialsModel, 'id', request.user, 'credential')
+      storage.put(credential)
       f.delete()
       return HttpResponseRedirect("/")
-    except Flow.DoesNotExist:
+    except FlowModel.DoesNotExist:
       pass
diff --git a/samples/moderator/moderator.py b/samples/moderator/moderator.py
index 080c599..c75c962 100644
--- a/samples/moderator/moderator.py
+++ b/samples/moderator/moderator.py
@@ -3,89 +3,100 @@
 #
 # Copyright 2010 Google Inc. All Rights Reserved.
 
-"""Simple command-line example for Buzz.
+"""Simple command-line example for Moderator.
 
-Command-line application that retrieves the users
-latest content and then adds a new entry.
+Command-line application that exercises the Google Moderator API.
 """
 
 __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 
+import gflags
+import httplib2
+import logging
+import sys
 
 from apiclient.discovery import build
-from apiclient.oauth import FlowThreeLegged
-from apiclient.ext.authtools import run
-from apiclient.ext.file import Storage
-from apiclient.oauth import CredentialsInvalidError
+from oauth2client.file import Storage
+from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.tools import run
 
-import httplib2
+FLAGS = gflags.FLAGS
+FLOW = OAuth2WebServerFlow(
+    client_id='433807057907.apps.googleusercontent.com',
+    client_secret='jigtZpMApkRxncxikFpR+SFg',
+    scope='https://www.googleapis.com/auth/moderator',
+    user_agent='moderator-cmdline-sample/1.0')
 
-# Uncomment to get detailed logging
-# httplib2.debuglevel = 4
+gflags.DEFINE_enum('logging_level', 'ERROR',
+    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+    'Set the level of logging detail.')
 
 
-def main():
+def main(argv):
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
+    sys.exit(1)
+
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
   storage = Storage('moderator.dat')
   credentials = storage.get()
+
   if credentials is None or credentials.invalid == True:
-    moderator_discovery = build('moderator', 'v1').auth_discovery()
+    credentials = run(FLOW, storage)
 
-    flow = FlowThreeLegged(moderator_discovery,
-                           consumer_key='anonymous',
-                           consumer_secret='anonymous',
-                           user_agent='python-moderator-sample/1.0',
-                           domain='anonymous',
-                           scope='https://www.googleapis.com/auth/moderator',
-                           xoauth_displayname='Google API Client Example App')
-
-    credentials = run(flow, storage)
-
-  http = httplib2.Http()
+  http = httplib2.Http(cache=".cache")
   http = credentials.authorize(http)
 
-  service = build('moderator', 'v1', http=http)
+  service = build("moderator", "v1", http=http)
 
   series_body = {
-      'description': 'Share and rank tips for eating healthy and cheap!',
-      'name': 'Eating Healthy & Cheap',
-      'videoSubmissionAllowed': False
+      "data": {
+        "description": "Share and rank tips for eating healthy and cheap!",
+        "name": "Eating Healthy & Cheap",
+        "videoSubmissionAllowed": False
+        }
       }
-  try:
-    series = service.series().insert(body=series_body).execute()
-    print 'Created a new series'
+  series = service.series().insert(body=series_body).execute()
+  print "Created a new series"
 
-    topic_body = {
-        'description': 'Share your ideas on eating healthy!',
-        'name': 'Ideas',
-        'presenter': 'liz'
+  topic_body = {
+      "data": {
+        "description": "Share your ideas on eating healthy!",
+        "name": "Ideas",
+        "presenter": "liz"
         }
-    topic = service.topics().insert(seriesId=series['id']['seriesId'],
-                              body=topic_body).execute()
-    print 'Created a new topic'
+      }
+  topic = service.topics().insert(seriesId=series['id']['seriesId'],
+                            body=topic_body).execute()
+  print "Created a new topic"
 
-    submission_body = {
-        'attachmentUrl': 'http://www.youtube.com/watch?v=1a1wyc5Xxpg',
-        'attribution': {
-          'displayName': 'Bashan',
-          'location': 'Bainbridge Island, WA'
+  submission_body = {
+      "data": {
+        "attachmentUrl": "http://www.youtube.com/watch?v=1a1wyc5Xxpg",
+        "attribution": {
+          "displayName": "Bashan",
+          "location": "Bainbridge Island, WA"
           },
-        'text': 'Charlie Ayers @ Google'
+        "text": "Charlie Ayers @ Google"
         }
-    submission = service.submissions().insert(seriesId=topic['id']['seriesId'],
-        topicId=topic['id']['topicId'], body=submission_body).execute()
-    print 'Inserted a new submisson on the topic'
+      }
+  submission = service.submissions().insert(seriesId=topic['id']['seriesId'],
+      topicId=topic['id']['topicId'], body=submission_body).execute()
+  print "Inserted a new submisson on the topic"
 
-    vote_body = {
-        'vote': 'PLUS'
+  vote_body = {
+      "data": {
+        "vote": "PLUS"
         }
-    service.votes().insert(seriesId=topic['id']['seriesId'],
-                     submissionId=submission['id']['submissionId'],
-                     body=vote_body)
-    print 'Voted on the submission'
-  except CredentialsInvalidError:
-    print 'Your credentials are no longer valid.'
-    print 'Please re-run this application to re-authorize.'
+      }
+  service.votes().insert(seriesId=topic['id']['seriesId'],
+                   submissionId=submission['id']['submissionId'],
+                   body=vote_body)
+  print "Voted on the submission"
 
 
 if __name__ == '__main__':
-  main()
+  main(sys.argv)
diff --git a/samples/oauth2/buzz/buzz.py b/samples/oauth2/buzz/buzz.py
deleted file mode 100644
index 74ee3a4..0000000
--- a/samples/oauth2/buzz/buzz.py
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/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)'
-
-import gflags
-import httplib2
-import logging
-import pprint
-import sys
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
-from oauth2client.tools import run
-
-FLAGS = gflags.FLAGS
-FLOW = OAuth2WebServerFlow(
-    client_id='433807057907.apps.googleusercontent.com',
-    client_secret='jigtZpMApkRxncxikFpR+SFg',
-    scope='https://www.googleapis.com/auth/buzz',
-    user_agent='buzz-cmdline-sample/1.0')
-
-gflags.DEFINE_enum('logging_level', 'ERROR',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-
-def main(argv):
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
-    sys.exit(1)
-
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  storage = Storage('buzz.dat')
-  credentials = storage.get()
-  if credentials is None or credentials.invalid == True:
-    credentials = run(FLOW, storage)
-
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-  # Build the Buzz service
-  service = build("buzz", "v1", http=http,
-            developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
-  activities = service.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 = {
-      '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 = {
-      "content": "This is a comment"
-      }
-  item = activitylist['items'][0]
-  comment = service.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(sys.argv)
diff --git a/samples/oauth2/moderator/moderator.py b/samples/oauth2/moderator/moderator.py
deleted file mode 100644
index c75c962..0000000
--- a/samples/oauth2/moderator/moderator.py
+++ /dev/null
@@ -1,102 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright 2010 Google Inc. All Rights Reserved.
-
-"""Simple command-line example for Moderator.
-
-Command-line application that exercises the Google Moderator API.
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-import gflags
-import httplib2
-import logging
-import sys
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
-from oauth2client.tools import run
-
-FLAGS = gflags.FLAGS
-FLOW = OAuth2WebServerFlow(
-    client_id='433807057907.apps.googleusercontent.com',
-    client_secret='jigtZpMApkRxncxikFpR+SFg',
-    scope='https://www.googleapis.com/auth/moderator',
-    user_agent='moderator-cmdline-sample/1.0')
-
-gflags.DEFINE_enum('logging_level', 'ERROR',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-
-def main(argv):
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
-    sys.exit(1)
-
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  storage = Storage('moderator.dat')
-  credentials = storage.get()
-
-  if credentials is None or credentials.invalid == True:
-    credentials = run(FLOW, storage)
-
-  http = httplib2.Http(cache=".cache")
-  http = credentials.authorize(http)
-
-  service = build("moderator", "v1", http=http)
-
-  series_body = {
-      "data": {
-        "description": "Share and rank tips for eating healthy and cheap!",
-        "name": "Eating Healthy & Cheap",
-        "videoSubmissionAllowed": False
-        }
-      }
-  series = service.series().insert(body=series_body).execute()
-  print "Created a new series"
-
-  topic_body = {
-      "data": {
-        "description": "Share your ideas on eating healthy!",
-        "name": "Ideas",
-        "presenter": "liz"
-        }
-      }
-  topic = service.topics().insert(seriesId=series['id']['seriesId'],
-                            body=topic_body).execute()
-  print "Created a new topic"
-
-  submission_body = {
-      "data": {
-        "attachmentUrl": "http://www.youtube.com/watch?v=1a1wyc5Xxpg",
-        "attribution": {
-          "displayName": "Bashan",
-          "location": "Bainbridge Island, WA"
-          },
-        "text": "Charlie Ayers @ Google"
-        }
-      }
-  submission = service.submissions().insert(seriesId=topic['id']['seriesId'],
-      topicId=topic['id']['topicId'], body=submission_body).execute()
-  print "Inserted a new submisson on the topic"
-
-  vote_body = {
-      "data": {
-        "vote": "PLUS"
-        }
-      }
-  service.votes().insert(seriesId=topic['id']['seriesId'],
-                   submissionId=submission['id']['submissionId'],
-                   body=vote_body)
-  print "Voted on the submission"
-
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/oauth2/urlshortener/main.py b/samples/oauth2/urlshortener/main.py
deleted file mode 100644
index 62945c5..0000000
--- a/samples/oauth2/urlshortener/main.py
+++ /dev/null
@@ -1,72 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright 2010 Google Inc. All Rights Reserved.
-
-"""Simple command-line example for Google URL Shortener API.
-
-Command-line application that shortens a URL.
-"""
-
-__author__ = 'jcgregorio@google.com (Joe Gregorio)'
-
-import gflags
-import httplib2
-import logging
-import pprint
-import sys
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import OAuth2WebServerFlow
-from oauth2client.client import AccessTokenCredentials
-from oauth2client.tools import run
-
-FLAGS = gflags.FLAGS
-FLOW = OAuth2WebServerFlow(
-    client_id='433807057907.apps.googleusercontent.com',
-    client_secret='jigtZpMApkRxncxikFpR+SFg',
-    scope='https://www.googleapis.com/auth/urlshortener',
-    user_agent='urlshortener-cmdline-sample/1.0')
-
-gflags.DEFINE_enum('logging_level', 'ERROR',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-
-def main(argv):
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
-    sys.exit(1)
-
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  storage = Storage('urlshortener.dat')
-  credentials = storage.get()
-  if credentials is None or credentials.invalid == True:
-    credentials = run(FLOW, storage)
-
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-  # Build the url shortener service
-  service = build("urlshortener", "v1", http=http,
-            developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
-  url = service.url()
-
-  # Create a shortened URL by inserting the URL into the url collection.
-  body = {"longUrl": "http://code.google.com/apis/urlshortener/" }
-  resp = url.insert(body=body).execute()
-  pprint.pprint(resp)
-
-  shortUrl = resp['id']
-
-  # Convert the shortened URL back into a long URL
-  resp = url.get(shortUrl=shortUrl).execute()
-  pprint.pprint(resp)
-
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/urlshortener/main.py b/samples/urlshortener/main.py
index 4609c9f..62945c5 100644
--- a/samples/urlshortener/main.py
+++ b/samples/urlshortener/main.py
@@ -10,19 +10,49 @@
 
 __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 
-from apiclient.discovery import build
-
+import gflags
+import httplib2
+import logging
 import pprint
+import sys
 
-# Uncomment the next two lines to get very detailed logging
-#import httplib2
-#httplib2.debuglevel = 4
+from apiclient.discovery import build
+from oauth2client.file import Storage
+from oauth2client.client import OAuth2WebServerFlow
+from oauth2client.client import AccessTokenCredentials
+from oauth2client.tools import run
+
+FLAGS = gflags.FLAGS
+FLOW = OAuth2WebServerFlow(
+    client_id='433807057907.apps.googleusercontent.com',
+    client_secret='jigtZpMApkRxncxikFpR+SFg',
+    scope='https://www.googleapis.com/auth/urlshortener',
+    user_agent='urlshortener-cmdline-sample/1.0')
+
+gflags.DEFINE_enum('logging_level', 'ERROR',
+    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+    'Set the level of logging detail.')
 
 
-def main():
+def main(argv):
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
+    sys.exit(1)
+
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
+  storage = Storage('urlshortener.dat')
+  credentials = storage.get()
+  if credentials is None or credentials.invalid == True:
+    credentials = run(FLOW, storage)
+
+  http = httplib2.Http()
+  http = credentials.authorize(http)
 
   # Build the url shortener service
-  service = build("urlshortener", "v1",
+  service = build("urlshortener", "v1", http=http,
             developerKey="AIzaSyDRRpR3GS1F1_jKNNM9HCNd2wJQyPG3oN0")
   url = service.url()
 
@@ -37,5 +67,6 @@
   resp = url.get(shortUrl=shortUrl).execute()
   pprint.pprint(resp)
 
+
 if __name__ == '__main__':
-  main()
+  main(sys.argv)
