diff --git a/README.md b/README.md
index f12e3ca..d7e3693 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,25 @@
 ## Google Cloud Platform
 
 Repository for building the googleapis packages
+
+### Manual process
+
+This should be automated, but here is the current workflow
+
+- Clone the GitHub repro
+  https://github.com/dart-lang/discovery_api_dart_client_generator
+- Checkout the experimental branch
+- Generate from config file
+
+    $ dart ../discovery_api_dart_client_generator/bin/generate.dart run_config
+
+- Downloaded discovery documents directory 'discovery'
+- Generated packages in directory 'generated'
+
+- Diff with previous apis and determine wheter to do minor or major version
+  update
+- Update config.yaml with new version and generate again
+- Run tests
+
+- Upload packages to pub
+- Commit downloaded discovery documents and generated packages
diff --git a/config.yaml b/config.yaml
index 3ad29f5..6d779d9 100644
--- a/config.yaml
+++ b/config.yaml
@@ -6,18 +6,58 @@
     readme: resources/README.md
     license: resources/LICENSE
     apis:
-    -  analytics:v3
-    -  bigquery:v2
-    -  blogger:v3
-    -  books:v1
-    -  calendar:v3
-    -  compute:v1
-    -  drive:v2
-    -  gmail:v1
-    -  plus:v1
-    -  storage:v1
-    -  urlshortener:v1
-    -  youtube:v3
+    - adexchangebuyer:v1.3  # https://developers.google.com/ad-exchange/buyer-rest/
+    - adexchangeseller:v1.1  # https://developers.google.com/ad-exchange/seller-rest/
+    - admin:directory_v1  # https://developers.google.com/admin-sdk/directory/
+    - admin:email_migration_v2  #https://developers.google.com/admin-sdk/email-migration/
+    - admin:reports_v1  # https://developers.google.com/admin-sdk/reports/
+    - adsense:v1.4  # https://developers.google.com/adsense/management/
+    - adsensehost:v4.1  # https://developers.google.com/adsense/host/
+    - analytics:v3  # https://developers.google.com/analytics/
+    - androidpublisher:v2  # https://developers.google.com/android-publisher/
+    - appsactivity:v1  # https://developers.google.com/google-apps/activity/
+    - appstate:v1  # https://developers.google.com/games/services/web/api/states
+    - bigquery:v2  # https://developers.google.com/bigquery/
+    - blogger:v3  # https://developers.google.com/blogger/
+    - books:v1  # https://developers.google.com/books/
+    - civicinfo:us_v1  # https://developers.google.com/civic-information/
+    - civicinfo:v1  # https://developers.google.com/civic-information/
+    - calendar:v3  # https://developers.google.com/google-apps/calendar/
+    - compute:v1  # https://developers.google.com/compute/
+    - content:v2  # https://developers.google.com/shopping-content/
+    - coordinate:v1  # https://google-developers.appspot.com/coordinate/
+    - customsearch:v1  # https://developers.google.com/custom-search/
+    - drive:v2  # https://developers.google.com/drive/v2/reference/
+    - dfareporting:v1.3  # https://developers.google.com/doubleclick-advertisers/reporting/
+    - doubleclickbidmanager:v1  # https://developers.google.com/bid-manager/
+    - doubleclicksearch:v2  # https://developers.google.com/doubleclick-search/
+    - freebase:v1  # https://developers.google.com/freebase/
+    - fusiontables:v1  # https://developers.google.com/fusiontables/
+    - games:v1  # https://developers.google.com/games/services/
+    - gamesManagement:v1management  # https://developers.google.com/games/services/management/api/
+    - gmail:v1  # https://developers.google.com/gmail/
+    - groupsmigration:v1  # https://developers.google.com/admin-sdk/groups-migration/
+    - groupssettings:v1  # https://developers.google.com/admin-sdk/groups-settings/
+    - identitytoolkit:v3  # https://developers.google.com/identity-toolkit/
+    - licensing:v1  # https://developers.google.com/admin-sdk/licensing/v1/how-tos/using
+    - mapsengine:v1  # https://developers.google.com/maps-engine/
+    - mirror:v1  # https://developers.google.com/glass/develop/mirror/
+    - oauth2:v2  # https://developers.google.com/accounts/docs/OAuth2UserAgent
+    - orkut:v2  # https://developers.google.com/orkut/docs/off-site-apps/v2restapi
+    - pagespeedonline:v1  # https://developers.google.com/speed/docs/insights/about
+    - plus:v1  # https://developers.google.com/+/api/
+    - plusDomains:v1  # https://developers.google.com/+/domains/
+    - prediction:v1.6  # https://developers.google.com/prediction/
+    - qpxExpress:v1  # https://developers.google.com/qpx-express/
+    - reseller:v1  # https://developers.google.com/admin-sdk/reseller/
+    - siteVerification:v1  # https://developers.google.com/site-verification/
+    - storage:v1  # https://developers.google.com/storage/
+    - tasks:v1  # https://developers.google.com/google-apps/tasks/
+    - translate:v2  # https://developers.google.com/translate/
+    - urlshortener:v1  # https://developers.google.com/url-shortener/
+    - webfonts:v1  # https://developers.google.com/fonts/docs/developer_api
+    - youtube:v3  # https://developers.google.com/youtube/
+    - youtubeAnalytics:v1  # https://developers.google.com/youtube/analytics/
 
 - googleapis_beta:
     version: 0.1.0
@@ -26,89 +66,49 @@
     readme: resources/README.md
     license: resources/LICENSE
     apis:
-    -  datastore:v1beta2
-    -  dns:v1beta1
-    -  pubsub:v1beta1
+    - autoscaler:v1beta2  # https://developers.google.com/compute/docs/autoscaler/ (Limited Preview)
+    - cloudmonitoring:v2beta1  # https://developers.google.com/cloud-monitoring/
+    - datastore:v1beta2  # https://developers.google.com/datastore/
+    - dns:v1beta1  # https://developers.google.com/cloud-dns/
+    - genomics:v1beta  # https://developers.google.com/genomics/
+    - manager:v1beta2  # https://developers.google.com/deployment-manager/
+    - pubsub:v1beta1  # https://developers.google.com/pubsub/ (Limited Preview)
+    - replicapool:v1beta1  # https://developers.google.com/compute/docs/replica-pool/ (Limited Preview)
+    - resourceviews:v1beta1  # https://developers.google.com/compute/docs/resource-views/ (Limited Preview)
+    - sqladmin:v1beta3  # https://developers.google.com/cloud-sql/docs/admin-api/
+    - taskqueue:v1beta2  # https://developers.google.com/appengine/docs/python/taskqueue/rest/libraries
 
 skipped_apis:
-- adexchangebuyer:v1
-- adexchangebuyer:v1.1
-- adexchangebuyer:v1.2
-- adexchangebuyer:v1.3
-- adexchangeseller:v1
-- adexchangeseller:v1.1
-- admin:directory_v1
-- admin:email_migration_v2
-- admin:reports_v1
-- adsense:v1.2
-- adsense:v1.3
-- adsense:v1.4
-- adsensehost:v4.1
-- analytics:v2.4
-- androidpublisher:v1
-- androidpublisher:v1.1
-- androidpublisher:v2
-- appsactivity:v1
-- appstate:v1
-- audit:v1
-- autoscaler:v1beta2
-- blogger:v2
-- civicinfo:us_v1
-- civicinfo:v1
-- cloudmonitoring:v2beta1
-- content:v2
-- coordinate:v1
-- customsearch:v1
-- datastore:v1beta1
-- dfareporting:v1
-- dfareporting:v1.1
-- dfareporting:v1.2
-- dfareporting:v1.3
-- discovery:v1
-- doubleclickbidmanager:v1
-- doubleclicksearch:v2
-- drive:v1
-- freebase:v1-sandbox
-- freebase:v1sandbox
-- freebase:v1
-- fusiontables:v1
-- games:v1
-- gamesManagement:v1management
-- gan:v1beta1
-- genomics:v1beta
-- groupsmigration:v1
-- groupssettings:v1
-- identitytoolkit:v3
-- licensing:v1
-- manager:v1beta2
-- mapsengine:exp2
-- mapsengine:v1
-- mirror:v1
-- oauth2:v1
-- oauth2:v2
-- orkut:v2
-- pagespeedonline:v1
-- plusDomains:v1
-- prediction:v1.2
-- prediction:v1.3
-- prediction:v1.4
-- prediction:v1.5
-- prediction:v1.6
-- qpxExpress:v1
-- replicapool:v1beta1
-- reseller:v1sandbox
-- reseller:v1
-- resourceviews:v1beta1
-- siteVerification:v1
-- spectrum:v1explorer
-- sqladmin:v1beta1
-- sqladmin:v1beta3
-- storage:v1beta1
-- storage:v1beta2
-- taskqueue:v1beta1
-- taskqueue:v1beta2
-- tasks:v1
-- translate:v2
-- webfonts:v1
-- youtubeAnalytics:v1
-- youtubeAnalytics:v1beta1
+- adexchangebuyer:v1  # v1.3 included
+- adexchangebuyer:v1.1  # v1.3 included
+- adexchangebuyer:v1.2  # v1.3 included
+- adexchangeseller:v1  # v1.1 included
+- adsense:v1.2  # v1.4 included
+- adsense:v1.3  # v1.4 included
+- analytics:v2.4  # v3 included
+- androidpublisher:v1  # v2 included
+- androidpublisher:v1.1  # v2 included
+- audit:v1  # Deprecated as of May 15, 2013, https://developers.google.com/google-apps/admin-audit/
+- blogger:v2  # v3 included
+- datastore:v1beta1  # v1beta2 included
+- dfareporting:v1  # v1.3 included
+- dfareporting:v1.1  # v1.3 included
+- dfareporting:v1.2  # v1.3 included
+- discovery:v1  # Not included
+- drive:v1  # v2 included
+- freebase:v1-sandbox  # v1 included
+- freebase:v1sandbox  # v1 included
+- gan:v1beta1  # Deprecated as of April 16, 2013, https://developers.google.com/affiliate-network/
+- mapsengine:exp2  # v1 included
+- oauth2:v1  # v2 included
+- prediction:v1.2  # v1.6 included
+- prediction:v1.3  # v1.6 included
+- prediction:v1.4  # v1.6 included
+- prediction:v1.5  # v1.6 included
+- reseller:v1sandbox  # v1 included
+- spectrum:v1explorer  # Not included, https://developers.google.com/spectrum/
+- sqladmin:v1beta1  # v1beta3 included
+- storage:v1beta1  # v1 included
+- storage:v1beta2  # v1 included
+- taskqueue:v1beta1  # v1beta2 included
+- youtubeAnalytics:v1beta1  # v1 included
diff --git a/main.dart b/main.dart
deleted file mode 100644
index 9cc17c2..0000000
--- a/main.dart
+++ /dev/null
@@ -1,262 +0,0 @@
-import "dart:io";
-import "dart:async";
-
-import '../discovery_api_dart_client_generator/lib/generator.dart';
-import 'package:google_discovery_v1_api/discovery_v1_api_client.dart';
-import 'package:yaml/yaml.dart';
-
-class Package {
-  final String name;
-  final List<String> apis;
-  final Pubspec pubspec;
-  final String readme;
-  final String license;
-
-  Package(this.name, this.apis, this.pubspec, this.readme, this.license);
-}
-
-/**
- * Configuration of a set of packages generated from a set of APIs exposed by
- * a Discovery Service.
- */
-class DiscoveryPackagesConfiguration {
-  Map<String, Package> packages = {};
-  Iterable<String> excessApis;
-  Iterable<String> missingApis;
-
-  /**
-   * Create a new discovery packages configuration.
-   *
-   * [config] is the path to the YAML configuration file.
-   *
-   * [allApis] is the list of all supported APIs returned by the Discovery
-   * Service.
-   *
-   * The format of a YAML document describing a number of packages looks
-   * like this:
-   *
-   *     packages:
-   *     - googleapis:
-   *         version: 0.1.0
-   *         author: Dart Team <misc@dartlang.org>
-   *         homepage: http://www.dartlang.org
-   *         readme: resources/README.md
-   *         license: resources/LICENSE
-   *         apis:
-   *         -  analytics:v3
-   *         -  bigquery:v2
-   *     - googleapis_beta:
-   *         version: 0.1.0
-   *         author: Dart Team <misc@dartlang.org>
-   *         homepage: http://www.dartlang.org
-   *         readme: resources/README.md
-   *         license: resources/LICENSE
-   *         apis:
-   *         -  datastore:v1beta2
-   *         -  dns:v1beta1
-   *     skipped_apis:
-   *     - adexchangebuyer:v1
-   *
-   * Each package to build is listed under the key `packages:`.
-   *
-   * The key `skipped_apis` is used to list APIs returned buy the Discovery
-   * Service but is not part of any generated packages.
-   *
-   * The file names for the content of readme and license files are resolved
-   * relative to the configuration file.
-   */
-  DiscoveryPackagesConfiguration(
-      String configFile, List<DirectoryListItems> allApis) {
-    var configYaml = new File(configFile).readAsStringSync();
-    var yaml = loadYaml(configYaml);
-    packages = _packagesFromYaml(yaml['packages'], configFile, allApis);
-    var knownApis = _calculateKnownApis(packages,
-                                        _listFromYaml(yaml['skipped_apis']));
-    missingApis = _calculateMissingApis(knownApis, allApis);
-    excessApis = _calculateExcessApis(knownApis, allApis);
-  }
-
-  /**
-   * Generate packages from the configuration.
-   *
-   * [discoveryDocsDir] is the directory where all the downloaded discovery
-   * documents are stored.
-   *
-   * [generatedApisDir] is the directory where the packages are generated.
-   * Each package is generated in a sub-directory.
-   */
-  Future generate(String discoveryDocsDir, String generatedApisDir) {
-    // Delete all downloaded discovery documents.
-    var dir = new Directory(discoveryDocsDir);
-    if (dir.existsSync()) dir.deleteSync(recursive: true);
-
-    // Download the discovery documents for the packages to build.
-    var futures = [];
-    packages.forEach((name, package) {
-      futures.add(downloadDiscoveryDocuments('$discoveryDocsDir/$name',
-                                             ids: package.apis));
-    });
-
-    return Future.wait(futures).then((_) {
-      packages.forEach((name, package) {
-        generateAllLibraries('$discoveryDocsDir/$name',
-                             '$generatedApisDir/$name',
-                             package.pubspec);
-        new File('$generatedApisDir/$name/README.md')
-            .writeAsStringSync(package.readme);
-        if (package.license != null) {
-          new File('$generatedApisDir/$name/LICENSE')
-              .writeAsStringSync(package.license);
-        }
-      });
-    });
-  }
-
-  // Return empty list for YAML null value.
-  static List _listFromYaml(value) => value != null ? value : [];
-
-  static String _generateReadme(
-      String readmeFile, List<DirectoryListItems> items) {
-    var sb = new StringBuffer();
-    if (readmeFile != null) {
-      sb.write(new File(readmeFile).readAsStringSync());
-    }
-    sb.writeln('''
-
-## Available Google APIs
-
-The following is a list of APIs that are currently available inside this
-package.
-''');
-    for (DirectoryListItems item in items) {
-      sb.write("#### ");
-      if (item.icons != null && item.icons.x16 != null) {
-        sb.write("![Logo](${item.icons.x16}) ");
-      }
-      sb..writeln('${item.title} - ${item.name} ${item.version}')
-          ..writeln()
-          ..writeln('${item.description}')
-          ..writeln();
-      if (item.documentationLink != null) {
-        sb.writeln(
-            'Official API documentation: ${item.documentationLink}');
-        sb.writeln();
-      }
-    }
-    return sb.toString();
-  }
-
-  static Map<String, Package>_packagesFromYaml(
-      YamlList configPackages,
-      String configFile,
-      List<DirectoryListItems>  allApis) {
-    var supportedApis = [];
-    var packages = {};
-    configPackages.forEach((package) {
-      package.forEach((name, values) {
-        packages[name] = _packageFromYaml(name, values, configFile, allApis);
-      });
-    });
-
-    return packages;
-  }
-
-  static Package _packageFromYaml(String name,
-                                  YamlMap values,
-                                  String configFile,
-                                  List<DirectoryListItems> allApis) {
-    var apis = _listFromYaml(values['apis']);
-    var version =
-        values['version'] != null ? values['version'] : '0.1.0-dev';
-    var author = values['author'];
-    var homepage = values['homepage'];
-    var readmeFile;
-    if (values['readme'] != null) {
-      readmeFile = new Uri.file(configFile).resolve(values['readme']).path;
-    }
-    var licenseFile;
-    if (values['license'] != null) {
-      licenseFile =
-          new Uri.file(configFile).resolve(values['license']).path;
-    }
-
-    // Generate package description.
-    var apiDescriptions = [];
-    var sb = new StringBuffer()
-        ..write('"Auto-generated client libraries for accessing '
-                'the following APIs:\\n');
-    allApis.forEach((DirectoryListItems apiDescription) {
-      if (apis.contains(apiDescription.id)) {
-        sb..writeln('')
-            ..write('  ')
-            ..write(apiDescription.id)
-            ..write(' - ')
-            ..write(apiDescription.description)
-            ..write('\\n');
-        apiDescriptions.add(apiDescription);
-      }
-    });
-    sb.write('"');
-
-    // Generate the README.md file content.
-    var readme = _generateReadme(readmeFile, apiDescriptions);
-
-    // Read the LICENSE
-    var license = new File(licenseFile).readAsStringSync();
-
-    // Create package description with pubspec.yaml information.
-    var pubspec = new Pubspec(
-        name, version, sb.toString(), author: author, homepage: homepage);
-    return new Package(name, apis, pubspec, readme, license);
-  }
-
-  /// The known APIs are the APis mentioned in each package together with
-  /// the APIs explicitly skipped.
-  static Set<String> _calculateKnownApis(Map<String, Package> packages,
-                                         YamlList skippedApis) {
-    var knownApis = new Set();
-    knownApis.addAll(skippedApis);
-    packages.forEach((_, package) => knownApis.addAll(package.apis));
-    return knownApis;
-  }
-
-  /// The missing APIs are the APIs returned from the Discovery Service
-  /// but not mentioned in the configuration.
-  static Iterable<String> _calculateMissingApis(
-      Iterable<String> knownApis, List<DirectoryListItems> allApis) {
-    return allApis
-        .where((item) => !knownApis.contains(item.id))
-        .map((item) => item.id);
-  }
-
-  /// The excess APIs are the APIs mentioned in the configuration but not
-  /// returned from the Discovery Service.
-  static Iterable<String> _calculateExcessApis(
-      Iterable<String> knownApis, List<DirectoryListItems> allApis) {
-    var excessApis = new Set.from(knownApis);
-    allApis.forEach((item) => excessApis.remove(item.id));
-    return excessApis;
-  }
-}
-
-main() {
-  listAllApis().then((List<DirectoryListItems> items) {
-    var configuration = new DiscoveryPackagesConfiguration(
-        Platform.script.resolve('config.yaml').path, items);
-
-    // Print warnings for APIs not mentioned.
-    if (configuration.missingApis.isNotEmpty) {
-      print('WARNING: No configuration for the following APIs:');
-      configuration.missingApis.forEach((id) => print('- $id'));
-    }
-    if (configuration.excessApis.isNotEmpty) {
-      print('WARNING: The following APIs do not exist:');
-      configuration.excessApis.forEach((id) => print('- $id'));
-    }
-
-    // Generate the packages.
-    configuration.generate(Platform.script.resolve('discovery').path,
-                           Platform.script.resolve('generated').path)
-        .then((_) => print('Done!'));
-  });
-}
\ No newline at end of file
diff --git a/pubspec.lock b/pubspec.lock
deleted file mode 100644
index 2be945e..0000000
--- a/pubspec.lock
+++ /dev/null
@@ -1,75 +0,0 @@
-# Generated by pub
-# See http://pub.dartlang.org/doc/glossary.html#lockfile
-packages:
-  asn1lib:
-    description: asn1lib
-    source: hosted
-    version: "0.3.2"
-  bignum:
-    description: bignum
-    source: hosted
-    version: "0.0.5"
-  cipher:
-    description: cipher
-    source: hosted
-    version: "0.7.1"
-  collection:
-    description: collection
-    source: hosted
-    version: "0.9.4"
-  crypto:
-    description: crypto
-    source: hosted
-    version: "0.9.0"
-  fixnum:
-    description: fixnum
-    source: hosted
-    version: "0.9.0"
-  google_discovery_v1_api:
-    description: google_discovery_v1_api
-    source: hosted
-    version: "0.4.13"
-  google_oauth2_client:
-    description: google_oauth2_client
-    source: hosted
-    version: "0.3.9"
-  http:
-    description: http
-    source: hosted
-    version: "0.11.1+1"
-  http_parser:
-    description: http_parser
-    source: hosted
-    version: "0.0.2+4"
-  json_web_token:
-    description: json_web_token
-    source: hosted
-    version: "0.1.3"
-  oauth2:
-    description: oauth2
-    source: hosted
-    version: "0.9.3"
-  path:
-    description: path
-    source: hosted
-    version: "1.3.0"
-  rsa_pkcs:
-    description: rsa_pkcs
-    source: hosted
-    version: "0.1.1"
-  source_span:
-    description: source_span
-    source: hosted
-    version: "1.0.0"
-  stack_trace:
-    description: stack_trace
-    source: hosted
-    version: "1.0.2"
-  string_scanner:
-    description: string_scanner
-    source: hosted
-    version: "0.1.0"
-  yaml:
-    description: yaml
-    source: hosted
-    version: "2.0.0"
diff --git a/pubspec.yaml b/pubspec.yaml
deleted file mode 100644
index 245e435..0000000
--- a/pubspec.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-name: googleapis_generator
-version: 0.0.1
-author: Dart Team <misc@dartlang.org>
-description: Create API Client libraries based on the APIs Discovery documentation
-environment:
-  sdk: '>=1.0.0 <2.0.0'
-dependencies:
-  google_discovery_v1_api: '>=0.4.12'
-  yaml: any
