diff --git a/samples/gan/README.txt b/samples/gan/README.txt
deleted file mode 100644
index 27a789e..0000000
--- a/samples/gan/README.txt
+++ /dev/null
@@ -1,4 +0,0 @@
-Python Sample Code for the Google Affiliate Network APIs
---------------------------------------------------------
-See API docs at https://code.google.com/apis/gan/index.html
-for system/dependency requirements and more information.
diff --git a/samples/gan/advertisers/advertisers.py b/samples/gan/advertisers/advertisers.py
deleted file mode 100644
index 4fc9411..0000000
--- a/samples/gan/advertisers/advertisers.py
+++ /dev/null
@@ -1,189 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011 Google Inc.
-
-"""Sample for retrieving advertiser information from GAN."""
-
-__author__ = 'leadpipe@google.com (Luke Blanshard)'
-
-import apiclient
-import gflags
-import httplib2
-import json
-import logging
-import os
-import stat
-import sys
-
-from django.conf import settings
-from django.template import Template, Context
-from django.template.loader import get_template
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import AccessTokenRefreshError
-from oauth2client.client import flow_from_clientsecrets
-from oauth2client.tools import run
-
-settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
-    TEMPLATE_DIRS=('.'))
-
-
-FLAGS = gflags.FLAGS
-
-# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
-# application, including client_id and client_secret, which are found
-# on the API Access tab on the Google APIs
-# Console <http://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/gan.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', 'DEBUG',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-gflags.DEFINE_enum("request_type", 'LIST', ['GET', 'LIST'],
-                   'Type of request to be made')
-
-gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
-                   'Set how to output the results received from the API')
-
-gflags.DEFINE_string('credentials_filename', '../credentials.dat',
-                     'File to store credentials in', short_name='cf')
-
-API_FLAGS = {'relationshipStatus':None, 'advertiserId':None, 'role':None,
-             'roleId':None, 'category':None, 'minSevenDayEpc':None,
-             'minNinetyDayEpc':None, 'minPayoutRank':None}
-
-gflags.DEFINE_enum(
-    'relationshipStatus', None,
-    ['APPROVED', 'AVAILABLE', 'PENDING', 'DECLINED', 'DEACTIVATED'],
-    'Status of the relationship')
-
-gflags.DEFINE_string(
-    'advertiserId', None,
-    'Advertiser ID to lookup (get requests only).')
-
-gflags.DEFINE_string('category', None,
-                     'Caret delimited set of advertiser categories to include'
-                     + ' (list requests only).')
-
-gflags.DEFINE_string('minSevenDayEpc', None,
-                     'Minimum value for the advertiser\'s seven day EPC'
-                     + ' (list requests only).')
-
-gflags.DEFINE_string('minNinetyDayEpc', None,
-                     'Minimum value for the advertiser\'s ninety day EPC'
-                     + ' (list requests only).')
-
-gflags.DEFINE_enum('minPayoutRank', None, ['1', '2', '3', '4'],
-                   'Minimum value for the advertiser\'s payout rank'
-                   + ' (list requests only)')
-
-def usage(argv):
-  print 'Usage: %s <role> <role-id>\n%s' % (argv[0], FLAGS)
-  sys.exit(1)
-
-
-def main(argv):
-  # Let the gflags module process the command-line arguments
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print e
-    usage(argv)
-
-  if len(argv) != 3:
-    usage(argv)
-  params = {
-    'role': argv[1],
-    'roleId': argv[2]
-  }
-
-  # Set the logging according to the command-line flag
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  # If the Credentials don't exist or are invalid run through the native client
-  # flow. The Storage object will ensure that if successful the good
-  # Credentials will get written back to a file.
-  storage = Storage(FLAGS.credentials_filename)
-  credentials = storage.get()
-  if credentials is None or credentials.invalid:
-    credentials = run(FLOW, storage)
-
-  # Create an httplib2.Http object to handle our HTTP requests and authorize it
-  # with our good Credentials.
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-  service = build('gan', 'v1beta1', http=http)
-
-  advertisers = service.advertisers()
-
-  # Filter out all params that aren't set.
-  for key in FLAGS:
-    if key in API_FLAGS and FLAGS[key].value != None:
-      params[key] = FLAGS[key].value
-
-  # Retrieve the relevant advertisers.
-  stdout = {}
-  html = {}
-  try:
-    if FLAGS.request_type == "GET":
-      get_call = advertisers.get(**params)
-
-      stdout = get_call.execute()
-      html['items'] = [stdout['item']]
-    else:
-      all_items = []
-      request = advertisers.list(**params)
-      while request:
-        response = request.execute()
-        if 'items' in response:
-          all_items.extend(response['items'])
-        request = advertisers.list_next(request, response)
-
-      html['items'] = all_items
-      stdout = html
-  except apiclient.errors.HttpError, e:
-    print json.dumps(e.__dict__, sort_keys=True, indent=4)
-
-  if FLAGS.output_type in ["BOTH", "HTML"]:
-    template = get_template('advertisers_template.html')
-    context = Context(html)
-
-    out = open("output.html", 'w')
-    out.write(template.render(context).encode('UTF-8'))
-    os.fchmod(out.fileno(), stat.S_IROTH|stat.S_IRGRP|stat.S_IRUSR|stat.S_IWUSR)
-    out.close()
-
-    print 'Wrote output.html'
-
-  if FLAGS.output_type in ["BOTH", "STDOUT"]:
-    print json.dumps(stdout, sort_keys=True, indent=4)
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/gan/advertisers/advertisers_template.html b/samples/gan/advertisers/advertisers_template.html
deleted file mode 100644
index 576109d..0000000
--- a/samples/gan/advertisers/advertisers_template.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<html>
-  <head>
-    <title>Advertiser Response</title>
-    <style>
-      h2 {
-      margin: 3ex 0 1ex;
-      }
-      th {
-      background-color: grey;
-      }
-      td {
-      vertical-align: top;
-      overflow: auto;
-      }
-      tr.details td {
-      padding: 0 3ex;
-      }
-      td pre {
-      margin: 3ex 3em;
-      width: 500px;
-      }
-    </style>
-    <script>
-      function toggleDisplay(id) {
-      el = document.getElementById(id);
-      if (el.style.display == "none") {
-      el.style.display = "block"
-      } else {
-      el.style.display = "none"
-      }
-      }
-    </script>
-  </head>
-  <body>
-    <h1>Advertisers</h1>
-    <table border="1" cellspacing="0">
-    {% for item in items %}
-      <tr>
-        <th>Advertiser ID</th>
-        {% if item.status %}<th>Relationship Status</th>{% endif %}
-        <th>Advertiser Name</th>
-        <th>Advertiser Category</th>
-        {% if item.joinDate %}<th>Join Date</th>{% endif %}
-        {% if item.epcSevenDayAverage %}<th>EPC Seven Day Average</th>{% endif %}
-        {% if item.epcNinetyDayAverage %}<th>EPC Ninety Day Average</th>{% endif %}
-        {% if item.payoutRank %}<th>Payout Rank</th>{% endif %}
-        {% if item.siteUrl %}<th>Site Url</th>{% endif %}
-        {% if item.productFeedsEnabled %}<th>Product Feeds Enabled</th>{% endif %}
-        {% if item.commissionDuration %}<th>Commission Duration</th>{% endif %}
-        {% if item.logoUrl %}<th>Logo Url</th>{% endif %}
-        {% if item.contactEmail %}<th>Contact Email</th>{% endif %}
-        {% if item.contactPhone %}<th>Contact Phone</th>{% endif %}
-      </tr>
-      <tr class="advertiserInfo">
-        <td>{{ item.id }}</td>
-        {% if item.status %}<td>{{ item.status }}</td>{% endif %}
-        <td>{{ item.name }}</td>
-        <td>{{ item.category }}</td>
-        {% if item.joinDate %}<td>{{ item.joinDate }}</td>{% endif %}
-        {% if item.epcSevenDayAverage %}<td>{{ item.epcSevenDayAverage }}</td>{% endif %}
-        {% if item.epcNinetyDayAverage %}<td>{{ item.epcNinetyDayAverage }}</td>{% endif %}
-        {% if item.payoutRank %}<td>{{ item.payoutRank }}</td>{% endif %}
-        {% if item.siteUrl %}<td>{{ item.siteUrl }}</td>{% endif %}
-        {% if item.productFeedsEnabled %}<td>{{ item.productFeedsEnabled }}</td>{% endif %}
-        {% if item.commissionDuration %}<td>{{ item.commissionDuration }}</td>{% endif %}
-        {% if item.logoUrl %}<td>{{ item.logoUrl }}</td>{% endif %}
-        {% if item.contactEmail %}<td>{{ item.contactEmail }}</td>{% endif %}
-        {% if item.contactPhone %}<td>{{ item.contactPhone }}</td>{% endif %}
-      </tr>
-      {% if item.description %}
-      <tr class="description">
-        <th>Description</th>
-        <td colspan="13">{{ item.description }}</td>
-      </tr>
-      {% endif %}
-      {% empty %}
-      <tr>
-        <td>
-          <p style="padding:10px">No advertisers fit that criteria. Try searching for modifying your search.</p>
-        </td>
-      </tr>
-      {% endfor %}
-    </table>
-  </body>
-</html>
diff --git a/samples/gan/ccoffers/offers.py b/samples/gan/ccoffers/offers.py
deleted file mode 100644
index ddc967a..0000000
--- a/samples/gan/ccoffers/offers.py
+++ /dev/null
@@ -1,136 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011 Google Inc.
-
-"""Sample for retrieving credit-card offers from GAN."""
-
-__author__ = 'leadpipe@google.com (Luke Blanshard)'
-
-import gflags
-import httplib2
-import json
-import logging
-import os
-import stat
-import sys
-
-from django.conf import settings
-from django.template import Template, Context
-from django.template.loader import get_template
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import AccessTokenRefreshError
-from oauth2client.client import flow_from_clientsecrets
-from oauth2client.tools import run
-
-settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
-    TEMPLATE_DIRS=('.'))
-
-
-FLAGS = gflags.FLAGS
-
-# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
-# application, including client_id and client_secret, which are found
-# on the API Access tab on the Google APIs
-# Console <http://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/gan.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', 'DEBUG',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
-                   'Set how to output the results received from the API')
-
-gflags.DEFINE_string('credentials_filename', '../credentials.dat',
-                     'File to store credentials in', short_name='cf')
-
-gflags.DEFINE_multistring('advertiser', [],
-                          'If given, advertiser we should run as')
-
-
-def usage(argv):
-  print 'Usage: %s <publisher-id>\n%s' % (argv[0], FLAGS)
-  sys.exit(1)
-
-
-def main(argv):
-  # Let the gflags module process the command-line arguments
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    raise e
-    usage(argv)
-
-  if len(argv) != 2:
-    usage(argv)
-  publisher = argv[1]
-
-  # Set the logging according to the command-line flag
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  # If the Credentials don't exist or are invalid run through the native client
-  # flow. The Storage object will ensure that if successful the good
-  # Credentials will get written back to a file.
-  storage = Storage(FLAGS.credentials_filename)
-  credentials = storage.get()
-  if credentials is None or credentials.invalid:
-    credentials = run(FLOW, storage)
-
-  # Create an httplib2.Http object to handle our HTTP requests and authorize it
-  # with our good Credentials.
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-  service = build('gan', 'v1beta1', http=http)
-
-  ccOffers = service.ccOffers()
-
-  # Retrieve the relevant offers.
-  request = ccOffers.list(publisher=publisher,
-                          advertiser=FLAGS.advertiser,
-                          projection='full')
-  response = request.execute()
-  response['publisher'] = publisher
-
-  if FLAGS.output_type in ["BOTH", "HTML"]:
-    template = get_template('offers_template.html')
-    context = Context(response)
-
-    fname = '%s.html' % publisher
-    out = open(fname, 'w')
-    out.write(template.render(context).encode('UTF-8'))
-    os.fchmod(out.fileno(), stat.S_IROTH|stat.S_IRGRP|stat.S_IRUSR|stat.S_IWUSR)
-    out.close()
-
-    print 'Wrote %s' % fname
-
-  if FLAGS.output_type in ["BOTH", "STDOUT"]:
-    print json.dumps(response, sort_keys=True, indent=4)
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/gan/ccoffers/offers_template.html b/samples/gan/ccoffers/offers_template.html
deleted file mode 100644
index 4e52c03..0000000
--- a/samples/gan/ccoffers/offers_template.html
+++ /dev/null
@@ -1,117 +0,0 @@
-<html>
-<head>
-<title>Credit Card Offers for Publisher {{ publisher }}</title>
-<style>
-  h2 {
-    margin: 3ex 0 1ex;
-  }
-  td.cardName {
-    padding-bottom: 2ex;
-  }
-  td {
-    vertical-align: top;
-    overflow: auto;
-  }
-  tr.details td {
-    padding: 0 3ex;
-    min-width: 15%;
-    max-width: 33%;
-  }
-  tr.details td img {
-    max-width: 200px;
-  }
-  td pre {
-    margin: 3ex 3em;
-    width: 500px;
-  }
-</style>
-<script>
-  function toggleDisplay(id) {
-    el = document.getElementById(id);
-    if (el.style.display == "none") {
-      el.style.display = "block"
-    } else {
-      el.style.display = "none"
-    }
-  }
-</script>
-</head>
-<body>
-<h1>Credit Card Offers for Publisher {{ publisher }}</h1>
-{% if items %}
-<table cellspacing=5>
-{% for item in items %}
-<tr>
-<td colspan=3 class="cardName">
-  <h2>{{ item.cardName }}</h2>
-  {{ item.network }} from {{ item.issuer }} - <a href="{{ item.trackingUrl }}">Click to apply</a>
-  - <a href="javascript:toggleDisplay('pre{{forloop.counter}}');">debug</a>
-<tr class="details">
-<td>
-  {% if item.imageUrl %}
-  <img src="{{ item.imageUrl }}" title="Image from GAN" />
-  {% endif %}
-<td>
-  {% if item.aprDisplay %}
-  <div>APR: {{ item.aprDisplay }}</div>
-  {% endif %}
-  {% if item.annualFeeDisplay %}
-  <div>Annual Fee: {{ item.annualFeeDisplay }}</div>
-  {% endif %}
-  {% if item.gracePeriodDisplay %}
-  <div>Grace Period: {{ item.gracePeriodDisplay }}</div>
-  {% endif %}
-  {% if item.latePaymentFee %}
-  <div>Late Payment Fee: {{ item.latePaymentFee }}</div>
-  {% endif %}
-  {% if item.creditRatingDisplay %}
-  <div>Credit Rating: {{ item.creditRatingDisplay }}</div>
-  {% endif %}
-<td>
-  {% if item.introAprDisplay %}
-  <div>Intro APR: {{ item.introAprDisplay }}</div>
-  {% endif %}
-  {% if item.balanceTransferAprDisplay %}
-  <div>Balance Transfer APR: {{ item.balanceTransferAprDisplay }}</div>
-  {% endif %}
-  {% if item.balanceTransferFeeDisplay %}
-  <div>Balance Transfer Fee: {{ item.balanceTransferFeeDisplay }}</div>
-  {% endif %}
-  {% if item.cashAdvanceAprDisplay %}
-  <div>Cash Advance APR: {{ item.cashAdvanceAprDisplay }}</div>
-  {% endif %}
-  {% if item.cashAdvanceFeeDisplay %}
-  <div>Cash Advance Fee: {{ item.cashAdvanceFeeDisplay }}</div>
-  {% endif %}
-<!--
-<td>
-  Card benefits: <ul>
-    {% for benefit in item.cardBenefits %}
-    <li> {{ benefit }} </li>
-    {% endfor %}
-  </ul>
-<td>
-  Additional benefits: <ul>
-    {% for benefit in item.additionalCardBenefits %}
-    <li> {{ benefit }} </li>
-    {% endfor %}
-  </ul>
--->
-</tr>
-<tr>
-  <td colspan=3>
-  {% if item.disclaimer %}
-  <div style="font-size:x-small">{{ item.disclaimer }}</div>
-  {% endif %}
-</tr>
-<tr><td colspan=3><pre id="pre{{forloop.counter}}" style="display:none">
-{{ item|pprint|linebreaks }}</pre>
-<tr><td>
-{% endfor %}
-</table>
-{% else %}
-<h2>Whoops, {{ publisher }} has no associated credit card offers.</h2>
-{% endif %}
-
-</body>
-</html>
diff --git a/samples/gan/client_secrets.json b/samples/gan/client_secrets.json
deleted file mode 100644
index a232f37..0000000
--- a/samples/gan/client_secrets.json
+++ /dev/null
@@ -1,9 +0,0 @@
-{
-  "web": {
-    "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/gan/events/events.py b/samples/gan/events/events.py
deleted file mode 100644
index bc45167..0000000
--- a/samples/gan/events/events.py
+++ /dev/null
@@ -1,185 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011 Google Inc.
-
-"""Sample for retrieving event information from GAN."""
-
-__author__ = 'leadpipe@google.com (Luke Blanshard)'
-
-import apiclient
-import gflags
-import httplib2
-import json
-import logging
-import os
-import stat
-import sys
-
-from django.conf import settings
-from django.template import Template, Context
-from django.template.loader import get_template
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import AccessTokenRefreshError
-from oauth2client.client import flow_from_clientsecrets
-from oauth2client.tools import run
-
-settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
-    TEMPLATE_DIRS=('.'))
-
-
-FLAGS = gflags.FLAGS
-
-# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
-# application, including client_id and client_secret, which are found
-# on the API Access tab on the Google APIs
-# Console <http://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/gan.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', 'DEBUG',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
-                   'Set how to output the results received from the API')
-
-gflags.DEFINE_string('credentials_filename', '../credentials.dat',
-                     'File to store credentials in', short_name='cf')
-
-API_FLAGS = {'eventDateMin':None, 'eventDateMax':None, 'advertiserId':None,
-             'publisherId':None, 'orderId':None, 'sku':None,
-             'productCategory':None, 'linkId':None, 'memberId':None,
-             'status':None, 'type':None, 'role':None, 'roleId':None}
-
-gflags.DEFINE_string(
-    'eventDateMin', None,
-    'RFC 3339 formatted min date. Ex: 2005-08-09-T10:57:00-08:00')
-
-gflags.DEFINE_string(
-    'eventDateMax', None,
-    'RFC 3339 formatted max date. Ex: 2005-08-09-T10:57:00-08:00')
-
-gflags.DEFINE_string('advertiserId', None,
-                     'caret delimited advertiser IDs')
-
-gflags.DEFINE_string('publisherId', None,
-                     'caret delimited publisher IDs')
-
-gflags.DEFINE_string('orderId', None,
-                     'caret delimited order IDs')
-
-gflags.DEFINE_string('sku', None,
-                     'caret delimited SKUs')
-
-gflags.DEFINE_string('productCategory', None,
-                     'caret delimited product categories')
-
-gflags.DEFINE_string('linkId', None,
-                     'caret delimited link IDs')
-
-gflags.DEFINE_string('memberId', None,
-                     'caret delimited member IDs')
-
-gflags.DEFINE_string('status', None,
-                     'status of events - valid values "active" or "cancelled"')
-
-gflags.DEFINE_string('type', None,
-                     'type of events - valid values "action" or "transaction"')
-
-
-def usage(argv):
-  print 'Usage: %s <role> <role-id>\n%s' % (argv[0], FLAGS)
-  sys.exit(1)
-
-
-def main(argv):
-  # Let the gflags module process the command-line arguments
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print e
-    usage(argv)
-
-  if len(argv) != 3:
-    usage(argv)
-  params = {
-    'role': argv[1],
-    'roleId': argv[2]
-  }
-
-  # Set the logging according to the command-line flag
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  # If the Credentials don't exist or are invalid run through the native client
-  # flow. The Storage object will ensure that if successful the good
-  # Credentials will get written back to a file.
-  storage = Storage(FLAGS.credentials_filename)
-  credentials = storage.get()
-  if credentials is None or credentials.invalid:
-    credentials = run(FLOW, storage)
-
-  # Create an httplib2.Http object to handle our HTTP requests and authorize it
-  # with our good Credentials.
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-  service = build('gan', 'v1beta1', http=http)
-
-  events = service.events()
-
-  # Filter out all params that aren't set.
-  for key in FLAGS:
-    if key in API_FLAGS and FLAGS[key].value != None:
-      params[key] = FLAGS[key].value
-
-  # Retrieve the relevant events.
-  all_items = []
-  try:
-    request = events.list(**params)
-    while request:
-      response = request.execute()
-      if FLAGS.output_type in ["BOTH", "STDOUT"]:
-        print json.dumps(response, sort_keys=True, indent=4)
-      all_items.extend(response['items'])
-      request = events.list_next(request, response)
-
-  except apiclient.errors.HttpError, e:
-    print json.dumps(e.__dict__, sort_keys=True, indent=4)
-
-  if FLAGS.output_type in ["BOTH", "HTML"]:
-    template = get_template('events_template.html')
-    context = Context({'items':items})
-
-    out = open("output.html", 'w')
-    out.write(template.render(context).encode('UTF-8'))
-    os.fchmod(out.fileno(), stat.S_IROTH|stat.S_IRGRP|stat.S_IRUSR|stat.S_IWUSR)
-    out.close()
-
-    print 'Wrote output.html'
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/gan/events/events_template.html b/samples/gan/events/events_template.html
deleted file mode 100644
index bd43ffd..0000000
--- a/samples/gan/events/events_template.html
+++ /dev/null
@@ -1,106 +0,0 @@
-<html>
-  <head>
-    <title>Event Response</title>
-    <style>
-      h2 {
-      margin: 3ex 0 1ex;
-      }
-      th {
-      background-color: grey;
-      }
-      td {
-      vertical-align: top;
-      overflow: auto;
-      }
-      tr.details td {
-      padding: 0 3ex;
-      }
-      td pre {
-      margin: 3ex 3em;
-      width: 500px;
-      }
-    </style>
-    <script>
-      function toggleDisplay(id) {
-      el = document.getElementById(id);
-      if (el.style.display == "none") {
-      el.style.display = "block"
-      } else {
-      el.style.display = "none"
-      }
-      }
-    </script>
-  </head>
-  <body>
-    <h1>Events</h1>
-    <table border="1" cellspacing="0">
-    {% for item in items %}
-      <tr> 
-        <th>Event Date</th>
-        {% if item.modifyDate %}<th>Modify Date</th> {% endif %}
-        {% if item.advertiserId %}<th>Advertiser Id</th>{% endif %}
-        {% if item.advertiserName %}<th>Advertiser Name</th>{% endif %}
-        {% if item.publisherId %}<th>Publisher Id</th>{% endif %}
-        {% if item.publisherName %}<th>Publisher Name</th>{% endif %}
-        <th>Order Id</th>
-        <th>Member Id</th>
-        <th>Event Status</th>
-        <th>Event Type</th>
-        <th>Commissionable Sales</th>
-        {% if item.earnings %}<th>Earnings (Publisher Only)</th>{% endif %}
-        {% if item.publisherFee %}<th>Publisher Fee (Advertiser Only)</th>{% endif %}
-        {% if item.networkFee %}<th>Network Fee (Advertiser Only)</th>{% endif %}
-      <tr class="eventinfo">
-        <td>{{ item.eventDate }}</td>
-        {% if item.modifyDate %}<td>{{ item.modifyDate }}</td>{% endif %}
-        <td>{{ item.advertiserId }}{{ item.publisherId }}</td>
-        <td>{{ item.advertiserName }}{{ item.publisherName }}</td>
-        <td>{{ item.orderId }}</td>
-        <td>{{ item.memberId }}</td>
-        <td>{{ item.status }}</td>
-        <td>{{ item.type }}</td>
-        <td>{{ item.commissionableSales }}</td>
-        {% if item.earnings %}<td>{{ item.earnings }}</td> {% endif %}
-        {% if item.publisherFee %}<td>{{ item.publisherFee }}</td>{% endif %}
-        {% if item.networkFee %}<td>{{ item.networkFee }}</td>{% endif %}
-      </tr>
-      <tr style="border:1px solid #444">
-        <td class="products">Products:</td>
-        <td colspan="11">
-         <table border="1" cellspacing="0">
-          <tr>
-           <th>Sku</th>
-           <th>Sku Name</th>
-           <th>Unit Price</th>
-           <th>Category ID</th>
-           <th>Category Name</th>
-           <th>Quantity</th>
-           <th>Publisher Fee</th>
-           <th>Earnings</th>
-           <th>Network Fee</th>
-         </tr>
-         {% for product in item.products %}
-          <tr>
-           <td>{{ product.sku }}</td>
-           <td>{{ product.skuName }}</td>
-           <td>{{ product.unitPrice }}</td>
-           <td>{{ product.categoryId }}</td>
-           <td>{{ product.categoryName }}</td>
-           <td>{{ product.quantity }}</td>
-           <td>{{ product.publisherFee }}</td>
-           <td>{{ product.earnings }}</td>
-           <td>{{ product.networkFee }}</td>
-         </tr>
-      {% endfor %}
-        </table>
-      </tr>
-      {% empty %}
-      <tr>
-        <td>
-          <p style="padding:10px">No events fit that criteria. Try searching for different timeframe.</p>
-        </td>
-      </tr>
-      {% endfor %}
-    </table>
-  </body>
-</html>
diff --git a/samples/gan/publishers/publishers.py b/samples/gan/publishers/publishers.py
deleted file mode 100644
index 5c40955..0000000
--- a/samples/gan/publishers/publishers.py
+++ /dev/null
@@ -1,188 +0,0 @@
-#!/usr/bin/python2.4
-# -*- coding: utf-8 -*-
-#
-# Copyright (C) 2011 Google Inc.
-
-"""Sample for retrieving publisher information from GAN."""
-
-__author__ = 'leadpipe@google.com (Luke Blanshard)'
-
-import apiclient
-import gflags
-import httplib2
-import json
-import logging
-import os
-import stat
-import sys
-
-from django.conf import settings
-from django.template import Template, Context
-from django.template.loader import get_template
-
-from apiclient.discovery import build
-from oauth2client.file import Storage
-from oauth2client.client import AccessTokenRefreshError
-from oauth2client.client import flow_from_clientsecrets
-from oauth2client.tools import run
-
-settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
-    TEMPLATE_DIRS=('.'))
-
-
-FLAGS = gflags.FLAGS
-
-# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
-# application, including client_id and client_secret, which are found
-# on the API Access tab on the Google APIs
-# Console <http://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/gan.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', 'DEBUG',
-    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
-    'Set the level of logging detail.')
-
-gflags.DEFINE_enum("request_type", 'LIST', ['GET', 'LIST'],
-                   'Type of request to be made')
-
-gflags.DEFINE_enum("output_type", 'STDOUT', ['BOTH', 'HTML', 'STDOUT'],
-                   'Set how to output the results received from the API')
-
-gflags.DEFINE_string('credentials_filename', '../credentials.dat',
-                     'File to store credentials in', short_name='cf')
-
-API_FLAGS = {'relationshipStatus':None, 'publisherId':None, 'role':None,
-             'roleId':None, 'category':None, 'minSevenDayEpc':None,
-             'minNinetyDayEpc':None, 'minPayoutRank':None}
-
-gflags.DEFINE_enum(
-    'relationshipStatus', None,
-    ['APPROVED', 'AVAILABLE', 'PENDING', 'DECLINED', 'DEACTIVATED'],
-    'Status of the relationship')
-
-gflags.DEFINE_string(
-    'publisherId', None,
-    'Publisher ID to lookup (get requests only).')
-
-gflags.DEFINE_string('category', None,
-                     'Caret delimited set of publisher categories to include'
-                     + ' (list requests only).')
-
-gflags.DEFINE_string('minSevenDayEpc', None,
-                     'Minimum value for the publisher\'s seven day EPC'
-                     + ' (list requests only).')
-
-gflags.DEFINE_string('minNinetyDayEpc', None,
-                     'Minimum value for the publisher\'s ninety day EPC'
-                     + ' (list requests only).')
-
-gflags.DEFINE_enum('minPayoutRank', None, ['1', '2', '3', '4'],
-                   'Minimum value for the publisher\'s payout rank'
-                   + ' (list requests only)')
-
-def usage(argv):
-  print 'Usage: %s <role> <role-id>\n%s' % (argv[0], FLAGS)
-  sys.exit(1)
-
-
-def main(argv):
-  # Let the gflags module process the command-line arguments
-  try:
-    argv = FLAGS(argv)
-  except gflags.FlagsError, e:
-    print e
-    usage(argv)
-
-  if len(argv) != 3:
-    usage(argv)
-  params = {
-    'role': argv[1],
-    'roleId': argv[2]
-  }
-
-  # Set the logging according to the command-line flag
-  logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level))
-
-  # If the Credentials don't exist or are invalid run through the native client
-  # flow. The Storage object will ensure that if successful the good
-  # Credentials will get written back to a file.
-  storage = Storage(FLAGS.credentials_filename)
-  credentials = storage.get()
-  if credentials is None or credentials.invalid:
-    credentials = run(FLOW, storage)
-
-  # Create an httplib2.Http object to handle our HTTP requests and authorize it
-  # with our good Credentials.
-  http = httplib2.Http()
-  http = credentials.authorize(http)
-
-  service = build('gan', 'v1beta1', http=http)
-
-  publishers = service.publishers()
-
-  # Filter out all params that aren't set.
-  for key in FLAGS:
-    if key in API_FLAGS and FLAGS[key].value != None:
-      params[key] = FLAGS[key].value
-
-  # Retrieve the relevant publishers.
-  stdout = {}
-  html = {}
-  try:
-    if FLAGS.request_type == "GET":
-      get_call = publishers.get(**params)
-
-      stdout = get_call.execute()
-      html['items'] = [stdout['item']]
-    else:
-      all_items = []
-      request = publishers.list(**params)
-      while request:
-        response = request.execute()
-        if 'items' in response:
-          all_items.extend(response['items'])
-        request = publishers.list_next(request, response)
-
-      html['items'] = all_items
-      stdout = html
-  except apiclient.errors.HttpError, e:
-    print json.dumps(e.__dict__, sort_keys=True, indent=4)
-
-  if FLAGS.output_type in ["BOTH", "HTML"]:
-    template = get_template('publishers_template.html')
-    context = Context(html)
-
-    out = open("output.html", 'w')
-    out.write(template.render(context).encode('UTF-8'))
-    os.fchmod(out.fileno(), stat.S_IROTH|stat.S_IRGRP|stat.S_IRUSR|stat.S_IWUSR)
-    out.close()
-
-    print 'Wrote output.html'
-
-  if FLAGS.output_type in ["BOTH", "STDOUT"]:
-    print json.dumps(stdout, sort_keys=True, indent=4)
-
-if __name__ == '__main__':
-  main(sys.argv)
diff --git a/samples/gan/publishers/publishers_template.html b/samples/gan/publishers/publishers_template.html
deleted file mode 100644
index a609999..0000000
--- a/samples/gan/publishers/publishers_template.html
+++ /dev/null
@@ -1,73 +0,0 @@
-<html>
-  <head>
-    <title>Publisher Response</title>
-    <style>
-      h2 {
-      margin: 3ex 0 1ex;
-      }
-      th {
-      background-color: grey;
-      }
-      td {
-      vertical-align: top;
-      overflow: auto;
-      }
-      tr.details td {
-      padding: 0 3ex;
-      }
-      td pre {
-      margin: 3ex 3em;
-      width: 500px;
-      }
-    </style>
-    <script>
-      function toggleDisplay(id) {
-      el = document.getElementById(id);
-      if (el.style.display == "none") {
-      el.style.display = "block"
-      } else {
-      el.style.display = "none"
-      }
-      }
-    </script>
-  </head>
-  <body>
-    <h1>Publishers</h1>
-    <table border="1" cellspacing="0">
-    {% for item in items %}
-      <tr>
-        <th>Publisher ID</th>
-        {% if item.status %}<th>Relationship Status</th>{% endif %}
-        <th>Publisher Name</th>
-        <th>Publisher Category</th>
-        {% if item.joinDate %}<th>Join Date</th>{% endif %}
-        {% if item.epcSevenDayAverage %}<th>EPC Seven Day Average</th>{% endif %}
-        {% if item.epcNinetyDayAverage %}<th>EPC Ninety Day Average</th>{% endif %}
-        {% if item.payoutRank %}<th>Payout Rank</th>{% endif %}
-      </tr>
-      <tr class="publisherInfo">
-        <td>{{ item.id }}</td>
-        {% if item.status %}<td>{{ item.status }}</td>{% endif %}
-        <td>{{ item.name }}</td>
-        <td>{{ item.classification }}</td>
-        {% if item.joinDate %}<td>{{ item.joinDate }}</td>{% endif %}
-        {% if item.epcSevenDayAverage %}<td>{{ item.epcSevenDayAverage }}</td>{% endif %}
-        {% if item.epcNinetyDayAverage %}<td>{{ item.epcNinetyDayAverage }}</td>{% endif %}
-        {% if item.payoutRank %}<td>{{ item.payoutRank }}</td>{% endif %}
-      </tr>
-      {% if item.sites %}
-      <tr style="border:1px solid #444">
-        <th class="sites">Sites:</th>
-        <td colspan="11">{{ item.sites }}</td>
-      </tr>
-      {% endif %}
-      {% empty %}
-      <tr>
-        <td>
-          <p style="padding:10px">No publishers fit that criteria. Try searching for modifying your search.</p>
-        </td>
-      </tr>
-      {% endfor %}
-    </table>
-  </body>
-</html>
