diff --git a/samples/analytics/client_secrets.json b/samples/analytics/client_secrets.json
new file mode 100644
index 0000000..323ffd0
--- /dev/null
+++ b/samples/analytics/client_secrets.json
@@ -0,0 +1,9 @@
+{
+  "installed": {
+    "client_id": "[[INSERT CLIENT ID HERE]]",
+    "client_secret": "[[INSERT CLIENT SECRET HERE]]",
+    "redirect_uris": [],
+    "auth_uri": "https://accounts.google.com/o/oauth2/auth",
+    "token_uri": "https://accounts.google.com/o/oauth2/token"
+  }
+}
diff --git a/samples/analytics/core_reporting_v3_reference.py b/samples/analytics/core_reporting_v3_reference.py
new file mode 100755
index 0000000..6132263
--- /dev/null
+++ b/samples/analytics/core_reporting_v3_reference.py
@@ -0,0 +1,255 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+#
+# 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.
+
+"""Reference command-line example for Google Analytics Core Reporting API v3.
+
+This application demonstrates how to use the python client library to access
+all the pieces of data returned by the Google Analytics Core Reporting API v3.
+
+The application manages autorization by saving an OAuth2.0 token in a local
+file and reusing the token for subsequent requests.
+
+Before You Begin:
+
+Update the client_secrets.json file
+
+  You must update the clients_secrets.json file with a client id, client
+  secret, and the redirect uri. You get these values by creating a new project
+  in the Google APIs console and registering for OAuth2.0 for installed
+  applications: https://code.google.com/apis/console
+
+  Learn more about registering your analytics application here:
+  http://code.google.com/apis/analytics/docs/gdata/v3/gdataAuthorization.html
+
+Supply your TABLE_ID
+
+  You will also need to identify from which profile to access data by
+  specifying the TABLE_ID constant below. This value is of the form: ga:xxxx
+  where xxxx is the profile ID. You can get the profile ID by either querying
+  the Management API or by looking it up in the account settings of the
+  Google Anlaytics web interface.
+
+Sample Usage:
+
+  $ python core_reporting_v3_reference.py
+
+Also you can also get help on all the command-line flags the program
+understands by running:
+
+  $ python core_reporting_v3_reference.py --help
+"""
+
+__author__ = 'api.nickm@gmail.com (Nick Mihailovski)'
+
+import sys
+import sample_utils
+
+from apiclient.errors import HttpError
+from oauth2client.client import AccessTokenRefreshError
+
+
+# The table ID is used to identify from which Google Anlaytics profile
+# to retrieve data. This ID is in the format ga:xxxx where xxxx is the
+# profile ID.
+TABLE_ID = 'INSERT_YOUR_TABLE_ID_HERE'
+
+
+def main(argv):
+  sample_utils.process_flags(argv)
+
+  # Authenticate and construct service.
+  service = sample_utils.initialize_service()
+
+  # Try to make a request to the API. Print the results or handle errors.
+  try:
+    results = get_api_query(service).execute()
+    print_results(results)
+
+  except TypeError, error:
+    # Handle errors in constructing a query.
+    print ('There was an error in constructing your query : %s' % error)
+
+  except HttpError, error:
+    # Handle API errors.
+    print ('Arg, there was an API error : %s : %s' %
+           (error.resp.status, error._get_reason()))
+
+  except AccessTokenRefreshError:
+    # Handle Auth errors.
+    print ('The credentials have been revoked or expired, please re-run '
+           'the application to re-authorize')
+
+
+def get_api_query(service):
+  """Returns a query object to retrieve data from the Core Reporting API.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+  """
+
+  return service.data().ga().get(
+      ids=TABLE_ID,
+      start_date='2012-01-01',
+      end_date='2012-01-15',
+      metrics='ga:visits',
+      dimensions='ga:source,ga:keyword',
+      sort='-ga:visits',
+      filters='ga:medium==organic',
+      start_index='1',
+      max_results='25')
+
+
+def print_results(results):
+  """Prints all the results in the Core Reporting API Response.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print_report_info(results)
+  print_pagination_info(results)
+  print_profile_info(results)
+  print_query(results)
+  print_column_headers(results)
+  print_totals_for_all_results(results)
+  print_rows(results)
+
+
+def print_report_info(results):
+  """Prints general information about this report.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Report Infos:'
+  print 'Contains Sampled Data = %s' % results.get('containsSampledData')
+  print 'Kind                  = %s' % results.get('kind')
+  print 'ID                    = %s' % results.get('id')
+  print 'Self Link             = %s' % results.get('selfLink')
+  print
+
+
+def print_pagination_info(results):
+  """Prints common pagination details.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Pagination Infos:'
+  print 'Items per page = %s' % results.get('itemsPerPage')
+  print 'Total Results  = %s' % results.get('totalResults')
+
+  # These only have values if other result pages exist.
+  if results.get('previousLink'):
+    print 'Previous Link  = %s' % results.get('previousLink')
+  if results.get('nextLink'):
+    print 'Next Link      = %s' % results.get('nextLink')
+  print
+
+
+def print_profile_info(results):
+  """Prints information about the profile.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Profile Infos:'
+  info = results.get('profileInfo')
+  print 'Account Id      = %s' % info.get('accountId')
+  print 'Web Property Id = %s' % info.get('webPropertyId')
+  print 'Profile Id      = %s' % info.get('profileId')
+  print 'Table Id        = %s' % info.get('tableId')
+  print 'Profile Name    = %s' % info.get('profileName')
+  print
+
+
+def print_query(results):
+  """The query returns the original report query as a dict.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Query Parameters:'
+  query = results.get('query')
+  for key, value in query.iteritems():
+    print '%s = %s' % (key, value)
+  print
+
+
+def print_column_headers(results):
+  """Prints the information for each column.
+
+  The main data from the API is returned as rows of data. The column
+  headers describe the names and types of each column in rows.
+
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Column Headers:'
+  headers = results.get('columnHeaders')
+  for header in headers:
+    # Print Dimension or Metric name.
+    print '\t%s name:    = %s' % (header.get('columnType').title(),
+                                  header.get('name'))
+    print '\tColumn Type = %s' % header.get('columnType')
+    print '\tData Type   = %s' % header.get('dataType')
+    print
+
+
+def print_totals_for_all_results(results):
+  """Prints the total metric value for all pages the query matched.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Total Metrics For All Results:'
+  print 'This query returned %s rows.' % len(results.get('rows'))
+  print ('But the query matched %s total results.' %
+         results.get('totalResults'))
+  print 'Here are the metric totals for the matched total results.'
+  totals = results.get('totalsForAllResults')
+
+  for metric_name, metric_total in totals.iteritems():
+    print 'Metric Name  = %s' % metric_name
+    print 'Metric Total = %s' % metric_total
+    print
+
+
+def print_rows(results):
+  """Prints all the rows of data returned by the API.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print 'Rows:'
+  if results.get('rows', []):
+    for row in results.get('rows'):
+      print '\t'.join(row)
+  else:
+    print 'No Rows Found'
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/samples/analytics/hello_analytics_api_v3.py b/samples/analytics/hello_analytics_api_v3.py
new file mode 100755
index 0000000..271c213
--- /dev/null
+++ b/samples/analytics/hello_analytics_api_v3.py
@@ -0,0 +1,176 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+#
+# 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.
+
+"""Simple intro to using the Google Analytics API v3.
+
+This application demonstrates how to use the python client library to access
+Google Analytics data. The sample traverses the Management API to obtain the
+authorized user's first profile ID. Then the sample uses this ID to
+contstruct a Core Reporting API query to return the top 25 organic search
+terms.
+
+Before you begin, you must sigup for a new project in the Google APIs console:
+https://code.google.com/apis/console
+
+Then register the project to use OAuth2.0 for installed applications.
+
+Finally you will need to add the client id, client secret, and redirect URL
+into the client_secrets.json file that is in the same directory as this sample.
+
+Sample Usage:
+
+  $ python hello_analytics_api_v3.py
+
+Also you can also get help on all the command-line flags the program
+understands by running:
+
+  $ python hello_analytics_api_v3.py --help
+"""
+
+__author__ = 'api.nickm@gmail.com (Nick Mihailovski)'
+
+import sys
+import sample_utils
+
+from apiclient.errors import HttpError
+from oauth2client.client import AccessTokenRefreshError
+
+
+def main(argv):
+  sample_utils.process_flags(argv)
+
+  # Authenticate and construct service.
+  service = sample_utils.initialize_service()
+
+  # Try to make a request to the API. Print the results or handle errors.
+  try:
+    first_profile_id = get_first_profile_id(service)
+    if not first_profile_id:
+      print 'Could not find a valid profile for this user.'
+    else:
+      results = get_top_keywords(service, first_profile_id)
+      print_results(results)
+
+  except TypeError, error:
+    # Handle errors in constructing a query.
+    print ('There was an error in constructing your query : %s' % error)
+
+  except HttpError, error:
+    # Handle API errors.
+    print ('Arg, there was an API error : %s : %s' %
+           (error.resp.status, error._get_reason()))
+
+  except AccessTokenRefreshError:
+    # Handle Auth errors.
+    print ('The credentials have been revoked or expired, please re-run '
+           'the application to re-authorize')
+
+
+def get_first_profile_id(service):
+  """Traverses Management API to return the first profile id.
+
+  This first queries the Accounts collection to get the first account ID.
+  This ID is used to query the Webproperties collection to retrieve the first
+  webproperty ID. And both account and webproperty IDs are used to query the
+  Profile collection to get the first profile id.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+
+  Returns:
+    A string with the first profile ID. None if a user does not have any
+    accounts, webproperties, or profiles.
+  """
+
+  accounts = service.management().accounts().list().execute()
+
+  if accounts.get('items'):
+    firstAccountId = accounts.get('items')[0].get('id')
+    webproperties = service.management().webproperties().list(
+        accountId=firstAccountId).execute()
+
+    if webproperties.get('items'):
+      firstWebpropertyId = webproperties.get('items')[0].get('id')
+      profiles = service.management().profiles().list(
+          accountId=firstAccountId,
+          webPropertyId=firstWebpropertyId).execute()
+
+      if profiles.get('items'):
+        return profiles.get('items')[0].get('id')
+
+  return None
+
+
+def get_top_keywords(service, profile_id):
+  """Executes and returns data from the Core Reporting API.
+
+  This queries the API for the top 25 organic search terms by visits.
+
+  Args:
+    service: The service object built by the Google API Python client library.
+    profile_id: String The profile ID from which to retrieve analytics data.
+
+  Returns:
+    The response returned from the Core Reporting API.
+  """
+
+  return service.data().ga().get(
+      ids='ga:' + profile_id,
+      start_date='2012-01-01',
+      end_date='2012-01-15',
+      metrics='ga:visits',
+      dimensions='ga:source,ga:keyword',
+      sort='-ga:visits',
+      filters='ga:medium==organic',
+      start_index='1',
+      max_results='25').execute()
+
+
+def print_results(results):
+  """Prints out the results.
+
+  This prints out the profile name, the column headers, and all the rows of
+  data.
+
+  Args:
+    results: The response returned from the Core Reporting API.
+  """
+
+  print
+  print 'Profile Name: %s' % results.get('profileInfo').get('profileName')
+  print
+
+  # Print header.
+  output = []
+  for header in results.get('columnHeaders'):
+    output.append('%30s' % header.get('name'))
+  print ''.join(output)
+
+  # Print data table.
+  if results.get('rows', []):
+    for row in results.get('rows'):
+      output = []
+      for cell in row:
+        output.append('%30s' % cell)
+      print ''.join(output)
+
+  else:
+    print 'No Rows Found'
+
+
+if __name__ == '__main__':
+  main(sys.argv)
diff --git a/samples/analytics/management_v3_reference.py b/samples/analytics/management_v3_reference.py
old mode 100644
new mode 100755
index 0ecfc08..2d73445
--- a/samples/analytics/management_v3_reference.py
+++ b/samples/analytics/management_v3_reference.py
@@ -1,7 +1,7 @@
 #!/usr/bin/python
 # -*- coding: utf-8 -*-
 #
-# Copyright 2011 Google Inc. All Rights Reserved.
+# Copyright 2012 Google Inc. All Rights Reserved.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
@@ -32,79 +32,55 @@
 API Python Getting Started guide here:
 http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html
 
-Usage:
+Before You Begin:
 
-Before you begin, you should register your application as an installed
-application to get your own Project / OAUth2 Client ID / Secret:
-https://code.google.com/apis/console
+Update the client_secrets.json file
 
-Learn more about registering your Analytics Application here:
-http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html#authorize
+  You must update the clients_secrets.json file with a client id, client
+  secret, and the redirect uri. You get these values by creating a new project
+  in the Google APIs console and registering for OAuth2.0 for installed
+  applications: https://code.google.com/apis/console
 
-  $ python analytics.py
+  Learn more about registering your analytics application here:
+  http://code.google.com/apis/analytics/docs/gdata/v3/gdataAuthorization.html
+
+Sample Usage:
+
+  $ python management_v3_reference.py
 
 Also you can also get help on all the command-line flags the program
 understands by running:
 
-  $ python analytics.py --help
+  $ python management_v3_reference.py --help
 """
 
-__author__ = 'api.nickm@ (Nick Mihailovski)'
+__author__ = 'api.nickm@gmail.com (Nick Mihailovski)'
 
 import sys
+import sample_utils
 
-from apiclient.discovery import build
 from apiclient.errors import HttpError
-
-import gflags
-import httplib2
-
 from oauth2client.client import AccessTokenRefreshError
-from oauth2client.client import OAuth2WebServerFlow
-from oauth2client.file import Storage
-from oauth2client.tools import run
-
-FLAGS = gflags.FLAGS
-
-
-# Remember to get your own client_id / client_secret in the
-# Google API developer console: https://code.google.com/apis/console
-FLOW = OAuth2WebServerFlow(
-    client_id='INSERT_YOUR_CLIENT_ID_HERE',
-    client_secret='INSERT_YOUR_CLIENT_SECRET_HERE',
-    scope='https://www.googleapis.com/auth/analytics.readonly',
-    user_agent='analytics-api-v3-awesomeness')
-
-TOKEN_FILE_NAME = 'analytics.dat'
 
 
 def main(argv):
-  # Let the gflags module process the command-line arguments
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
-    sys.exit(1)
+  sample_utils.process_flags(argv)
 
-  # Manage re-using tokens.
-  storage = Storage(TOKEN_FILE_NAME)
-  credentials = storage.get()
-  if not credentials or credentials.invalid:
-    # Get a new token.
-    credentials = run(FLOW, storage)
+  # Authenticate and construct service.
+  service = sample_utils.initialize_service()
 
-  # Build an authorized service object.
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-  service = build('analytics', 'v3', http=http)
-
-  # Traverse the Management hiearchy and print results.
+  # Traverse the Management hiearchy and print results or handle errors.
   try:
     traverse_hiearchy(service)
 
+  except TypeError, error:
+    # Handle errors in constructing a query.
+    print ('There was an error in constructing your query : %s' % error)
+
   except HttpError, error:
-    print ('Arg, there was an API error : %s %s : %s' %
-            (error.resp.status, error.resp.reason, error._get_reason()))
+    # Handle API errors.
+    print ('Arg, there was an API error : %s : %s' %
+           (error.resp.status, error._get_reason()))
 
   except AccessTokenRefreshError:
     print ('The credentials have been revoked or expired, please re-run'
@@ -126,18 +102,16 @@
     HttpError: If an error occured when accessing the API.
     AccessTokenRefreshError: If the current token was invalid.
   """
-  view = View()
 
   accounts = service.management().accounts().list().execute()
-
-  view.print_accounts(accounts)
+  print_accounts(accounts)
 
   if accounts.get('items'):
     firstAccountId = accounts.get('items')[0].get('id')
     webproperties = service.management().webproperties().list(
         accountId=firstAccountId).execute()
 
-    view.print_webproperties(webproperties)
+    print_webproperties(webproperties)
 
     if webproperties.get('items'):
       firstWebpropertyId = webproperties.get('items')[0].get('id')
@@ -145,7 +119,7 @@
           accountId=firstAccountId,
           webPropertyId=firstWebpropertyId).execute()
 
-      view.print_profiles(profiles)
+      print_profiles(profiles)
 
       if profiles.get('items'):
         firstProfileId = profiles.get('items')[0].get('id')
@@ -154,226 +128,285 @@
             webPropertyId=firstWebpropertyId,
             profileId=firstProfileId).execute()
 
-        view.print_goals(goals)
+        print_goals(goals)
 
-  view.print_segments(service.management().segments().list().execute())
+  print_segments(service.management().segments().list().execute())
 
 
-class View(object):
-  """Utility class to print various Management API collections."""
+def print_accounts(accounts_response):
+  """Prints all the account info in the Accounts Collection.
 
-  def print_accounts(self, accounts_list):
-    """Prints all the account info in the Accounts Collection."""
+  Args:
+    accounts_response: The response object returned from querying the Accounts
+        collection.
+  """
 
-    print '------ Account Collection -------'
-    self.print_pagination_info(accounts_list)
+  print '------ Account Collection -------'
+  print_pagination_info(accounts_response)
+  print
+
+  for account in accounts_response.get('items', []):
+    print 'Account ID      = %s' % account.get('id')
+    print 'Kind            = %s' % account.get('kind')
+    print 'Self Link       = %s' % account.get('selfLink')
+    print 'Account Name    = %s' % account.get('name')
+    print 'Created         = %s' % account.get('created')
+    print 'Updated         = %s' % account.get('updated')
+
+    child_link = account.get('childLink')
+    print 'Child link href = %s' % child_link.get('href')
+    print 'Child link type = %s' % child_link.get('type')
+    print
+  else:
+    print 'No accounts found.\n'
+
+
+def print_webproperties(webproperties_response):
+  """Prints all the web property info in the WebProperties collection.
+
+  Args:
+    webproperties_response: The response object returned from querying the
+        Webproperties collection.
+  """
+
+  print '------ Web Properties Collection -------'
+  print_pagination_info(webproperties_response)
+  print
+
+  for webproperty in webproperties_response.get('items', []):
+    print 'Kind               = %s' % webproperty.get('kind')
+    print 'Account ID         = %s' % webproperty.get('accountId')
+    print 'Web Property ID    = %s' % webproperty.get('id')
+    print ('Internal Web Property ID = %s' %
+           webproperty.get('internalWebPropertyId'))
+
+    print 'Website URL        = %s' % webproperty.get('websiteUrl')
+    print 'Created            = %s' % webproperty.get('created')
+    print 'Updated            = %s' % webproperty.get('updated')
+
+    print 'Self Link          = %s' % webproperty.get('selfLink')
+    parent_link = webproperty.get('parentLink')
+    print 'Parent link href   = %s' % parent_link.get('href')
+    print 'Parent link type   = %s' % parent_link.get('type')
+    child_link = webproperty.get('childLink')
+    print 'Child link href    = %s' % child_link.get('href')
+    print 'Child link type    = %s' % child_link.get('type')
+    print
+  else:
+    print 'No webproperties found.\n'
+
+
+def print_profiles(profiles_response):
+  """Prints all the profile info in the Profiles Collection.
+
+  Args:
+    profiles_response: The response object returned from querying the
+        Profiles collection.
+  """
+
+  print '------ Profiles Collection -------'
+  print_pagination_info(profiles_response)
+  print
+
+  for profile in profiles_response.get('items', []):
+    print 'Kind                      = %s' % profile.get('kind')
+    print 'Account ID                = %s' % profile.get('accountId')
+    print 'Web Property ID           = %s' % profile.get('webPropertyId')
+    print ('Internal Web Property ID = %s' %
+           profile.get('internalWebPropertyId'))
+    print 'Profile ID                = %s' % profile.get('id')
+    print 'Profile Name              = %s' % profile.get('name')
+
+    print 'Currency         = %s' % profile.get('currency')
+    print 'Timezone         = %s' % profile.get('timezone')
+    print 'Default Page     = %s' % profile.get('defaultPage')
+
+    print ('Exclude Query Parameters        = %s' %
+           profile.get('excludeQueryParameters'))
+    print ('Site Search Category Parameters = %s' %
+           profile.get('siteSearchCategoryParameters'))
+    print ('Site Search Query Parameters    = %s' %
+           profile.get('siteSearchQueryParameters'))
+
+    print 'Created          = %s' % profile.get('created')
+    print 'Updated          = %s' % profile.get('updated')
+
+    print 'Self Link        = %s' % profile.get('selfLink')
+    parent_link = profile.get('parentLink')
+    print 'Parent link href = %s' % parent_link.get('href')
+    print 'Parent link type = %s' % parent_link.get('type')
+    child_link = profile.get('childLink')
+    print 'Child link href  = %s' % child_link.get('href')
+    print 'Child link type  = %s' % child_link.get('type')
+    print
+  else:
+    print 'No profiles found.\n'
+
+
+def print_goals(goals_response):
+  """Prints all the goal info in the Goals collection.
+
+  Args:
+    goals_response: The response object returned from querying the Goals
+        collection
+  """
+
+  print '------ Goals Collection -------'
+  print_pagination_info(goals_response)
+  print
+
+  for goal in goals_response.get('items', []):
+    print 'Goal ID     = %s' % goal.get('id')
+    print 'Kind        = %s' % goal.get('kind')
+    print 'Self Link        = %s' % goal.get('selfLink')
+
+    print 'Account ID               = %s' % goal.get('accountId')
+    print 'Web Property ID          = %s' % goal.get('webPropertyId')
+    print ('Internal Web Property ID = %s' %
+           goal.get('internalWebPropertyId'))
+    print 'Profile ID               = %s' % goal.get('profileId')
+
+    print 'Goal Name   = %s' % goal.get('name')
+    print 'Goal Value  = %s' % goal.get('value')
+    print 'Goal Active = %s' % goal.get('active')
+    print 'Goal Type   = %s' % goal.get('type')
+
+    print 'Created     = %s' % goal.get('created')
+    print 'Updated     = %s' % goal.get('updated')
+
+    parent_link = goal.get('parentLink')
+    print 'Parent link href = %s' % parent_link.get('href')
+    print 'Parent link type = %s' % parent_link.get('type')
+
+    # Print the goal details depending on the type of goal.
+    if goal.get('urlDestinationDetails'):
+      print_url_destination_goal_details(
+          goal.get('urlDestinationDetails'))
+
+    elif goal.get('visitTimeOnSiteDetails'):
+      print_visit_time_on_site_goal_details(
+          goal.get('visitTimeOnSiteDetails'))
+
+    elif goal.get('visitNumPagesDetails'):
+      print_visit_num_pages_goal_details(
+          goal.get('visitNumPagesDetails'))
+
+    elif goal.get('eventDetails'):
+      print_event_goal_details(goal.get('eventDetails'))
+
+    print
+  else:
+    print 'No goals found.\n'
+
+
+def print_url_destination_goal_details(goal_details):
+  """Prints all the URL Destination goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Url Destination Goal -------'
+  print 'Goal URL            = %s' % goal_details.get('url')
+  print 'Case Sensitive      = %s' % goal_details.get('caseSensitive')
+  print 'Match Type          = %s' % goal_details.get('matchType')
+  print 'First Step Required = %s' % goal_details.get('firstStepRequired')
+
+  print '------ Url Destination Goal Steps -------'
+  for goal_step in goal_details.get('steps', []):
+    print 'Step Number  = %s' % goal_step.get('number')
+    print 'Step Name    = %s' % goal_step.get('name')
+    print 'Step URL     = %s' % goal_step.get('url')
+  else:
+    print 'No Steps Configured'
+
+
+def print_visit_time_on_site_goal_details(goal_details):
+  """Prints all the Visit Time On Site goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Visit Time On Site Goal -------'
+  print 'Comparison Type  = %s' % goal_details.get('comparisonType')
+  print 'comparison Value = %s' % goal_details.get('comparisonValue')
+
+
+def print_visit_num_pages_goal_details(goal_details):
+  """Prints all the Visit Num Pages goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Visit Num Pages Goal -------'
+  print 'Comparison Type  = %s' % goal_details.get('comparisonType')
+  print 'comparison Value = %s' % goal_details.get('comparisonValue')
+
+
+def print_event_goal_details(goal_details):
+  """Prints all the Event goal type info.
+
+  Args:
+    goal_details: The details portion of the goal response.
+  """
+
+  print '------ Event Goal -------'
+  print 'Use Event Value  = %s' % goal_details.get('useEventValue')
+
+  for event_condition in goal_details.get('eventConditions', []):
+    event_type = event_condition.get('type')
+    print 'Type             = %s' % event_type
+
+    if event_type in ('CATEGORY', 'ACTION', 'LABEL'):
+      print 'Match Type       = %s' % event_condition.get('matchType')
+      print 'Expression       = %s' % event_condition.get('expression')
+    else:  # VALUE type.
+      print 'Comparison Type  = %s' % event_condition.get('comparisonType')
+      print 'Comparison Value = %s' % event_condition.get('comparisonValue')
+
+
+def print_segments(segments_response):
+  """Prints all the segment info in the Segments collection.
+
+  Args:
+    segments_response: The response object returned from querying the
+        Segments collection.
+  """
+
+  print '------ Segments Collection -------'
+  print_pagination_info(segments_response)
+  print
+
+  for segment in segments_response.get('items', []):
+    print 'Segment ID = %s' % segment.get('id')
+    print 'Kind       = %s' % segment.get('kind')
+    print 'Self Link  = %s' % segment.get('selfLink')
+    print 'Name       = %s' % segment.get('name')
+    print 'Definition = %s' % segment.get('definition')
+    print 'Created    = %s' % segment.get('created')
+    print 'Updated    = %s' % segment.get('updated')
     print
 
-    for account in accounts_list.get('items'):
-      print 'Account ID      = %s' % account.get('id')
-      print 'Kind            = %s' % account.get('kind')
-      print 'Self Link       = %s' % account.get('selfLink')
-      print 'Account Name    = %s' % account.get('name')
-      print 'Created         = %s' % account.get('created')
-      print 'Updated         = %s' % account.get('updated')
 
-      child_link = account.get('childLink')
-      print 'Child link href = %s' % child_link.get('href')
-      print 'Child link type = %s' % child_link.get('type')
-      print
+def print_pagination_info(management_response):
+  """Prints common pagination details.
 
-  def print_webproperties(self, webproperties_list):
-    """Prints all the web property info in the WebProperties Collection."""
+  Args:
+    management_response: The common reponse object for each collection in the
+        Management API.
+  """
 
-    print '------ Web Properties Collection -------'
-    self.print_pagination_info(webproperties_list)
-    print
+  print 'Items per page = %s' % management_response.get('itemsPerPage')
+  print 'Total Results  = %s' % management_response.get('totalResults')
+  print 'Start Index    = %s' % management_response.get('startIndex')
 
-    for webproperty in webproperties_list.get('items'):
-      print 'Kind               = %s' % webproperty.get('kind')
-      print 'Account ID         = %s' % webproperty.get('accountId')
-      print 'Web Property ID    = %s' % webproperty.get('id')
-      print ('Internal Web Property ID = %s' %
-             webproperty.get('internalWebPropertyId'))
-
-      print 'Website URL        = %s' % webproperty.get('websiteUrl')
-      print 'Created            = %s' % webproperty.get('created')
-      print 'Updated            = %s' % webproperty.get('updated')
-
-      print 'Self Link          = %s' % webproperty.get('selfLink')
-      parent_link = webproperty.get('parentLink')
-      print 'Parent link href   = %s' % parent_link.get('href')
-      print 'Parent link type   = %s' % parent_link.get('type')
-      child_link = webproperty.get('childLink')
-      print 'Child link href    = %s' % child_link.get('href')
-      print 'Child link type    = %s' % child_link.get('type')
-      print
-
-  def print_profiles(self, profiles_list):
-    """Prints all the profile info in the Profiles Collection."""
-
-    print '------ Profiles Collection -------'
-    self.print_pagination_info(profiles_list)
-    print
-
-    for profile in profiles_list.get('items'):
-      print 'Kind                      = %s' % profile.get('kind')
-      print 'Account ID                = %s' % profile.get('accountId')
-      print 'Web Property ID           = %s' % profile.get('webPropertyId')
-      print ('Internal Web Property ID = %s' %
-             profile.get('internalWebPropertyId'))
-      print 'Profile ID                = %s' % profile.get('id')
-      print 'Profile Name              = %s' % profile.get('name')
-
-      print 'Currency         = %s' % profile.get('currency')
-      print 'Timezone         = %s' % profile.get('timezone')
-      print 'Default Page     = %s' % profile.get('defaultPage')
-
-      print ('Exclude Query Parameters        = %s' %
-             profile.get('excludeQueryParameters'))
-      print ('Site Search Category Parameters = %s' %
-             profile.get('siteSearchCategoryParameters'))
-      print ('Site Search Query Parameters    = %s' %
-             profile.get('siteSearchQueryParameters'))
-
-      print 'Created          = %s' % profile.get('created')
-      print 'Updated          = %s' % profile.get('updated')
-
-      print 'Self Link        = %s' % profile.get('selfLink')
-      parent_link = profile.get('parentLink')
-      print 'Parent link href = %s' % parent_link.get('href')
-      print 'Parent link type = %s' % parent_link.get('type')
-      child_link = profile.get('childLink')
-      print 'Child link href  = %s' % child_link.get('href')
-      print 'Child link type  = %s' % child_link.get('type')
-      print
-
-  def print_goals(self, goals_list):
-    """Prints all the goal info in the Goals Collection."""
-
-    print '------ Goals Collection -------'
-    self.print_pagination_info(goals_list)
-    print
-
-    for goal in goals_list.get('items'):
-      print 'Goal ID     = %s' % goal.get('id')
-      print 'Kind        = %s' % goal.get('kind')
-      print 'Self Link        = %s' % goal.get('selfLink')
-
-      print 'Account ID               = %s' % goal.get('accountId')
-      print 'Web Property ID          = %s' % goal.get('webPropertyId')
-      print ('Internal Web Property ID = %s' %
-             goal.get('internalWebPropertyId'))
-      print 'Profile ID               = %s' % goal.get('profileId')
-
-      print 'Goal Name   = %s' % goal.get('name')
-      print 'Goal Value  = %s' % goal.get('value')
-      print 'Goal Active = %s' % goal.get('active')
-      print 'Goal Type   = %s' % goal.get('type')
-
-      print 'Created     = %s' % goal.get('created')
-      print 'Updated     = %s' % goal.get('updated')
-
-      parent_link = goal.get('parentLink')
-      print 'Parent link href = %s' % parent_link.get('href')
-      print 'Parent link type = %s' % parent_link.get('type')
-
-      # Print the goal details depending on the type of goal.
-      if goal.get('urlDestinationDetails'):
-        self.print_url_destination_goal_details(
-            goal.get('urlDestinationDetails'))
-
-      elif goal.get('visitTimeOnSiteDetails'):
-        self.print_visit_time_on_site_goal_details(
-            goal.get('visitTimeOnSiteDetails'))
-
-      elif goal.get('visitNumPagesDetails'):
-        self.print_visit_num_pages_goal_details(
-            goal.get('visitNumPagesDetails'))
-
-      elif goal.get('eventDetails'):
-        self.print_event_goal_details(goal.get('eventDetails'))
-
-      print
-
-  def print_url_destination_goal_details(self, goal_details):
-    """Prints all the URL Destination goal type info."""
-
-    print '------ Url Destination Goal -------'
-    print 'Goal URL            = %s' % goal_details.get('url')
-    print 'Case Sensitive      = %s' % goal_details.get('caseSensitive')
-    print 'Match Type          = %s' % goal_details.get('matchType')
-    print 'First Step Required = %s' % goal_details.get('firstStepRequired')
-
-    print '------ Url Destination Goal Steps -------'
-    if goal_details.get('steps'):
-      for goal_step in goal_details.get('steps'):
-        print 'Step Number  = %s' % goal_step.get('number')
-        print 'Step Name    = %s' % goal_step.get('name')
-        print 'Step URL     = %s' % goal_step.get('url')
-    else:
-      print 'No Steps Configured'
-
-  def print_visit_time_on_site_goal_details(self, goal_details):
-    """Prints all the Visit Time On Site goal type info."""
-
-    print '------ Visit Time On Site Goal -------'
-    print 'Comparison Type  = %s' % goal_details.get('comparisonType')
-    print 'comparison Value = %s' % goal_details.get('comparisonValue')
-
-  def print_visit_num_pages_goal_details(self, goal_details):
-    """Prints all the Visit Num Pages goal type info."""
-
-    print '------ Visit Num Pages Goal -------'
-    print 'Comparison Type  = %s' % goal_details.get('comparisonType')
-    print 'comparison Value = %s' % goal_details.get('comparisonValue')
-
-  def print_event_goal_details(self, goal_details):
-    """Prints all the Event goal type info."""
-
-    print '------ Event Goal -------'
-    print 'Use Event Value  = %s' % goal_details.get('useEventValue')
-
-    for event_condition in goal_details.get('eventConditions'):
-      event_type = event_condition.get('type')
-      print 'Type             = %s' % event_type
-
-      if event_type in ('CATEGORY', 'ACTION', 'LABEL'):
-        print 'Match Type       = %s' % event_condition.get('matchType')
-        print 'Expression       = %s' % event_condition.get('expression')
-      else:  # VALUE type.
-        print 'Comparison Type  = %s' % event_condition.get('comparisonType')
-        print 'Comparison Value = %s' % event_condition.get('comparisonValue')
-
-  def print_segments(self, segments_list):
-    """Prints all the segment info in the Segments Collection."""
-
-    print '------ Segments Collection -------'
-    self.print_pagination_info(segments_list)
-    print
-
-    for segment in segments_list.get('items'):
-      print 'Segment ID = %s' % segment.get('id')
-      print 'Kind       = %s' % segment.get('kind')
-      print 'Self Link  = %s' % segment.get('selfLink')
-      print 'Name       = %s' % segment.get('name')
-      print 'Definition = %s' % segment.get('definition')
-      print 'Created    = %s' % segment.get('created')
-      print 'Updated    = %s' % segment.get('updated')
-      print
-
-  def print_pagination_info(self, mgmt_list):
-    """Prints common pagination details."""
-
-    print 'Items per page = %s' % mgmt_list.get('itemsPerPage')
-    print 'Total Results  = %s' % mgmt_list.get('totalResults')
-    print 'Start Index    = %s' % mgmt_list.get('startIndex')
-
-    # These only have values if other result pages exist.
-    if mgmt_list.get('previousLink'):
-      print 'Previous Link  = %s' % mgmt_list.get('previousLink')
-    if mgmt_list.get('nextLink'):
-      print 'Next Link      = %s' % mgmt_list.get('nextLink')
+  # These only have values if other result pages exist.
+  if management_response.get('previousLink'):
+    print 'Previous Link  = %s' % management_response.get('previousLink')
+  if management_response.get('nextLink'):
+    print 'Next Link      = %s' % management_response.get('nextLink')
 
 
 if __name__ == '__main__':
diff --git a/samples/analytics/sample_utils.py b/samples/analytics/sample_utils.py
new file mode 100644
index 0000000..c397bf8
--- /dev/null
+++ b/samples/analytics/sample_utils.py
@@ -0,0 +1,131 @@
+#!/usr/bin/python
+#
+# Copyright 2012 Google Inc. All Rights Reserved.
+#
+# 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.
+
+"""Utilities for Analytics API code samples.
+
+Handles various tasks to do with logging, authentication and initialization.
+Mostly taken from Sergio :)
+
+Before You Begin:
+
+You must update the client_secrets.json file with a client id, client secret,
+and the redirect uri. You get these values by creating a new project
+in the Google APIs console and registering for OAuth2.0 for installed
+applications: https://code.google.com/apis/console
+
+Also all OAuth2.0 tokens are stored for resue in the file specified
+as TOKEN_FILE_NAME. You can modify this file name if you wish.
+"""
+
+__author__ = ('sergio.gomes@google.com (Sergio Gomes)'
+              'api.nickm@gmail.com (Nick Mihailovski)')
+
+import logging
+import os
+import sys
+from apiclient.discovery import build
+import gflags
+import httplib2
+from oauth2client.client import flow_from_clientsecrets
+from oauth2client.file import Storage
+from oauth2client.tools import run
+
+
+FLAGS = gflags.FLAGS
+
+# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
+# application, including client_id and client_secret. You get these values by
+# creating a new project in the Google APIs console and registering for
+# OAuth2.0 for installed applications: <https://code.google.com/apis/console>
+CLIENT_SECRETS = 'client_secrets.json'
+
+
+# Helpful message to display in the browser if the CLIENT_SECRETS file
+# is missing.
+MISSING_CLIENT_SECRETS_MESSAGE = """
+WARNING: Please configure OAuth 2.0
+
+To make this sample run you will need to populate the client_secrets.json file
+found at:
+
+   %s
+
+with information from the APIs Console <https://code.google.com/apis/console>.
+
+""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS)
+
+# Set up a Flow object to be used if we need to authenticate.
+FLOW = flow_from_clientsecrets(CLIENT_SECRETS,
+    scope='https://www.googleapis.com/auth/analytics.readonly',
+    message=MISSING_CLIENT_SECRETS_MESSAGE)
+
+# The gflags module makes defining command-line options easy for applications.
+# Run this program with the '--help' argument to see all the flags that it
+# understands.
+gflags.DEFINE_enum('logging_level', 'ERROR',
+                   ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
+                   'Set the level of logging detail.')
+
+
+# Name of file that will store the access and refresh tokens to access
+# the API without having to login each time. Make sure this file is in
+# a secure place.
+TOKEN_FILE_NAME = 'analytics.dat'
+
+
+def process_flags(argv):
+  """Uses the command-line flags to set the logging level.
+
+  Args:
+    argv: List of command line arguments passed to the python script.
+  """
+
+  # Let the gflags module process the command-line arguments.
+  try:
+    argv = FLAGS(argv)
+  except gflags.FlagsError, e:
+    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
+    sys.exit(1)
+
+  # Set the logging according to the command-line flag.
+  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
+
+
+def initialize_service():
+  """Returns an instance of service from discovery data and does auth.
+
+  This method tries to read any existing OAuth 2.0 credentials from the
+  Storage object. If the credentials do not exist, new credentials are
+  obtained. The crdentials are used to authorize an http object. The
+  http object is used to build the analytics service object.
+
+  Returns:
+    An analytics v3 service object.
+  """
+
+  # Create an httplib2.Http object to handle our HTTP requests.
+  http = httplib2.Http()
+
+  # Prepare credentials, and authorize HTTP object with them.
+  storage = Storage(TOKEN_FILE_NAME)
+  credentials = storage.get()
+  if credentials is None or credentials.invalid:
+    credentials = run(FLOW, storage)
+
+  http = credentials.authorize(http)
+
+  # Retrieve service.
+  return build('analytics', 'v3', http=http)
