diff --git a/apitools/base/py/app2.py b/apitools/base/py/app2.py
deleted file mode 100644
index c0ea9e0..0000000
--- a/apitools/base/py/app2.py
+++ /dev/null
@@ -1,373 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2015 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Appcommands-compatible command class with extra fixins."""
-from __future__ import absolute_import
-from __future__ import print_function
-
-import cmd
-import inspect
-import pdb
-import shlex
-import sys
-import traceback
-import types
-
-import gflags as flags
-from google.apputils import app
-from google.apputils import appcommands
-import six
-
-
-__all__ = [
-    'NewCmd',
-    'Repl',
-]
-
-flags.DEFINE_boolean(
-    'debug_mode', False,
-    'Show tracebacks on Python exceptions.')
-flags.DEFINE_boolean(
-    'headless', False,
-    'Assume no user is at the controlling console.')
-FLAGS = flags.FLAGS
-
-
-def _SafeMakeAscii(s):
-    if isinstance(s, six.text_type):
-        return s.encode('ascii')
-    elif isinstance(s, str):
-        return s.decode('ascii')
-    return six.text_type(s).encode('ascii', 'backslashreplace')
-
-
-class NewCmd(appcommands.Cmd):
-
-    """Featureful extension of appcommands.Cmd."""
-
-    def __init__(self, name, flag_values):
-        super(NewCmd, self).__init__(name, flag_values)
-        run_with_args = getattr(self, 'RunWithArgs', None)
-        self._new_style = isinstance(run_with_args, types.MethodType)
-        if self._new_style:
-            func = run_with_args.__func__
-
-            argspec = inspect.getargspec(func)
-            if argspec.args and argspec.args[0] == 'self':
-                argspec = argspec._replace(  # pylint: disable=protected-access
-                    args=argspec.args[1:])
-            self._argspec = argspec
-            # TODO(craigcitro): Do we really want to support all this
-            # nonsense?
-            self._star_args = self._argspec.varargs is not None
-            self._star_kwds = self._argspec.keywords is not None
-            self._max_args = len(self._argspec.args or ())
-            self._min_args = self._max_args - len(self._argspec.defaults or ())
-            if self._star_args:
-                self._max_args = sys.maxsize
-
-            self._debug_mode = FLAGS.debug_mode
-            self.surface_in_shell = True
-            self.__doc__ = self.RunWithArgs.__doc__
-
-    def __getattr__(self, name):
-        if name in self._command_flags:
-            return self._command_flags[name].value
-        return super(NewCmd, self).__getattribute__(name)
-
-    def _GetFlag(self, flagname):
-        if flagname in self._command_flags:
-            return self._command_flags[flagname]
-        return None
-
-    def Run(self, argv):
-        """Run this command.
-
-        If self is a new-style command, we set up arguments and call
-        self.RunWithArgs, gracefully handling exceptions. If not, we
-        simply call self.Run(argv).
-
-        Args:
-          argv: List of arguments as strings.
-
-        Returns:
-          0 on success, nonzero on failure.
-        """
-        if not self._new_style:
-            return super(NewCmd, self).Run(argv)
-
-        # TODO(craigcitro): We need to save and restore flags each time so
-        # that we can per-command flags in the REPL.
-        args = argv[1:]
-        fail = None
-        fail_template = '%s positional args, found %d, expected at %s %d'
-        if len(args) < self._min_args:
-            fail = fail_template % ('Not enough', len(args),
-                                    'least', self._min_args)
-        if len(args) > self._max_args:
-            fail = fail_template % ('Too many', len(args),
-                                    'most', self._max_args)
-        if fail:
-            print(fail)
-            if self.usage:
-                print('Usage: %s' % (self.usage,))
-            return 1
-
-        if self._debug_mode:
-            return self.RunDebug(args, {})
-        return self.RunSafely(args, {})
-
-    def RunCmdLoop(self, argv):
-        """Hook for use in cmd.Cmd-based command shells."""
-        try:
-            args = shlex.split(argv)
-        except ValueError as e:
-            raise SyntaxError(self.EncodeForPrinting(e))
-        return self.Run([self._command_name] + args)
-
-    @staticmethod
-    def EncodeForPrinting(s):
-        """Safely encode a string as the encoding for sys.stdout."""
-        encoding = sys.stdout.encoding or 'ascii'
-        return six.text_type(s).encode(encoding, 'backslashreplace')
-
-    def _FormatError(self, e):
-        """Hook for subclasses to modify how error messages are printed."""
-        return _SafeMakeAscii(e)
-
-    def _HandleError(self, e):
-        message = self._FormatError(e)
-        print('Exception raised in %s operation: %s' % (
-            self._command_name, message))
-        return 1
-
-    def _IsDebuggableException(self, e):
-        """Hook for subclasses to skip debugging on certain exceptions."""
-        return not isinstance(e, app.UsageError)
-
-    def RunDebug(self, args, kwds):
-        """Run this command in debug mode."""
-        try:
-            return_value = self.RunWithArgs(*args, **kwds)
-        except BaseException as e:
-            # Don't break into the debugger for expected exceptions.
-            if not self._IsDebuggableException(e):
-                return self._HandleError(e)
-            print()
-            print('****************************************************')
-            print('**   Unexpected Exception raised in execution!    **')
-            if FLAGS.headless:
-                print('**  --headless mode enabled, exiting.             **')
-                print('**  See STDERR for traceback.                     **')
-            else:
-                print('**  --debug_mode enabled, starting pdb.           **')
-            print('****************************************************')
-            print()
-            traceback.print_exc()
-            print()
-            if not FLAGS.headless:
-                pdb.post_mortem()
-            return 1
-        return return_value
-
-    def RunSafely(self, args, kwds):
-        """Run this command, turning exceptions into print statements."""
-        try:
-            return_value = self.RunWithArgs(*args, **kwds)
-        except BaseException as e:
-            return self._HandleError(e)
-        return return_value
-
-
-class CommandLoop(cmd.Cmd):
-
-    """Instance of cmd.Cmd built to work with NewCmd."""
-
-    class TerminateSignal(Exception):
-
-        """Exception type used for signaling loop completion."""
-
-    def __init__(self, commands, prompt):
-        cmd.Cmd.__init__(self)
-        self._commands = {'help': commands['help']}
-        self._special_command_names = ['help', 'repl', 'EOF']
-        for name, command in commands.items():
-            if (name not in self._special_command_names and
-                    isinstance(command, NewCmd) and
-                    command.surface_in_shell):
-                self._commands[name] = command
-                setattr(self, 'do_%s' % (name,), command.RunCmdLoop)
-        self._default_prompt = prompt
-        self._set_prompt()
-        self._last_return_code = 0
-
-    @property
-    def last_return_code(self):
-        return self._last_return_code
-
-    def _set_prompt(self):  # pylint: disable=invalid-name
-        self.prompt = self._default_prompt
-
-    def do_EOF(self, *unused_args):  # pylint: disable=invalid-name
-        """Terminate the running command loop.
-
-        This function raises an exception to avoid the need to do
-        potentially-error-prone string parsing inside onecmd.
-
-        Args:
-          *unused_args: unused.
-
-        Returns:
-          Never returns.
-
-        Raises:
-          CommandLoop.TerminateSignal: always.
-        """
-        raise CommandLoop.TerminateSignal()
-
-    def postloop(self):
-        print('Goodbye.')
-
-    # pylint: disable=arguments-differ
-    def completedefault(self, unused_text, line, unused_begidx, unused_endidx):
-        if not line:
-            return []
-        else:
-            command_name = line.partition(' ')[0].lower()
-            usage = ''
-            if command_name in self._commands:
-                usage = self._commands[command_name].usage
-            if usage:
-                print()
-                print(usage)
-                print('%s%s' % (self.prompt, line), end=' ')
-            return []
-    # pylint: enable=arguments-differ
-
-    def emptyline(self):
-        print('Available commands:', end=' ')
-        print(' '.join(list(self._commands)))
-
-    def precmd(self, line):
-        """Preprocess the shell input."""
-        if line == 'EOF':
-            return line
-        if line.startswith('exit') or line.startswith('quit'):
-            return 'EOF'
-        words = line.strip().split()
-        if len(words) == 1 and words[0] not in ['help', 'ls', 'version']:
-            return 'help %s' % (line.strip(),)
-        return line
-
-    def onecmd(self, line):
-        """Process a single command.
-
-        Runs a single command, and stores the return code in
-        self._last_return_code. Always returns False unless the command
-        was EOF.
-
-        Args:
-          line: (str) Command line to process.
-
-        Returns:
-          A bool signaling whether or not the command loop should terminate.
-        """
-        try:
-            self._last_return_code = cmd.Cmd.onecmd(self, line)
-        except CommandLoop.TerminateSignal:
-            return True
-        except BaseException as e:
-            name = line.split(' ')[0]
-            print('Error running %s:' % name)
-            print(e)
-            self._last_return_code = 1
-        return False
-
-    def get_names(self):
-        names = dir(self)
-        commands = (name for name in self._commands
-                    if name not in self._special_command_names)
-        names.extend('do_%s' % (name,) for name in commands)
-        names.remove('do_EOF')
-        return names
-
-    def do_help(self, arg):
-        """Print the help for command_name (if present) or general help."""
-
-        command_name = arg
-
-        # TODO(craigcitro): Add command-specific flags.
-        def FormatOneCmd(name, command, command_names):
-            """Format one command."""
-            indent_size = appcommands.GetMaxCommandLength() + 3
-            if len(command_names) > 1:
-                indent = ' ' * indent_size
-                command_help = flags.TextWrap(
-                    command.CommandGetHelp('', cmd_names=command_names),
-                    indent=indent,
-                    firstline_indent='')
-                first_help_line, _, rest = command_help.partition('\n')
-                first_line = '%-*s%s' % (indent_size,
-                                         name + ':', first_help_line)
-                return '\n'.join((first_line, rest))
-            default_indent = '  '
-            return '\n' + flags.TextWrap(
-                command.CommandGetHelp('', cmd_names=command_names),
-                indent=default_indent,
-                firstline_indent=default_indent) + '\n'
-
-        if not command_name:
-            print('\nHelp for commands:\n')
-            command_names = list(self._commands)
-            print('\n\n'.join(
-                FormatOneCmd(name, command, command_names)
-                for name, command in self._commands.items()
-                if name not in self._special_command_names))
-            print()
-        elif command_name in self._commands:
-            print(FormatOneCmd(command_name, self._commands[command_name],
-                               command_names=[command_name]))
-        return 0
-
-    def postcmd(self, stop, line):
-        return bool(stop) or line == 'EOF'
-
-
-class Repl(NewCmd):
-
-    """Start an interactive session."""
-    PROMPT = '> '
-
-    def __init__(self, name, fv):
-        super(Repl, self).__init__(name, fv)
-        self.surface_in_shell = False
-        flags.DEFINE_string(
-            'prompt', '',
-            'Prompt to use for interactive shell.',
-            flag_values=fv)
-
-    def RunWithArgs(self):
-        """Start an interactive session."""
-        prompt = FLAGS.prompt or self.PROMPT
-        repl = CommandLoop(appcommands.GetCommandList(), prompt=prompt)
-        print('Welcome! (Type help for more information.)')
-        while True:
-            try:
-                repl.cmdloop()
-                break
-            except KeyboardInterrupt:
-                print()
-        return repl.last_return_code
diff --git a/apitools/base/py/base_cli.py b/apitools/base/py/base_cli.py
deleted file mode 100644
index 70515c1..0000000
--- a/apitools/base/py/base_cli.py
+++ /dev/null
@@ -1,162 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2015 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Base script for generated CLI."""
-
-from __future__ import absolute_import
-
-import atexit
-import code
-import logging
-import os
-import readline
-import rlcompleter
-import sys
-
-import gflags as flags
-from google.apputils import appcommands
-
-from apitools.base.py import encoding
-from apitools.base.py import exceptions
-
-__all__ = [
-    'ConsoleWithReadline',
-    'DeclareBaseFlags',
-    'FormatOutput',
-    'SetupLogger',
-    'run_main',
-]
-
-
-# TODO(craigcitro): We should move all the flags for the
-# StandardQueryParameters into this file, so that they can be used
-# elsewhere easily.
-
-_BASE_FLAGS_DECLARED = False
-_OUTPUT_FORMATTER_MAP = {
-    'protorpc': lambda x: x,
-    'json': encoding.MessageToJson,
-}
-
-
-def DeclareBaseFlags():
-    """Declare base flags for all CLIs."""
-    # TODO(craigcitro): FlagValidators?
-    global _BASE_FLAGS_DECLARED  # pylint: disable=global-statement
-    if _BASE_FLAGS_DECLARED:
-        return
-    flags.DEFINE_boolean(
-        'log_request', False,
-        'Log requests.')
-    flags.DEFINE_boolean(
-        'log_response', False,
-        'Log responses.')
-    flags.DEFINE_boolean(
-        'log_request_response', False,
-        'Log requests and responses.')
-    flags.DEFINE_enum(
-        'output_format',
-        'protorpc',
-        _OUTPUT_FORMATTER_MAP.keys(),
-        'Display format for results.')
-
-    _BASE_FLAGS_DECLARED = True
-
-
-FLAGS = flags.FLAGS
-
-
-def SetupLogger():
-    if FLAGS.log_request or FLAGS.log_response or FLAGS.log_request_response:
-        logging.basicConfig()
-        logging.getLogger().setLevel(logging.INFO)
-
-
-def FormatOutput(message, output_format=None):
-    """Convert the output to the user-specified format."""
-    output_format = output_format or FLAGS.output_format
-    formatter = _OUTPUT_FORMATTER_MAP.get(FLAGS.output_format)
-    if formatter is None:
-        raise exceptions.UserError('Unknown output format: %s' % output_format)
-    return formatter(message)
-
-
-class _SmartCompleter(rlcompleter.Completer):
-
-    def _callable_postfix(self, val, word):
-        if ('(' in readline.get_line_buffer() or
-                not callable(val)):
-            return word
-        return word + '('
-
-    def complete(self, text, state):
-        if not readline.get_line_buffer().strip():
-            if not state:
-                return '  '
-            return None
-        return rlcompleter.Completer.complete(self, text, state)
-
-
-class ConsoleWithReadline(code.InteractiveConsole):
-
-    """InteractiveConsole with readline, tab completion, and history."""
-
-    def __init__(self, env, filename='<console>', histfile=None):
-        new_locals = dict(env)
-        new_locals.update({
-            '_SmartCompleter': _SmartCompleter,
-            'readline': readline,
-            'rlcompleter': rlcompleter,
-        })
-        code.InteractiveConsole.__init__(self, new_locals, filename)
-        readline.parse_and_bind('tab: complete')
-        readline.set_completer(_SmartCompleter(new_locals).complete)
-        if histfile is not None:
-            histfile = os.path.expanduser(histfile)
-            if os.path.exists(histfile):
-                readline.read_history_file(histfile)
-            atexit.register(lambda: readline.write_history_file(histfile))
-
-
-def run_main():  # pylint: disable=invalid-name
-    """Function to be used as setuptools script entry point.
-
-    Appcommands assumes that it always runs as __main__, but launching
-    via a setuptools-generated entry_point breaks this rule. We do some
-    trickery here to make sure that appcommands and flags find their
-    state where they expect to by faking ourselves as __main__.
-    """
-
-    # Put the flags for this module somewhere the flags module will look
-    # for them.
-    # pylint: disable=protected-access
-    new_name = flags._GetMainModule()
-    sys.modules[new_name] = sys.modules['__main__']
-    for flag in FLAGS.FlagsByModuleDict().get(__name__, []):
-        FLAGS._RegisterFlagByModule(new_name, flag)
-        for key_flag in FLAGS.KeyFlagsByModuleDict().get(__name__, []):
-            FLAGS._RegisterKeyFlagForModule(new_name, key_flag)
-    # pylint: enable=protected-access
-
-    # Now set __main__ appropriately so that appcommands will be
-    # happy.
-    sys.modules['__main__'] = sys.modules[__name__]
-    appcommands.Run()
-    sys.modules['__main__'] = sys.modules.pop(new_name)
-
-
-if __name__ == '__main__':
-    appcommands.Run()
diff --git a/apitools/base/py/cli.py b/apitools/base/py/cli.py
deleted file mode 100644
index 920cfc5..0000000
--- a/apitools/base/py/cli.py
+++ /dev/null
@@ -1,35 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2015 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Top-level import for all CLI-related functionality in apitools.
-
-Note that importing this file will ultimately have side-effects, and
-may require imports not available in all environments (such as App
-Engine). In particular, picking up some readline-related imports can
-cause pain.
-"""
-
-# pylint:disable=wildcard-import
-# pylint:disable=unused-wildcard-import
-
-from apitools.base.py.app2 import *
-from apitools.base.py.base_cli import *
-
-try:
-    # pylint:disable=no-name-in-module
-    from apitools.base.py.internal.cli import *
-except ImportError:
-    pass
diff --git a/apitools/gen/client_generation_test.py b/apitools/gen/client_generation_test.py
index 5e7932a..8a2f8e8 100644
--- a/apitools/gen/client_generation_test.py
+++ b/apitools/gen/client_generation_test.py
@@ -15,9 +15,11 @@
 
 """Test gen_client against all the APIs we use regularly."""
 
+import importlib
 import logging
 import os
 import subprocess
+import sys
 import tempfile
 
 import unittest2
@@ -27,9 +29,9 @@
 
 
 _API_LIST = [
-    'drive.v2',
     'bigquery.v2',
     'compute.v1',
+    'drive.v3',
     'storage.v1',
 ]
 
@@ -62,20 +64,7 @@
                     continue
                 self.assertEqual(0, retcode)
 
-                with tempfile.NamedTemporaryFile() as out:
-                    with tempfile.NamedTemporaryFile() as err:
-                        cmdline_args = [
-                            os.path.join(
-                                'generated', api.replace('.', '_') + '.py'),
-                            'help',
-                        ]
-                        retcode = subprocess.call(
-                            cmdline_args, stdout=out, stderr=err)
-                        with open(err.name, 'rb') as f:
-                            err_output = f.read()
-                # appcommands returns 1 on help
-                self.assertEqual(1, retcode)
-                if 'Traceback (most recent call last):' in err_output:
-                    err = '\n======\n%s======\n' % err_output
-                    self.fail(
-                        'Error raised in generated client:' + err)
+                sys.path.insert(0, os.path.join(os.getcwd(), 'generated'))
+                # Ensure we can import the generated client.
+                importlib.import_module('{}_{}_client'.format(
+                    *api.split('.')))
diff --git a/apitools/gen/command_registry.py b/apitools/gen/command_registry.py
deleted file mode 100644
index 486934f..0000000
--- a/apitools/gen/command_registry.py
+++ /dev/null
@@ -1,608 +0,0 @@
-#!/usr/bin/env python
-#
-# Copyright 2015 Google Inc.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#     http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-"""Command registry for apitools."""
-
-import logging
-import textwrap
-
-from apitools.base.protorpclite import descriptor
-from apitools.base.protorpclite import messages
-from apitools.gen import extended_descriptor
-
-# This is a code generator; we're purposely verbose.
-# pylint:disable=too-many-statements
-
-_VARIANT_TO_FLAG_TYPE_MAP = {
-    messages.Variant.DOUBLE: 'float',
-    messages.Variant.FLOAT: 'float',
-    messages.Variant.INT64: 'string',
-    messages.Variant.UINT64: 'string',
-    messages.Variant.INT32: 'integer',
-    messages.Variant.BOOL: 'boolean',
-    messages.Variant.STRING: 'string',
-    messages.Variant.MESSAGE: 'string',
-    messages.Variant.BYTES: 'string',
-    messages.Variant.UINT32: 'integer',
-    messages.Variant.ENUM: 'enum',
-    messages.Variant.SINT32: 'integer',
-    messages.Variant.SINT64: 'integer',
-}
-
-
-class FlagInfo(messages.Message):
-
-    """Information about a flag and conversion to a message.
-
-    Fields:
-      name: name of this flag.
-      type: type of the flag.
-      description: description of the flag.
-      default: default value for this flag.
-      enum_values: if this flag is an enum, the list of possible
-          values.
-      required: whether or not this flag is required.
-      fv: name of the flag_values object where this flag should
-          be registered.
-      conversion: template for type conversion.
-      special: (boolean, default: False) If True, this flag doesn't
-          correspond to an attribute on the request.
-    """
-    name = messages.StringField(1)
-    type = messages.StringField(2)
-    description = messages.StringField(3)
-    default = messages.StringField(4)
-    enum_values = messages.StringField(5, repeated=True)
-    required = messages.BooleanField(6, default=False)
-    fv = messages.StringField(7)
-    conversion = messages.StringField(8)
-    special = messages.BooleanField(9, default=False)
-
-
-class ArgInfo(messages.Message):
-
-    """Information about a single positional command argument.
-
-    Fields:
-      name: argument name.
-      description: description of this argument.
-      conversion: template for type conversion.
-    """
-    name = messages.StringField(1)
-    description = messages.StringField(2)
-    conversion = messages.StringField(3)
-
-
-class CommandInfo(messages.Message):
-
-    """Information about a single command.
-
-    Fields:
-      name: name of this command.
-      class_name: name of the apitools_base.NewCmd class for this command.
-      description: description of this command.
-      flags: list of FlagInfo messages for the command-specific flags.
-      args: list of ArgInfo messages for the positional args.
-      request_type: name of the request type for this command.
-      client_method_path: path from the client object to the method
-          this command is wrapping.
-    """
-    name = messages.StringField(1)
-    class_name = messages.StringField(2)
-    description = messages.StringField(3)
-    flags = messages.MessageField(FlagInfo, 4, repeated=True)
-    args = messages.MessageField(ArgInfo, 5, repeated=True)
-    request_type = messages.StringField(6)
-    client_method_path = messages.StringField(7)
-    has_upload = messages.BooleanField(8, default=False)
-    has_download = messages.BooleanField(9, default=False)
-
-
-class CommandRegistry(object):
-
-    """Registry for CLI commands."""
-
-    def __init__(self, package, version, client_info, message_registry,
-                 root_package, base_files_package, protorpc_package, names):
-        self.__package = package
-        self.__version = version
-        self.__client_info = client_info
-        self.__names = names
-        self.__message_registry = message_registry
-        self.__root_package = root_package
-        self.__base_files_package = base_files_package
-        self.__protorpc_package = protorpc_package
-        self.__command_list = []
-        self.__global_flags = []
-
-    def Validate(self):
-        self.__message_registry.Validate()
-
-    def AddGlobalParameters(self, schema):
-        for field in schema.fields:
-            self.__global_flags.append(self.__FlagInfoFromField(field, schema))
-
-    def AddCommandForMethod(self, service_name, method_name, method_info,
-                            request, _):
-        """Add the given method as a command."""
-        command_name = self.__GetCommandName(method_info.method_id)
-        calling_path = '%s.%s' % (service_name, method_name)
-        request_type = self.__message_registry.LookupDescriptor(request)
-        description = method_info.description
-        if not description:
-            description = 'Call the %s method.' % method_info.method_id
-        field_map = dict((f.name, f) for f in request_type.fields)
-        args = []
-        arg_names = []
-        for field_name in method_info.ordered_params:
-            extended_field = field_map[field_name]
-            name = extended_field.name
-            args.append(ArgInfo(
-                name=name,
-                description=extended_field.description,
-                conversion=self.__GetConversion(extended_field, request_type),
-            ))
-            arg_names.append(name)
-        flags = []
-        for extended_field in sorted(request_type.fields,
-                                     key=lambda x: x.name):
-            field = extended_field.field_descriptor
-            if extended_field.name in arg_names:
-                continue
-            if self.__FieldIsRequired(field):
-                logging.warning(
-                    'Required field %s not in ordered_params for command %s',
-                    extended_field.name, command_name)
-            flags.append(self.__FlagInfoFromField(
-                extended_field, request_type, fv='fv'))
-        if method_info.upload_config:
-            # TODO(craigcitro): Consider adding additional flags to allow
-            # determining the filename from the object metadata.
-            upload_flag_info = FlagInfo(
-                name='upload_filename', type='string', default='',
-                description='Filename to use for upload.', fv='fv',
-                special=True)
-            flags.append(upload_flag_info)
-            mime_description = (
-                'MIME type to use for the upload. Only needed if '
-                'the extension on --upload_filename does not determine '
-                'the correct (or any) MIME type.')
-            mime_type_flag_info = FlagInfo(
-                name='upload_mime_type', type='string', default='',
-                description=mime_description, fv='fv', special=True)
-            flags.append(mime_type_flag_info)
-        if method_info.supports_download:
-            download_flag_info = FlagInfo(
-                name='download_filename', type='string', default='',
-                description='Filename to use for download.', fv='fv',
-                special=True)
-            flags.append(download_flag_info)
-            overwrite_description = (
-                'If True, overwrite the existing file when downloading.')
-            overwrite_flag_info = FlagInfo(
-                name='overwrite', type='boolean', default='False',
-                description=overwrite_description, fv='fv', special=True)
-            flags.append(overwrite_flag_info)
-        command_info = CommandInfo(
-            name=command_name,
-            class_name=self.__names.ClassName(command_name),
-            description=description,
-            flags=flags,
-            args=args,
-            request_type=request_type.full_name,
-            client_method_path=calling_path,
-            has_upload=bool(method_info.upload_config),
-            has_download=bool(method_info.supports_download)
-        )
-        self.__command_list.append(command_info)
-
-    def __LookupMessage(self, message, field):
-        message_type = self.__message_registry.LookupDescriptor(
-            '%s.%s' % (message.name, field.type_name))
-        if message_type is None:
-            message_type = self.__message_registry.LookupDescriptor(
-                field.type_name)
-        return message_type
-
-    def __GetCommandName(self, method_id):
-        command_name = method_id
-        prefix = '%s.' % self.__package
-        if command_name.startswith(prefix):
-            command_name = command_name[len(prefix):]
-        command_name = command_name.replace('.', '_')
-        return command_name
-
-    def __GetConversion(self, extended_field, extended_message):
-        """Returns a template for field type."""
-        field = extended_field.field_descriptor
-
-        type_name = ''
-        if field.variant in (messages.Variant.MESSAGE, messages.Variant.ENUM):
-            if field.type_name.startswith('apitools.base.protorpclite.'):
-                type_name = field.type_name
-            else:
-                field_message = self.__LookupMessage(extended_message, field)
-                if field_message is None:
-                    raise ValueError(
-                        'Could not find type for field %s' % field.name)
-                type_name = 'messages.%s' % field_message.full_name
-
-        template = ''
-        if field.variant in (messages.Variant.INT64, messages.Variant.UINT64):
-            template = 'int(%s)'
-        elif field.variant == messages.Variant.MESSAGE:
-            template = 'apitools_base.JsonToMessage(%s, %%s)' % type_name
-        elif field.variant == messages.Variant.ENUM:
-            template = '%s(%%s)' % type_name
-        elif field.variant == messages.Variant.STRING:
-            template = "%s.decode('utf8')"
-
-        if self.__FieldIsRepeated(extended_field.field_descriptor):
-            if template:
-                template = '[%s for x in %%s]' % (template % 'x')
-
-        return template
-
-    def __FieldIsRequired(self, field):
-        return field.label == descriptor.FieldDescriptor.Label.REQUIRED
-
-    def __FieldIsRepeated(self, field):
-        return field.label == descriptor.FieldDescriptor.Label.REPEATED
-
-    def __FlagInfoFromField(self, extended_field, extended_message, fv=''):
-        """Creates FlagInfo object for given field."""
-        field = extended_field.field_descriptor
-        flag_info = FlagInfo()
-        flag_info.name = str(field.name)
-        # TODO(craigcitro): We should key by variant.
-        flag_info.type = _VARIANT_TO_FLAG_TYPE_MAP[field.variant]
-        flag_info.description = extended_field.description
-        if field.default_value:
-            # TODO(craigcitro): Formatting?
-            flag_info.default = field.default_value
-        if flag_info.type == 'enum':
-            # TODO(craigcitro): Does protorpc do this for us?
-            enum_type = self.__LookupMessage(extended_message, field)
-            if enum_type is None:
-                raise ValueError('Cannot find enum type %s', field.type_name)
-            flag_info.enum_values = [x.name for x in enum_type.values]
-            # Note that this choice is completely arbitrary -- but we only
-            # push the value through if the user specifies it, so this
-            # doesn't hurt anything.
-            if flag_info.default is None:
-                flag_info.default = flag_info.enum_values[0]
-        if self.__FieldIsRequired(field):
-            flag_info.required = True
-        flag_info.fv = fv
-        flag_info.conversion = self.__GetConversion(
-            extended_field, extended_message)
-        return flag_info
-
-    def __PrintFlagDeclarations(self, printer):
-        """Writes out command line flag declarations."""
-        package = self.__client_info.package
-        function_name = '_Declare%sFlags' % (package[0].upper() + package[1:])
-        printer()
-        printer()
-        printer('def %s():', function_name)
-        with printer.Indent():
-            printer('"""Declare global flags in an idempotent way."""')
-            printer("if 'api_endpoint' in flags.FLAGS:")
-            with printer.Indent():
-                printer('return')
-            printer('flags.DEFINE_string(')
-            with printer.Indent('    '):
-                printer("'api_endpoint',")
-                printer('%r,', self.__client_info.base_url)
-                printer("'URL of the API endpoint to use.',")
-                printer("short_name='%s_url')", self.__package)
-            printer('flags.DEFINE_string(')
-            with printer.Indent('    '):
-                printer("'history_file',")
-                printer('%r,', '~/.%s.%s.history' %
-                        (self.__package, self.__version))
-                printer("'File with interactive shell history.')")
-            printer('flags.DEFINE_multistring(')
-            with printer.Indent('    '):
-                printer("'add_header', [],")
-                printer("'Additional http headers (as key=value strings). '")
-                printer("'Can be specified multiple times.')")
-            printer('flags.DEFINE_string(')
-            with printer.Indent('    '):
-                printer("'service_account_json_keyfile', '',")
-                printer("'Filename for a JSON service account key downloaded'")
-                printer("' from the Developer Console.')")
-            for flag_info in self.__global_flags:
-                self.__PrintFlag(printer, flag_info)
-        printer()
-        printer()
-        printer('FLAGS = flags.FLAGS')
-        printer('apitools_base_cli.DeclareBaseFlags()')
-        printer('%s()', function_name)
-
-    def __PrintGetGlobalParams(self, printer):
-        """Writes out GetGlobalParamsFromFlags function."""
-        printer('def GetGlobalParamsFromFlags():')
-        with printer.Indent():
-            printer('"""Return a StandardQueryParameters based on flags."""')
-            printer('result = messages.StandardQueryParameters()')
-
-            for flag_info in self.__global_flags:
-                rhs = 'FLAGS.%s' % flag_info.name
-                if flag_info.conversion:
-                    rhs = flag_info.conversion % rhs
-                printer('if FLAGS[%r].present:', flag_info.name)
-                with printer.Indent():
-                    printer('result.%s = %s', flag_info.name, rhs)
-            printer('return result')
-        printer()
-        printer()
-
-    def __PrintGetClient(self, printer):
-        """Writes out GetClientFromFlags function."""
-        printer('def GetClientFromFlags():')
-        with printer.Indent():
-            printer('"""Return a client object, configured from flags."""')
-            printer('log_request = FLAGS.log_request or '
-                    'FLAGS.log_request_response')
-            printer('log_response = FLAGS.log_response or '
-                    'FLAGS.log_request_response')
-            printer('api_endpoint = apitools_base.NormalizeApiEndpoint('
-                    'FLAGS.api_endpoint)')
-            printer("additional_http_headers = dict(x.split('=', 1) for x in "
-                    "FLAGS.add_header)")
-            printer('credentials_args = {')
-            with printer.Indent('    '):
-                printer("'service_account_json_keyfile': os.path.expanduser("
-                        'FLAGS.service_account_json_keyfile)')
-            printer('}')
-            printer('try:')
-            with printer.Indent():
-                printer('client = client_lib.%s(',
-                        self.__client_info.client_class_name)
-                with printer.Indent(indent='    '):
-                    printer('api_endpoint, log_request=log_request,')
-                    printer('log_response=log_response,')
-                    printer('credentials_args=credentials_args,')
-                    printer('additional_http_headers=additional_http_headers)')
-            printer('except apitools_base.CredentialsError as e:')
-            with printer.Indent():
-                printer("print 'Error creating credentials: %%s' %% e")
-                printer('sys.exit(1)')
-            printer('return client')
-        printer()
-        printer()
-
-    def __PrintCommandDocstring(self, printer, command_info):
-        with printer.CommentContext():
-            for line in textwrap.wrap('"""%s' % command_info.description,
-                                      printer.CalculateWidth()):
-                printer(line)
-            extended_descriptor.PrintIndentedDescriptions(
-                printer, command_info.args, 'Args')
-            extended_descriptor.PrintIndentedDescriptions(
-                printer, command_info.flags, 'Flags')
-            printer('"""')
-
-    def __PrintFlag(self, printer, flag_info):
-        """Writes out given flag definition."""
-        printer('flags.DEFINE_%s(', flag_info.type)
-        with printer.Indent(indent='    '):
-            printer('%r,', flag_info.name)
-            printer('%r,', flag_info.default)
-            if flag_info.type == 'enum':
-                printer('%r,', flag_info.enum_values)
-
-            # TODO(craigcitro): Consider using 'drop_whitespace' elsewhere.
-            description_lines = textwrap.wrap(
-                flag_info.description, 75 - len(printer.indent),
-                drop_whitespace=False)
-            for line in description_lines[:-1]:
-                printer('%r', line)
-            last_line = description_lines[-1] if description_lines else ''
-            printer('%r%s', last_line, ',' if flag_info.fv else ')')
-            if flag_info.fv:
-                printer('flag_values=%s)', flag_info.fv)
-        if flag_info.required:
-            printer('flags.MarkFlagAsRequired(%r)', flag_info.name)
-
-    def __PrintPyShell(self, printer):
-        """Writes out PyShell class."""
-        printer('class PyShell(appcommands.Cmd):')
-        printer()
-        with printer.Indent():
-            printer('def Run(self, _):')
-            with printer.Indent():
-                printer(
-                    '"""Run an interactive python shell with the client."""')
-                printer('client = GetClientFromFlags()')
-                printer('params = GetGlobalParamsFromFlags()')
-                printer('for field in params.all_fields():')
-                with printer.Indent():
-                    printer('value = params.get_assigned_value(field.name)')
-                    printer('if value != field.default:')
-                    with printer.Indent():
-                        printer('client.AddGlobalParam(field.name, value)')
-                printer('banner = """')
-                printer('       == %s interactive console ==' % (
-                    self.__client_info.package))
-                printer('             client: a %s client' %
-                        self.__client_info.package)
-                printer('      apitools_base: base apitools module')
-                printer('     messages: the generated messages module')
-                printer('"""')
-                printer('local_vars = {')
-                with printer.Indent(indent='    '):
-                    printer("'apitools_base': apitools_base,")
-                    printer("'client': client,")
-                    printer("'client_lib': client_lib,")
-                    printer("'messages': messages,")
-                printer('}')
-                printer("if platform.system() == 'Linux':")
-                with printer.Indent():
-                    printer('console = apitools_base_cli.ConsoleWithReadline(')
-                    with printer.Indent(indent='    '):
-                        printer('local_vars, histfile=FLAGS.history_file)')
-                printer('else:')
-                with printer.Indent():
-                    printer('console = code.InteractiveConsole(local_vars)')
-                printer('try:')
-                with printer.Indent():
-                    printer('console.interact(banner)')
-                printer('except SystemExit as e:')
-                with printer.Indent():
-                    printer('return e.code')
-        printer()
-        printer()
-
-    def WriteFile(self, printer):
-        """Write a simple CLI (currently just a stub)."""
-        printer('#!/usr/bin/env python')
-        printer('"""CLI for %s, version %s."""',
-                self.__package, self.__version)
-        printer('# NOTE: This file is autogenerated and should not be edited '
-                'by hand.')
-        # TODO(craigcitro): Add a build stamp, along with some other
-        # information.
-        printer()
-        printer('import code')
-        printer('import os')
-        printer('import platform')
-        printer('import sys')
-        printer()
-        printer('from %s import message_types', self.__protorpc_package)
-        printer('from %s import messages', self.__protorpc_package)
-        printer()
-        appcommands_import = 'from google.apputils import appcommands'
-        printer(appcommands_import)
-
-        flags_import = 'import gflags as flags'
-        printer(flags_import)
-        printer()
-        printer('import %s as apitools_base', self.__base_files_package)
-        printer('from %s import cli as apitools_base_cli',
-                self.__base_files_package)
-        import_prefix = ''
-        printer('%simport %s as client_lib',
-                import_prefix, self.__client_info.client_rule_name)
-        printer('%simport %s as messages',
-                import_prefix, self.__client_info.messages_rule_name)
-        self.__PrintFlagDeclarations(printer)
-        printer()
-        printer()
-        self.__PrintGetGlobalParams(printer)
-        self.__PrintGetClient(printer)
-        self.__PrintPyShell(printer)
-        self.__PrintCommands(printer)
-        printer('def main(_):')
-        with printer.Indent():
-            printer("appcommands.AddCmd('pyshell', PyShell)")
-            for command_info in self.__command_list:
-                printer("appcommands.AddCmd('%s', %s)",
-                        command_info.name, command_info.class_name)
-            printer()
-            printer('apitools_base_cli.SetupLogger()')
-            # TODO(craigcitro): Just call SetDefaultCommand as soon as
-            # another appcommands release happens and this exists
-            # externally.
-            printer("if hasattr(appcommands, 'SetDefaultCommand'):")
-            with printer.Indent():
-                printer("appcommands.SetDefaultCommand('pyshell')")
-        printer()
-        printer()
-        printer('run_main = apitools_base_cli.run_main')
-        printer()
-        printer("if __name__ == '__main__':")
-        with printer.Indent():
-            printer('appcommands.Run()')
-
-    def __PrintCommands(self, printer):
-        """Print all commands in this registry using printer."""
-        for command_info in self.__command_list:
-            arg_list = [arg_info.name for arg_info in command_info.args]
-            printer(
-                'class %s(apitools_base_cli.NewCmd):', command_info.class_name)
-            with printer.Indent():
-                printer('"""Command wrapping %s."""',
-                        command_info.client_method_path)
-                printer()
-                printer('usage = """%s%s%s"""',
-                        command_info.name,
-                        ' ' if arg_list else '',
-                        ' '.join('<%s>' % argname for argname in arg_list))
-                printer()
-                printer('def __init__(self, name, fv):')
-                with printer.Indent():
-                    printer('super(%s, self).__init__(name, fv)',
-                            command_info.class_name)
-                    for flag in command_info.flags:
-                        self.__PrintFlag(printer, flag)
-                printer()
-                printer('def RunWithArgs(%s):', ', '.join(['self'] + arg_list))
-                with printer.Indent():
-                    self.__PrintCommandDocstring(printer, command_info)
-                    printer('client = GetClientFromFlags()')
-                    printer('global_params = GetGlobalParamsFromFlags()')
-                    printer(
-                        'request = messages.%s(', command_info.request_type)
-                    with printer.Indent(indent='    '):
-                        for arg in command_info.args:
-                            rhs = arg.name
-                            if arg.conversion:
-                                rhs = arg.conversion % arg.name
-                            printer('%s=%s,', arg.name, rhs)
-                        printer(')')
-                    for flag_info in command_info.flags:
-                        if flag_info.special:
-                            continue
-                        rhs = 'FLAGS.%s' % flag_info.name
-                        if flag_info.conversion:
-                            rhs = flag_info.conversion % rhs
-                        printer('if FLAGS[%r].present:', flag_info.name)
-                        with printer.Indent():
-                            printer('request.%s = %s', flag_info.name, rhs)
-                    call_args = ['request', 'global_params=global_params']
-                    if command_info.has_upload:
-                        call_args.append('upload=upload')
-                        printer('upload = None')
-                        printer('if FLAGS.upload_filename:')
-                        with printer.Indent():
-                            printer('upload = apitools_base.Upload.FromFile(')
-                            printer('    FLAGS.upload_filename, '
-                                    'FLAGS.upload_mime_type,')
-                            printer('    progress_callback='
-                                    'apitools_base.UploadProgressPrinter,')
-                            printer('    finish_callback='
-                                    'apitools_base.UploadCompletePrinter)')
-                    if command_info.has_download:
-                        call_args.append('download=download')
-                        printer('download = None')
-                        printer('if FLAGS.download_filename:')
-                        with printer.Indent():
-                            printer('download = apitools_base.Download.'
-                                    'FromFile(FLAGS.download_filename, '
-                                    'overwrite=FLAGS.overwrite,')
-                            printer('    progress_callback='
-                                    'apitools_base.DownloadProgressPrinter,')
-                            printer('    finish_callback='
-                                    'apitools_base.DownloadCompletePrinter)')
-                    printer(
-                        'result = client.%s(', command_info.client_method_path)
-                    with printer.Indent(indent='    '):
-                        printer('%s)', ', '.join(call_args))
-                    printer('print apitools_base_cli.FormatOutput(result)')
-            printer()
-            printer()
diff --git a/apitools/gen/gen_client.py b/apitools/gen/gen_client.py
index 462b347..7027523 100644
--- a/apitools/gen/gen_client.py
+++ b/apitools/gen/gen_client.py
@@ -98,7 +98,6 @@
         discovery_doc, client_info, names, args.root_package, outdir,
         base_package=args.base_package,
         protorpc_package=args.protorpc_package,
-        generate_cli=args.generate_cli,
         init_wildcards_file=(args.init_file == 'wildcards'),
         use_proto2=args.experimental_proto2_output,
         unelidable_request_methods=args.unelidable_request_methods,
@@ -108,9 +107,7 @@
 # TODO(craigcitro): Delete this if we don't need this functionality.
 def _WriteBaseFiles(codegen):
     with util.Chdir(codegen.outdir):
-        _CopyLocalFile('app2.py')
         _CopyLocalFile('base_api.py')
-        _CopyLocalFile('base_cli.py')
         _CopyLocalFile('credentials_lib.py')
         _CopyLocalFile('exceptions.py')
 
@@ -136,10 +133,6 @@
             codegen.WriteMessagesFile(out)
         with open(codegen.client_info.client_file_name, 'w') as out:
             codegen.WriteClientLibrary(out)
-        if args.generate_cli:
-            with open(codegen.client_info.cli_file_name, 'w') as out:
-                codegen.WriteCli(out)
-            os.chmod(codegen.client_info.cli_file_name, 0o755)
 
 
 def _WriteInit(codegen):
@@ -176,7 +169,6 @@
     args.outdir = os.path.join(
         args.outdir, 'apitools/clients/%s' % package)
     args.root_package = 'apitools.clients.%s' % package
-    args.generate_cli = False
     codegen = _GetCodegenFromFlags(args)
     if codegen is None:
         logging.error('Failed to create codegen, exiting.')
@@ -287,11 +279,10 @@
 
     parser.add_argument(
         '--generate_cli', dest='generate_cli', action='store_true',
-        help='If specified (default), a CLI is also generated.')
+        help='Ignored.')
     parser.add_argument(
         '--nogenerate_cli', dest='generate_cli', action='store_false',
-        help='CLI will not be generated.')
-    parser.set_defaults(generate_cli=True)
+        help='Ignored.')
 
     parser.add_argument(
         '--init-file',
diff --git a/apitools/gen/gen_client_lib.py b/apitools/gen/gen_client_lib.py
index b910f0f..1796762 100644
--- a/apitools/gen/gen_client_lib.py
+++ b/apitools/gen/gen_client_lib.py
@@ -22,7 +22,6 @@
 
 import datetime
 
-from apitools.gen import command_registry
 from apitools.gen import message_registry
 from apitools.gen import service_registry
 from apitools.gen import util
@@ -63,8 +62,7 @@
     """Code generator for a given discovery document."""
 
     def __init__(self, discovery_doc, client_info, names, root_package, outdir,
-                 base_package, protorpc_package, generate_cli=False,
-                 init_wildcards_file=True,
+                 base_package, protorpc_package, init_wildcards_file=True,
                  use_proto2=False, unelidable_request_methods=None,
                  apitools_version=''):
         self.__discovery_doc = discovery_doc
@@ -76,7 +74,6 @@
         self.__package = self.__client_info.package
         self.__version = self.__client_info.version
         self.__revision = discovery_doc.get('revision', '1')
-        self.__generate_cli = generate_cli
         self.__init_wildcards_file = init_wildcards_file
         self.__root_package = root_package
         self.__base_files_package = base_package
@@ -104,19 +101,9 @@
         # fields from MessageFields to EnumFields.
         self.__message_registry.FixupMessageFields()
 
-        self.__command_registry = command_registry.CommandRegistry(
-            self.__package, self.__version, self.__client_info,
-            self.__message_registry, self.__root_package,
-            self.__base_files_package, self.__protorpc_package,
-            self.__names)
-        self.__command_registry.AddGlobalParameters(
-            self.__message_registry.LookupDescriptorOrDie(
-                'StandardQueryParameters'))
-
         self.__services_registry = service_registry.ServiceRegistry(
             self.__client_info,
             self.__message_registry,
-            self.__command_registry,
             self.__names,
             self.__root_package,
             self.__base_files_package,
@@ -189,9 +176,6 @@
                 import_prefix = ''
             else:
                 import_prefix = '%s.' % self.__root_package
-            if self.__generate_cli:
-                printer('from %s%s import *',
-                        import_prefix, self.__client_info.cli_rule_name)
             printer('from %s%s import *',
                     import_prefix, self.__client_info.client_rule_name)
             printer('from %s%s import *',
@@ -281,6 +265,3 @@
 
     def WriteClientLibrary(self, out):
         self.__services_registry.WriteFile(self._GetPrinter(out))
-
-    def WriteCli(self, out):
-        self.__command_registry.WriteFile(self._GetPrinter(out))
diff --git a/apitools/gen/gen_client_test.py b/apitools/gen/gen_client_test.py
index 3be3e7a..a0dbc9e 100644
--- a/apitools/gen/gen_client_test.py
+++ b/apitools/gen/gen_client_test.py
@@ -47,7 +47,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--generate_cli',
                 '--init-file', 'none',
                 '--infile', GetTestDataPath('dns', 'dns_v1.json'),
                 '--outdir', tmp_dir_path,
@@ -56,7 +55,6 @@
                 'client'
             ])
             expected_files = (
-                set(['dns_v1.py']) |  # CLI files
                 set(['dns_v1_client.py', 'dns_v1_messages.py']))
             self.assertEquals(expected_files, set(os.listdir(tmp_dir_path)))
 
@@ -64,7 +62,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--generate_cli',
                 '--init-file', 'empty',
                 '--infile', GetTestDataPath('dns', 'dns_v1.json'),
                 '--outdir', tmp_dir_path,
@@ -73,7 +70,6 @@
                 'client'
             ])
             expected_files = (
-                set(['dns_v1.py']) |  # CLI files
                 set(['dns_v1_client.py', 'dns_v1_messages.py', '__init__.py']))
             self.assertEquals(expected_files, set(os.listdir(tmp_dir_path)))
             init_file = _GetContent(os.path.join(tmp_dir_path, '__init__.py'))
@@ -88,7 +84,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--nogenerate_cli',
                 '--infile', GetTestDataPath('dns', 'dns_v1.json'),
                 '--outdir', tmp_dir_path,
                 '--overwrite',
@@ -104,7 +99,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--nogenerate_cli',
                 '--infile', GetTestDataPath('dns', 'dns_v1.json'),
                 '--outdir', tmp_dir_path,
                 '--overwrite',
@@ -120,7 +114,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--nogenerate_cli',
                 '--infile', GetTestDataPath('dns', 'dns_v1.json'),
                 '--outdir', tmp_dir_path,
                 '--overwrite',
@@ -135,7 +128,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--nogenerate_cli',
                 '--infile', GetTestDataPath('dns', 'dns_v1.json'),
                 '--outdir', tmp_dir_path,
                 '--overwrite',
diff --git a/apitools/gen/service_registry.py b/apitools/gen/service_registry.py
index fdcd93e..66b635a 100644
--- a/apitools/gen/service_registry.py
+++ b/apitools/gen/service_registry.py
@@ -34,7 +34,7 @@
 
     """Registry for service types."""
 
-    def __init__(self, client_info, message_registry, command_registry,
+    def __init__(self, client_info, message_registry,
                  names, root_package, base_files_package,
                  unelidable_request_methods):
         self.__client_info = client_info
@@ -42,7 +42,6 @@
         self.__names = names
         self.__service_method_info_map = collections.OrderedDict()
         self.__message_registry = message_registry
-        self.__command_registry = command_registry
         self.__root_package = root_package
         self.__base_files_package = base_files_package
         self.__unelidable_request_methods = unelidable_request_methods
@@ -473,9 +472,6 @@
 
             method_info_map[method_name] = self.__ComputeMethodInfo(
                 method_description, request, response, request_field)
-            self.__command_registry.AddCommandForMethod(
-                service_name, method_name, method_info_map[method_name],
-                request, response)
 
         nested_services = methods.get('resources', {})
         services = sorted(nested_services.items())
diff --git a/apitools/gen/util.py b/apitools/gen/util.py
index 146b452..312885f 100644
--- a/apitools/gen/util.py
+++ b/apitools/gen/util.py
@@ -223,14 +223,6 @@
         return self.package
 
     @property
-    def cli_rule_name(self):
-        return '%s_%s' % (self.package, self.version)
-
-    @property
-    def cli_file_name(self):
-        return '%s.py' % self.cli_rule_name
-
-    @property
     def client_rule_name(self):
         return '%s_%s_client' % (self.package, self.version)
 
diff --git a/samples/bigquery_sample/bigquery_v2/bigquery_v2.py b/samples/bigquery_sample/bigquery_v2/bigquery_v2.py
deleted file mode 100644
index 7cd69b5..0000000
--- a/samples/bigquery_sample/bigquery_v2/bigquery_v2.py
+++ /dev/null
@@ -1,1096 +0,0 @@
-#!/usr/bin/env python
-"""CLI for bigquery, version v2."""
-# NOTE: This file is autogenerated and should not be edited by hand.
-
-import code
-import os
-import platform
-import sys
-
-from apitools.base.protorpclite import message_types
-from apitools.base.protorpclite import messages
-
-from google.apputils import appcommands
-import gflags as flags
-
-import apitools.base.py as apitools_base
-from apitools.base.py import cli as apitools_base_cli
-import bigquery_v2_client as client_lib
-import bigquery_v2_messages as messages
-
-
-def _DeclareBigqueryFlags():
-  """Declare global flags in an idempotent way."""
-  if 'api_endpoint' in flags.FLAGS:
-    return
-  flags.DEFINE_string(
-      'api_endpoint',
-      u'https://www.googleapis.com/bigquery/v2/',
-      'URL of the API endpoint to use.',
-      short_name='bigquery_url')
-  flags.DEFINE_string(
-      'history_file',
-      u'~/.bigquery.v2.history',
-      'File with interactive shell history.')
-  flags.DEFINE_multistring(
-      'add_header', [],
-      'Additional http headers (as key=value strings). '
-      'Can be specified multiple times.')
-  flags.DEFINE_string(
-      'service_account_json_keyfile', '',
-      'Filename for a JSON service account key downloaded'
-      ' from the Developer Console.')
-  flags.DEFINE_enum(
-      'alt',
-      u'json',
-      [u'json'],
-      u'Data format for the response.')
-  flags.DEFINE_string(
-      'fields',
-      None,
-      u'Selector specifying which fields to include in a partial response.')
-  flags.DEFINE_string(
-      'key',
-      None,
-      u'API key. Your API key identifies your project and provides you with '
-      u'API access, quota, and reports. Required unless you provide an OAuth '
-      u'2.0 token.')
-  flags.DEFINE_string(
-      'oauth_token',
-      None,
-      u'OAuth 2.0 token for the current user.')
-  flags.DEFINE_boolean(
-      'prettyPrint',
-      'True',
-      u'Returns response with indentations and line breaks.')
-  flags.DEFINE_string(
-      'quotaUser',
-      None,
-      u'Available to use for quota purposes for server-side applications. Can'
-      u' be any arbitrary string assigned to a user, but should not exceed 40'
-      u' characters. Overrides userIp if both are provided.')
-  flags.DEFINE_string(
-      'trace',
-      None,
-      'A tracing token of the form "token:<tokenid>" to include in api '
-      'requests.')
-  flags.DEFINE_string(
-      'userIp',
-      None,
-      u'IP address of the site where the request originates. Use this if you '
-      u'want to enforce per-user limits.')
-
-
-FLAGS = flags.FLAGS
-apitools_base_cli.DeclareBaseFlags()
-_DeclareBigqueryFlags()
-
-
-def GetGlobalParamsFromFlags():
-  """Return a StandardQueryParameters based on flags."""
-  result = messages.StandardQueryParameters()
-  if FLAGS['alt'].present:
-    result.alt = messages.StandardQueryParameters.AltValueValuesEnum(FLAGS.alt)
-  if FLAGS['fields'].present:
-    result.fields = FLAGS.fields.decode('utf8')
-  if FLAGS['key'].present:
-    result.key = FLAGS.key.decode('utf8')
-  if FLAGS['oauth_token'].present:
-    result.oauth_token = FLAGS.oauth_token.decode('utf8')
-  if FLAGS['prettyPrint'].present:
-    result.prettyPrint = FLAGS.prettyPrint
-  if FLAGS['quotaUser'].present:
-    result.quotaUser = FLAGS.quotaUser.decode('utf8')
-  if FLAGS['trace'].present:
-    result.trace = FLAGS.trace.decode('utf8')
-  if FLAGS['userIp'].present:
-    result.userIp = FLAGS.userIp.decode('utf8')
-  return result
-
-
-def GetClientFromFlags():
-  """Return a client object, configured from flags."""
-  log_request = FLAGS.log_request or FLAGS.log_request_response
-  log_response = FLAGS.log_response or FLAGS.log_request_response
-  api_endpoint = apitools_base.NormalizeApiEndpoint(FLAGS.api_endpoint)
-  additional_http_headers = dict(x.split('=', 1) for x in FLAGS.add_header)
-  credentials_args = {
-      'service_account_json_keyfile': os.path.expanduser(FLAGS.service_account_json_keyfile)
-  }
-  try:
-    client = client_lib.BigqueryV2(
-        api_endpoint, log_request=log_request,
-        log_response=log_response,
-        credentials_args=credentials_args,
-        additional_http_headers=additional_http_headers)
-  except apitools_base.CredentialsError as e:
-    print 'Error creating credentials: %s' % e
-    sys.exit(1)
-  return client
-
-
-class PyShell(appcommands.Cmd):
-
-  def Run(self, _):
-    """Run an interactive python shell with the client."""
-    client = GetClientFromFlags()
-    params = GetGlobalParamsFromFlags()
-    for field in params.all_fields():
-      value = params.get_assigned_value(field.name)
-      if value != field.default:
-        client.AddGlobalParam(field.name, value)
-    banner = """
-           == bigquery interactive console ==
-                 client: a bigquery client
-          apitools_base: base apitools module
-         messages: the generated messages module
-    """
-    local_vars = {
-        'apitools_base': apitools_base,
-        'client': client,
-        'client_lib': client_lib,
-        'messages': messages,
-    }
-    if platform.system() == 'Linux':
-      console = apitools_base_cli.ConsoleWithReadline(
-          local_vars, histfile=FLAGS.history_file)
-    else:
-      console = code.InteractiveConsole(local_vars)
-    try:
-      console.interact(banner)
-    except SystemExit as e:
-      return e.code
-
-
-class DatasetsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping datasets.Delete."""
-
-  usage = """datasets_delete <projectId> <datasetId>"""
-
-  def __init__(self, name, fv):
-    super(DatasetsDelete, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'deleteContents',
-        None,
-        u'If True, delete all the tables in the dataset. If False and the '
-        u'dataset contains tables, the request will fail. Default is False',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId):
-    """Deletes the dataset specified by the datasetId value. Before you can
-    delete a dataset, you must delete all its tables, either manually or by
-    specifying deleteContents. Immediately after deletion, you can create
-    another dataset with the same name.
-
-    Args:
-      projectId: Project ID of the dataset being deleted
-      datasetId: Dataset ID of dataset being deleted
-
-    Flags:
-      deleteContents: If True, delete all the tables in the dataset. If False
-        and the dataset contains tables, the request will fail. Default is
-        False
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryDatasetsDeleteRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        )
-    if FLAGS['deleteContents'].present:
-      request.deleteContents = FLAGS.deleteContents
-    result = client.datasets.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DatasetsGet(apitools_base_cli.NewCmd):
-  """Command wrapping datasets.Get."""
-
-  usage = """datasets_get <projectId> <datasetId>"""
-
-  def __init__(self, name, fv):
-    super(DatasetsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, projectId, datasetId):
-    """Returns the dataset specified by datasetID.
-
-    Args:
-      projectId: Project ID of the requested dataset
-      datasetId: Dataset ID of the requested dataset
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryDatasetsGetRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        )
-    result = client.datasets.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DatasetsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping datasets.Insert."""
-
-  usage = """datasets_insert <projectId>"""
-
-  def __init__(self, name, fv):
-    super(DatasetsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'dataset',
-        None,
-        u'A Dataset resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId):
-    """Creates a new empty dataset.
-
-    Args:
-      projectId: Project ID of the new dataset
-
-    Flags:
-      dataset: A Dataset resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryDatasetsInsertRequest(
-        projectId=projectId.decode('utf8'),
-        )
-    if FLAGS['dataset'].present:
-      request.dataset = apitools_base.JsonToMessage(messages.Dataset, FLAGS.dataset)
-    result = client.datasets.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DatasetsList(apitools_base_cli.NewCmd):
-  """Command wrapping datasets.List."""
-
-  usage = """datasets_list <projectId>"""
-
-  def __init__(self, name, fv):
-    super(DatasetsList, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'all',
-        None,
-        u'Whether to list all datasets, including hidden ones',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'filter',
-        None,
-        u'An expression for filtering the results of the request by label. '
-        u'The syntax is "labels.[:]". Multiple filters can be ANDed together '
-        u'by connecting with a space. Example: "labels.department:receiving '
-        u'labels.active". See https://cloud.google.com/bigquery/docs'
-        u'/labeling-datasets#filtering_datasets_using_labels for details.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'The maximum number of results to return',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Page token, returned by a previous call, to request the next page '
-        u'of results',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId):
-    """Lists all datasets in the specified project to which you have been
-    granted the READER dataset role.
-
-    Args:
-      projectId: Project ID of the datasets to be listed
-
-    Flags:
-      all: Whether to list all datasets, including hidden ones
-      filter: An expression for filtering the results of the request by label.
-        The syntax is "labels.[:]". Multiple filters can be ANDed together by
-        connecting with a space. Example: "labels.department:receiving
-        labels.active". See https://cloud.google.com/bigquery/docs/labeling-
-        datasets#filtering_datasets_using_labels for details.
-      maxResults: The maximum number of results to return
-      pageToken: Page token, returned by a previous call, to request the next
-        page of results
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryDatasetsListRequest(
-        projectId=projectId.decode('utf8'),
-        )
-    if FLAGS['all'].present:
-      request.all = FLAGS.all
-    if FLAGS['filter'].present:
-      request.filter = FLAGS.filter.decode('utf8')
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.datasets.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DatasetsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping datasets.Patch."""
-
-  usage = """datasets_patch <projectId> <datasetId>"""
-
-  def __init__(self, name, fv):
-    super(DatasetsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'dataset',
-        None,
-        u'A Dataset resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId):
-    """Updates information in an existing dataset. The update method replaces
-    the entire dataset resource, whereas the patch method only replaces fields
-    that are provided in the submitted dataset resource. This method supports
-    patch semantics.
-
-    Args:
-      projectId: Project ID of the dataset being updated
-      datasetId: Dataset ID of the dataset being updated
-
-    Flags:
-      dataset: A Dataset resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryDatasetsPatchRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        )
-    if FLAGS['dataset'].present:
-      request.dataset = apitools_base.JsonToMessage(messages.Dataset, FLAGS.dataset)
-    result = client.datasets.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DatasetsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping datasets.Update."""
-
-  usage = """datasets_update <projectId> <datasetId>"""
-
-  def __init__(self, name, fv):
-    super(DatasetsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'dataset',
-        None,
-        u'A Dataset resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId):
-    """Updates information in an existing dataset. The update method replaces
-    the entire dataset resource, whereas the patch method only replaces fields
-    that are provided in the submitted dataset resource.
-
-    Args:
-      projectId: Project ID of the dataset being updated
-      datasetId: Dataset ID of the dataset being updated
-
-    Flags:
-      dataset: A Dataset resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryDatasetsUpdateRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        )
-    if FLAGS['dataset'].present:
-      request.dataset = apitools_base.JsonToMessage(messages.Dataset, FLAGS.dataset)
-    result = client.datasets.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class JobsCancel(apitools_base_cli.NewCmd):
-  """Command wrapping jobs.Cancel."""
-
-  usage = """jobs_cancel <projectId> <jobId>"""
-
-  def __init__(self, name, fv):
-    super(JobsCancel, self).__init__(name, fv)
-
-  def RunWithArgs(self, projectId, jobId):
-    """Requests that a job be cancelled. This call will return immediately,
-    and the client will need to poll for the job status to see if the cancel
-    completed successfully. Cancelled jobs may still incur costs.
-
-    Args:
-      projectId: [Required] Project ID of the job to cancel
-      jobId: [Required] Job ID of the job to cancel
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryJobsCancelRequest(
-        projectId=projectId.decode('utf8'),
-        jobId=jobId.decode('utf8'),
-        )
-    result = client.jobs.Cancel(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class JobsGet(apitools_base_cli.NewCmd):
-  """Command wrapping jobs.Get."""
-
-  usage = """jobs_get <projectId> <jobId>"""
-
-  def __init__(self, name, fv):
-    super(JobsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, projectId, jobId):
-    """Returns information about a specific job. Job information is available
-    for a six month period after creation. Requires that you're the person who
-    ran the job, or have the Is Owner project role.
-
-    Args:
-      projectId: [Required] Project ID of the requested job
-      jobId: [Required] Job ID of the requested job
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryJobsGetRequest(
-        projectId=projectId.decode('utf8'),
-        jobId=jobId.decode('utf8'),
-        )
-    result = client.jobs.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class JobsGetQueryResults(apitools_base_cli.NewCmd):
-  """Command wrapping jobs.GetQueryResults."""
-
-  usage = """jobs_getQueryResults <projectId> <jobId>"""
-
-  def __init__(self, name, fv):
-    super(JobsGetQueryResults, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of results to read',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Page token, returned by a previous call, to request the next page '
-        u'of results',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'startIndex',
-        None,
-        u'Zero-based index of the starting row',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'timeoutMs',
-        None,
-        u'How long to wait for the query to complete, in milliseconds, before'
-        u' returning. Default is 10 seconds. If the timeout passes before the'
-        u" job completes, the 'jobComplete' field in the response will be "
-        u'false',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, jobId):
-    """Retrieves the results of a query job.
-
-    Args:
-      projectId: [Required] Project ID of the query job
-      jobId: [Required] Job ID of the query job
-
-    Flags:
-      maxResults: Maximum number of results to read
-      pageToken: Page token, returned by a previous call, to request the next
-        page of results
-      startIndex: Zero-based index of the starting row
-      timeoutMs: How long to wait for the query to complete, in milliseconds,
-        before returning. Default is 10 seconds. If the timeout passes before
-        the job completes, the 'jobComplete' field in the response will be
-        false
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryJobsGetQueryResultsRequest(
-        projectId=projectId.decode('utf8'),
-        jobId=jobId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['startIndex'].present:
-      request.startIndex = int(FLAGS.startIndex)
-    if FLAGS['timeoutMs'].present:
-      request.timeoutMs = FLAGS.timeoutMs
-    result = client.jobs.GetQueryResults(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class JobsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping jobs.Insert."""
-
-  usage = """jobs_insert <projectId>"""
-
-  def __init__(self, name, fv):
-    super(JobsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'job',
-        None,
-        u'A Job resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_filename',
-        '',
-        'Filename to use for upload.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_mime_type',
-        '',
-        'MIME type to use for the upload. Only needed if the extension on '
-        '--upload_filename does not determine the correct (or any) MIME '
-        'type.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId):
-    """Starts a new asynchronous job. Requires the Can View project role.
-
-    Args:
-      projectId: Project ID of the project that will be billed for the job
-
-    Flags:
-      job: A Job resource to be passed as the request body.
-      upload_filename: Filename to use for upload.
-      upload_mime_type: MIME type to use for the upload. Only needed if the
-        extension on --upload_filename does not determine the correct (or any)
-        MIME type.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryJobsInsertRequest(
-        projectId=projectId.decode('utf8'),
-        )
-    if FLAGS['job'].present:
-      request.job = apitools_base.JsonToMessage(messages.Job, FLAGS.job)
-    upload = None
-    if FLAGS.upload_filename:
-      upload = apitools_base.Upload.FromFile(
-          FLAGS.upload_filename, FLAGS.upload_mime_type,
-          progress_callback=apitools_base.UploadProgressPrinter,
-          finish_callback=apitools_base.UploadCompletePrinter)
-    result = client.jobs.Insert(
-        request, global_params=global_params, upload=upload)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class JobsList(apitools_base_cli.NewCmd):
-  """Command wrapping jobs.List."""
-
-  usage = """jobs_list <projectId>"""
-
-  def __init__(self, name, fv):
-    super(JobsList, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'allUsers',
-        None,
-        u'Whether to display jobs owned by all users in the project. Default '
-        u'false',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of results to return',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Page token, returned by a previous call, to request the next page '
-        u'of results',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'minimal'],
-        u'Restrict information returned to a set of selected fields',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'stateFilter',
-        u'done',
-        [u'done', u'pending', u'running'],
-        u'Filter for job state',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId):
-    """Lists all jobs that you started in the specified project. Job
-    information is available for a six month period after creation. The job
-    list is sorted in reverse chronological order, by job creation time.
-    Requires the Can View project role, or the Is Owner project role if you
-    set the allUsers property.
-
-    Args:
-      projectId: Project ID of the jobs to list
-
-    Flags:
-      allUsers: Whether to display jobs owned by all users in the project.
-        Default false
-      maxResults: Maximum number of results to return
-      pageToken: Page token, returned by a previous call, to request the next
-        page of results
-      projection: Restrict information returned to a set of selected fields
-      stateFilter: Filter for job state
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryJobsListRequest(
-        projectId=projectId.decode('utf8'),
-        )
-    if FLAGS['allUsers'].present:
-      request.allUsers = FLAGS.allUsers
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['projection'].present:
-      request.projection = messages.BigqueryJobsListRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    if FLAGS['stateFilter'].present:
-      request.stateFilter = [messages.BigqueryJobsListRequest.StateFilterValueValuesEnum(x) for x in FLAGS.stateFilter]
-    result = client.jobs.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class JobsQuery(apitools_base_cli.NewCmd):
-  """Command wrapping jobs.Query."""
-
-  usage = """jobs_query <projectId>"""
-
-  def __init__(self, name, fv):
-    super(JobsQuery, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'queryRequest',
-        None,
-        u'A QueryRequest resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId):
-    """Runs a BigQuery SQL query synchronously and returns query results if
-    the query completes within a specified timeout.
-
-    Args:
-      projectId: Project ID of the project billed for the query
-
-    Flags:
-      queryRequest: A QueryRequest resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryJobsQueryRequest(
-        projectId=projectId.decode('utf8'),
-        )
-    if FLAGS['queryRequest'].present:
-      request.queryRequest = apitools_base.JsonToMessage(messages.QueryRequest, FLAGS.queryRequest)
-    result = client.jobs.Query(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsList(apitools_base_cli.NewCmd):
-  """Command wrapping projects.List."""
-
-  usage = """projects_list"""
-
-  def __init__(self, name, fv):
-    super(ProjectsList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of results to return',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Page token, returned by a previous call, to request the next page '
-        u'of results',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Lists all projects to which you have been granted any project role.
-
-    Flags:
-      maxResults: Maximum number of results to return
-      pageToken: Page token, returned by a previous call, to request the next
-        page of results
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryProjectsListRequest(
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.projects.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TabledataInsertAll(apitools_base_cli.NewCmd):
-  """Command wrapping tabledata.InsertAll."""
-
-  usage = """tabledata_insertAll <projectId> <datasetId> <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TabledataInsertAll, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'tableDataInsertAllRequest',
-        None,
-        u'A TableDataInsertAllRequest resource to be passed as the request '
-        u'body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId, tableId):
-    """Streams data into BigQuery one record at a time without needing to run
-    a load job. Requires the WRITER dataset role.
-
-    Args:
-      projectId: Project ID of the destination table.
-      datasetId: Dataset ID of the destination table.
-      tableId: Table ID of the destination table.
-
-    Flags:
-      tableDataInsertAllRequest: A TableDataInsertAllRequest resource to be
-        passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTabledataInsertAllRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['tableDataInsertAllRequest'].present:
-      request.tableDataInsertAllRequest = apitools_base.JsonToMessage(messages.TableDataInsertAllRequest, FLAGS.tableDataInsertAllRequest)
-    result = client.tabledata.InsertAll(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TabledataList(apitools_base_cli.NewCmd):
-  """Command wrapping tabledata.List."""
-
-  usage = """tabledata_list <projectId> <datasetId> <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TabledataList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of results to return',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Page token, returned by a previous call, identifying the result set',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'startIndex',
-        None,
-        u'Zero-based index of the starting row to read',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId, tableId):
-    """Retrieves table data from a specified set of rows. Requires the READER
-    dataset role.
-
-    Args:
-      projectId: Project ID of the table to read
-      datasetId: Dataset ID of the table to read
-      tableId: Table ID of the table to read
-
-    Flags:
-      maxResults: Maximum number of results to return
-      pageToken: Page token, returned by a previous call, identifying the
-        result set
-      startIndex: Zero-based index of the starting row to read
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTabledataListRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['startIndex'].present:
-      request.startIndex = int(FLAGS.startIndex)
-    result = client.tabledata.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablesDelete(apitools_base_cli.NewCmd):
-  """Command wrapping tables.Delete."""
-
-  usage = """tables_delete <projectId> <datasetId> <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TablesDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, projectId, datasetId, tableId):
-    """Deletes the table specified by tableId from the dataset. If the table
-    contains data, all the data will be deleted.
-
-    Args:
-      projectId: Project ID of the table to delete
-      datasetId: Dataset ID of the table to delete
-      tableId: Table ID of the table to delete
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTablesDeleteRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        tableId=tableId.decode('utf8'),
-        )
-    result = client.tables.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablesGet(apitools_base_cli.NewCmd):
-  """Command wrapping tables.Get."""
-
-  usage = """tables_get <projectId> <datasetId> <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TablesGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, projectId, datasetId, tableId):
-    """Gets the specified table resource by table ID. This method does not
-    return the data in the table, it only returns the table resource, which
-    describes the structure of this table.
-
-    Args:
-      projectId: Project ID of the requested table
-      datasetId: Dataset ID of the requested table
-      tableId: Table ID of the requested table
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTablesGetRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        tableId=tableId.decode('utf8'),
-        )
-    result = client.tables.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablesInsert(apitools_base_cli.NewCmd):
-  """Command wrapping tables.Insert."""
-
-  usage = """tables_insert <projectId> <datasetId>"""
-
-  def __init__(self, name, fv):
-    super(TablesInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'table',
-        None,
-        u'A Table resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId):
-    """Creates a new, empty table in the dataset.
-
-    Args:
-      projectId: Project ID of the new table
-      datasetId: Dataset ID of the new table
-
-    Flags:
-      table: A Table resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTablesInsertRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        )
-    if FLAGS['table'].present:
-      request.table = apitools_base.JsonToMessage(messages.Table, FLAGS.table)
-    result = client.tables.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablesList(apitools_base_cli.NewCmd):
-  """Command wrapping tables.List."""
-
-  usage = """tables_list <projectId> <datasetId>"""
-
-  def __init__(self, name, fv):
-    super(TablesList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of results to return',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Page token, returned by a previous call, to request the next page '
-        u'of results',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId):
-    """Lists all tables in the specified dataset. Requires the READER dataset
-    role.
-
-    Args:
-      projectId: Project ID of the tables to list
-      datasetId: Dataset ID of the tables to list
-
-    Flags:
-      maxResults: Maximum number of results to return
-      pageToken: Page token, returned by a previous call, to request the next
-        page of results
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTablesListRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.tables.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablesPatch(apitools_base_cli.NewCmd):
-  """Command wrapping tables.Patch."""
-
-  usage = """tables_patch <projectId> <datasetId> <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TablesPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'table',
-        None,
-        u'A Table resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId, tableId):
-    """Updates information in an existing table. The update method replaces
-    the entire table resource, whereas the patch method only replaces fields
-    that are provided in the submitted table resource. This method supports
-    patch semantics.
-
-    Args:
-      projectId: Project ID of the table to update
-      datasetId: Dataset ID of the table to update
-      tableId: Table ID of the table to update
-
-    Flags:
-      table: A Table resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTablesPatchRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['table'].present:
-      request.table = apitools_base.JsonToMessage(messages.Table, FLAGS.table)
-    result = client.tables.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablesUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping tables.Update."""
-
-  usage = """tables_update <projectId> <datasetId> <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TablesUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'table',
-        None,
-        u'A Table resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, projectId, datasetId, tableId):
-    """Updates information in an existing table. The update method replaces
-    the entire table resource, whereas the patch method only replaces fields
-    that are provided in the submitted table resource.
-
-    Args:
-      projectId: Project ID of the table to update
-      datasetId: Dataset ID of the table to update
-      tableId: Table ID of the table to update
-
-    Flags:
-      table: A Table resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BigqueryTablesUpdateRequest(
-        projectId=projectId.decode('utf8'),
-        datasetId=datasetId.decode('utf8'),
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['table'].present:
-      request.table = apitools_base.JsonToMessage(messages.Table, FLAGS.table)
-    result = client.tables.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-def main(_):
-  appcommands.AddCmd('pyshell', PyShell)
-  appcommands.AddCmd('datasets_delete', DatasetsDelete)
-  appcommands.AddCmd('datasets_get', DatasetsGet)
-  appcommands.AddCmd('datasets_insert', DatasetsInsert)
-  appcommands.AddCmd('datasets_list', DatasetsList)
-  appcommands.AddCmd('datasets_patch', DatasetsPatch)
-  appcommands.AddCmd('datasets_update', DatasetsUpdate)
-  appcommands.AddCmd('jobs_cancel', JobsCancel)
-  appcommands.AddCmd('jobs_get', JobsGet)
-  appcommands.AddCmd('jobs_getQueryResults', JobsGetQueryResults)
-  appcommands.AddCmd('jobs_insert', JobsInsert)
-  appcommands.AddCmd('jobs_list', JobsList)
-  appcommands.AddCmd('jobs_query', JobsQuery)
-  appcommands.AddCmd('projects_list', ProjectsList)
-  appcommands.AddCmd('tabledata_insertAll', TabledataInsertAll)
-  appcommands.AddCmd('tabledata_list', TabledataList)
-  appcommands.AddCmd('tables_delete', TablesDelete)
-  appcommands.AddCmd('tables_get', TablesGet)
-  appcommands.AddCmd('tables_insert', TablesInsert)
-  appcommands.AddCmd('tables_list', TablesList)
-  appcommands.AddCmd('tables_patch', TablesPatch)
-  appcommands.AddCmd('tables_update', TablesUpdate)
-
-  apitools_base_cli.SetupLogger()
-  if hasattr(appcommands, 'SetDefaultCommand'):
-    appcommands.SetDefaultCommand('pyshell')
-
-
-run_main = apitools_base_cli.run_main
-
-if __name__ == '__main__':
-  appcommands.Run()
diff --git a/samples/dns_sample/dns_v1/dns_v1.py b/samples/dns_sample/dns_v1/dns_v1.py
deleted file mode 100644
index 56e54f3..0000000
--- a/samples/dns_sample/dns_v1/dns_v1.py
+++ /dev/null
@@ -1,554 +0,0 @@
-#!/usr/bin/env python
-"""CLI for dns, version v1."""
-# NOTE: This file is autogenerated and should not be edited by hand.
-
-import code
-import os
-import platform
-import sys
-
-from apitools.base.protorpclite import message_types
-from apitools.base.protorpclite import messages
-
-from google.apputils import appcommands
-import gflags as flags
-
-import apitools.base.py as apitools_base
-from apitools.base.py import cli as apitools_base_cli
-import dns_v1_client as client_lib
-import dns_v1_messages as messages
-
-
-def _DeclareDnsFlags():
-  """Declare global flags in an idempotent way."""
-  if 'api_endpoint' in flags.FLAGS:
-    return
-  flags.DEFINE_string(
-      'api_endpoint',
-      u'https://www.googleapis.com/dns/v1/',
-      'URL of the API endpoint to use.',
-      short_name='dns_url')
-  flags.DEFINE_string(
-      'history_file',
-      u'~/.dns.v1.history',
-      'File with interactive shell history.')
-  flags.DEFINE_multistring(
-      'add_header', [],
-      'Additional http headers (as key=value strings). '
-      'Can be specified multiple times.')
-  flags.DEFINE_string(
-      'service_account_json_keyfile', '',
-      'Filename for a JSON service account key downloaded'
-      ' from the Developer Console.')
-  flags.DEFINE_enum(
-      'alt',
-      u'json',
-      [u'json'],
-      u'Data format for the response.')
-  flags.DEFINE_string(
-      'fields',
-      None,
-      u'Selector specifying which fields to include in a partial response.')
-  flags.DEFINE_string(
-      'key',
-      None,
-      u'API key. Your API key identifies your project and provides you with '
-      u'API access, quota, and reports. Required unless you provide an OAuth '
-      u'2.0 token.')
-  flags.DEFINE_string(
-      'oauth_token',
-      None,
-      u'OAuth 2.0 token for the current user.')
-  flags.DEFINE_boolean(
-      'prettyPrint',
-      'True',
-      u'Returns response with indentations and line breaks.')
-  flags.DEFINE_string(
-      'quotaUser',
-      None,
-      u'Available to use for quota purposes for server-side applications. Can'
-      u' be any arbitrary string assigned to a user, but should not exceed 40'
-      u' characters. Overrides userIp if both are provided.')
-  flags.DEFINE_string(
-      'trace',
-      None,
-      'A tracing token of the form "token:<tokenid>" to include in api '
-      'requests.')
-  flags.DEFINE_string(
-      'userIp',
-      None,
-      u'IP address of the site where the request originates. Use this if you '
-      u'want to enforce per-user limits.')
-
-
-FLAGS = flags.FLAGS
-apitools_base_cli.DeclareBaseFlags()
-_DeclareDnsFlags()
-
-
-def GetGlobalParamsFromFlags():
-  """Return a StandardQueryParameters based on flags."""
-  result = messages.StandardQueryParameters()
-  if FLAGS['alt'].present:
-    result.alt = messages.StandardQueryParameters.AltValueValuesEnum(FLAGS.alt)
-  if FLAGS['fields'].present:
-    result.fields = FLAGS.fields.decode('utf8')
-  if FLAGS['key'].present:
-    result.key = FLAGS.key.decode('utf8')
-  if FLAGS['oauth_token'].present:
-    result.oauth_token = FLAGS.oauth_token.decode('utf8')
-  if FLAGS['prettyPrint'].present:
-    result.prettyPrint = FLAGS.prettyPrint
-  if FLAGS['quotaUser'].present:
-    result.quotaUser = FLAGS.quotaUser.decode('utf8')
-  if FLAGS['trace'].present:
-    result.trace = FLAGS.trace.decode('utf8')
-  if FLAGS['userIp'].present:
-    result.userIp = FLAGS.userIp.decode('utf8')
-  return result
-
-
-def GetClientFromFlags():
-  """Return a client object, configured from flags."""
-  log_request = FLAGS.log_request or FLAGS.log_request_response
-  log_response = FLAGS.log_response or FLAGS.log_request_response
-  api_endpoint = apitools_base.NormalizeApiEndpoint(FLAGS.api_endpoint)
-  additional_http_headers = dict(x.split('=', 1) for x in FLAGS.add_header)
-  credentials_args = {
-      'service_account_json_keyfile': os.path.expanduser(FLAGS.service_account_json_keyfile)
-  }
-  try:
-    client = client_lib.DnsV1(
-        api_endpoint, log_request=log_request,
-        log_response=log_response,
-        credentials_args=credentials_args,
-        additional_http_headers=additional_http_headers)
-  except apitools_base.CredentialsError as e:
-    print 'Error creating credentials: %s' % e
-    sys.exit(1)
-  return client
-
-
-class PyShell(appcommands.Cmd):
-
-  def Run(self, _):
-    """Run an interactive python shell with the client."""
-    client = GetClientFromFlags()
-    params = GetGlobalParamsFromFlags()
-    for field in params.all_fields():
-      value = params.get_assigned_value(field.name)
-      if value != field.default:
-        client.AddGlobalParam(field.name, value)
-    banner = """
-           == dns interactive console ==
-                 client: a dns client
-          apitools_base: base apitools module
-         messages: the generated messages module
-    """
-    local_vars = {
-        'apitools_base': apitools_base,
-        'client': client,
-        'client_lib': client_lib,
-        'messages': messages,
-    }
-    if platform.system() == 'Linux':
-      console = apitools_base_cli.ConsoleWithReadline(
-          local_vars, histfile=FLAGS.history_file)
-    else:
-      console = code.InteractiveConsole(local_vars)
-    try:
-      console.interact(banner)
-    except SystemExit as e:
-      return e.code
-
-
-class ChangesCreate(apitools_base_cli.NewCmd):
-  """Command wrapping changes.Create."""
-
-  usage = """changes_create <project> <managedZone>"""
-
-  def __init__(self, name, fv):
-    super(ChangesCreate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'change',
-        None,
-        u'A Change resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, project, managedZone):
-    """Atomically update the ResourceRecordSet collection.
-
-    Args:
-      project: Identifies the project addressed by this request.
-      managedZone: Identifies the managed zone addressed by this request. Can
-        be the managed zone name or id.
-
-    Flags:
-      change: A Change resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsChangesCreateRequest(
-        project=project.decode('utf8'),
-        managedZone=managedZone.decode('utf8'),
-        )
-    if FLAGS['change'].present:
-      request.change = apitools_base.JsonToMessage(messages.Change, FLAGS.change)
-    result = client.changes.Create(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ChangesGet(apitools_base_cli.NewCmd):
-  """Command wrapping changes.Get."""
-
-  usage = """changes_get <project> <managedZone> <changeId>"""
-
-  def __init__(self, name, fv):
-    super(ChangesGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, project, managedZone, changeId):
-    """Fetch the representation of an existing Change.
-
-    Args:
-      project: Identifies the project addressed by this request.
-      managedZone: Identifies the managed zone addressed by this request. Can
-        be the managed zone name or id.
-      changeId: The identifier of the requested change, from a previous
-        ResourceRecordSetsChangeResponse.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsChangesGetRequest(
-        project=project.decode('utf8'),
-        managedZone=managedZone.decode('utf8'),
-        changeId=changeId.decode('utf8'),
-        )
-    result = client.changes.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ChangesList(apitools_base_cli.NewCmd):
-  """Command wrapping changes.List."""
-
-  usage = """changes_list <project> <managedZone>"""
-
-  def __init__(self, name, fv):
-    super(ChangesList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Optional. Maximum number of results to be returned. If unspecified,'
-        u' the server will decide how many results to return.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Optional. A tag returned by a previous list request that was '
-        u'truncated. Use this parameter to continue a previous list request.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'sortBy',
-        u'changeSequence',
-        [u'changeSequence'],
-        u'Sorting criterion. The only supported value is change sequence.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'sortOrder',
-        None,
-        u"Sorting order direction: 'ascending' or 'descending'.",
-        flag_values=fv)
-
-  def RunWithArgs(self, project, managedZone):
-    """Enumerate Changes to a ResourceRecordSet collection.
-
-    Args:
-      project: Identifies the project addressed by this request.
-      managedZone: Identifies the managed zone addressed by this request. Can
-        be the managed zone name or id.
-
-    Flags:
-      maxResults: Optional. Maximum number of results to be returned. If
-        unspecified, the server will decide how many results to return.
-      pageToken: Optional. A tag returned by a previous list request that was
-        truncated. Use this parameter to continue a previous list request.
-      sortBy: Sorting criterion. The only supported value is change sequence.
-      sortOrder: Sorting order direction: 'ascending' or 'descending'.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsChangesListRequest(
-        project=project.decode('utf8'),
-        managedZone=managedZone.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['sortBy'].present:
-      request.sortBy = messages.DnsChangesListRequest.SortByValueValuesEnum(FLAGS.sortBy)
-    if FLAGS['sortOrder'].present:
-      request.sortOrder = FLAGS.sortOrder.decode('utf8')
-    result = client.changes.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ManagedZonesCreate(apitools_base_cli.NewCmd):
-  """Command wrapping managedZones.Create."""
-
-  usage = """managedZones_create <project>"""
-
-  def __init__(self, name, fv):
-    super(ManagedZonesCreate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'managedZone',
-        None,
-        u'A ManagedZone resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, project):
-    """Create a new ManagedZone.
-
-    Args:
-      project: Identifies the project addressed by this request.
-
-    Flags:
-      managedZone: A ManagedZone resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsManagedZonesCreateRequest(
-        project=project.decode('utf8'),
-        )
-    if FLAGS['managedZone'].present:
-      request.managedZone = apitools_base.JsonToMessage(messages.ManagedZone, FLAGS.managedZone)
-    result = client.managedZones.Create(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ManagedZonesDelete(apitools_base_cli.NewCmd):
-  """Command wrapping managedZones.Delete."""
-
-  usage = """managedZones_delete <project> <managedZone>"""
-
-  def __init__(self, name, fv):
-    super(ManagedZonesDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, project, managedZone):
-    """Delete a previously created ManagedZone.
-
-    Args:
-      project: Identifies the project addressed by this request.
-      managedZone: Identifies the managed zone addressed by this request. Can
-        be the managed zone name or id.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsManagedZonesDeleteRequest(
-        project=project.decode('utf8'),
-        managedZone=managedZone.decode('utf8'),
-        )
-    result = client.managedZones.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ManagedZonesGet(apitools_base_cli.NewCmd):
-  """Command wrapping managedZones.Get."""
-
-  usage = """managedZones_get <project> <managedZone>"""
-
-  def __init__(self, name, fv):
-    super(ManagedZonesGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, project, managedZone):
-    """Fetch the representation of an existing ManagedZone.
-
-    Args:
-      project: Identifies the project addressed by this request.
-      managedZone: Identifies the managed zone addressed by this request. Can
-        be the managed zone name or id.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsManagedZonesGetRequest(
-        project=project.decode('utf8'),
-        managedZone=managedZone.decode('utf8'),
-        )
-    result = client.managedZones.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ManagedZonesList(apitools_base_cli.NewCmd):
-  """Command wrapping managedZones.List."""
-
-  usage = """managedZones_list <project>"""
-
-  def __init__(self, name, fv):
-    super(ManagedZonesList, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'dnsName',
-        None,
-        u'Restricts the list to return only zones with this domain name.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Optional. Maximum number of results to be returned. If unspecified,'
-        u' the server will decide how many results to return.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Optional. A tag returned by a previous list request that was '
-        u'truncated. Use this parameter to continue a previous list request.',
-        flag_values=fv)
-
-  def RunWithArgs(self, project):
-    """Enumerate ManagedZones that have been created but not yet deleted.
-
-    Args:
-      project: Identifies the project addressed by this request.
-
-    Flags:
-      dnsName: Restricts the list to return only zones with this domain name.
-      maxResults: Optional. Maximum number of results to be returned. If
-        unspecified, the server will decide how many results to return.
-      pageToken: Optional. A tag returned by a previous list request that was
-        truncated. Use this parameter to continue a previous list request.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsManagedZonesListRequest(
-        project=project.decode('utf8'),
-        )
-    if FLAGS['dnsName'].present:
-      request.dnsName = FLAGS.dnsName.decode('utf8')
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.managedZones.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsGet(apitools_base_cli.NewCmd):
-  """Command wrapping projects.Get."""
-
-  usage = """projects_get <project>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, project):
-    """Fetch the representation of an existing Project.
-
-    Args:
-      project: Identifies the project addressed by this request.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsProjectsGetRequest(
-        project=project.decode('utf8'),
-        )
-    result = client.projects.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ResourceRecordSetsList(apitools_base_cli.NewCmd):
-  """Command wrapping resourceRecordSets.List."""
-
-  usage = """resourceRecordSets_list <project> <managedZone>"""
-
-  def __init__(self, name, fv):
-    super(ResourceRecordSetsList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Optional. Maximum number of results to be returned. If unspecified,'
-        u' the server will decide how many results to return.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Restricts the list to return only records with this fully qualified'
-        u' domain name.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Optional. A tag returned by a previous list request that was '
-        u'truncated. Use this parameter to continue a previous list request.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'type',
-        None,
-        u'Restricts the list to return only records of this type. If present,'
-        u' the "name" parameter must also be present.',
-        flag_values=fv)
-
-  def RunWithArgs(self, project, managedZone):
-    """Enumerate ResourceRecordSets that have been created but not yet
-    deleted.
-
-    Args:
-      project: Identifies the project addressed by this request.
-      managedZone: Identifies the managed zone addressed by this request. Can
-        be the managed zone name or id.
-
-    Flags:
-      maxResults: Optional. Maximum number of results to be returned. If
-        unspecified, the server will decide how many results to return.
-      name: Restricts the list to return only records with this fully
-        qualified domain name.
-      pageToken: Optional. A tag returned by a previous list request that was
-        truncated. Use this parameter to continue a previous list request.
-      type: Restricts the list to return only records of this type. If
-        present, the "name" parameter must also be present.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.DnsResourceRecordSetsListRequest(
-        project=project.decode('utf8'),
-        managedZone=managedZone.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['type'].present:
-      request.type = FLAGS.type.decode('utf8')
-    result = client.resourceRecordSets.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-def main(_):
-  appcommands.AddCmd('pyshell', PyShell)
-  appcommands.AddCmd('changes_create', ChangesCreate)
-  appcommands.AddCmd('changes_get', ChangesGet)
-  appcommands.AddCmd('changes_list', ChangesList)
-  appcommands.AddCmd('managedZones_create', ManagedZonesCreate)
-  appcommands.AddCmd('managedZones_delete', ManagedZonesDelete)
-  appcommands.AddCmd('managedZones_get', ManagedZonesGet)
-  appcommands.AddCmd('managedZones_list', ManagedZonesList)
-  appcommands.AddCmd('projects_get', ProjectsGet)
-  appcommands.AddCmd('resourceRecordSets_list', ResourceRecordSetsList)
-
-  apitools_base_cli.SetupLogger()
-  if hasattr(appcommands, 'SetDefaultCommand'):
-    appcommands.SetDefaultCommand('pyshell')
-
-
-run_main = apitools_base_cli.run_main
-
-if __name__ == '__main__':
-  appcommands.Run()
diff --git a/samples/fusiontables_sample/fusiontables_v1/fusiontables_v1.py b/samples/fusiontables_sample/fusiontables_v1/fusiontables_v1.py
deleted file mode 100644
index 8bb2c8a..0000000
--- a/samples/fusiontables_sample/fusiontables_v1/fusiontables_v1.py
+++ /dev/null
@@ -1,1797 +0,0 @@
-#!/usr/bin/env python
-"""CLI for fusiontables, version v1."""
-# NOTE: This file is autogenerated and should not be edited by hand.
-
-import code
-import os
-import platform
-import sys
-
-from apitools.base.protorpclite import message_types
-from apitools.base.protorpclite import messages
-
-from google.apputils import appcommands
-import gflags as flags
-
-import apitools.base.py as apitools_base
-from apitools.base.py import cli as apitools_base_cli
-import fusiontables_v1_client as client_lib
-import fusiontables_v1_messages as messages
-
-
-def _DeclareFusiontablesFlags():
-  """Declare global flags in an idempotent way."""
-  if 'api_endpoint' in flags.FLAGS:
-    return
-  flags.DEFINE_string(
-      'api_endpoint',
-      u'https://www.googleapis.com/fusiontables/v1/',
-      'URL of the API endpoint to use.',
-      short_name='fusiontables_url')
-  flags.DEFINE_string(
-      'history_file',
-      u'~/.fusiontables.v1.history',
-      'File with interactive shell history.')
-  flags.DEFINE_multistring(
-      'add_header', [],
-      'Additional http headers (as key=value strings). '
-      'Can be specified multiple times.')
-  flags.DEFINE_string(
-      'service_account_json_keyfile', '',
-      'Filename for a JSON service account key downloaded'
-      ' from the Developer Console.')
-  flags.DEFINE_enum(
-      'alt',
-      u'json',
-      [u'csv', u'json'],
-      u'Data format for the response.')
-  flags.DEFINE_string(
-      'fields',
-      None,
-      u'Selector specifying which fields to include in a partial response.')
-  flags.DEFINE_string(
-      'key',
-      None,
-      u'API key. Your API key identifies your project and provides you with '
-      u'API access, quota, and reports. Required unless you provide an OAuth '
-      u'2.0 token.')
-  flags.DEFINE_string(
-      'oauth_token',
-      None,
-      u'OAuth 2.0 token for the current user.')
-  flags.DEFINE_boolean(
-      'prettyPrint',
-      'True',
-      u'Returns response with indentations and line breaks.')
-  flags.DEFINE_string(
-      'quotaUser',
-      None,
-      u'Available to use for quota purposes for server-side applications. Can'
-      u' be any arbitrary string assigned to a user, but should not exceed 40'
-      u' characters. Overrides userIp if both are provided.')
-  flags.DEFINE_string(
-      'trace',
-      None,
-      'A tracing token of the form "token:<tokenid>" to include in api '
-      'requests.')
-  flags.DEFINE_string(
-      'userIp',
-      None,
-      u'IP address of the site where the request originates. Use this if you '
-      u'want to enforce per-user limits.')
-
-
-FLAGS = flags.FLAGS
-apitools_base_cli.DeclareBaseFlags()
-_DeclareFusiontablesFlags()
-
-
-def GetGlobalParamsFromFlags():
-  """Return a StandardQueryParameters based on flags."""
-  result = messages.StandardQueryParameters()
-  if FLAGS['alt'].present:
-    result.alt = messages.StandardQueryParameters.AltValueValuesEnum(FLAGS.alt)
-  if FLAGS['fields'].present:
-    result.fields = FLAGS.fields.decode('utf8')
-  if FLAGS['key'].present:
-    result.key = FLAGS.key.decode('utf8')
-  if FLAGS['oauth_token'].present:
-    result.oauth_token = FLAGS.oauth_token.decode('utf8')
-  if FLAGS['prettyPrint'].present:
-    result.prettyPrint = FLAGS.prettyPrint
-  if FLAGS['quotaUser'].present:
-    result.quotaUser = FLAGS.quotaUser.decode('utf8')
-  if FLAGS['trace'].present:
-    result.trace = FLAGS.trace.decode('utf8')
-  if FLAGS['userIp'].present:
-    result.userIp = FLAGS.userIp.decode('utf8')
-  return result
-
-
-def GetClientFromFlags():
-  """Return a client object, configured from flags."""
-  log_request = FLAGS.log_request or FLAGS.log_request_response
-  log_response = FLAGS.log_response or FLAGS.log_request_response
-  api_endpoint = apitools_base.NormalizeApiEndpoint(FLAGS.api_endpoint)
-  additional_http_headers = dict(x.split('=', 1) for x in FLAGS.add_header)
-  credentials_args = {
-      'service_account_json_keyfile': os.path.expanduser(FLAGS.service_account_json_keyfile)
-  }
-  try:
-    client = client_lib.FusiontablesV1(
-        api_endpoint, log_request=log_request,
-        log_response=log_response,
-        credentials_args=credentials_args,
-        additional_http_headers=additional_http_headers)
-  except apitools_base.CredentialsError as e:
-    print 'Error creating credentials: %s' % e
-    sys.exit(1)
-  return client
-
-
-class PyShell(appcommands.Cmd):
-
-  def Run(self, _):
-    """Run an interactive python shell with the client."""
-    client = GetClientFromFlags()
-    params = GetGlobalParamsFromFlags()
-    for field in params.all_fields():
-      value = params.get_assigned_value(field.name)
-      if value != field.default:
-        client.AddGlobalParam(field.name, value)
-    banner = """
-           == fusiontables interactive console ==
-                 client: a fusiontables client
-          apitools_base: base apitools module
-         messages: the generated messages module
-    """
-    local_vars = {
-        'apitools_base': apitools_base,
-        'client': client,
-        'client_lib': client_lib,
-        'messages': messages,
-    }
-    if platform.system() == 'Linux':
-      console = apitools_base_cli.ConsoleWithReadline(
-          local_vars, histfile=FLAGS.history_file)
-    else:
-      console = code.InteractiveConsole(local_vars)
-    try:
-      console.interact(banner)
-    except SystemExit as e:
-      return e.code
-
-
-class ColumnDelete(apitools_base_cli.NewCmd):
-  """Command wrapping column.Delete."""
-
-  usage = """column_delete <tableId> <columnId>"""
-
-  def __init__(self, name, fv):
-    super(ColumnDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, columnId):
-    """Deletes the column.
-
-    Args:
-      tableId: Table from which the column is being deleted.
-      columnId: Name or identifier for the column being deleted.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesColumnDeleteRequest(
-        tableId=tableId.decode('utf8'),
-        columnId=columnId.decode('utf8'),
-        )
-    result = client.column.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ColumnGet(apitools_base_cli.NewCmd):
-  """Command wrapping column.Get."""
-
-  usage = """column_get <tableId> <columnId>"""
-
-  def __init__(self, name, fv):
-    super(ColumnGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, columnId):
-    """Retrieves a specific column by its id.
-
-    Args:
-      tableId: Table to which the column belongs.
-      columnId: Name or identifier for the column that is being requested.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesColumnGetRequest(
-        tableId=tableId.decode('utf8'),
-        columnId=columnId.decode('utf8'),
-        )
-    result = client.column.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ColumnInsert(apitools_base_cli.NewCmd):
-  """Command wrapping column.Insert."""
-
-  usage = """column_insert <tableId>"""
-
-  def __init__(self, name, fv):
-    super(ColumnInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'column',
-        None,
-        u'A Column resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Adds a new column to the table.
-
-    Args:
-      tableId: Table for which a new column is being added.
-
-    Flags:
-      column: A Column resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesColumnInsertRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['column'].present:
-      request.column = apitools_base.JsonToMessage(messages.Column, FLAGS.column)
-    result = client.column.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ColumnList(apitools_base_cli.NewCmd):
-  """Command wrapping column.List."""
-
-  usage = """column_list <tableId>"""
-
-  def __init__(self, name, fv):
-    super(ColumnList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of columns to return. Optional. Default is 5.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Continuation token specifying which result page to return. '
-        u'Optional.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Retrieves a list of columns.
-
-    Args:
-      tableId: Table whose columns are being listed.
-
-    Flags:
-      maxResults: Maximum number of columns to return. Optional. Default is 5.
-      pageToken: Continuation token specifying which result page to return.
-        Optional.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesColumnListRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.column.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ColumnPatch(apitools_base_cli.NewCmd):
-  """Command wrapping column.Patch."""
-
-  usage = """column_patch <tableId> <columnId>"""
-
-  def __init__(self, name, fv):
-    super(ColumnPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'column',
-        None,
-        u'A Column resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId, columnId):
-    """Updates the name or type of an existing column. This method supports
-    patch semantics.
-
-    Args:
-      tableId: Table for which the column is being updated.
-      columnId: Name or identifier for the column that is being updated.
-
-    Flags:
-      column: A Column resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesColumnPatchRequest(
-        tableId=tableId.decode('utf8'),
-        columnId=columnId.decode('utf8'),
-        )
-    if FLAGS['column'].present:
-      request.column = apitools_base.JsonToMessage(messages.Column, FLAGS.column)
-    result = client.column.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ColumnUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping column.Update."""
-
-  usage = """column_update <tableId> <columnId>"""
-
-  def __init__(self, name, fv):
-    super(ColumnUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'column',
-        None,
-        u'A Column resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId, columnId):
-    """Updates the name or type of an existing column.
-
-    Args:
-      tableId: Table for which the column is being updated.
-      columnId: Name or identifier for the column that is being updated.
-
-    Flags:
-      column: A Column resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesColumnUpdateRequest(
-        tableId=tableId.decode('utf8'),
-        columnId=columnId.decode('utf8'),
-        )
-    if FLAGS['column'].present:
-      request.column = apitools_base.JsonToMessage(messages.Column, FLAGS.column)
-    result = client.column.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class QuerySql(apitools_base_cli.NewCmd):
-  """Command wrapping query.Sql."""
-
-  usage = """query_sql <sql>"""
-
-  def __init__(self, name, fv):
-    super(QuerySql, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'hdrs',
-        None,
-        u'Should column names be included (in the first row)?. Default is '
-        u'true.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'typed',
-        None,
-        u'Should typed values be returned in the (JSON) response -- numbers '
-        u'for numeric values and parsed geometries for KML values? Default is'
-        u' true.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, sql):
-    """Executes an SQL SELECT/INSERT/UPDATE/DELETE/SHOW/DESCRIBE/CREATE
-    statement.
-
-    Args:
-      sql: An SQL SELECT/SHOW/DESCRIBE/INSERT/UPDATE/DELETE/CREATE statement.
-
-    Flags:
-      hdrs: Should column names be included (in the first row)?. Default is
-        true.
-      typed: Should typed values be returned in the (JSON) response -- numbers
-        for numeric values and parsed geometries for KML values? Default is
-        true.
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesQuerySqlRequest(
-        sql=sql.decode('utf8'),
-        )
-    if FLAGS['hdrs'].present:
-      request.hdrs = FLAGS.hdrs
-    if FLAGS['typed'].present:
-      request.typed = FLAGS.typed
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.query.Sql(
-        request, global_params=global_params, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class QuerySqlGet(apitools_base_cli.NewCmd):
-  """Command wrapping query.SqlGet."""
-
-  usage = """query_sqlGet <sql>"""
-
-  def __init__(self, name, fv):
-    super(QuerySqlGet, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'hdrs',
-        None,
-        u'Should column names be included (in the first row)?. Default is '
-        u'true.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'typed',
-        None,
-        u'Should typed values be returned in the (JSON) response -- numbers '
-        u'for numeric values and parsed geometries for KML values? Default is'
-        u' true.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, sql):
-    """Executes an SQL SELECT/SHOW/DESCRIBE statement.
-
-    Args:
-      sql: An SQL SELECT/SHOW/DESCRIBE statement.
-
-    Flags:
-      hdrs: Should column names be included (in the first row)?. Default is
-        true.
-      typed: Should typed values be returned in the (JSON) response -- numbers
-        for numeric values and parsed geometries for KML values? Default is
-        true.
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesQuerySqlGetRequest(
-        sql=sql.decode('utf8'),
-        )
-    if FLAGS['hdrs'].present:
-      request.hdrs = FLAGS.hdrs
-    if FLAGS['typed'].present:
-      request.typed = FLAGS.typed
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.query.SqlGet(
-        request, global_params=global_params, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class StyleDelete(apitools_base_cli.NewCmd):
-  """Command wrapping style.Delete."""
-
-  usage = """style_delete <tableId> <styleId>"""
-
-  def __init__(self, name, fv):
-    super(StyleDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, styleId):
-    """Deletes a style.
-
-    Args:
-      tableId: Table from which the style is being deleted
-      styleId: Identifier (within a table) for the style being deleted
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesStyleDeleteRequest(
-        tableId=tableId.decode('utf8'),
-        styleId=styleId,
-        )
-    result = client.style.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class StyleGet(apitools_base_cli.NewCmd):
-  """Command wrapping style.Get."""
-
-  usage = """style_get <tableId> <styleId>"""
-
-  def __init__(self, name, fv):
-    super(StyleGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, styleId):
-    """Gets a specific style.
-
-    Args:
-      tableId: Table to which the requested style belongs
-      styleId: Identifier (integer) for a specific style in a table
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesStyleGetRequest(
-        tableId=tableId.decode('utf8'),
-        styleId=styleId,
-        )
-    result = client.style.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class StyleInsert(apitools_base_cli.NewCmd):
-  """Command wrapping style.Insert."""
-
-  usage = """style_insert <tableId>"""
-
-  def __init__(self, name, fv):
-    super(StyleInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#styleSetting',
-        u'Type name: an individual style setting. A StyleSetting contains the'
-        u' style defintions for points, lines, and polygons in a table. Since'
-        u' a table can have any one or all of them, a style definition can '
-        u'have point, line and polygon style definitions.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'markerOptions',
-        None,
-        u'Style definition for points in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Optional name for the style setting.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'polygonOptions',
-        None,
-        u'Style definition for polygons in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'polylineOptions',
-        None,
-        u'Style definition for lines in the table.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'styleId',
-        None,
-        u'Identifier for the style setting (unique only within tables).',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Adds a new style for the table.
-
-    Args:
-      tableId: Identifier for the table.
-
-    Flags:
-      kind: Type name: an individual style setting. A StyleSetting contains
-        the style defintions for points, lines, and polygons in a table. Since
-        a table can have any one or all of them, a style definition can have
-        point, line and polygon style definitions.
-      markerOptions: Style definition for points in the table.
-      name: Optional name for the style setting.
-      polygonOptions: Style definition for polygons in the table.
-      polylineOptions: Style definition for lines in the table.
-      styleId: Identifier for the style setting (unique only within tables).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StyleSetting(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['markerOptions'].present:
-      request.markerOptions = apitools_base.JsonToMessage(messages.PointStyle, FLAGS.markerOptions)
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['polygonOptions'].present:
-      request.polygonOptions = apitools_base.JsonToMessage(messages.PolygonStyle, FLAGS.polygonOptions)
-    if FLAGS['polylineOptions'].present:
-      request.polylineOptions = apitools_base.JsonToMessage(messages.LineStyle, FLAGS.polylineOptions)
-    if FLAGS['styleId'].present:
-      request.styleId = FLAGS.styleId
-    result = client.style.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class StyleList(apitools_base_cli.NewCmd):
-  """Command wrapping style.List."""
-
-  usage = """style_list <tableId>"""
-
-  def __init__(self, name, fv):
-    super(StyleList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of styles to return. Optional. Default is 5.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Continuation token specifying which result page to return. '
-        u'Optional.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Retrieves a list of styles.
-
-    Args:
-      tableId: Table whose styles are being listed
-
-    Flags:
-      maxResults: Maximum number of styles to return. Optional. Default is 5.
-      pageToken: Continuation token specifying which result page to return.
-        Optional.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesStyleListRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.style.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class StylePatch(apitools_base_cli.NewCmd):
-  """Command wrapping style.Patch."""
-
-  usage = """style_patch <tableId> <styleId>"""
-
-  def __init__(self, name, fv):
-    super(StylePatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#styleSetting',
-        u'Type name: an individual style setting. A StyleSetting contains the'
-        u' style defintions for points, lines, and polygons in a table. Since'
-        u' a table can have any one or all of them, a style definition can '
-        u'have point, line and polygon style definitions.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'markerOptions',
-        None,
-        u'Style definition for points in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Optional name for the style setting.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'polygonOptions',
-        None,
-        u'Style definition for polygons in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'polylineOptions',
-        None,
-        u'Style definition for lines in the table.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId, styleId):
-    """Updates an existing style. This method supports patch semantics.
-
-    Args:
-      tableId: Identifier for the table.
-      styleId: Identifier for the style setting (unique only within tables).
-
-    Flags:
-      kind: Type name: an individual style setting. A StyleSetting contains
-        the style defintions for points, lines, and polygons in a table. Since
-        a table can have any one or all of them, a style definition can have
-        point, line and polygon style definitions.
-      markerOptions: Style definition for points in the table.
-      name: Optional name for the style setting.
-      polygonOptions: Style definition for polygons in the table.
-      polylineOptions: Style definition for lines in the table.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StyleSetting(
-        tableId=tableId.decode('utf8'),
-        styleId=styleId,
-        )
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['markerOptions'].present:
-      request.markerOptions = apitools_base.JsonToMessage(messages.PointStyle, FLAGS.markerOptions)
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['polygonOptions'].present:
-      request.polygonOptions = apitools_base.JsonToMessage(messages.PolygonStyle, FLAGS.polygonOptions)
-    if FLAGS['polylineOptions'].present:
-      request.polylineOptions = apitools_base.JsonToMessage(messages.LineStyle, FLAGS.polylineOptions)
-    result = client.style.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class StyleUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping style.Update."""
-
-  usage = """style_update <tableId> <styleId>"""
-
-  def __init__(self, name, fv):
-    super(StyleUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#styleSetting',
-        u'Type name: an individual style setting. A StyleSetting contains the'
-        u' style defintions for points, lines, and polygons in a table. Since'
-        u' a table can have any one or all of them, a style definition can '
-        u'have point, line and polygon style definitions.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'markerOptions',
-        None,
-        u'Style definition for points in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Optional name for the style setting.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'polygonOptions',
-        None,
-        u'Style definition for polygons in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'polylineOptions',
-        None,
-        u'Style definition for lines in the table.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId, styleId):
-    """Updates an existing style.
-
-    Args:
-      tableId: Identifier for the table.
-      styleId: Identifier for the style setting (unique only within tables).
-
-    Flags:
-      kind: Type name: an individual style setting. A StyleSetting contains
-        the style defintions for points, lines, and polygons in a table. Since
-        a table can have any one or all of them, a style definition can have
-        point, line and polygon style definitions.
-      markerOptions: Style definition for points in the table.
-      name: Optional name for the style setting.
-      polygonOptions: Style definition for polygons in the table.
-      polylineOptions: Style definition for lines in the table.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StyleSetting(
-        tableId=tableId.decode('utf8'),
-        styleId=styleId,
-        )
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['markerOptions'].present:
-      request.markerOptions = apitools_base.JsonToMessage(messages.PointStyle, FLAGS.markerOptions)
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['polygonOptions'].present:
-      request.polygonOptions = apitools_base.JsonToMessage(messages.PolygonStyle, FLAGS.polygonOptions)
-    if FLAGS['polylineOptions'].present:
-      request.polylineOptions = apitools_base.JsonToMessage(messages.LineStyle, FLAGS.polylineOptions)
-    result = client.style.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableCopy(apitools_base_cli.NewCmd):
-  """Command wrapping table.Copy."""
-
-  usage = """table_copy <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TableCopy, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'copyPresentation',
-        None,
-        u'Whether to also copy tabs, styles, and templates. Default is false.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Copies a table.
-
-    Args:
-      tableId: ID of the table that is being copied.
-
-    Flags:
-      copyPresentation: Whether to also copy tabs, styles, and templates.
-        Default is false.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableCopyRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['copyPresentation'].present:
-      request.copyPresentation = FLAGS.copyPresentation
-    result = client.table.Copy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableDelete(apitools_base_cli.NewCmd):
-  """Command wrapping table.Delete."""
-
-  usage = """table_delete <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TableDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId):
-    """Deletes a table.
-
-    Args:
-      tableId: ID of the table that is being deleted.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableDeleteRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    result = client.table.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableGet(apitools_base_cli.NewCmd):
-  """Command wrapping table.Get."""
-
-  usage = """table_get <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TableGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId):
-    """Retrieves a specific table by its id.
-
-    Args:
-      tableId: Identifier(ID) for the table being requested.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableGetRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    result = client.table.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableImportRows(apitools_base_cli.NewCmd):
-  """Command wrapping table.ImportRows."""
-
-  usage = """table_importRows <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TableImportRows, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'delimiter',
-        None,
-        u'The delimiter used to separate cell values. This can only consist '
-        u"of a single character. Default is ','.",
-        flag_values=fv)
-    flags.DEFINE_string(
-        'encoding',
-        None,
-        u"The encoding of the content. Default is UTF-8. Use 'auto-detect' if"
-        u' you are unsure of the encoding.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'endLine',
-        None,
-        u'The index of the last line from which to start importing, '
-        u'exclusive. Thus, the number of imported lines is endLine - '
-        u'startLine. If this parameter is not provided, the file will be '
-        u'imported until the last line of the file. If endLine is negative, '
-        u'then the imported content will exclude the last endLine lines. That'
-        u' is, if endline is negative, no line will be imported whose index '
-        u'is greater than N + endLine where N is the number of lines in the '
-        u'file, and the number of imported lines will be N + endLine - '
-        u'startLine.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'isStrict',
-        None,
-        u'Whether the CSV must have the same number of values for each row. '
-        u'If false, rows with fewer values will be padded with empty values. '
-        u'Default is true.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'startLine',
-        None,
-        u'The index of the first line from which to start importing, '
-        u'inclusive. Default is 0.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_filename',
-        '',
-        'Filename to use for upload.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_mime_type',
-        '',
-        'MIME type to use for the upload. Only needed if the extension on '
-        '--upload_filename does not determine the correct (or any) MIME '
-        'type.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Import more rows into a table.
-
-    Args:
-      tableId: The table into which new rows are being imported.
-
-    Flags:
-      delimiter: The delimiter used to separate cell values. This can only
-        consist of a single character. Default is ','.
-      encoding: The encoding of the content. Default is UTF-8. Use 'auto-
-        detect' if you are unsure of the encoding.
-      endLine: The index of the last line from which to start importing,
-        exclusive. Thus, the number of imported lines is endLine - startLine.
-        If this parameter is not provided, the file will be imported until the
-        last line of the file. If endLine is negative, then the imported
-        content will exclude the last endLine lines. That is, if endline is
-        negative, no line will be imported whose index is greater than N +
-        endLine where N is the number of lines in the file, and the number of
-        imported lines will be N + endLine - startLine.
-      isStrict: Whether the CSV must have the same number of values for each
-        row. If false, rows with fewer values will be padded with empty
-        values. Default is true.
-      startLine: The index of the first line from which to start importing,
-        inclusive. Default is 0.
-      upload_filename: Filename to use for upload.
-      upload_mime_type: MIME type to use for the upload. Only needed if the
-        extension on --upload_filename does not determine the correct (or any)
-        MIME type.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableImportRowsRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['delimiter'].present:
-      request.delimiter = FLAGS.delimiter.decode('utf8')
-    if FLAGS['encoding'].present:
-      request.encoding = FLAGS.encoding.decode('utf8')
-    if FLAGS['endLine'].present:
-      request.endLine = FLAGS.endLine
-    if FLAGS['isStrict'].present:
-      request.isStrict = FLAGS.isStrict
-    if FLAGS['startLine'].present:
-      request.startLine = FLAGS.startLine
-    upload = None
-    if FLAGS.upload_filename:
-      upload = apitools_base.Upload.FromFile(
-          FLAGS.upload_filename, FLAGS.upload_mime_type,
-          progress_callback=apitools_base.UploadProgressPrinter,
-          finish_callback=apitools_base.UploadCompletePrinter)
-    result = client.table.ImportRows(
-        request, global_params=global_params, upload=upload)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableImportTable(apitools_base_cli.NewCmd):
-  """Command wrapping table.ImportTable."""
-
-  usage = """table_importTable <name>"""
-
-  def __init__(self, name, fv):
-    super(TableImportTable, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'delimiter',
-        None,
-        u'The delimiter used to separate cell values. This can only consist '
-        u"of a single character. Default is ','.",
-        flag_values=fv)
-    flags.DEFINE_string(
-        'encoding',
-        None,
-        u"The encoding of the content. Default is UTF-8. Use 'auto-detect' if"
-        u' you are unsure of the encoding.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_filename',
-        '',
-        'Filename to use for upload.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_mime_type',
-        '',
-        'MIME type to use for the upload. Only needed if the extension on '
-        '--upload_filename does not determine the correct (or any) MIME '
-        'type.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Import a new table.
-
-    Args:
-      name: The name to be assigned to the new table.
-
-    Flags:
-      delimiter: The delimiter used to separate cell values. This can only
-        consist of a single character. Default is ','.
-      encoding: The encoding of the content. Default is UTF-8. Use 'auto-
-        detect' if you are unsure of the encoding.
-      upload_filename: Filename to use for upload.
-      upload_mime_type: MIME type to use for the upload. Only needed if the
-        extension on --upload_filename does not determine the correct (or any)
-        MIME type.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableImportTableRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['delimiter'].present:
-      request.delimiter = FLAGS.delimiter.decode('utf8')
-    if FLAGS['encoding'].present:
-      request.encoding = FLAGS.encoding.decode('utf8')
-    upload = None
-    if FLAGS.upload_filename:
-      upload = apitools_base.Upload.FromFile(
-          FLAGS.upload_filename, FLAGS.upload_mime_type,
-          progress_callback=apitools_base.UploadProgressPrinter,
-          finish_callback=apitools_base.UploadCompletePrinter)
-    result = client.table.ImportTable(
-        request, global_params=global_params, upload=upload)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableInsert(apitools_base_cli.NewCmd):
-  """Command wrapping table.Insert."""
-
-  usage = """table_insert"""
-
-  def __init__(self, name, fv):
-    super(TableInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'attribution',
-        None,
-        u'Optional attribution assigned to the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'attributionLink',
-        None,
-        u'Optional link for attribution.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'baseTableIds',
-        None,
-        u'Optional base table identifier if this table is a view or merged '
-        u'table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'columns',
-        None,
-        u'Columns in the table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'description',
-        None,
-        u'Optional description assigned to the table.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'isExportable',
-        None,
-        u'Variable for whether table is exportable.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#table',
-        u'Type name: a template for an individual table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Name assigned to a table.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'sql',
-        None,
-        u'Optional sql that encodes the table definition for derived tables.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'tableId',
-        None,
-        u'Encrypted unique alphanumeric identifier for the table.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Creates a new table.
-
-    Flags:
-      attribution: Optional attribution assigned to the table.
-      attributionLink: Optional link for attribution.
-      baseTableIds: Optional base table identifier if this table is a view or
-        merged table.
-      columns: Columns in the table.
-      description: Optional description assigned to the table.
-      isExportable: Variable for whether table is exportable.
-      kind: Type name: a template for an individual table.
-      name: Name assigned to a table.
-      sql: Optional sql that encodes the table definition for derived tables.
-      tableId: Encrypted unique alphanumeric identifier for the table.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.Table(
-        )
-    if FLAGS['attribution'].present:
-      request.attribution = FLAGS.attribution.decode('utf8')
-    if FLAGS['attributionLink'].present:
-      request.attributionLink = FLAGS.attributionLink.decode('utf8')
-    if FLAGS['baseTableIds'].present:
-      request.baseTableIds = [x.decode('utf8') for x in FLAGS.baseTableIds]
-    if FLAGS['columns'].present:
-      request.columns = [apitools_base.JsonToMessage(messages.Column, x) for x in FLAGS.columns]
-    if FLAGS['description'].present:
-      request.description = FLAGS.description.decode('utf8')
-    if FLAGS['isExportable'].present:
-      request.isExportable = FLAGS.isExportable
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['sql'].present:
-      request.sql = FLAGS.sql.decode('utf8')
-    if FLAGS['tableId'].present:
-      request.tableId = FLAGS.tableId.decode('utf8')
-    result = client.table.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableList(apitools_base_cli.NewCmd):
-  """Command wrapping table.List."""
-
-  usage = """table_list"""
-
-  def __init__(self, name, fv):
-    super(TableList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of styles to return. Optional. Default is 5.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Continuation token specifying which result page to return. '
-        u'Optional.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Retrieves a list of tables a user owns.
-
-    Flags:
-      maxResults: Maximum number of styles to return. Optional. Default is 5.
-      pageToken: Continuation token specifying which result page to return.
-        Optional.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableListRequest(
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.table.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TablePatch(apitools_base_cli.NewCmd):
-  """Command wrapping table.Patch."""
-
-  usage = """table_patch <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TablePatch, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'replaceViewDefinition',
-        None,
-        u'Should the view definition also be updated? The specified view '
-        u'definition replaces the existing one. Only a view can be updated '
-        u'with a new definition.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'table',
-        None,
-        u'A Table resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Updates an existing table. Unless explicitly requested, only the name,
-    description, and attribution will be updated. This method supports patch
-    semantics.
-
-    Args:
-      tableId: ID of the table that is being updated.
-
-    Flags:
-      replaceViewDefinition: Should the view definition also be updated? The
-        specified view definition replaces the existing one. Only a view can
-        be updated with a new definition.
-      table: A Table resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTablePatchRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['replaceViewDefinition'].present:
-      request.replaceViewDefinition = FLAGS.replaceViewDefinition
-    if FLAGS['table'].present:
-      request.table = apitools_base.JsonToMessage(messages.Table, FLAGS.table)
-    result = client.table.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TableUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping table.Update."""
-
-  usage = """table_update <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TableUpdate, self).__init__(name, fv)
-    flags.DEFINE_boolean(
-        'replaceViewDefinition',
-        None,
-        u'Should the view definition also be updated? The specified view '
-        u'definition replaces the existing one. Only a view can be updated '
-        u'with a new definition.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'table',
-        None,
-        u'A Table resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Updates an existing table. Unless explicitly requested, only the name,
-    description, and attribution will be updated.
-
-    Args:
-      tableId: ID of the table that is being updated.
-
-    Flags:
-      replaceViewDefinition: Should the view definition also be updated? The
-        specified view definition replaces the existing one. Only a view can
-        be updated with a new definition.
-      table: A Table resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTableUpdateRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['replaceViewDefinition'].present:
-      request.replaceViewDefinition = FLAGS.replaceViewDefinition
-    if FLAGS['table'].present:
-      request.table = apitools_base.JsonToMessage(messages.Table, FLAGS.table)
-    result = client.table.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TaskDelete(apitools_base_cli.NewCmd):
-  """Command wrapping task.Delete."""
-
-  usage = """task_delete <tableId> <taskId>"""
-
-  def __init__(self, name, fv):
-    super(TaskDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, taskId):
-    """Deletes the task, unless already started.
-
-    Args:
-      tableId: Table from which the task is being deleted.
-      taskId: A string attribute.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTaskDeleteRequest(
-        tableId=tableId.decode('utf8'),
-        taskId=taskId.decode('utf8'),
-        )
-    result = client.task.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TaskGet(apitools_base_cli.NewCmd):
-  """Command wrapping task.Get."""
-
-  usage = """task_get <tableId> <taskId>"""
-
-  def __init__(self, name, fv):
-    super(TaskGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, taskId):
-    """Retrieves a specific task by its id.
-
-    Args:
-      tableId: Table to which the task belongs.
-      taskId: A string attribute.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTaskGetRequest(
-        tableId=tableId.decode('utf8'),
-        taskId=taskId.decode('utf8'),
-        )
-    result = client.task.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TaskList(apitools_base_cli.NewCmd):
-  """Command wrapping task.List."""
-
-  usage = """task_list <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TaskList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of columns to return. Optional. Default is 5.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        'A string attribute.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'startIndex',
-        None,
-        'A integer attribute.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Retrieves a list of tasks.
-
-    Args:
-      tableId: Table whose tasks are being listed.
-
-    Flags:
-      maxResults: Maximum number of columns to return. Optional. Default is 5.
-      pageToken: A string attribute.
-      startIndex: A integer attribute.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTaskListRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['startIndex'].present:
-      request.startIndex = FLAGS.startIndex
-    result = client.task.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TemplateDelete(apitools_base_cli.NewCmd):
-  """Command wrapping template.Delete."""
-
-  usage = """template_delete <tableId> <templateId>"""
-
-  def __init__(self, name, fv):
-    super(TemplateDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, templateId):
-    """Deletes a template
-
-    Args:
-      tableId: Table from which the template is being deleted
-      templateId: Identifier for the template which is being deleted
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTemplateDeleteRequest(
-        tableId=tableId.decode('utf8'),
-        templateId=templateId,
-        )
-    result = client.template.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TemplateGet(apitools_base_cli.NewCmd):
-  """Command wrapping template.Get."""
-
-  usage = """template_get <tableId> <templateId>"""
-
-  def __init__(self, name, fv):
-    super(TemplateGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, tableId, templateId):
-    """Retrieves a specific template by its id
-
-    Args:
-      tableId: Table to which the template belongs
-      templateId: Identifier for the template that is being requested
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTemplateGetRequest(
-        tableId=tableId.decode('utf8'),
-        templateId=templateId,
-        )
-    result = client.template.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TemplateInsert(apitools_base_cli.NewCmd):
-  """Command wrapping template.Insert."""
-
-  usage = """template_insert <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TemplateInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'automaticColumnNames',
-        None,
-        u'List of columns from which the template is to be automatically '
-        u'constructed. Only one of body or automaticColumns can be specified.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'body',
-        None,
-        u'Body of the template. It contains HTML with {column_name} to insert'
-        u' values from a particular column. The body is sanitized to remove '
-        u'certain tags, e.g., script. Only one of body or automaticColumns '
-        u'can be specified.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#template',
-        u'Type name: a template for the info window contents. The template '
-        u'can either include an HTML body or a list of columns from which the'
-        u' template is computed automatically.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Optional name assigned to a template.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'templateId',
-        None,
-        u'Identifier for the template, unique within the context of a '
-        u'particular table.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Creates a new template for the table.
-
-    Args:
-      tableId: Identifier for the table for which the template is defined.
-
-    Flags:
-      automaticColumnNames: List of columns from which the template is to be
-        automatically constructed. Only one of body or automaticColumns can be
-        specified.
-      body: Body of the template. It contains HTML with {column_name} to
-        insert values from a particular column. The body is sanitized to
-        remove certain tags, e.g., script. Only one of body or
-        automaticColumns can be specified.
-      kind: Type name: a template for the info window contents. The template
-        can either include an HTML body or a list of columns from which the
-        template is computed automatically.
-      name: Optional name assigned to a template.
-      templateId: Identifier for the template, unique within the context of a
-        particular table.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.Template(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['automaticColumnNames'].present:
-      request.automaticColumnNames = [x.decode('utf8') for x in FLAGS.automaticColumnNames]
-    if FLAGS['body'].present:
-      request.body = FLAGS.body.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['templateId'].present:
-      request.templateId = FLAGS.templateId
-    result = client.template.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TemplateList(apitools_base_cli.NewCmd):
-  """Command wrapping template.List."""
-
-  usage = """template_list <tableId>"""
-
-  def __init__(self, name, fv):
-    super(TemplateList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of templates to return. Optional. Default is 5.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Continuation token specifying which results page to return. '
-        u'Optional.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId):
-    """Retrieves a list of templates.
-
-    Args:
-      tableId: Identifier for the table whose templates are being requested
-
-    Flags:
-      maxResults: Maximum number of templates to return. Optional. Default is
-        5.
-      pageToken: Continuation token specifying which results page to return.
-        Optional.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.FusiontablesTemplateListRequest(
-        tableId=tableId.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.template.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TemplatePatch(apitools_base_cli.NewCmd):
-  """Command wrapping template.Patch."""
-
-  usage = """template_patch <tableId> <templateId>"""
-
-  def __init__(self, name, fv):
-    super(TemplatePatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'automaticColumnNames',
-        None,
-        u'List of columns from which the template is to be automatically '
-        u'constructed. Only one of body or automaticColumns can be specified.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'body',
-        None,
-        u'Body of the template. It contains HTML with {column_name} to insert'
-        u' values from a particular column. The body is sanitized to remove '
-        u'certain tags, e.g., script. Only one of body or automaticColumns '
-        u'can be specified.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#template',
-        u'Type name: a template for the info window contents. The template '
-        u'can either include an HTML body or a list of columns from which the'
-        u' template is computed automatically.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Optional name assigned to a template.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId, templateId):
-    """Updates an existing template. This method supports patch semantics.
-
-    Args:
-      tableId: Identifier for the table for which the template is defined.
-      templateId: Identifier for the template, unique within the context of a
-        particular table.
-
-    Flags:
-      automaticColumnNames: List of columns from which the template is to be
-        automatically constructed. Only one of body or automaticColumns can be
-        specified.
-      body: Body of the template. It contains HTML with {column_name} to
-        insert values from a particular column. The body is sanitized to
-        remove certain tags, e.g., script. Only one of body or
-        automaticColumns can be specified.
-      kind: Type name: a template for the info window contents. The template
-        can either include an HTML body or a list of columns from which the
-        template is computed automatically.
-      name: Optional name assigned to a template.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.Template(
-        tableId=tableId.decode('utf8'),
-        templateId=templateId,
-        )
-    if FLAGS['automaticColumnNames'].present:
-      request.automaticColumnNames = [x.decode('utf8') for x in FLAGS.automaticColumnNames]
-    if FLAGS['body'].present:
-      request.body = FLAGS.body.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    result = client.template.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class TemplateUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping template.Update."""
-
-  usage = """template_update <tableId> <templateId>"""
-
-  def __init__(self, name, fv):
-    super(TemplateUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'automaticColumnNames',
-        None,
-        u'List of columns from which the template is to be automatically '
-        u'constructed. Only one of body or automaticColumns can be specified.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'body',
-        None,
-        u'Body of the template. It contains HTML with {column_name} to insert'
-        u' values from a particular column. The body is sanitized to remove '
-        u'certain tags, e.g., script. Only one of body or automaticColumns '
-        u'can be specified.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'fusiontables#template',
-        u'Type name: a template for the info window contents. The template '
-        u'can either include an HTML body or a list of columns from which the'
-        u' template is computed automatically.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Optional name assigned to a template.',
-        flag_values=fv)
-
-  def RunWithArgs(self, tableId, templateId):
-    """Updates an existing template
-
-    Args:
-      tableId: Identifier for the table for which the template is defined.
-      templateId: Identifier for the template, unique within the context of a
-        particular table.
-
-    Flags:
-      automaticColumnNames: List of columns from which the template is to be
-        automatically constructed. Only one of body or automaticColumns can be
-        specified.
-      body: Body of the template. It contains HTML with {column_name} to
-        insert values from a particular column. The body is sanitized to
-        remove certain tags, e.g., script. Only one of body or
-        automaticColumns can be specified.
-      kind: Type name: a template for the info window contents. The template
-        can either include an HTML body or a list of columns from which the
-        template is computed automatically.
-      name: Optional name assigned to a template.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.Template(
-        tableId=tableId.decode('utf8'),
-        templateId=templateId,
-        )
-    if FLAGS['automaticColumnNames'].present:
-      request.automaticColumnNames = [x.decode('utf8') for x in FLAGS.automaticColumnNames]
-    if FLAGS['body'].present:
-      request.body = FLAGS.body.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    result = client.template.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-def main(_):
-  appcommands.AddCmd('pyshell', PyShell)
-  appcommands.AddCmd('column_delete', ColumnDelete)
-  appcommands.AddCmd('column_get', ColumnGet)
-  appcommands.AddCmd('column_insert', ColumnInsert)
-  appcommands.AddCmd('column_list', ColumnList)
-  appcommands.AddCmd('column_patch', ColumnPatch)
-  appcommands.AddCmd('column_update', ColumnUpdate)
-  appcommands.AddCmd('query_sql', QuerySql)
-  appcommands.AddCmd('query_sqlGet', QuerySqlGet)
-  appcommands.AddCmd('style_delete', StyleDelete)
-  appcommands.AddCmd('style_get', StyleGet)
-  appcommands.AddCmd('style_insert', StyleInsert)
-  appcommands.AddCmd('style_list', StyleList)
-  appcommands.AddCmd('style_patch', StylePatch)
-  appcommands.AddCmd('style_update', StyleUpdate)
-  appcommands.AddCmd('table_copy', TableCopy)
-  appcommands.AddCmd('table_delete', TableDelete)
-  appcommands.AddCmd('table_get', TableGet)
-  appcommands.AddCmd('table_importRows', TableImportRows)
-  appcommands.AddCmd('table_importTable', TableImportTable)
-  appcommands.AddCmd('table_insert', TableInsert)
-  appcommands.AddCmd('table_list', TableList)
-  appcommands.AddCmd('table_patch', TablePatch)
-  appcommands.AddCmd('table_update', TableUpdate)
-  appcommands.AddCmd('task_delete', TaskDelete)
-  appcommands.AddCmd('task_get', TaskGet)
-  appcommands.AddCmd('task_list', TaskList)
-  appcommands.AddCmd('template_delete', TemplateDelete)
-  appcommands.AddCmd('template_get', TemplateGet)
-  appcommands.AddCmd('template_insert', TemplateInsert)
-  appcommands.AddCmd('template_list', TemplateList)
-  appcommands.AddCmd('template_patch', TemplatePatch)
-  appcommands.AddCmd('template_update', TemplateUpdate)
-
-  apitools_base_cli.SetupLogger()
-  if hasattr(appcommands, 'SetDefaultCommand'):
-    appcommands.SetDefaultCommand('pyshell')
-
-
-run_main = apitools_base_cli.run_main
-
-if __name__ == '__main__':
-  appcommands.Run()
diff --git a/samples/iam_sample/iam_v1/iam_v1.py b/samples/iam_sample/iam_v1/iam_v1.py
deleted file mode 100644
index da9750e..0000000
--- a/samples/iam_sample/iam_v1/iam_v1.py
+++ /dev/null
@@ -1,921 +0,0 @@
-#!/usr/bin/env python
-"""CLI for iam, version v1."""
-# NOTE: This file is autogenerated and should not be edited by hand.
-
-import code
-import os
-import platform
-import sys
-
-from apitools.base.protorpclite import message_types
-from apitools.base.protorpclite import messages
-
-from google.apputils import appcommands
-import gflags as flags
-
-import apitools.base.py as apitools_base
-from apitools.base.py import cli as apitools_base_cli
-import iam_v1_client as client_lib
-import iam_v1_messages as messages
-
-
-def _DeclareIamFlags():
-  """Declare global flags in an idempotent way."""
-  if 'api_endpoint' in flags.FLAGS:
-    return
-  flags.DEFINE_string(
-      'api_endpoint',
-      u'https://iam.googleapis.com/',
-      'URL of the API endpoint to use.',
-      short_name='iam_url')
-  flags.DEFINE_string(
-      'history_file',
-      u'~/.iam.v1.history',
-      'File with interactive shell history.')
-  flags.DEFINE_multistring(
-      'add_header', [],
-      'Additional http headers (as key=value strings). '
-      'Can be specified multiple times.')
-  flags.DEFINE_string(
-      'service_account_json_keyfile', '',
-      'Filename for a JSON service account key downloaded'
-      ' from the Developer Console.')
-  flags.DEFINE_enum(
-      'f__xgafv',
-      u'_1',
-      [u'_1', u'_2'],
-      u'V1 error format.')
-  flags.DEFINE_string(
-      'access_token',
-      None,
-      u'OAuth access token.')
-  flags.DEFINE_enum(
-      'alt',
-      u'json',
-      [u'json', u'media', u'proto'],
-      u'Data format for response.')
-  flags.DEFINE_string(
-      'bearer_token',
-      None,
-      u'OAuth bearer token.')
-  flags.DEFINE_string(
-      'callback',
-      None,
-      u'JSONP')
-  flags.DEFINE_string(
-      'fields',
-      None,
-      u'Selector specifying which fields to include in a partial response.')
-  flags.DEFINE_string(
-      'key',
-      None,
-      u'API key. Your API key identifies your project and provides you with '
-      u'API access, quota, and reports. Required unless you provide an OAuth '
-      u'2.0 token.')
-  flags.DEFINE_string(
-      'oauth_token',
-      None,
-      u'OAuth 2.0 token for the current user.')
-  flags.DEFINE_boolean(
-      'pp',
-      'True',
-      u'Pretty-print response.')
-  flags.DEFINE_boolean(
-      'prettyPrint',
-      'True',
-      u'Returns response with indentations and line breaks.')
-  flags.DEFINE_string(
-      'quotaUser',
-      None,
-      u'Available to use for quota purposes for server-side applications. Can'
-      u' be any arbitrary string assigned to a user, but should not exceed 40'
-      u' characters.')
-  flags.DEFINE_string(
-      'trace',
-      None,
-      'A tracing token of the form "token:<tokenid>" to include in api '
-      'requests.')
-  flags.DEFINE_string(
-      'uploadType',
-      None,
-      u'Legacy upload protocol for media (e.g. "media", "multipart").')
-  flags.DEFINE_string(
-      'upload_protocol',
-      None,
-      u'Upload protocol for media (e.g. "raw", "multipart").')
-
-
-FLAGS = flags.FLAGS
-apitools_base_cli.DeclareBaseFlags()
-_DeclareIamFlags()
-
-
-def GetGlobalParamsFromFlags():
-  """Return a StandardQueryParameters based on flags."""
-  result = messages.StandardQueryParameters()
-  if FLAGS['f__xgafv'].present:
-    result.f__xgafv = messages.StandardQueryParameters.FXgafvValueValuesEnum(FLAGS.f__xgafv)
-  if FLAGS['access_token'].present:
-    result.access_token = FLAGS.access_token.decode('utf8')
-  if FLAGS['alt'].present:
-    result.alt = messages.StandardQueryParameters.AltValueValuesEnum(FLAGS.alt)
-  if FLAGS['bearer_token'].present:
-    result.bearer_token = FLAGS.bearer_token.decode('utf8')
-  if FLAGS['callback'].present:
-    result.callback = FLAGS.callback.decode('utf8')
-  if FLAGS['fields'].present:
-    result.fields = FLAGS.fields.decode('utf8')
-  if FLAGS['key'].present:
-    result.key = FLAGS.key.decode('utf8')
-  if FLAGS['oauth_token'].present:
-    result.oauth_token = FLAGS.oauth_token.decode('utf8')
-  if FLAGS['pp'].present:
-    result.pp = FLAGS.pp
-  if FLAGS['prettyPrint'].present:
-    result.prettyPrint = FLAGS.prettyPrint
-  if FLAGS['quotaUser'].present:
-    result.quotaUser = FLAGS.quotaUser.decode('utf8')
-  if FLAGS['trace'].present:
-    result.trace = FLAGS.trace.decode('utf8')
-  if FLAGS['uploadType'].present:
-    result.uploadType = FLAGS.uploadType.decode('utf8')
-  if FLAGS['upload_protocol'].present:
-    result.upload_protocol = FLAGS.upload_protocol.decode('utf8')
-  return result
-
-
-def GetClientFromFlags():
-  """Return a client object, configured from flags."""
-  log_request = FLAGS.log_request or FLAGS.log_request_response
-  log_response = FLAGS.log_response or FLAGS.log_request_response
-  api_endpoint = apitools_base.NormalizeApiEndpoint(FLAGS.api_endpoint)
-  additional_http_headers = dict(x.split('=', 1) for x in FLAGS.add_header)
-  credentials_args = {
-      'service_account_json_keyfile': os.path.expanduser(FLAGS.service_account_json_keyfile)
-  }
-  try:
-    client = client_lib.IamV1(
-        api_endpoint, log_request=log_request,
-        log_response=log_response,
-        credentials_args=credentials_args,
-        additional_http_headers=additional_http_headers)
-  except apitools_base.CredentialsError as e:
-    print 'Error creating credentials: %s' % e
-    sys.exit(1)
-  return client
-
-
-class PyShell(appcommands.Cmd):
-
-  def Run(self, _):
-    """Run an interactive python shell with the client."""
-    client = GetClientFromFlags()
-    params = GetGlobalParamsFromFlags()
-    for field in params.all_fields():
-      value = params.get_assigned_value(field.name)
-      if value != field.default:
-        client.AddGlobalParam(field.name, value)
-    banner = """
-           == iam interactive console ==
-                 client: a iam client
-          apitools_base: base apitools module
-         messages: the generated messages module
-    """
-    local_vars = {
-        'apitools_base': apitools_base,
-        'client': client,
-        'client_lib': client_lib,
-        'messages': messages,
-    }
-    if platform.system() == 'Linux':
-      console = apitools_base_cli.ConsoleWithReadline(
-          local_vars, histfile=FLAGS.history_file)
-    else:
-      console = code.InteractiveConsole(local_vars)
-    try:
-      console.interact(banner)
-    except SystemExit as e:
-      return e.code
-
-
-class IamPoliciesGetPolicyDetails(apitools_base_cli.NewCmd):
-  """Command wrapping iamPolicies.GetPolicyDetails."""
-
-  usage = """iamPolicies_getPolicyDetails"""
-
-  def __init__(self, name, fv):
-    super(IamPoliciesGetPolicyDetails, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'fullResourcePath',
-        None,
-        u'REQUIRED: The full resource path of the current policy being '
-        u'requested, e.g., `//dataflow.googleapis.com/projects/../jobs/..`.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'pageSize',
-        None,
-        u'Limit on the number of policies to include in the response. Further'
-        u' accounts can subsequently be obtained by including the '
-        u'GetPolicyDetailsResponse.next_page_token in a subsequent request. '
-        u'If zero, the default page size 20 will be used. Must be given a '
-        u'value in range [0, 100], otherwise an invalid argument error will '
-        u'be returned.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Optional pagination token returned in an earlier '
-        u'GetPolicyDetailsResponse.next_page_token response.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Returns the current IAM policy and the policies on the inherited
-    resources that the user has access to.
-
-    Flags:
-      fullResourcePath: REQUIRED: The full resource path of the current policy
-        being requested, e.g.,
-        `//dataflow.googleapis.com/projects/../jobs/..`.
-      pageSize: Limit on the number of policies to include in the response.
-        Further accounts can subsequently be obtained by including the
-        GetPolicyDetailsResponse.next_page_token in a subsequent request. If
-        zero, the default page size 20 will be used. Must be given a value in
-        range [0, 100], otherwise an invalid argument error will be returned.
-      pageToken: Optional pagination token returned in an earlier
-        GetPolicyDetailsResponse.next_page_token response.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.GetPolicyDetailsRequest(
-        )
-    if FLAGS['fullResourcePath'].present:
-      request.fullResourcePath = FLAGS.fullResourcePath.decode('utf8')
-    if FLAGS['pageSize'].present:
-      request.pageSize = FLAGS.pageSize
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.iamPolicies.GetPolicyDetails(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsCreate(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.Create."""
-
-  usage = """projects_serviceAccounts_create <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsCreate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'createServiceAccountRequest',
-        None,
-        u'A CreateServiceAccountRequest resource to be passed as the request '
-        u'body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Creates a ServiceAccount and returns it.
-
-    Args:
-      name: Required. The resource name of the project associated with the
-        service accounts, such as `projects/my-project-123`.
-
-    Flags:
-      createServiceAccountRequest: A CreateServiceAccountRequest resource to
-        be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsCreateRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['createServiceAccountRequest'].present:
-      request.createServiceAccountRequest = apitools_base.JsonToMessage(messages.CreateServiceAccountRequest, FLAGS.createServiceAccountRequest)
-    result = client.projects_serviceAccounts.Create(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.Delete."""
-
-  usage = """projects_serviceAccounts_delete <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, name):
-    """Deletes a ServiceAccount.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`. Using `-` as a
-        wildcard for the project will infer the project from the account. The
-        `account` value can be the `email` address or the `unique_id` of the
-        service account.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsDeleteRequest(
-        name=name.decode('utf8'),
-        )
-    result = client.projects_serviceAccounts.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsGet(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.Get."""
-
-  usage = """projects_serviceAccounts_get <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, name):
-    """Gets a ServiceAccount.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`. Using `-` as a
-        wildcard for the project will infer the project from the account. The
-        `account` value can be the `email` address or the `unique_id` of the
-        service account.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsGetRequest(
-        name=name.decode('utf8'),
-        )
-    result = client.projects_serviceAccounts.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsGetIamPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.GetIamPolicy."""
-
-  usage = """projects_serviceAccounts_getIamPolicy <resource>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsGetIamPolicy, self).__init__(name, fv)
-
-  def RunWithArgs(self, resource):
-    """Returns the IAM access control policy for specified IAM resource.
-
-    Args:
-      resource: REQUIRED: The resource for which the policy is being
-        requested. `resource` is usually specified as a path, such as
-        `projects/*project*/zones/*zone*/disks/*disk*`.  The format for the
-        path specified in this value is resource specific and is specified in
-        the `getIamPolicy` documentation.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsGetIamPolicyRequest(
-        resource=resource.decode('utf8'),
-        )
-    result = client.projects_serviceAccounts.GetIamPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsList(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.List."""
-
-  usage = """projects_serviceAccounts_list <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'pageSize',
-        None,
-        u'Optional limit on the number of service accounts to include in the '
-        u'response. Further accounts can subsequently be obtained by '
-        u'including the ListServiceAccountsResponse.next_page_token in a '
-        u'subsequent request.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Optional pagination token returned in an earlier '
-        u'ListServiceAccountsResponse.next_page_token.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'removeDeletedServiceAccounts',
-        None,
-        u'Do not list service accounts deleted from Gaia. <b><font '
-        u'color="red">DO NOT INCLUDE IN EXTERNAL DOCUMENTATION</font></b>.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Lists ServiceAccounts for a project.
-
-    Args:
-      name: Required. The resource name of the project associated with the
-        service accounts, such as `projects/my-project-123`.
-
-    Flags:
-      pageSize: Optional limit on the number of service accounts to include in
-        the response. Further accounts can subsequently be obtained by
-        including the ListServiceAccountsResponse.next_page_token in a
-        subsequent request.
-      pageToken: Optional pagination token returned in an earlier
-        ListServiceAccountsResponse.next_page_token.
-      removeDeletedServiceAccounts: Do not list service accounts deleted from
-        Gaia. <b><font color="red">DO NOT INCLUDE IN EXTERNAL
-        DOCUMENTATION</font></b>.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsListRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['pageSize'].present:
-      request.pageSize = FLAGS.pageSize
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['removeDeletedServiceAccounts'].present:
-      request.removeDeletedServiceAccounts = FLAGS.removeDeletedServiceAccounts
-    result = client.projects_serviceAccounts.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsSetIamPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.SetIamPolicy."""
-
-  usage = """projects_serviceAccounts_setIamPolicy <resource>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsSetIamPolicy, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'setIamPolicyRequest',
-        None,
-        u'A SetIamPolicyRequest resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, resource):
-    """Sets the IAM access control policy for the specified IAM resource.
-
-    Args:
-      resource: REQUIRED: The resource for which the policy is being
-        specified. `resource` is usually specified as a path, such as
-        `projects/*project*/zones/*zone*/disks/*disk*`.  The format for the
-        path specified in this value is resource specific and is specified in
-        the `setIamPolicy` documentation.
-
-    Flags:
-      setIamPolicyRequest: A SetIamPolicyRequest resource to be passed as the
-        request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsSetIamPolicyRequest(
-        resource=resource.decode('utf8'),
-        )
-    if FLAGS['setIamPolicyRequest'].present:
-      request.setIamPolicyRequest = apitools_base.JsonToMessage(messages.SetIamPolicyRequest, FLAGS.setIamPolicyRequest)
-    result = client.projects_serviceAccounts.SetIamPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsSignBlob(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.SignBlob."""
-
-  usage = """projects_serviceAccounts_signBlob <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsSignBlob, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'signBlobRequest',
-        None,
-        u'A SignBlobRequest resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Signs a blob using a service account's system-managed private key.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`. Using `-` as a
-        wildcard for the project will infer the project from the account. The
-        `account` value can be the `email` address or the `unique_id` of the
-        service account.
-
-    Flags:
-      signBlobRequest: A SignBlobRequest resource to be passed as the request
-        body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsSignBlobRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['signBlobRequest'].present:
-      request.signBlobRequest = apitools_base.JsonToMessage(messages.SignBlobRequest, FLAGS.signBlobRequest)
-    result = client.projects_serviceAccounts.SignBlob(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsSignJwt(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.SignJwt."""
-
-  usage = """projects_serviceAccounts_signJwt <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsSignJwt, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'signJwtRequest',
-        None,
-        u'A SignJwtRequest resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Signs a JWT using a service account's system-managed private key.  If
-    no `exp` (expiry) time is contained in the claims, we will provide an
-    expiry of one hour in the future. If an expiry of more than one hour in
-    the future is requested, the request will fail.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`. Using `-` as a
-        wildcard for the project will infer the project from the account. The
-        `account` value can be the `email` address or the `unique_id` of the
-        service account.
-
-    Flags:
-      signJwtRequest: A SignJwtRequest resource to be passed as the request
-        body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsSignJwtRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['signJwtRequest'].present:
-      request.signJwtRequest = apitools_base.JsonToMessage(messages.SignJwtRequest, FLAGS.signJwtRequest)
-    result = client.projects_serviceAccounts.SignJwt(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsTestIamPermissions(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.TestIamPermissions."""
-
-  usage = """projects_serviceAccounts_testIamPermissions <resource>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsTestIamPermissions, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'testIamPermissionsRequest',
-        None,
-        u'A TestIamPermissionsRequest resource to be passed as the request '
-        u'body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, resource):
-    """Tests the specified permissions against the IAM access control policy
-    for the specified IAM resource.
-
-    Args:
-      resource: REQUIRED: The resource for which the policy detail is being
-        requested. `resource` is usually specified as a path, such as
-        `projects/*project*/zones/*zone*/disks/*disk*`.  The format for the
-        path specified in this value is resource specific and is specified in
-        the `testIamPermissions` documentation.
-
-    Flags:
-      testIamPermissionsRequest: A TestIamPermissionsRequest resource to be
-        passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsTestIamPermissionsRequest(
-        resource=resource.decode('utf8'),
-        )
-    if FLAGS['testIamPermissionsRequest'].present:
-      request.testIamPermissionsRequest = apitools_base.JsonToMessage(messages.TestIamPermissionsRequest, FLAGS.testIamPermissionsRequest)
-    result = client.projects_serviceAccounts.TestIamPermissions(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts.Update."""
-
-  usage = """projects_serviceAccounts_update <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'description',
-        None,
-        u'Optional. A user-specified opaque description of the service '
-        u'account.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'displayName',
-        None,
-        u'Optional. A user-specified description of the service account.  '
-        u'Must be fewer than 100 UTF-8 bytes.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'@OutputOnly The email address of the service account.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'Used to perform a consistent read-modify-write.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'oauth2ClientId',
-        None,
-        u'@OutputOnly. The OAuth2 client id for the service account. This is '
-        u'used in conjunction with the OAuth2 clientconfig API to make three '
-        u'legged OAuth2 (3LO) flows to access the data of Google users.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectId',
-        None,
-        u'@OutputOnly The id of the project that owns the service account.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'uniqueId',
-        None,
-        u'@OutputOnly The unique and stable id of the service account.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Updates a ServiceAccount.  Currently, only the following fields are
-    updatable: `display_name` . The `etag` is mandatory.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`.  Requests using `-` as
-        a wildcard for the project will infer the project from the `account`
-        and the `account` value can be the `email` address or the `unique_id`
-        of the service account.  In responses the resource name will always be
-        in the format `projects/{project}/serviceAccounts/{email}`.
-
-    Flags:
-      description: Optional. A user-specified opaque description of the
-        service account.
-      displayName: Optional. A user-specified description of the service
-        account.  Must be fewer than 100 UTF-8 bytes.
-      email: @OutputOnly The email address of the service account.
-      etag: Used to perform a consistent read-modify-write.
-      oauth2ClientId: @OutputOnly. The OAuth2 client id for the service
-        account. This is used in conjunction with the OAuth2 clientconfig API
-        to make three legged OAuth2 (3LO) flows to access the data of Google
-        users.
-      projectId: @OutputOnly The id of the project that owns the service
-        account.
-      uniqueId: @OutputOnly The unique and stable id of the service account.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServiceAccount(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['description'].present:
-      request.description = FLAGS.description.decode('utf8')
-    if FLAGS['displayName'].present:
-      request.displayName = FLAGS.displayName.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag
-    if FLAGS['oauth2ClientId'].present:
-      request.oauth2ClientId = FLAGS.oauth2ClientId.decode('utf8')
-    if FLAGS['projectId'].present:
-      request.projectId = FLAGS.projectId.decode('utf8')
-    if FLAGS['uniqueId'].present:
-      request.uniqueId = FLAGS.uniqueId.decode('utf8')
-    result = client.projects_serviceAccounts.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsKeysCreate(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts_keys.Create."""
-
-  usage = """projects_serviceAccounts_keys_create <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsKeysCreate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'createServiceAccountKeyRequest',
-        None,
-        u'A CreateServiceAccountKeyRequest resource to be passed as the '
-        u'request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Creates a ServiceAccountKey and returns it.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`. Using `-` as a
-        wildcard for the project will infer the project from the account. The
-        `account` value can be the `email` address or the `unique_id` of the
-        service account.
-
-    Flags:
-      createServiceAccountKeyRequest: A CreateServiceAccountKeyRequest
-        resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsKeysCreateRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['createServiceAccountKeyRequest'].present:
-      request.createServiceAccountKeyRequest = apitools_base.JsonToMessage(messages.CreateServiceAccountKeyRequest, FLAGS.createServiceAccountKeyRequest)
-    result = client.projects_serviceAccounts_keys.Create(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsKeysDelete(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts_keys.Delete."""
-
-  usage = """projects_serviceAccounts_keys_delete <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsKeysDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, name):
-    """Deletes a ServiceAccountKey.
-
-    Args:
-      name: The resource name of the service account key in the following
-        format: `projects/{project}/serviceAccounts/{account}/keys/{key}`.
-        Using `-` as a wildcard for the project will infer the project from
-        the account. The `account` value can be the `email` address or the
-        `unique_id` of the service account.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsKeysDeleteRequest(
-        name=name.decode('utf8'),
-        )
-    result = client.projects_serviceAccounts_keys.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsKeysGet(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts_keys.Get."""
-
-  usage = """projects_serviceAccounts_keys_get <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsKeysGet, self).__init__(name, fv)
-    flags.DEFINE_enum(
-        'publicKeyType',
-        u'TYPE_NONE',
-        [u'TYPE_NONE', u'TYPE_X509_PEM_FILE', u'TYPE_RAW_PUBLIC_KEY'],
-        u'The output format of the public key requested. X509_PEM is the '
-        u'default output format.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Gets the ServiceAccountKey by key id.
-
-    Args:
-      name: The resource name of the service account key in the following
-        format: `projects/{project}/serviceAccounts/{account}/keys/{key}`.
-        Using `-` as a wildcard for the project will infer the project from
-        the account. The `account` value can be the `email` address or the
-        `unique_id` of the service account.
-
-    Flags:
-      publicKeyType: The output format of the public key requested. X509_PEM
-        is the default output format.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsKeysGetRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['publicKeyType'].present:
-      request.publicKeyType = messages.IamProjectsServiceAccountsKeysGetRequest.PublicKeyTypeValueValuesEnum(FLAGS.publicKeyType)
-    result = client.projects_serviceAccounts_keys.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ProjectsServiceAccountsKeysList(apitools_base_cli.NewCmd):
-  """Command wrapping projects_serviceAccounts_keys.List."""
-
-  usage = """projects_serviceAccounts_keys_list <name>"""
-
-  def __init__(self, name, fv):
-    super(ProjectsServiceAccountsKeysList, self).__init__(name, fv)
-    flags.DEFINE_enum(
-        'keyTypes',
-        u'KEY_TYPE_UNSPECIFIED',
-        [u'KEY_TYPE_UNSPECIFIED', u'USER_MANAGED', u'SYSTEM_MANAGED'],
-        u'Filters the types of keys the user wants to include in the list '
-        u'response. Duplicate key types are not allowed. If no key type is '
-        u'provided, all keys are returned.',
-        flag_values=fv)
-
-  def RunWithArgs(self, name):
-    """Lists ServiceAccountKeys.
-
-    Args:
-      name: The resource name of the service account in the following format:
-        `projects/{project}/serviceAccounts/{account}`.  Using `-` as a
-        wildcard for the project, will infer the project from the account. The
-        `account` value can be the `email` address or the `unique_id` of the
-        service account.
-
-    Flags:
-      keyTypes: Filters the types of keys the user wants to include in the
-        list response. Duplicate key types are not allowed. If no key type is
-        provided, all keys are returned.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.IamProjectsServiceAccountsKeysListRequest(
-        name=name.decode('utf8'),
-        )
-    if FLAGS['keyTypes'].present:
-      request.keyTypes = [messages.IamProjectsServiceAccountsKeysListRequest.KeyTypesValueValuesEnum(x) for x in FLAGS.keyTypes]
-    result = client.projects_serviceAccounts_keys.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class RolesQueryGrantableRoles(apitools_base_cli.NewCmd):
-  """Command wrapping roles.QueryGrantableRoles."""
-
-  usage = """roles_queryGrantableRoles"""
-
-  def __init__(self, name, fv):
-    super(RolesQueryGrantableRoles, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'fullResourceName',
-        None,
-        u'Required. The full resource name to query from the list of '
-        u'grantable roles.  The name follows the Google Cloud Platform '
-        u'resource format. For example, a Cloud Platform project with id `my-'
-        u'project` will be named '
-        u'`//cloudresourcemanager.googleapis.com/projects/my-project`.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Queries roles that can be granted on a particular resource.
-
-    Flags:
-      fullResourceName: Required. The full resource name to query from the
-        list of grantable roles.  The name follows the Google Cloud Platform
-        resource format. For example, a Cloud Platform project with id `my-
-        project` will be named `//cloudresourcemanager.googleapis.com/projects
-        /my-project`.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.QueryGrantableRolesRequest(
-        )
-    if FLAGS['fullResourceName'].present:
-      request.fullResourceName = FLAGS.fullResourceName.decode('utf8')
-    result = client.roles.QueryGrantableRoles(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-def main(_):
-  appcommands.AddCmd('pyshell', PyShell)
-  appcommands.AddCmd('iamPolicies_getPolicyDetails', IamPoliciesGetPolicyDetails)
-  appcommands.AddCmd('projects_serviceAccounts_create', ProjectsServiceAccountsCreate)
-  appcommands.AddCmd('projects_serviceAccounts_delete', ProjectsServiceAccountsDelete)
-  appcommands.AddCmd('projects_serviceAccounts_get', ProjectsServiceAccountsGet)
-  appcommands.AddCmd('projects_serviceAccounts_getIamPolicy', ProjectsServiceAccountsGetIamPolicy)
-  appcommands.AddCmd('projects_serviceAccounts_list', ProjectsServiceAccountsList)
-  appcommands.AddCmd('projects_serviceAccounts_setIamPolicy', ProjectsServiceAccountsSetIamPolicy)
-  appcommands.AddCmd('projects_serviceAccounts_signBlob', ProjectsServiceAccountsSignBlob)
-  appcommands.AddCmd('projects_serviceAccounts_signJwt', ProjectsServiceAccountsSignJwt)
-  appcommands.AddCmd('projects_serviceAccounts_testIamPermissions', ProjectsServiceAccountsTestIamPermissions)
-  appcommands.AddCmd('projects_serviceAccounts_update', ProjectsServiceAccountsUpdate)
-  appcommands.AddCmd('projects_serviceAccounts_keys_create', ProjectsServiceAccountsKeysCreate)
-  appcommands.AddCmd('projects_serviceAccounts_keys_delete', ProjectsServiceAccountsKeysDelete)
-  appcommands.AddCmd('projects_serviceAccounts_keys_get', ProjectsServiceAccountsKeysGet)
-  appcommands.AddCmd('projects_serviceAccounts_keys_list', ProjectsServiceAccountsKeysList)
-  appcommands.AddCmd('roles_queryGrantableRoles', RolesQueryGrantableRoles)
-
-  apitools_base_cli.SetupLogger()
-  if hasattr(appcommands, 'SetDefaultCommand'):
-    appcommands.SetDefaultCommand('pyshell')
-
-
-run_main = apitools_base_cli.run_main
-
-if __name__ == '__main__':
-  appcommands.Run()
diff --git a/samples/servicemanagement_sample/servicemanagement_v1/servicemanagement_v1.py b/samples/servicemanagement_sample/servicemanagement_v1/servicemanagement_v1.py
deleted file mode 100644
index d1a4ab8..0000000
--- a/samples/servicemanagement_sample/servicemanagement_v1/servicemanagement_v1.py
+++ /dev/null
@@ -1,1520 +0,0 @@
-#!/usr/bin/env python
-"""CLI for servicemanagement, version v1."""
-# NOTE: This file is autogenerated and should not be edited by hand.
-
-import code
-import os
-import platform
-import sys
-
-from apitools.base.protorpclite import message_types
-from apitools.base.protorpclite import messages
-
-from google.apputils import appcommands
-import gflags as flags
-
-import apitools.base.py as apitools_base
-from apitools.base.py import cli as apitools_base_cli
-import servicemanagement_v1_client as client_lib
-import servicemanagement_v1_messages as messages
-
-
-def _DeclareServicemanagementFlags():
-  """Declare global flags in an idempotent way."""
-  if 'api_endpoint' in flags.FLAGS:
-    return
-  flags.DEFINE_string(
-      'api_endpoint',
-      u'https://servicemanagement.googleapis.com/',
-      'URL of the API endpoint to use.',
-      short_name='servicemanagement_url')
-  flags.DEFINE_string(
-      'history_file',
-      u'~/.servicemanagement.v1.history',
-      'File with interactive shell history.')
-  flags.DEFINE_multistring(
-      'add_header', [],
-      'Additional http headers (as key=value strings). '
-      'Can be specified multiple times.')
-  flags.DEFINE_string(
-      'service_account_json_keyfile', '',
-      'Filename for a JSON service account key downloaded'
-      ' from the Developer Console.')
-  flags.DEFINE_enum(
-      'f__xgafv',
-      u'_1',
-      [u'_1', u'_2'],
-      u'V1 error format.')
-  flags.DEFINE_string(
-      'access_token',
-      None,
-      u'OAuth access token.')
-  flags.DEFINE_enum(
-      'alt',
-      u'json',
-      [u'json', u'media', u'proto'],
-      u'Data format for response.')
-  flags.DEFINE_string(
-      'bearer_token',
-      None,
-      u'OAuth bearer token.')
-  flags.DEFINE_string(
-      'callback',
-      None,
-      u'JSONP')
-  flags.DEFINE_string(
-      'fields',
-      None,
-      u'Selector specifying which fields to include in a partial response.')
-  flags.DEFINE_string(
-      'key',
-      None,
-      u'API key. Your API key identifies your project and provides you with '
-      u'API access, quota, and reports. Required unless you provide an OAuth '
-      u'2.0 token.')
-  flags.DEFINE_string(
-      'oauth_token',
-      None,
-      u'OAuth 2.0 token for the current user.')
-  flags.DEFINE_boolean(
-      'pp',
-      'True',
-      u'Pretty-print response.')
-  flags.DEFINE_boolean(
-      'prettyPrint',
-      'True',
-      u'Returns response with indentations and line breaks.')
-  flags.DEFINE_string(
-      'quotaUser',
-      None,
-      u'Available to use for quota purposes for server-side applications. Can'
-      u' be any arbitrary string assigned to a user, but should not exceed 40'
-      u' characters.')
-  flags.DEFINE_string(
-      'trace',
-      None,
-      'A tracing token of the form "token:<tokenid>" to include in api '
-      'requests.')
-  flags.DEFINE_string(
-      'uploadType',
-      None,
-      u'Legacy upload protocol for media (e.g. "media", "multipart").')
-  flags.DEFINE_string(
-      'upload_protocol',
-      None,
-      u'Upload protocol for media (e.g. "raw", "multipart").')
-
-
-FLAGS = flags.FLAGS
-apitools_base_cli.DeclareBaseFlags()
-_DeclareServicemanagementFlags()
-
-
-def GetGlobalParamsFromFlags():
-  """Return a StandardQueryParameters based on flags."""
-  result = messages.StandardQueryParameters()
-  if FLAGS['f__xgafv'].present:
-    result.f__xgafv = messages.StandardQueryParameters.FXgafvValueValuesEnum(FLAGS.f__xgafv)
-  if FLAGS['access_token'].present:
-    result.access_token = FLAGS.access_token.decode('utf8')
-  if FLAGS['alt'].present:
-    result.alt = messages.StandardQueryParameters.AltValueValuesEnum(FLAGS.alt)
-  if FLAGS['bearer_token'].present:
-    result.bearer_token = FLAGS.bearer_token.decode('utf8')
-  if FLAGS['callback'].present:
-    result.callback = FLAGS.callback.decode('utf8')
-  if FLAGS['fields'].present:
-    result.fields = FLAGS.fields.decode('utf8')
-  if FLAGS['key'].present:
-    result.key = FLAGS.key.decode('utf8')
-  if FLAGS['oauth_token'].present:
-    result.oauth_token = FLAGS.oauth_token.decode('utf8')
-  if FLAGS['pp'].present:
-    result.pp = FLAGS.pp
-  if FLAGS['prettyPrint'].present:
-    result.prettyPrint = FLAGS.prettyPrint
-  if FLAGS['quotaUser'].present:
-    result.quotaUser = FLAGS.quotaUser.decode('utf8')
-  if FLAGS['trace'].present:
-    result.trace = FLAGS.trace.decode('utf8')
-  if FLAGS['uploadType'].present:
-    result.uploadType = FLAGS.uploadType.decode('utf8')
-  if FLAGS['upload_protocol'].present:
-    result.upload_protocol = FLAGS.upload_protocol.decode('utf8')
-  return result
-
-
-def GetClientFromFlags():
-  """Return a client object, configured from flags."""
-  log_request = FLAGS.log_request or FLAGS.log_request_response
-  log_response = FLAGS.log_response or FLAGS.log_request_response
-  api_endpoint = apitools_base.NormalizeApiEndpoint(FLAGS.api_endpoint)
-  additional_http_headers = dict(x.split('=', 1) for x in FLAGS.add_header)
-  credentials_args = {
-      'service_account_json_keyfile': os.path.expanduser(FLAGS.service_account_json_keyfile)
-  }
-  try:
-    client = client_lib.ServicemanagementV1(
-        api_endpoint, log_request=log_request,
-        log_response=log_response,
-        credentials_args=credentials_args,
-        additional_http_headers=additional_http_headers)
-  except apitools_base.CredentialsError as e:
-    print 'Error creating credentials: %s' % e
-    sys.exit(1)
-  return client
-
-
-class PyShell(appcommands.Cmd):
-
-  def Run(self, _):
-    """Run an interactive python shell with the client."""
-    client = GetClientFromFlags()
-    params = GetGlobalParamsFromFlags()
-    for field in params.all_fields():
-      value = params.get_assigned_value(field.name)
-      if value != field.default:
-        client.AddGlobalParam(field.name, value)
-    banner = """
-           == servicemanagement interactive console ==
-                 client: a servicemanagement client
-          apitools_base: base apitools module
-         messages: the generated messages module
-    """
-    local_vars = {
-        'apitools_base': apitools_base,
-        'client': client,
-        'client_lib': client_lib,
-        'messages': messages,
-    }
-    if platform.system() == 'Linux':
-      console = apitools_base_cli.ConsoleWithReadline(
-          local_vars, histfile=FLAGS.history_file)
-    else:
-      console = code.InteractiveConsole(local_vars)
-    try:
-      console.interact(banner)
-    except SystemExit as e:
-      return e.code
-
-
-class OperationsGet(apitools_base_cli.NewCmd):
-  """Command wrapping operations.Get."""
-
-  usage = """operations_get <operationsId>"""
-
-  def __init__(self, name, fv):
-    super(OperationsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, operationsId):
-    """Gets the latest state of a long-running operation.  Clients can use
-    this method to poll the operation result at intervals as recommended by
-    the API service.
-
-    Args:
-      operationsId: Part of `name`. The name of the operation resource.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementOperationsGetRequest(
-        operationsId=operationsId.decode('utf8'),
-        )
-    result = client.operations.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesConvertConfig(apitools_base_cli.NewCmd):
-  """Command wrapping services.ConvertConfig."""
-
-  usage = """services_convertConfig"""
-
-  def __init__(self, name, fv):
-    super(ServicesConvertConfig, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'configSpec',
-        None,
-        u'Input configuration For this version of API, the supported type is '
-        u'OpenApiSpec',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'openApiSpec',
-        None,
-        u'The OpenAPI specification for an API.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'serviceName',
-        None,
-        u'The service name to use for constructing the normalized service '
-        u'configuration equivalent of the provided configuration '
-        u'specification.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'swaggerSpec',
-        None,
-        u'The swagger specification for an API.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """DEPRECATED. `SubmitConfigSource` with `validate_only=true` will provide
-    config conversion moving forward.  Converts an API specification (e.g.
-    Swagger spec) to an equivalent `google.api.Service`.
-
-    Flags:
-      configSpec: Input configuration For this version of API, the supported
-        type is OpenApiSpec
-      openApiSpec: The OpenAPI specification for an API.
-      serviceName: The service name to use for constructing the normalized
-        service configuration equivalent of the provided configuration
-        specification.
-      swaggerSpec: The swagger specification for an API.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ConvertConfigRequest(
-        )
-    if FLAGS['configSpec'].present:
-      request.configSpec = apitools_base.JsonToMessage(messages.ConvertConfigRequest.ConfigSpecValue, FLAGS.configSpec)
-    if FLAGS['openApiSpec'].present:
-      request.openApiSpec = apitools_base.JsonToMessage(messages.OpenApiSpec, FLAGS.openApiSpec)
-    if FLAGS['serviceName'].present:
-      request.serviceName = FLAGS.serviceName.decode('utf8')
-    if FLAGS['swaggerSpec'].present:
-      request.swaggerSpec = apitools_base.JsonToMessage(messages.SwaggerSpec, FLAGS.swaggerSpec)
-    result = client.services.ConvertConfig(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesCreate(apitools_base_cli.NewCmd):
-  """Command wrapping services.Create."""
-
-  usage = """services_create"""
-
-  def __init__(self, name, fv):
-    super(ServicesCreate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'configSource',
-        None,
-        u'User-supplied source configuration for the service. This is '
-        u'distinct from the generated configuration provided in '
-        u'`google.api.Service`. This is NOT populated on GetService calls at '
-        u'the moment. NOTE: Any upsert operation that contains both a '
-        u'service_config and a config_source is considered invalid and will '
-        u'result in an error being returned.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'A server-assigned monotonically increasing number that changes '
-        u'whenever a mutation is made to the `ManagedService` or any of its '
-        u'components via the `ServiceManager` API.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'operations',
-        None,
-        u'Read-only view of pending operations affecting this resource, if '
-        u'requested.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'producerProjectId',
-        None,
-        u'ID of the project that produces and owns this service.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectSettings',
-        None,
-        u'Read-only view of settings for a particular consumer project, if '
-        u'requested.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'serviceConfig',
-        None,
-        u"The service's generated configuration.",
-        flag_values=fv)
-    flags.DEFINE_string(
-        'serviceName',
-        None,
-        u'The name of the service.  See the `ServiceManager` overview for '
-        u'naming requirements.  This name must match '
-        u'`google.api.Service.name` in the `service_config` field.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Creates a new managed service.  Operation<response: ManagedService>
-
-    Flags:
-      configSource: User-supplied source configuration for the service. This
-        is distinct from the generated configuration provided in
-        `google.api.Service`. This is NOT populated on GetService calls at the
-        moment. NOTE: Any upsert operation that contains both a service_config
-        and a config_source is considered invalid and will result in an error
-        being returned.
-      generation: A server-assigned monotonically increasing number that
-        changes whenever a mutation is made to the `ManagedService` or any of
-        its components via the `ServiceManager` API.
-      operations: Read-only view of pending operations affecting this
-        resource, if requested.
-      producerProjectId: ID of the project that produces and owns this
-        service.
-      projectSettings: Read-only view of settings for a particular consumer
-        project, if requested.
-      serviceConfig: The service's generated configuration.
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  This name must match
-        `google.api.Service.name` in the `service_config` field.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ManagedService(
-        )
-    if FLAGS['configSource'].present:
-      request.configSource = apitools_base.JsonToMessage(messages.ConfigSource, FLAGS.configSource)
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['operations'].present:
-      request.operations = [apitools_base.JsonToMessage(messages.Operation, x) for x in FLAGS.operations]
-    if FLAGS['producerProjectId'].present:
-      request.producerProjectId = FLAGS.producerProjectId.decode('utf8')
-    if FLAGS['projectSettings'].present:
-      request.projectSettings = apitools_base.JsonToMessage(messages.ProjectSettings, FLAGS.projectSettings)
-    if FLAGS['serviceConfig'].present:
-      request.serviceConfig = apitools_base.JsonToMessage(messages.Service, FLAGS.serviceConfig)
-    if FLAGS['serviceName'].present:
-      request.serviceName = FLAGS.serviceName.decode('utf8')
-    result = client.services.Create(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesDelete(apitools_base_cli.NewCmd):
-  """Command wrapping services.Delete."""
-
-  usage = """services_delete <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, serviceName):
-    """Deletes a managed service.  Operation<response: google.protobuf.Empty>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesDeleteRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    result = client.services.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesDisable(apitools_base_cli.NewCmd):
-  """Command wrapping services.Disable."""
-
-  usage = """services_disable <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesDisable, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'disableServiceRequest',
-        None,
-        u'A DisableServiceRequest resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Disable a managed service for a project. Google Service Management will
-    only disable the managed service even if there are other services depend
-    on the managed service.  Operation<response: DisableServiceResponse>
-
-    Args:
-      serviceName: Name of the service to disable. Specifying an unknown
-        service name will cause the request to fail.
-
-    Flags:
-      disableServiceRequest: A DisableServiceRequest resource to be passed as
-        the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesDisableRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['disableServiceRequest'].present:
-      request.disableServiceRequest = apitools_base.JsonToMessage(messages.DisableServiceRequest, FLAGS.disableServiceRequest)
-    result = client.services.Disable(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesEnable(apitools_base_cli.NewCmd):
-  """Command wrapping services.Enable."""
-
-  usage = """services_enable <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesEnable, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'enableServiceRequest',
-        None,
-        u'A EnableServiceRequest resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Enable a managed service for a project with default setting. If the
-    managed service has dependencies, they will be enabled as well.
-    Operation<response: EnableServiceResponse>
-
-    Args:
-      serviceName: Name of the service to enable. Specifying an unknown
-        service name will cause the request to fail.
-
-    Flags:
-      enableServiceRequest: A EnableServiceRequest resource to be passed as
-        the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesEnableRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['enableServiceRequest'].present:
-      request.enableServiceRequest = apitools_base.JsonToMessage(messages.EnableServiceRequest, FLAGS.enableServiceRequest)
-    result = client.services.Enable(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesGet(apitools_base_cli.NewCmd):
-  """Command wrapping services.Get."""
-
-  usage = """services_get <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesGet, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'consumerProjectId',
-        None,
-        u'If project_settings is expanded, return settings for the specified '
-        u'consumer project.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'expand',
-        None,
-        u'Fields to expand in any results.  By default, the following fields '
-        u'are not present in the result: - `operations` - `project_settings` '
-        u'- `project_settings.operations` - `quota_usage` (It requires '
-        u'`project_settings`) - `historical_quota_usage` (It requires '
-        u'`project_settings`)',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'view',
-        u'PROJECT_SETTINGS_VIEW_UNSPECIFIED',
-        [u'PROJECT_SETTINGS_VIEW_UNSPECIFIED', u'CONSUMER_VIEW', u'PRODUCER_VIEW', u'ALL'],
-        u'If project_settings is expanded, request only fields for the '
-        u'specified view.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Gets a managed service. If the `consumer_project_id` is specified, the
-    project's settings for the specified service are also returned.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      consumerProjectId: If project_settings is expanded, return settings for
-        the specified consumer project.
-      expand: Fields to expand in any results.  By default, the following
-        fields are not present in the result: - `operations` -
-        `project_settings` - `project_settings.operations` - `quota_usage` (It
-        requires `project_settings`) - `historical_quota_usage` (It requires
-        `project_settings`)
-      view: If project_settings is expanded, request only fields for the
-        specified view.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesGetRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['consumerProjectId'].present:
-      request.consumerProjectId = FLAGS.consumerProjectId.decode('utf8')
-    if FLAGS['expand'].present:
-      request.expand = FLAGS.expand.decode('utf8')
-    if FLAGS['view'].present:
-      request.view = messages.ServicemanagementServicesGetRequest.ViewValueValuesEnum(FLAGS.view)
-    result = client.services.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesGetAccessPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping services.GetAccessPolicy."""
-
-  usage = """services_getAccessPolicy <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesGetAccessPolicy, self).__init__(name, fv)
-
-  def RunWithArgs(self, serviceName):
-    """Producer method to retrieve current policy.
-
-    Args:
-      serviceName: The name of the service.  For example:
-        `example.googleapis.com`.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesGetAccessPolicyRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    result = client.services.GetAccessPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesGetConfig(apitools_base_cli.NewCmd):
-  """Command wrapping services.GetConfig."""
-
-  usage = """services_getConfig <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesGetConfig, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'configId',
-        None,
-        u'The id of the service config resource. Optional. If it is not '
-        u'specified, the latest version of config will be returned.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Gets a service config (version) for a managed service. If `config_id`
-    is not specified, the latest service config will be returned.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      configId: The id of the service config resource. Optional. If it is not
-        specified, the latest version of config will be returned.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesGetConfigRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['configId'].present:
-      request.configId = FLAGS.configId.decode('utf8')
-    result = client.services.GetConfig(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesList(apitools_base_cli.NewCmd):
-  """Command wrapping services.List."""
-
-  usage = """services_list"""
-
-  def __init__(self, name, fv):
-    super(ServicesList, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'category',
-        None,
-        u'Include services only in the specified category. Supported '
-        u'categories are servicemanagement.googleapis.com/categories/google-'
-        u'services or servicemanagement.googleapis.com/categories/play-games.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'consumerProjectId',
-        None,
-        u'Include services consumed by the specified project.  If '
-        u'project_settings is expanded, then this field controls which '
-        u'project project_settings is populated for.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'expand',
-        None,
-        u'Fields to expand in any results.  By default, the following fields '
-        u'are not fully included in list results: - `operations` - '
-        u'`project_settings` - `project_settings.operations` - `quota_usage` '
-        u'(It requires `project_settings`)',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'pageSize',
-        None,
-        u'Requested size of the next page of data.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'Token identifying which result to start with; returned by a '
-        u'previous list call.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'producerProjectId',
-        None,
-        u'Include services produced by the specified project.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Lists all managed services. If the `consumer_project_id` is specified,
-    the project's settings for the specified service are also returned.
-
-    Flags:
-      category: Include services only in the specified category. Supported
-        categories are servicemanagement.googleapis.com/categories/google-
-        services or servicemanagement.googleapis.com/categories/play-games.
-      consumerProjectId: Include services consumed by the specified project.
-        If project_settings is expanded, then this field controls which
-        project project_settings is populated for.
-      expand: Fields to expand in any results.  By default, the following
-        fields are not fully included in list results: - `operations` -
-        `project_settings` - `project_settings.operations` - `quota_usage` (It
-        requires `project_settings`)
-      pageSize: Requested size of the next page of data.
-      pageToken: Token identifying which result to start with; returned by a
-        previous list call.
-      producerProjectId: Include services produced by the specified project.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesListRequest(
-        )
-    if FLAGS['category'].present:
-      request.category = FLAGS.category.decode('utf8')
-    if FLAGS['consumerProjectId'].present:
-      request.consumerProjectId = FLAGS.consumerProjectId.decode('utf8')
-    if FLAGS['expand'].present:
-      request.expand = FLAGS.expand.decode('utf8')
-    if FLAGS['pageSize'].present:
-      request.pageSize = FLAGS.pageSize
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['producerProjectId'].present:
-      request.producerProjectId = FLAGS.producerProjectId.decode('utf8')
-    result = client.services.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesPatch(apitools_base_cli.NewCmd):
-  """Command wrapping services.Patch."""
-
-  usage = """services_patch <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'managedService',
-        None,
-        u'A ManagedService resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'updateMask',
-        None,
-        u'A mask specifying which fields to update.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Updates the specified subset of the configuration. If the specified
-    service does not exists the patch operation fails.  Operation<response:
-    ManagedService>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      managedService: A ManagedService resource to be passed as the request
-        body.
-      updateMask: A mask specifying which fields to update.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesPatchRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['managedService'].present:
-      request.managedService = apitools_base.JsonToMessage(messages.ManagedService, FLAGS.managedService)
-    if FLAGS['updateMask'].present:
-      request.updateMask = FLAGS.updateMask.decode('utf8')
-    result = client.services.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesPatchConfig(apitools_base_cli.NewCmd):
-  """Command wrapping services.PatchConfig."""
-
-  usage = """services_patchConfig <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesPatchConfig, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'service',
-        None,
-        u'A Service resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'updateMask',
-        None,
-        u'A mask specifying which fields to update.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Updates the specified subset of the service resource. Equivalent to
-    calling `PatchService` with only the `service_config` field updated.
-    Operation<response: google.api.Service>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      service: A Service resource to be passed as the request body.
-      updateMask: A mask specifying which fields to update.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesPatchConfigRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['service'].present:
-      request.service = apitools_base.JsonToMessage(messages.Service, FLAGS.service)
-    if FLAGS['updateMask'].present:
-      request.updateMask = FLAGS.updateMask.decode('utf8')
-    result = client.services.PatchConfig(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping services.Update."""
-
-  usage = """services_update <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'managedService',
-        None,
-        u'A ManagedService resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'updateMask',
-        None,
-        u'A mask specifying which fields to update. Update mask has been '
-        u'deprecated on UpdateService service method. Please use PatchService'
-        u' method instead to do partial updates.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Updates the configuration of a service.  If the specified service does
-    not already exist, then it is created.  Operation<response:
-    ManagedService>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      managedService: A ManagedService resource to be passed as the request
-        body.
-      updateMask: A mask specifying which fields to update. Update mask has
-        been deprecated on UpdateService service method. Please use
-        PatchService method instead to do partial updates.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesUpdateRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['managedService'].present:
-      request.managedService = apitools_base.JsonToMessage(messages.ManagedService, FLAGS.managedService)
-    if FLAGS['updateMask'].present:
-      request.updateMask = FLAGS.updateMask.decode('utf8')
-    result = client.services.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesUpdateAccessPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping services.UpdateAccessPolicy."""
-
-  usage = """services_updateAccessPolicy <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesUpdateAccessPolicy, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'accessList',
-        None,
-        u'ACL for access to the unrestricted surface of the service.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'visibilityLabelAccessLists',
-        None,
-        u'ACLs for access to restricted parts of the service.  The map key is'
-        u' the visibility label that is being controlled.  Note that access '
-        u'to any label also implies access to the unrestricted surface.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Producer method to update the current policy.  This method will return
-    an error if the policy is too large (more than 50 entries across all
-    lists).
-
-    Args:
-      serviceName: The service protected by this policy.
-
-    Flags:
-      accessList: ACL for access to the unrestricted surface of the service.
-      visibilityLabelAccessLists: ACLs for access to restricted parts of the
-        service.  The map key is the visibility label that is being
-        controlled.  Note that access to any label also implies access to the
-        unrestricted surface.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServiceAccessPolicy(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['accessList'].present:
-      request.accessList = apitools_base.JsonToMessage(messages.ServiceAccessList, FLAGS.accessList)
-    if FLAGS['visibilityLabelAccessLists'].present:
-      request.visibilityLabelAccessLists = apitools_base.JsonToMessage(messages.ServiceAccessPolicy.VisibilityLabelAccessListsValue, FLAGS.visibilityLabelAccessLists)
-    result = client.services.UpdateAccessPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesUpdateConfig(apitools_base_cli.NewCmd):
-  """Command wrapping services.UpdateConfig."""
-
-  usage = """services_updateConfig <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesUpdateConfig, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'service',
-        None,
-        u'A Service resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'updateMask',
-        None,
-        u'A mask specifying which fields to update. Update mask has been '
-        u'deprecated on UpdateServiceConfig service method. Please use '
-        u'PatchServiceConfig method instead to do partial updates.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Updates the specified subset of the service resource. Equivalent to
-    calling `UpdateService` with only the `service_config` field updated.
-    Operation<response: google.api.Service>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      service: A Service resource to be passed as the request body.
-      updateMask: A mask specifying which fields to update. Update mask has
-        been deprecated on UpdateServiceConfig service method. Please use
-        PatchServiceConfig method instead to do partial updates.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesUpdateConfigRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['service'].present:
-      request.service = apitools_base.JsonToMessage(messages.Service, FLAGS.service)
-    if FLAGS['updateMask'].present:
-      request.updateMask = FLAGS.updateMask.decode('utf8')
-    result = client.services.UpdateConfig(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesAccessPolicyQuery(apitools_base_cli.NewCmd):
-  """Command wrapping services_accessPolicy.Query."""
-
-  usage = """services_accessPolicy_query <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesAccessPolicyQuery, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'userEmail',
-        None,
-        u'The user to query access for.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Method to query the accessibility of a service and any associated
-    visibility labels for a specified user.  Members of the producer project
-    may call this method and specify any user.  Any user may call this method,
-    but must specify their own email address. In this case the method will
-    return NOT_FOUND if the user has no access to the service.
-
-    Args:
-      serviceName: The service to query access for.
-
-    Flags:
-      userEmail: The user to query access for.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesAccessPolicyQueryRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['userEmail'].present:
-      request.userEmail = FLAGS.userEmail.decode('utf8')
-    result = client.services_accessPolicy.Query(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesConfigsCreate(apitools_base_cli.NewCmd):
-  """Command wrapping services_configs.Create."""
-
-  usage = """services_configs_create <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesConfigsCreate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'service',
-        None,
-        u'A Service resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Creates a new service config (version) for a managed service. This
-    method only stores the service config, but does not apply the service
-    config to any backend services.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      service: A Service resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesConfigsCreateRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['service'].present:
-      request.service = apitools_base.JsonToMessage(messages.Service, FLAGS.service)
-    result = client.services_configs.Create(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesConfigsGet(apitools_base_cli.NewCmd):
-  """Command wrapping services_configs.Get."""
-
-  usage = """services_configs_get <serviceName> <configId>"""
-
-  def __init__(self, name, fv):
-    super(ServicesConfigsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, serviceName, configId):
-    """Gets a service config (version) for a managed service. If `config_id`
-    is not specified, the latest service config will be returned.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-      configId: The id of the service config resource. Optional. If it is not
-        specified, the latest version of config will be returned.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesConfigsGetRequest(
-        serviceName=serviceName.decode('utf8'),
-        configId=configId.decode('utf8'),
-        )
-    result = client.services_configs.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesConfigsList(apitools_base_cli.NewCmd):
-  """Command wrapping services_configs.List."""
-
-  usage = """services_configs_list <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesConfigsList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'pageSize',
-        None,
-        u'The max number of items to include in the response list.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'The token of the page to retrieve.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Lists the history of the service config for a managed service, from the
-    newest to the oldest.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      pageSize: The max number of items to include in the response list.
-      pageToken: The token of the page to retrieve.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesConfigsListRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['pageSize'].present:
-      request.pageSize = FLAGS.pageSize
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    result = client.services_configs.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesConfigsSubmit(apitools_base_cli.NewCmd):
-  """Command wrapping services_configs.Submit."""
-
-  usage = """services_configs_submit <serviceName>"""
-
-  def __init__(self, name, fv):
-    super(ServicesConfigsSubmit, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'submitConfigSourceRequest',
-        None,
-        u'A SubmitConfigSourceRequest resource to be passed as the request '
-        u'body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName):
-    """Creates a new service config (version) for a managed service based on
-    user-supplied configuration sources files (for example: OpenAPI
-    Specification). This method stores the source configurations as well as
-    the generated service config. It does NOT apply the service config to any
-    backend services.  Operation<response: SubmitConfigSourceResponse>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-
-    Flags:
-      submitConfigSourceRequest: A SubmitConfigSourceRequest resource to be
-        passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesConfigsSubmitRequest(
-        serviceName=serviceName.decode('utf8'),
-        )
-    if FLAGS['submitConfigSourceRequest'].present:
-      request.submitConfigSourceRequest = apitools_base.JsonToMessage(messages.SubmitConfigSourceRequest, FLAGS.submitConfigSourceRequest)
-    result = client.services_configs.Submit(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesCustomerSettingsGet(apitools_base_cli.NewCmd):
-  """Command wrapping services_customerSettings.Get."""
-
-  usage = """services_customerSettings_get <serviceName> <customerId>"""
-
-  def __init__(self, name, fv):
-    super(ServicesCustomerSettingsGet, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'expand',
-        None,
-        u'Fields to expand in any results.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'view',
-        u'PROJECT_SETTINGS_VIEW_UNSPECIFIED',
-        [u'PROJECT_SETTINGS_VIEW_UNSPECIFIED', u'CONSUMER_VIEW', u'PRODUCER_VIEW', u'ALL'],
-        u'Request only fields for the specified view.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName, customerId):
-    """Retrieves the settings that control the specified customer's usage of
-    the service.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`. This
-        field is required.
-      customerId: ID for the customer. See the comment for
-        `CustomerSettings.customer_id` field of message for its format. This
-        field is required.
-
-    Flags:
-      expand: Fields to expand in any results.
-      view: Request only fields for the specified view.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesCustomerSettingsGetRequest(
-        serviceName=serviceName.decode('utf8'),
-        customerId=customerId.decode('utf8'),
-        )
-    if FLAGS['expand'].present:
-      request.expand = FLAGS.expand.decode('utf8')
-    if FLAGS['view'].present:
-      request.view = messages.ServicemanagementServicesCustomerSettingsGetRequest.ViewValueValuesEnum(FLAGS.view)
-    result = client.services_customerSettings.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesCustomerSettingsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping services_customerSettings.Patch."""
-
-  usage = """services_customerSettings_patch <serviceName> <customerId>"""
-
-  def __init__(self, name, fv):
-    super(ServicesCustomerSettingsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'customerSettings',
-        None,
-        u'A CustomerSettings resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'updateMask',
-        None,
-        u'The field mask specifying which fields are to be updated.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName, customerId):
-    """Updates specified subset of the settings that control the specified
-    customer's usage of the service.  Attempts to update a field not
-    controlled by the caller will result in an access denied error.
-    Operation<response: CustomerSettings>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`. This
-        field is required.
-      customerId: ID for the customer. See the comment for
-        `CustomerSettings.customer_id` field of message for its format. This
-        field is required.
-
-    Flags:
-      customerSettings: A CustomerSettings resource to be passed as the
-        request body.
-      updateMask: The field mask specifying which fields are to be updated.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesCustomerSettingsPatchRequest(
-        serviceName=serviceName.decode('utf8'),
-        customerId=customerId.decode('utf8'),
-        )
-    if FLAGS['customerSettings'].present:
-      request.customerSettings = apitools_base.JsonToMessage(messages.CustomerSettings, FLAGS.customerSettings)
-    if FLAGS['updateMask'].present:
-      request.updateMask = FLAGS.updateMask.decode('utf8')
-    result = client.services_customerSettings.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesProjectSettingsGet(apitools_base_cli.NewCmd):
-  """Command wrapping services_projectSettings.Get."""
-
-  usage = """services_projectSettings_get <serviceName> <consumerProjectId>"""
-
-  def __init__(self, name, fv):
-    super(ServicesProjectSettingsGet, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'expand',
-        None,
-        u'Fields to expand in any results.  By default, the following fields '
-        u'are not present in the result: - `operations` - `quota_usage`',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'view',
-        u'PROJECT_SETTINGS_VIEW_UNSPECIFIED',
-        [u'PROJECT_SETTINGS_VIEW_UNSPECIFIED', u'CONSUMER_VIEW', u'PRODUCER_VIEW', u'ALL'],
-        u'Request only the fields for the specified view.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName, consumerProjectId):
-    """Retrieves the settings that control the specified consumer project's
-    usage of the service.
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-      consumerProjectId: The project ID of the consumer.
-
-    Flags:
-      expand: Fields to expand in any results.  By default, the following
-        fields are not present in the result: - `operations` - `quota_usage`
-      view: Request only the fields for the specified view.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesProjectSettingsGetRequest(
-        serviceName=serviceName.decode('utf8'),
-        consumerProjectId=consumerProjectId.decode('utf8'),
-        )
-    if FLAGS['expand'].present:
-      request.expand = FLAGS.expand.decode('utf8')
-    if FLAGS['view'].present:
-      request.view = messages.ServicemanagementServicesProjectSettingsGetRequest.ViewValueValuesEnum(FLAGS.view)
-    result = client.services_projectSettings.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesProjectSettingsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping services_projectSettings.Patch."""
-
-  usage = """services_projectSettings_patch <serviceName> <consumerProjectId>"""
-
-  def __init__(self, name, fv):
-    super(ServicesProjectSettingsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'projectSettings',
-        None,
-        u'A ProjectSettings resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'updateMask',
-        None,
-        u'The field mask specifying which fields are to be updated.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName, consumerProjectId):
-    """Updates specified subset of the settings that control the specified
-    consumer project's usage of the service.  Attempts to update a field not
-    controlled by the caller will result in an access denied error.
-    Operation<response: ProjectSettings>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.  For example: `example.googleapis.com`.
-      consumerProjectId: The project ID of the consumer.
-
-    Flags:
-      projectSettings: A ProjectSettings resource to be passed as the request
-        body.
-      updateMask: The field mask specifying which fields are to be updated.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ServicemanagementServicesProjectSettingsPatchRequest(
-        serviceName=serviceName.decode('utf8'),
-        consumerProjectId=consumerProjectId.decode('utf8'),
-        )
-    if FLAGS['projectSettings'].present:
-      request.projectSettings = apitools_base.JsonToMessage(messages.ProjectSettings, FLAGS.projectSettings)
-    if FLAGS['updateMask'].present:
-      request.updateMask = FLAGS.updateMask.decode('utf8')
-    result = client.services_projectSettings.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ServicesProjectSettingsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping services_projectSettings.Update."""
-
-  usage = """services_projectSettings_update <serviceName> <consumerProjectId>"""
-
-  def __init__(self, name, fv):
-    super(ServicesProjectSettingsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'operations',
-        None,
-        u'Read-only view of pending operations affecting this resource, if '
-        u'requested.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'properties',
-        None,
-        u'Service-defined per-consumer properties.  A key-value mapping a '
-        u'string key to a google.protobuf.ListValue proto. Values in the list'
-        u" are typed as defined in the Service configuration's "
-        u'consumer.properties field.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'quotaSettings',
-        None,
-        u'Settings that control how much or how fast the service can be used '
-        u'by the consumer project.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'usageSettings',
-        None,
-        u'Settings that control whether this service is usable by the '
-        u'consumer project.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'visibilitySettings',
-        None,
-        u'Settings that control which features of the service are visible to '
-        u'the consumer project.',
-        flag_values=fv)
-
-  def RunWithArgs(self, serviceName, consumerProjectId):
-    """NOTE: Currently unsupported.  Use PatchProjectSettings instead.
-    Updates the settings that control the specified consumer project's usage
-    of the service.  Attempts to update a field not controlled by the caller
-    will result in an access denied error.  Operation<response:
-    ProjectSettings>
-
-    Args:
-      serviceName: The name of the service.  See the `ServiceManager` overview
-        for naming requirements.
-      consumerProjectId: ID for the project consuming this service.
-
-    Flags:
-      operations: Read-only view of pending operations affecting this
-        resource, if requested.
-      properties: Service-defined per-consumer properties.  A key-value
-        mapping a string key to a google.protobuf.ListValue proto. Values in
-        the list are typed as defined in the Service configuration's
-        consumer.properties field.
-      quotaSettings: Settings that control how much or how fast the service
-        can be used by the consumer project.
-      usageSettings: Settings that control whether this service is usable by
-        the consumer project.
-      visibilitySettings: Settings that control which features of the service
-        are visible to the consumer project.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ProjectSettings(
-        serviceName=serviceName.decode('utf8'),
-        consumerProjectId=consumerProjectId.decode('utf8'),
-        )
-    if FLAGS['operations'].present:
-      request.operations = [apitools_base.JsonToMessage(messages.Operation, x) for x in FLAGS.operations]
-    if FLAGS['properties'].present:
-      request.properties = apitools_base.JsonToMessage(messages.ProjectSettings.PropertiesValue, FLAGS.properties)
-    if FLAGS['quotaSettings'].present:
-      request.quotaSettings = apitools_base.JsonToMessage(messages.QuotaSettings, FLAGS.quotaSettings)
-    if FLAGS['usageSettings'].present:
-      request.usageSettings = apitools_base.JsonToMessage(messages.UsageSettings, FLAGS.usageSettings)
-    if FLAGS['visibilitySettings'].present:
-      request.visibilitySettings = apitools_base.JsonToMessage(messages.VisibilitySettings, FLAGS.visibilitySettings)
-    result = client.services_projectSettings.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ConvertConfig(apitools_base_cli.NewCmd):
-  """Command wrapping v1.ConvertConfig."""
-
-  usage = """convertConfig"""
-
-  def __init__(self, name, fv):
-    super(ConvertConfig, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'configSpec',
-        None,
-        u'Input configuration For this version of API, the supported type is '
-        u'OpenApiSpec',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'openApiSpec',
-        None,
-        u'The OpenAPI specification for an API.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'serviceName',
-        None,
-        u'The service name to use for constructing the normalized service '
-        u'configuration equivalent of the provided configuration '
-        u'specification.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'swaggerSpec',
-        None,
-        u'The swagger specification for an API.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """DEPRECATED. `SubmitConfigSource` with `validate_only=true` will provide
-    config conversion moving forward.  Converts an API specification (e.g.
-    Swagger spec) to an equivalent `google.api.Service`.
-
-    Flags:
-      configSpec: Input configuration For this version of API, the supported
-        type is OpenApiSpec
-      openApiSpec: The OpenAPI specification for an API.
-      serviceName: The service name to use for constructing the normalized
-        service configuration equivalent of the provided configuration
-        specification.
-      swaggerSpec: The swagger specification for an API.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ConvertConfigRequest(
-        )
-    if FLAGS['configSpec'].present:
-      request.configSpec = apitools_base.JsonToMessage(messages.ConvertConfigRequest.ConfigSpecValue, FLAGS.configSpec)
-    if FLAGS['openApiSpec'].present:
-      request.openApiSpec = apitools_base.JsonToMessage(messages.OpenApiSpec, FLAGS.openApiSpec)
-    if FLAGS['serviceName'].present:
-      request.serviceName = FLAGS.serviceName.decode('utf8')
-    if FLAGS['swaggerSpec'].present:
-      request.swaggerSpec = apitools_base.JsonToMessage(messages.SwaggerSpec, FLAGS.swaggerSpec)
-    result = client.v1.ConvertConfig(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-def main(_):
-  appcommands.AddCmd('pyshell', PyShell)
-  appcommands.AddCmd('operations_get', OperationsGet)
-  appcommands.AddCmd('services_convertConfig', ServicesConvertConfig)
-  appcommands.AddCmd('services_create', ServicesCreate)
-  appcommands.AddCmd('services_delete', ServicesDelete)
-  appcommands.AddCmd('services_disable', ServicesDisable)
-  appcommands.AddCmd('services_enable', ServicesEnable)
-  appcommands.AddCmd('services_get', ServicesGet)
-  appcommands.AddCmd('services_getAccessPolicy', ServicesGetAccessPolicy)
-  appcommands.AddCmd('services_getConfig', ServicesGetConfig)
-  appcommands.AddCmd('services_list', ServicesList)
-  appcommands.AddCmd('services_patch', ServicesPatch)
-  appcommands.AddCmd('services_patchConfig', ServicesPatchConfig)
-  appcommands.AddCmd('services_update', ServicesUpdate)
-  appcommands.AddCmd('services_updateAccessPolicy', ServicesUpdateAccessPolicy)
-  appcommands.AddCmd('services_updateConfig', ServicesUpdateConfig)
-  appcommands.AddCmd('services_accessPolicy_query', ServicesAccessPolicyQuery)
-  appcommands.AddCmd('services_configs_create', ServicesConfigsCreate)
-  appcommands.AddCmd('services_configs_get', ServicesConfigsGet)
-  appcommands.AddCmd('services_configs_list', ServicesConfigsList)
-  appcommands.AddCmd('services_configs_submit', ServicesConfigsSubmit)
-  appcommands.AddCmd('services_customerSettings_get', ServicesCustomerSettingsGet)
-  appcommands.AddCmd('services_customerSettings_patch', ServicesCustomerSettingsPatch)
-  appcommands.AddCmd('services_projectSettings_get', ServicesProjectSettingsGet)
-  appcommands.AddCmd('services_projectSettings_patch', ServicesProjectSettingsPatch)
-  appcommands.AddCmd('services_projectSettings_update', ServicesProjectSettingsUpdate)
-  appcommands.AddCmd('convertConfig', ConvertConfig)
-
-  apitools_base_cli.SetupLogger()
-  if hasattr(appcommands, 'SetDefaultCommand'):
-    appcommands.SetDefaultCommand('pyshell')
-
-
-run_main = apitools_base_cli.run_main
-
-if __name__ == '__main__':
-  appcommands.Run()
diff --git a/samples/storage_sample/storage_v1/storage_v1.py b/samples/storage_sample/storage_v1/storage_v1.py
deleted file mode 100644
index d7cff48..0000000
--- a/samples/storage_sample/storage_v1/storage_v1.py
+++ /dev/null
@@ -1,3578 +0,0 @@
-#!/usr/bin/env python
-"""CLI for storage, version v1."""
-# NOTE: This file is autogenerated and should not be edited by hand.
-
-import code
-import os
-import platform
-import sys
-
-from apitools.base.protorpclite import message_types
-from apitools.base.protorpclite import messages
-
-from google.apputils import appcommands
-import gflags as flags
-
-import apitools.base.py as apitools_base
-from apitools.base.py import cli as apitools_base_cli
-import storage_v1_client as client_lib
-import storage_v1_messages as messages
-
-
-def _DeclareStorageFlags():
-  """Declare global flags in an idempotent way."""
-  if 'api_endpoint' in flags.FLAGS:
-    return
-  flags.DEFINE_string(
-      'api_endpoint',
-      u'https://www.googleapis.com/storage/v1/',
-      'URL of the API endpoint to use.',
-      short_name='storage_url')
-  flags.DEFINE_string(
-      'history_file',
-      u'~/.storage.v1.history',
-      'File with interactive shell history.')
-  flags.DEFINE_multistring(
-      'add_header', [],
-      'Additional http headers (as key=value strings). '
-      'Can be specified multiple times.')
-  flags.DEFINE_string(
-      'service_account_json_keyfile', '',
-      'Filename for a JSON service account key downloaded'
-      ' from the Developer Console.')
-  flags.DEFINE_enum(
-      'alt',
-      u'json',
-      [u'json'],
-      u'Data format for the response.')
-  flags.DEFINE_string(
-      'fields',
-      None,
-      u'Selector specifying which fields to include in a partial response.')
-  flags.DEFINE_string(
-      'key',
-      None,
-      u'API key. Your API key identifies your project and provides you with '
-      u'API access, quota, and reports. Required unless you provide an OAuth '
-      u'2.0 token.')
-  flags.DEFINE_string(
-      'oauth_token',
-      None,
-      u'OAuth 2.0 token for the current user.')
-  flags.DEFINE_boolean(
-      'prettyPrint',
-      'True',
-      u'Returns response with indentations and line breaks.')
-  flags.DEFINE_string(
-      'quotaUser',
-      None,
-      u'Available to use for quota purposes for server-side applications. Can'
-      u' be any arbitrary string assigned to a user, but should not exceed 40'
-      u' characters. Overrides userIp if both are provided.')
-  flags.DEFINE_string(
-      'trace',
-      None,
-      'A tracing token of the form "token:<tokenid>" to include in api '
-      'requests.')
-  flags.DEFINE_string(
-      'userIp',
-      None,
-      u'IP address of the site where the request originates. Use this if you '
-      u'want to enforce per-user limits.')
-
-
-FLAGS = flags.FLAGS
-apitools_base_cli.DeclareBaseFlags()
-_DeclareStorageFlags()
-
-
-def GetGlobalParamsFromFlags():
-  """Return a StandardQueryParameters based on flags."""
-  result = messages.StandardQueryParameters()
-  if FLAGS['alt'].present:
-    result.alt = messages.StandardQueryParameters.AltValueValuesEnum(FLAGS.alt)
-  if FLAGS['fields'].present:
-    result.fields = FLAGS.fields.decode('utf8')
-  if FLAGS['key'].present:
-    result.key = FLAGS.key.decode('utf8')
-  if FLAGS['oauth_token'].present:
-    result.oauth_token = FLAGS.oauth_token.decode('utf8')
-  if FLAGS['prettyPrint'].present:
-    result.prettyPrint = FLAGS.prettyPrint
-  if FLAGS['quotaUser'].present:
-    result.quotaUser = FLAGS.quotaUser.decode('utf8')
-  if FLAGS['trace'].present:
-    result.trace = FLAGS.trace.decode('utf8')
-  if FLAGS['userIp'].present:
-    result.userIp = FLAGS.userIp.decode('utf8')
-  return result
-
-
-def GetClientFromFlags():
-  """Return a client object, configured from flags."""
-  log_request = FLAGS.log_request or FLAGS.log_request_response
-  log_response = FLAGS.log_response or FLAGS.log_request_response
-  api_endpoint = apitools_base.NormalizeApiEndpoint(FLAGS.api_endpoint)
-  additional_http_headers = dict(x.split('=', 1) for x in FLAGS.add_header)
-  credentials_args = {
-      'service_account_json_keyfile': os.path.expanduser(FLAGS.service_account_json_keyfile)
-  }
-  try:
-    client = client_lib.StorageV1(
-        api_endpoint, log_request=log_request,
-        log_response=log_response,
-        credentials_args=credentials_args,
-        additional_http_headers=additional_http_headers)
-  except apitools_base.CredentialsError as e:
-    print 'Error creating credentials: %s' % e
-    sys.exit(1)
-  return client
-
-
-class PyShell(appcommands.Cmd):
-
-  def Run(self, _):
-    """Run an interactive python shell with the client."""
-    client = GetClientFromFlags()
-    params = GetGlobalParamsFromFlags()
-    for field in params.all_fields():
-      value = params.get_assigned_value(field.name)
-      if value != field.default:
-        client.AddGlobalParam(field.name, value)
-    banner = """
-           == storage interactive console ==
-                 client: a storage client
-          apitools_base: base apitools module
-         messages: the generated messages module
-    """
-    local_vars = {
-        'apitools_base': apitools_base,
-        'client': client,
-        'client_lib': client_lib,
-        'messages': messages,
-    }
-    if platform.system() == 'Linux':
-      console = apitools_base_cli.ConsoleWithReadline(
-          local_vars, histfile=FLAGS.history_file)
-    else:
-      console = code.InteractiveConsole(local_vars)
-    try:
-      console.interact(banner)
-    except SystemExit as e:
-      return e.code
-
-
-class BucketAccessControlsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping bucketAccessControls.Delete."""
-
-  usage = """bucketAccessControls_delete <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(BucketAccessControlsDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Permanently deletes the ACL entry for the specified entity on the
-    specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketAccessControlsDeleteRequest(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    result = client.bucketAccessControls.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketAccessControlsGet(apitools_base_cli.NewCmd):
-  """Command wrapping bucketAccessControls.Get."""
-
-  usage = """bucketAccessControls_get <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(BucketAccessControlsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Returns the ACL entry for the specified entity on the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketAccessControlsGetRequest(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    result = client.bucketAccessControls.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketAccessControlsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping bucketAccessControls.Insert."""
-
-  usage = """bucketAccessControls_insert <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketAccessControlsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'domain',
-        None,
-        u'The domain associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'The email address associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entity',
-        None,
-        u'The entity holding the permission, in one of the following forms:  '
-        u'- user-userId  - user-email  - group-groupId  - group-email  - '
-        u'domain-domain  - project-team-projectId  - allUsers  - '
-        u'allAuthenticatedUsers Examples:  - The user liz@example.com would '
-        u'be user-liz@example.com.  - The group example@googlegroups.com '
-        u'would be group-example@googlegroups.com.  - To refer to all members'
-        u' of the Google Apps for Business domain example.com, the entity '
-        u'would be domain-example.com.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entityId',
-        None,
-        u'The ID for the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#bucketAccessControl',
-        u'The kind of item this is. For bucket access control entries, this '
-        u'is always storage#bucketAccessControl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectTeam',
-        None,
-        u'The project team associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'role',
-        None,
-        u'The access permission for the entity. Can be READER, WRITER, or '
-        u'OWNER.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The link to this access-control entry.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Creates a new ACL entry on the specified bucket.
-
-    Args:
-      bucket: The name of the bucket.
-
-    Flags:
-      domain: The domain associated with the entity, if any.
-      email: The email address associated with the entity, if any.
-      entity: The entity holding the permission, in one of the following
-        forms:  - user-userId  - user-email  - group-groupId  - group-email  -
-        domain-domain  - project-team-projectId  - allUsers  -
-        allAuthenticatedUsers Examples:  - The user liz@example.com would be
-        user-liz@example.com.  - The group example@googlegroups.com would be
-        group-example@googlegroups.com.  - To refer to all members of the
-        Google Apps for Business domain example.com, the entity would be
-        domain-example.com.
-      entityId: The ID for the entity, if any.
-      etag: HTTP 1.1 Entity tag for the access-control entry.
-      id: The ID of the access-control entry.
-      kind: The kind of item this is. For bucket access control entries, this
-        is always storage#bucketAccessControl.
-      projectTeam: The project team associated with the entity, if any.
-      role: The access permission for the entity. Can be READER, WRITER, or
-        OWNER.
-      selfLink: The link to this access-control entry.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BucketAccessControl(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['domain'].present:
-      request.domain = FLAGS.domain.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['entity'].present:
-      request.entity = FLAGS.entity.decode('utf8')
-    if FLAGS['entityId'].present:
-      request.entityId = FLAGS.entityId.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['projectTeam'].present:
-      request.projectTeam = apitools_base.JsonToMessage(messages.BucketAccessControl.ProjectTeamValue, FLAGS.projectTeam)
-    if FLAGS['role'].present:
-      request.role = FLAGS.role.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    result = client.bucketAccessControls.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketAccessControlsList(apitools_base_cli.NewCmd):
-  """Command wrapping bucketAccessControls.List."""
-
-  usage = """bucketAccessControls_list <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketAccessControlsList, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket):
-    """Retrieves ACL entries on the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketAccessControlsListRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    result = client.bucketAccessControls.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketAccessControlsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping bucketAccessControls.Patch."""
-
-  usage = """bucketAccessControls_patch <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(BucketAccessControlsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'domain',
-        None,
-        u'The domain associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'The email address associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entityId',
-        None,
-        u'The ID for the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#bucketAccessControl',
-        u'The kind of item this is. For bucket access control entries, this '
-        u'is always storage#bucketAccessControl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectTeam',
-        None,
-        u'The project team associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'role',
-        None,
-        u'The access permission for the entity. Can be READER, WRITER, or '
-        u'OWNER.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The link to this access-control entry.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Updates an ACL entry on the specified bucket. This method supports
-    patch semantics.
-
-    Args:
-      bucket: The name of the bucket.
-      entity: The entity holding the permission, in one of the following
-        forms:  - user-userId  - user-email  - group-groupId  - group-email  -
-        domain-domain  - project-team-projectId  - allUsers  -
-        allAuthenticatedUsers Examples:  - The user liz@example.com would be
-        user-liz@example.com.  - The group example@googlegroups.com would be
-        group-example@googlegroups.com.  - To refer to all members of the
-        Google Apps for Business domain example.com, the entity would be
-        domain-example.com.
-
-    Flags:
-      domain: The domain associated with the entity, if any.
-      email: The email address associated with the entity, if any.
-      entityId: The ID for the entity, if any.
-      etag: HTTP 1.1 Entity tag for the access-control entry.
-      id: The ID of the access-control entry.
-      kind: The kind of item this is. For bucket access control entries, this
-        is always storage#bucketAccessControl.
-      projectTeam: The project team associated with the entity, if any.
-      role: The access permission for the entity. Can be READER, WRITER, or
-        OWNER.
-      selfLink: The link to this access-control entry.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BucketAccessControl(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['domain'].present:
-      request.domain = FLAGS.domain.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['entityId'].present:
-      request.entityId = FLAGS.entityId.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['projectTeam'].present:
-      request.projectTeam = apitools_base.JsonToMessage(messages.BucketAccessControl.ProjectTeamValue, FLAGS.projectTeam)
-    if FLAGS['role'].present:
-      request.role = FLAGS.role.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    result = client.bucketAccessControls.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketAccessControlsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping bucketAccessControls.Update."""
-
-  usage = """bucketAccessControls_update <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(BucketAccessControlsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'domain',
-        None,
-        u'The domain associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'The email address associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entityId',
-        None,
-        u'The ID for the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#bucketAccessControl',
-        u'The kind of item this is. For bucket access control entries, this '
-        u'is always storage#bucketAccessControl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectTeam',
-        None,
-        u'The project team associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'role',
-        None,
-        u'The access permission for the entity. Can be READER, WRITER, or '
-        u'OWNER.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The link to this access-control entry.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Updates an ACL entry on the specified bucket.
-
-    Args:
-      bucket: The name of the bucket.
-      entity: The entity holding the permission, in one of the following
-        forms:  - user-userId  - user-email  - group-groupId  - group-email  -
-        domain-domain  - project-team-projectId  - allUsers  -
-        allAuthenticatedUsers Examples:  - The user liz@example.com would be
-        user-liz@example.com.  - The group example@googlegroups.com would be
-        group-example@googlegroups.com.  - To refer to all members of the
-        Google Apps for Business domain example.com, the entity would be
-        domain-example.com.
-
-    Flags:
-      domain: The domain associated with the entity, if any.
-      email: The email address associated with the entity, if any.
-      entityId: The ID for the entity, if any.
-      etag: HTTP 1.1 Entity tag for the access-control entry.
-      id: The ID of the access-control entry.
-      kind: The kind of item this is. For bucket access control entries, this
-        is always storage#bucketAccessControl.
-      projectTeam: The project team associated with the entity, if any.
-      role: The access permission for the entity. Can be READER, WRITER, or
-        OWNER.
-      selfLink: The link to this access-control entry.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.BucketAccessControl(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['domain'].present:
-      request.domain = FLAGS.domain.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['entityId'].present:
-      request.entityId = FLAGS.entityId.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['projectTeam'].present:
-      request.projectTeam = apitools_base.JsonToMessage(messages.BucketAccessControl.ProjectTeamValue, FLAGS.projectTeam)
-    if FLAGS['role'].present:
-      request.role = FLAGS.role.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    result = client.bucketAccessControls.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.Delete."""
-
-  usage = """buckets_delete <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketsDelete, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u'If set, only deletes the bucket if its metageneration matches this '
-        u'value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u'If set, only deletes the bucket if its metageneration does not '
-        u'match this value.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Permanently deletes an empty bucket.
-
-    Args:
-      bucket: Name of a bucket.
-
-    Flags:
-      ifMetagenerationMatch: If set, only deletes the bucket if its
-        metageneration matches this value.
-      ifMetagenerationNotMatch: If set, only deletes the bucket if its
-        metageneration does not match this value.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsDeleteRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    result = client.buckets.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsGet(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.Get."""
-
-  usage = """buckets_get <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketsGet, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u'Makes the return of the bucket metadata conditional on whether the '
-        u"bucket's current metageneration matches the given value.",
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u'Makes the return of the bucket metadata conditional on whether the '
-        u"bucket's current metageneration does not match the given value.",
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Returns metadata for the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-
-    Flags:
-      ifMetagenerationMatch: Makes the return of the bucket metadata
-        conditional on whether the bucket's current metageneration matches the
-        given value.
-      ifMetagenerationNotMatch: Makes the return of the bucket metadata
-        conditional on whether the bucket's current metageneration does not
-        match the given value.
-      projection: Set of properties to return. Defaults to noAcl.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsGetRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageBucketsGetRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    result = client.buckets.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsGetIamPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.GetIamPolicy."""
-
-  usage = """buckets_getIamPolicy <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketsGetIamPolicy, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket):
-    """Returns an IAM policy for the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsGetIamPolicyRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    result = client.buckets.GetIamPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.Insert."""
-
-  usage = """buckets_insert <project>"""
-
-  def __init__(self, name, fv):
-    super(BucketsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'bucket',
-        None,
-        u'A Bucket resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'private', u'projectPrivate', u'publicRead', u'publicReadWrite'],
-        u'Apply a predefined set of access controls to this bucket.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedDefaultObjectAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of default object access controls to this '
-        u'bucket.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl, unless the bucket '
-        u'resource specifies acl or defaultObjectAcl properties, when it '
-        u'defaults to full.',
-        flag_values=fv)
-
-  def RunWithArgs(self, project):
-    """Creates a new bucket.
-
-    Args:
-      project: A valid API project identifier.
-
-    Flags:
-      bucket: A Bucket resource to be passed as the request body.
-      predefinedAcl: Apply a predefined set of access controls to this bucket.
-      predefinedDefaultObjectAcl: Apply a predefined set of default object
-        access controls to this bucket.
-      projection: Set of properties to return. Defaults to noAcl, unless the
-        bucket resource specifies acl or defaultObjectAcl properties, when it
-        defaults to full.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsInsertRequest(
-        project=project.decode('utf8'),
-        )
-    if FLAGS['bucket'].present:
-      request.bucket = apitools_base.JsonToMessage(messages.Bucket, FLAGS.bucket)
-    if FLAGS['predefinedAcl'].present:
-      request.predefinedAcl = messages.StorageBucketsInsertRequest.PredefinedAclValueValuesEnum(FLAGS.predefinedAcl)
-    if FLAGS['predefinedDefaultObjectAcl'].present:
-      request.predefinedDefaultObjectAcl = messages.StorageBucketsInsertRequest.PredefinedDefaultObjectAclValueValuesEnum(FLAGS.predefinedDefaultObjectAcl)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageBucketsInsertRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    result = client.buckets.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsList(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.List."""
-
-  usage = """buckets_list <project>"""
-
-  def __init__(self, name, fv):
-    super(BucketsList, self).__init__(name, fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of buckets to return.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'A previously-returned page token representing part of the larger '
-        u'set of results to view.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'prefix',
-        None,
-        u'Filter results to buckets whose names begin with this prefix.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl.',
-        flag_values=fv)
-
-  def RunWithArgs(self, project):
-    """Retrieves a list of buckets for a given project.
-
-    Args:
-      project: A valid API project identifier.
-
-    Flags:
-      maxResults: Maximum number of buckets to return.
-      pageToken: A previously-returned page token representing part of the
-        larger set of results to view.
-      prefix: Filter results to buckets whose names begin with this prefix.
-      projection: Set of properties to return. Defaults to noAcl.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsListRequest(
-        project=project.decode('utf8'),
-        )
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['prefix'].present:
-      request.prefix = FLAGS.prefix.decode('utf8')
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageBucketsListRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    result = client.buckets.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.Patch."""
-
-  usage = """buckets_patch <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'bucketResource',
-        None,
-        u'A Bucket resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u'Makes the return of the bucket metadata conditional on whether the '
-        u"bucket's current metageneration matches the given value.",
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u'Makes the return of the bucket metadata conditional on whether the '
-        u"bucket's current metageneration does not match the given value.",
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'private', u'projectPrivate', u'publicRead', u'publicReadWrite'],
-        u'Apply a predefined set of access controls to this bucket.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedDefaultObjectAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of default object access controls to this '
-        u'bucket.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to full.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Updates a bucket. This method supports patch semantics.
-
-    Args:
-      bucket: Name of a bucket.
-
-    Flags:
-      bucketResource: A Bucket resource to be passed as the request body.
-      ifMetagenerationMatch: Makes the return of the bucket metadata
-        conditional on whether the bucket's current metageneration matches the
-        given value.
-      ifMetagenerationNotMatch: Makes the return of the bucket metadata
-        conditional on whether the bucket's current metageneration does not
-        match the given value.
-      predefinedAcl: Apply a predefined set of access controls to this bucket.
-      predefinedDefaultObjectAcl: Apply a predefined set of default object
-        access controls to this bucket.
-      projection: Set of properties to return. Defaults to full.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsPatchRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['bucketResource'].present:
-      request.bucketResource = apitools_base.JsonToMessage(messages.Bucket, FLAGS.bucketResource)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['predefinedAcl'].present:
-      request.predefinedAcl = messages.StorageBucketsPatchRequest.PredefinedAclValueValuesEnum(FLAGS.predefinedAcl)
-    if FLAGS['predefinedDefaultObjectAcl'].present:
-      request.predefinedDefaultObjectAcl = messages.StorageBucketsPatchRequest.PredefinedDefaultObjectAclValueValuesEnum(FLAGS.predefinedDefaultObjectAcl)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageBucketsPatchRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    result = client.buckets.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsSetIamPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.SetIamPolicy."""
-
-  usage = """buckets_setIamPolicy <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketsSetIamPolicy, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'policy',
-        None,
-        u'A Policy resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Updates an IAM policy for the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-
-    Flags:
-      policy: A Policy resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsSetIamPolicyRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['policy'].present:
-      request.policy = apitools_base.JsonToMessage(messages.Policy, FLAGS.policy)
-    result = client.buckets.SetIamPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsTestIamPermissions(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.TestIamPermissions."""
-
-  usage = """buckets_testIamPermissions <bucket> <permissions>"""
-
-  def __init__(self, name, fv):
-    super(BucketsTestIamPermissions, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket, permissions):
-    """Tests a set of permissions on the given bucket to see which, if any,
-    are held by the caller.
-
-    Args:
-      bucket: Name of a bucket.
-      permissions: Permissions to test.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsTestIamPermissionsRequest(
-        bucket=bucket.decode('utf8'),
-        permissions=permissions.decode('utf8'),
-        )
-    result = client.buckets.TestIamPermissions(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class BucketsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping buckets.Update."""
-
-  usage = """buckets_update <bucket>"""
-
-  def __init__(self, name, fv):
-    super(BucketsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'bucketResource',
-        None,
-        u'A Bucket resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u'Makes the return of the bucket metadata conditional on whether the '
-        u"bucket's current metageneration matches the given value.",
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u'Makes the return of the bucket metadata conditional on whether the '
-        u"bucket's current metageneration does not match the given value.",
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'private', u'projectPrivate', u'publicRead', u'publicReadWrite'],
-        u'Apply a predefined set of access controls to this bucket.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedDefaultObjectAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of default object access controls to this '
-        u'bucket.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to full.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Updates a bucket.
-
-    Args:
-      bucket: Name of a bucket.
-
-    Flags:
-      bucketResource: A Bucket resource to be passed as the request body.
-      ifMetagenerationMatch: Makes the return of the bucket metadata
-        conditional on whether the bucket's current metageneration matches the
-        given value.
-      ifMetagenerationNotMatch: Makes the return of the bucket metadata
-        conditional on whether the bucket's current metageneration does not
-        match the given value.
-      predefinedAcl: Apply a predefined set of access controls to this bucket.
-      predefinedDefaultObjectAcl: Apply a predefined set of default object
-        access controls to this bucket.
-      projection: Set of properties to return. Defaults to full.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageBucketsUpdateRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['bucketResource'].present:
-      request.bucketResource = apitools_base.JsonToMessage(messages.Bucket, FLAGS.bucketResource)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['predefinedAcl'].present:
-      request.predefinedAcl = messages.StorageBucketsUpdateRequest.PredefinedAclValueValuesEnum(FLAGS.predefinedAcl)
-    if FLAGS['predefinedDefaultObjectAcl'].present:
-      request.predefinedDefaultObjectAcl = messages.StorageBucketsUpdateRequest.PredefinedDefaultObjectAclValueValuesEnum(FLAGS.predefinedDefaultObjectAcl)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageBucketsUpdateRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    result = client.buckets.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ChannelsStop(apitools_base_cli.NewCmd):
-  """Command wrapping channels.Stop."""
-
-  usage = """channels_stop"""
-
-  def __init__(self, name, fv):
-    super(ChannelsStop, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'address',
-        None,
-        u'The address where notifications are delivered for this channel.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'expiration',
-        None,
-        u'Date and time of notification channel expiration, expressed as a '
-        u'Unix timestamp, in milliseconds. Optional.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'A UUID or similar unique string that identifies this channel.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'api#channel',
-        u'Identifies this as a notification channel used to watch for changes'
-        u' to a resource. Value: the fixed string "api#channel".',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'params',
-        None,
-        u'Additional parameters controlling delivery channel behavior. '
-        u'Optional.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'payload',
-        None,
-        u'A Boolean value to indicate whether payload is wanted. Optional.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'resourceId',
-        None,
-        u'An opaque ID that identifies the resource being watched on this '
-        u'channel. Stable across different API versions.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'resourceUri',
-        None,
-        u'A version-specific identifier for the watched resource.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'token',
-        None,
-        u'An arbitrary string delivered to the target address with each '
-        u'notification delivered over this channel. Optional.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'type',
-        None,
-        u'The type of delivery mechanism used for this channel.',
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Stop watching resources through this channel
-
-    Flags:
-      address: The address where notifications are delivered for this channel.
-      expiration: Date and time of notification channel expiration, expressed
-        as a Unix timestamp, in milliseconds. Optional.
-      id: A UUID or similar unique string that identifies this channel.
-      kind: Identifies this as a notification channel used to watch for
-        changes to a resource. Value: the fixed string "api#channel".
-      params: Additional parameters controlling delivery channel behavior.
-        Optional.
-      payload: A Boolean value to indicate whether payload is wanted.
-        Optional.
-      resourceId: An opaque ID that identifies the resource being watched on
-        this channel. Stable across different API versions.
-      resourceUri: A version-specific identifier for the watched resource.
-      token: An arbitrary string delivered to the target address with each
-        notification delivered over this channel. Optional.
-      type: The type of delivery mechanism used for this channel.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.Channel(
-        )
-    if FLAGS['address'].present:
-      request.address = FLAGS.address.decode('utf8')
-    if FLAGS['expiration'].present:
-      request.expiration = int(FLAGS.expiration)
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['params'].present:
-      request.params = apitools_base.JsonToMessage(messages.Channel.ParamsValue, FLAGS.params)
-    if FLAGS['payload'].present:
-      request.payload = FLAGS.payload
-    if FLAGS['resourceId'].present:
-      request.resourceId = FLAGS.resourceId.decode('utf8')
-    if FLAGS['resourceUri'].present:
-      request.resourceUri = FLAGS.resourceUri.decode('utf8')
-    if FLAGS['token'].present:
-      request.token = FLAGS.token.decode('utf8')
-    if FLAGS['type'].present:
-      request.type = FLAGS.type.decode('utf8')
-    result = client.channels.Stop(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DefaultObjectAccessControlsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping defaultObjectAccessControls.Delete."""
-
-  usage = """defaultObjectAccessControls_delete <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(DefaultObjectAccessControlsDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Permanently deletes the default object ACL entry for the specified
-    entity on the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageDefaultObjectAccessControlsDeleteRequest(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    result = client.defaultObjectAccessControls.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DefaultObjectAccessControlsGet(apitools_base_cli.NewCmd):
-  """Command wrapping defaultObjectAccessControls.Get."""
-
-  usage = """defaultObjectAccessControls_get <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(DefaultObjectAccessControlsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Returns the default object ACL entry for the specified entity on the
-    specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageDefaultObjectAccessControlsGetRequest(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    result = client.defaultObjectAccessControls.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DefaultObjectAccessControlsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping defaultObjectAccessControls.Insert."""
-
-  usage = """defaultObjectAccessControls_insert <bucket>"""
-
-  def __init__(self, name, fv):
-    super(DefaultObjectAccessControlsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'domain',
-        None,
-        u'The domain associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'The email address associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entity',
-        None,
-        u'The entity holding the permission, in one of the following forms:  '
-        u'- user-userId  - user-email  - group-groupId  - group-email  - '
-        u'domain-domain  - project-team-projectId  - allUsers  - '
-        u'allAuthenticatedUsers Examples:  - The user liz@example.com would '
-        u'be user-liz@example.com.  - The group example@googlegroups.com '
-        u'would be group-example@googlegroups.com.  - To refer to all members'
-        u' of the Google Apps for Business domain example.com, the entity '
-        u'would be domain-example.com.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entityId',
-        None,
-        u'The ID for the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'The content generation of the object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#objectAccessControl',
-        u'The kind of item this is. For object access control entries, this '
-        u'is always storage#objectAccessControl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object',
-        None,
-        u'The name of the object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectTeam',
-        None,
-        u'The project team associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'role',
-        None,
-        u'The access permission for the entity. Can be READER or OWNER.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The link to this access-control entry.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Creates a new default object ACL entry on the specified bucket.
-
-    Args:
-      bucket: The name of the bucket.
-
-    Flags:
-      domain: The domain associated with the entity, if any.
-      email: The email address associated with the entity, if any.
-      entity: The entity holding the permission, in one of the following
-        forms:  - user-userId  - user-email  - group-groupId  - group-email  -
-        domain-domain  - project-team-projectId  - allUsers  -
-        allAuthenticatedUsers Examples:  - The user liz@example.com would be
-        user-liz@example.com.  - The group example@googlegroups.com would be
-        group-example@googlegroups.com.  - To refer to all members of the
-        Google Apps for Business domain example.com, the entity would be
-        domain-example.com.
-      entityId: The ID for the entity, if any.
-      etag: HTTP 1.1 Entity tag for the access-control entry.
-      generation: The content generation of the object.
-      id: The ID of the access-control entry.
-      kind: The kind of item this is. For object access control entries, this
-        is always storage#objectAccessControl.
-      object: The name of the object.
-      projectTeam: The project team associated with the entity, if any.
-      role: The access permission for the entity. Can be READER or OWNER.
-      selfLink: The link to this access-control entry.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ObjectAccessControl(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['domain'].present:
-      request.domain = FLAGS.domain.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['entity'].present:
-      request.entity = FLAGS.entity.decode('utf8')
-    if FLAGS['entityId'].present:
-      request.entityId = FLAGS.entityId.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['object'].present:
-      request.object = FLAGS.object.decode('utf8')
-    if FLAGS['projectTeam'].present:
-      request.projectTeam = apitools_base.JsonToMessage(messages.ObjectAccessControl.ProjectTeamValue, FLAGS.projectTeam)
-    if FLAGS['role'].present:
-      request.role = FLAGS.role.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    result = client.defaultObjectAccessControls.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DefaultObjectAccessControlsList(apitools_base_cli.NewCmd):
-  """Command wrapping defaultObjectAccessControls.List."""
-
-  usage = """defaultObjectAccessControls_list <bucket>"""
-
-  def __init__(self, name, fv):
-    super(DefaultObjectAccessControlsList, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"If present, only return default ACL listing if the bucket's current"
-        u' metageneration matches this value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"If present, only return default ACL listing if the bucket's current"
-        u' metageneration does not match the given value.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Retrieves default object ACL entries on the specified bucket.
-
-    Args:
-      bucket: Name of a bucket.
-
-    Flags:
-      ifMetagenerationMatch: If present, only return default ACL listing if
-        the bucket's current metageneration matches this value.
-      ifMetagenerationNotMatch: If present, only return default ACL listing if
-        the bucket's current metageneration does not match the given value.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageDefaultObjectAccessControlsListRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    result = client.defaultObjectAccessControls.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DefaultObjectAccessControlsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping defaultObjectAccessControls.Patch."""
-
-  usage = """defaultObjectAccessControls_patch <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(DefaultObjectAccessControlsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'domain',
-        None,
-        u'The domain associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'The email address associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entityId',
-        None,
-        u'The ID for the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'The content generation of the object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#objectAccessControl',
-        u'The kind of item this is. For object access control entries, this '
-        u'is always storage#objectAccessControl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object',
-        None,
-        u'The name of the object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectTeam',
-        None,
-        u'The project team associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'role',
-        None,
-        u'The access permission for the entity. Can be READER or OWNER.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The link to this access-control entry.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Updates a default object ACL entry on the specified bucket. This method
-    supports patch semantics.
-
-    Args:
-      bucket: The name of the bucket.
-      entity: The entity holding the permission, in one of the following
-        forms:  - user-userId  - user-email  - group-groupId  - group-email  -
-        domain-domain  - project-team-projectId  - allUsers  -
-        allAuthenticatedUsers Examples:  - The user liz@example.com would be
-        user-liz@example.com.  - The group example@googlegroups.com would be
-        group-example@googlegroups.com.  - To refer to all members of the
-        Google Apps for Business domain example.com, the entity would be
-        domain-example.com.
-
-    Flags:
-      domain: The domain associated with the entity, if any.
-      email: The email address associated with the entity, if any.
-      entityId: The ID for the entity, if any.
-      etag: HTTP 1.1 Entity tag for the access-control entry.
-      generation: The content generation of the object.
-      id: The ID of the access-control entry.
-      kind: The kind of item this is. For object access control entries, this
-        is always storage#objectAccessControl.
-      object: The name of the object.
-      projectTeam: The project team associated with the entity, if any.
-      role: The access permission for the entity. Can be READER or OWNER.
-      selfLink: The link to this access-control entry.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ObjectAccessControl(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['domain'].present:
-      request.domain = FLAGS.domain.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['entityId'].present:
-      request.entityId = FLAGS.entityId.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['object'].present:
-      request.object = FLAGS.object.decode('utf8')
-    if FLAGS['projectTeam'].present:
-      request.projectTeam = apitools_base.JsonToMessage(messages.ObjectAccessControl.ProjectTeamValue, FLAGS.projectTeam)
-    if FLAGS['role'].present:
-      request.role = FLAGS.role.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    result = client.defaultObjectAccessControls.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class DefaultObjectAccessControlsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping defaultObjectAccessControls.Update."""
-
-  usage = """defaultObjectAccessControls_update <bucket> <entity>"""
-
-  def __init__(self, name, fv):
-    super(DefaultObjectAccessControlsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'domain',
-        None,
-        u'The domain associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'email',
-        None,
-        u'The email address associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'entityId',
-        None,
-        u'The ID for the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'The content generation of the object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the access-control entry.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#objectAccessControl',
-        u'The kind of item this is. For object access control entries, this '
-        u'is always storage#objectAccessControl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object',
-        None,
-        u'The name of the object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'projectTeam',
-        None,
-        u'The project team associated with the entity, if any.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'role',
-        None,
-        u'The access permission for the entity. Can be READER or OWNER.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The link to this access-control entry.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, entity):
-    """Updates a default object ACL entry on the specified bucket.
-
-    Args:
-      bucket: The name of the bucket.
-      entity: The entity holding the permission, in one of the following
-        forms:  - user-userId  - user-email  - group-groupId  - group-email  -
-        domain-domain  - project-team-projectId  - allUsers  -
-        allAuthenticatedUsers Examples:  - The user liz@example.com would be
-        user-liz@example.com.  - The group example@googlegroups.com would be
-        group-example@googlegroups.com.  - To refer to all members of the
-        Google Apps for Business domain example.com, the entity would be
-        domain-example.com.
-
-    Flags:
-      domain: The domain associated with the entity, if any.
-      email: The email address associated with the entity, if any.
-      entityId: The ID for the entity, if any.
-      etag: HTTP 1.1 Entity tag for the access-control entry.
-      generation: The content generation of the object.
-      id: The ID of the access-control entry.
-      kind: The kind of item this is. For object access control entries, this
-        is always storage#objectAccessControl.
-      object: The name of the object.
-      projectTeam: The project team associated with the entity, if any.
-      role: The access permission for the entity. Can be READER or OWNER.
-      selfLink: The link to this access-control entry.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.ObjectAccessControl(
-        bucket=bucket.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['domain'].present:
-      request.domain = FLAGS.domain.decode('utf8')
-    if FLAGS['email'].present:
-      request.email = FLAGS.email.decode('utf8')
-    if FLAGS['entityId'].present:
-      request.entityId = FLAGS.entityId.decode('utf8')
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['object'].present:
-      request.object = FLAGS.object.decode('utf8')
-    if FLAGS['projectTeam'].present:
-      request.projectTeam = apitools_base.JsonToMessage(messages.ObjectAccessControl.ProjectTeamValue, FLAGS.projectTeam)
-    if FLAGS['role'].present:
-      request.role = FLAGS.role.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    result = client.defaultObjectAccessControls.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class NotificationsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping notifications.Delete."""
-
-  usage = """notifications_delete <notification>"""
-
-  def __init__(self, name, fv):
-    super(NotificationsDelete, self).__init__(name, fv)
-
-  def RunWithArgs(self, notification):
-    """Permanently deletes a notification subscription.
-
-    Args:
-      notification: ID of the notification to delete.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageNotificationsDeleteRequest(
-        notification=notification.decode('utf8'),
-        )
-    result = client.notifications.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class NotificationsGet(apitools_base_cli.NewCmd):
-  """Command wrapping notifications.Get."""
-
-  usage = """notifications_get <notification>"""
-
-  def __init__(self, name, fv):
-    super(NotificationsGet, self).__init__(name, fv)
-
-  def RunWithArgs(self, notification):
-    """View a notification configuration.
-
-    Args:
-      notification: Notification ID
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageNotificationsGetRequest(
-        notification=notification.decode('utf8'),
-        )
-    result = client.notifications.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class NotificationsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping notifications.Insert."""
-
-  usage = """notifications_insert"""
-
-  def __init__(self, name, fv):
-    super(NotificationsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'bucket',
-        None,
-        u'The name of the bucket this subscription is particular to.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'custom_attributes',
-        None,
-        u'An optional list of additional attributes to attach to each Cloud '
-        u'PubSub message published for this notification subscription.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'etag',
-        None,
-        u'HTTP 1.1 Entity tag for this subscription notification.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'event_types',
-        None,
-        u'If present, only send notifications about listed event types. If '
-        u'empty, sent notifications for all event types.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'id',
-        None,
-        u'The ID of the notification.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'kind',
-        u'storage#notification',
-        u'The kind of item this is. For notifications, this is always '
-        u'storage#notification.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object_metadata_format',
-        u'JSON_API_V1',
-        u'If payload_content is OBJECT_METADATA, controls the format of that '
-        u'metadata. Otherwise, must not be set.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object_name_prefix',
-        None,
-        u'If present, only apply this notification configuration to object '
-        u'names that begin with this prefix.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'payload_content',
-        u'OBJECT_METADATA',
-        u'The desired content of the Payload. Defaults to OBJECT_METADATA.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'selfLink',
-        None,
-        u'The canonical URL of this notification.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'topic',
-        None,
-        u'The Cloud PubSub topic to which this subscription publishes. '
-        u"Formatted as: '//pubsub.googleapis.com/projects/{project-"
-        u"identifier}/topics/{my-topic}'",
-        flag_values=fv)
-
-  def RunWithArgs(self):
-    """Creates a notification subscription for a given bucket.
-
-    Flags:
-      bucket: The name of the bucket this subscription is particular to.
-      custom_attributes: An optional list of additional attributes to attach
-        to each Cloud PubSub message published for this notification
-        subscription.
-      etag: HTTP 1.1 Entity tag for this subscription notification.
-      event_types: If present, only send notifications about listed event
-        types. If empty, sent notifications for all event types.
-      id: The ID of the notification.
-      kind: The kind of item this is. For notifications, this is always
-        storage#notification.
-      object_metadata_format: If payload_content is OBJECT_METADATA, controls
-        the format of that metadata. Otherwise, must not be set.
-      object_name_prefix: If present, only apply this notification
-        configuration to object names that begin with this prefix.
-      payload_content: The desired content of the Payload. Defaults to
-        OBJECT_METADATA.
-      selfLink: The canonical URL of this notification.
-      topic: The Cloud PubSub topic to which this subscription publishes.
-        Formatted as: '//pubsub.googleapis.com/projects/{project-
-        identifier}/topics/{my-topic}'
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.Notification(
-        )
-    if FLAGS['bucket'].present:
-      request.bucket = FLAGS.bucket.decode('utf8')
-    if FLAGS['custom_attributes'].present:
-      request.custom_attributes = apitools_base.JsonToMessage(messages.Notification.CustomAttributesValue, FLAGS.custom_attributes)
-    if FLAGS['etag'].present:
-      request.etag = FLAGS.etag.decode('utf8')
-    if FLAGS['event_types'].present:
-      request.event_types = [x.decode('utf8') for x in FLAGS.event_types]
-    if FLAGS['id'].present:
-      request.id = FLAGS.id.decode('utf8')
-    if FLAGS['kind'].present:
-      request.kind = FLAGS.kind.decode('utf8')
-    if FLAGS['object_metadata_format'].present:
-      request.object_metadata_format = FLAGS.object_metadata_format.decode('utf8')
-    if FLAGS['object_name_prefix'].present:
-      request.object_name_prefix = FLAGS.object_name_prefix.decode('utf8')
-    if FLAGS['payload_content'].present:
-      request.payload_content = FLAGS.payload_content.decode('utf8')
-    if FLAGS['selfLink'].present:
-      request.selfLink = FLAGS.selfLink.decode('utf8')
-    if FLAGS['topic'].present:
-      request.topic = FLAGS.topic.decode('utf8')
-    result = client.notifications.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class NotificationsList(apitools_base_cli.NewCmd):
-  """Command wrapping notifications.List."""
-
-  usage = """notifications_list <bucket>"""
-
-  def __init__(self, name, fv):
-    super(NotificationsList, self).__init__(name, fv)
-
-  def RunWithArgs(self, bucket):
-    """Retrieves a list of notification subscriptions for a given bucket.
-
-    Args:
-      bucket: Name of a GCS bucket.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageNotificationsListRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    result = client.notifications.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectAccessControlsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping objectAccessControls.Delete."""
-
-  usage = """objectAccessControls_delete <bucket> <object> <entity>"""
-
-  def __init__(self, name, fv):
-    super(ObjectAccessControlsDelete, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object, entity):
-    """Permanently deletes the ACL entry for the specified entity on the
-    specified object.
-
-    Args:
-      bucket: Name of a bucket.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectAccessControlsDeleteRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    result = client.objectAccessControls.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectAccessControlsGet(apitools_base_cli.NewCmd):
-  """Command wrapping objectAccessControls.Get."""
-
-  usage = """objectAccessControls_get <bucket> <object> <entity>"""
-
-  def __init__(self, name, fv):
-    super(ObjectAccessControlsGet, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object, entity):
-    """Returns the ACL entry for the specified entity on the specified object.
-
-    Args:
-      bucket: Name of a bucket.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectAccessControlsGetRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    result = client.objectAccessControls.Get(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectAccessControlsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping objectAccessControls.Insert."""
-
-  usage = """objectAccessControls_insert <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectAccessControlsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'objectAccessControl',
-        None,
-        u'A ObjectAccessControl resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Creates a new ACL entry on the specified object.
-
-    Args:
-      bucket: Name of a bucket.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      objectAccessControl: A ObjectAccessControl resource to be passed as the
-        request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectAccessControlsInsertRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['objectAccessControl'].present:
-      request.objectAccessControl = apitools_base.JsonToMessage(messages.ObjectAccessControl, FLAGS.objectAccessControl)
-    result = client.objectAccessControls.Insert(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectAccessControlsList(apitools_base_cli.NewCmd):
-  """Command wrapping objectAccessControls.List."""
-
-  usage = """objectAccessControls_list <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectAccessControlsList, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Retrieves ACL entries on the specified object.
-
-    Args:
-      bucket: Name of a bucket.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectAccessControlsListRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    result = client.objectAccessControls.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectAccessControlsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping objectAccessControls.Patch."""
-
-  usage = """objectAccessControls_patch <bucket> <object> <entity>"""
-
-  def __init__(self, name, fv):
-    super(ObjectAccessControlsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'objectAccessControl',
-        None,
-        u'A ObjectAccessControl resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object, entity):
-    """Updates an ACL entry on the specified object. This method supports
-    patch semantics.
-
-    Args:
-      bucket: Name of a bucket.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      objectAccessControl: A ObjectAccessControl resource to be passed as the
-        request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectAccessControlsPatchRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['objectAccessControl'].present:
-      request.objectAccessControl = apitools_base.JsonToMessage(messages.ObjectAccessControl, FLAGS.objectAccessControl)
-    result = client.objectAccessControls.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectAccessControlsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping objectAccessControls.Update."""
-
-  usage = """objectAccessControls_update <bucket> <object> <entity>"""
-
-  def __init__(self, name, fv):
-    super(ObjectAccessControlsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'objectAccessControl',
-        None,
-        u'A ObjectAccessControl resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object, entity):
-    """Updates an ACL entry on the specified object.
-
-    Args:
-      bucket: Name of a bucket.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-      entity: The entity holding the permission. Can be user-userId, user-
-        emailAddress, group-groupId, group-emailAddress, allUsers, or
-        allAuthenticatedUsers.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      objectAccessControl: A ObjectAccessControl resource to be passed as the
-        request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectAccessControlsUpdateRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        entity=entity.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['objectAccessControl'].present:
-      request.objectAccessControl = apitools_base.JsonToMessage(messages.ObjectAccessControl, FLAGS.objectAccessControl)
-    result = client.objectAccessControls.Update(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsCompose(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Compose."""
-
-  usage = """objects_compose <destinationBucket> <destinationObject>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsCompose, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'composeRequest',
-        None,
-        u'A ComposeRequest resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'destinationPredefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of access controls to the destination '
-        u'object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, destinationBucket, destinationObject):
-    """Concatenates a list of existing objects into a new object in the same
-    bucket.
-
-    Args:
-      destinationBucket: Name of the bucket in which to store the new object.
-      destinationObject: Name of the new object. For information about how to
-        URL encode object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      composeRequest: A ComposeRequest resource to be passed as the request
-        body.
-      destinationPredefinedAcl: Apply a predefined set of access controls to
-        the destination object.
-      ifGenerationMatch: Makes the operation conditional on whether the
-        object's current generation matches the given value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        object's current metageneration matches the given value.
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsComposeRequest(
-        destinationBucket=destinationBucket.decode('utf8'),
-        destinationObject=destinationObject.decode('utf8'),
-        )
-    if FLAGS['composeRequest'].present:
-      request.composeRequest = apitools_base.JsonToMessage(messages.ComposeRequest, FLAGS.composeRequest)
-    if FLAGS['destinationPredefinedAcl'].present:
-      request.destinationPredefinedAcl = messages.StorageObjectsComposeRequest.DestinationPredefinedAclValueValuesEnum(FLAGS.destinationPredefinedAcl)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.objects.Compose(
-        request, global_params=global_params, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsCopy(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Copy."""
-
-  usage = """objects_copy <sourceBucket> <sourceObject> <destinationBucket> <destinationObject>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsCopy, self).__init__(name, fv)
-    flags.DEFINE_enum(
-        'destinationPredefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of access controls to the destination '
-        u'object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'current metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'current metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object',
-        None,
-        u'A Object resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl, unless the object '
-        u'resource specifies the acl property, when it defaults to full.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'sourceGeneration',
-        None,
-        u'If present, selects a specific revision of the source object (as '
-        u'opposed to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, sourceBucket, sourceObject, destinationBucket, destinationObject):
-    """Copies a source object to a destination object. Optionally overrides
-    metadata.
-
-    Args:
-      sourceBucket: Name of the bucket in which to find the source object.
-      sourceObject: Name of the source object. For information about how to
-        URL encode object names to be path safe, see Encoding URI Path Parts.
-      destinationBucket: Name of the bucket in which to store the new object.
-        Overrides the provided object metadata's bucket value, if any.For
-        information about how to URL encode object names to be path safe, see
-        Encoding URI Path Parts.
-      destinationObject: Name of the new object. Required when the object
-        metadata is not otherwise provided. Overrides the object metadata's
-        name value, if any.
-
-    Flags:
-      destinationPredefinedAcl: Apply a predefined set of access controls to
-        the destination object.
-      ifGenerationMatch: Makes the operation conditional on whether the
-        destination object's current generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        destination object's current generation does not match the given
-        value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        destination object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        destination object's current metageneration does not match the given
-        value.
-      ifSourceGenerationMatch: Makes the operation conditional on whether the
-        source object's generation matches the given value.
-      ifSourceGenerationNotMatch: Makes the operation conditional on whether
-        the source object's generation does not match the given value.
-      ifSourceMetagenerationMatch: Makes the operation conditional on whether
-        the source object's current metageneration matches the given value.
-      ifSourceMetagenerationNotMatch: Makes the operation conditional on
-        whether the source object's current metageneration does not match the
-        given value.
-      object: A Object resource to be passed as the request body.
-      projection: Set of properties to return. Defaults to noAcl, unless the
-        object resource specifies the acl property, when it defaults to full.
-      sourceGeneration: If present, selects a specific revision of the source
-        object (as opposed to the latest version, the default).
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsCopyRequest(
-        sourceBucket=sourceBucket.decode('utf8'),
-        sourceObject=sourceObject.decode('utf8'),
-        destinationBucket=destinationBucket.decode('utf8'),
-        destinationObject=destinationObject.decode('utf8'),
-        )
-    if FLAGS['destinationPredefinedAcl'].present:
-      request.destinationPredefinedAcl = messages.StorageObjectsCopyRequest.DestinationPredefinedAclValueValuesEnum(FLAGS.destinationPredefinedAcl)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['ifSourceGenerationMatch'].present:
-      request.ifSourceGenerationMatch = int(FLAGS.ifSourceGenerationMatch)
-    if FLAGS['ifSourceGenerationNotMatch'].present:
-      request.ifSourceGenerationNotMatch = int(FLAGS.ifSourceGenerationNotMatch)
-    if FLAGS['ifSourceMetagenerationMatch'].present:
-      request.ifSourceMetagenerationMatch = int(FLAGS.ifSourceMetagenerationMatch)
-    if FLAGS['ifSourceMetagenerationNotMatch'].present:
-      request.ifSourceMetagenerationNotMatch = int(FLAGS.ifSourceMetagenerationNotMatch)
-    if FLAGS['object'].present:
-      request.object = apitools_base.JsonToMessage(messages.Object, FLAGS.object)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsCopyRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    if FLAGS['sourceGeneration'].present:
-      request.sourceGeneration = int(FLAGS.sourceGeneration)
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.objects.Copy(
-        request, global_params=global_params, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsDelete(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Delete."""
-
-  usage = """objects_delete <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsDelete, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, permanently deletes a specific revision of this object '
-        u'(as opposed to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration does not match the given value.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Deletes an object and its metadata. Deletions are permanent if
-    versioning is not enabled for the bucket, or if the generation parameter
-    is used.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, permanently deletes a specific revision of this
-        object (as opposed to the latest version, the default).
-      ifGenerationMatch: Makes the operation conditional on whether the
-        object's current generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        object's current generation does not match the given value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        object's current metageneration does not match the given value.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsDeleteRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    result = client.objects.Delete(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsGet(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Get."""
-
-  usage = """objects_get <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsGet, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's generation "
-        u'matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's generation "
-        u'does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Retrieves an object or its metadata.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      ifGenerationMatch: Makes the operation conditional on whether the
-        object's generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        object's generation does not match the given value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        object's current metageneration does not match the given value.
-      projection: Set of properties to return. Defaults to noAcl.
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsGetRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsGetRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.objects.Get(
-        request, global_params=global_params, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsGetIamPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping objects.GetIamPolicy."""
-
-  usage = """objects_getIamPolicy <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsGetIamPolicy, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Returns an IAM policy for the specified object.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsGetIamPolicyRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    result = client.objects.GetIamPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsInsert(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Insert."""
-
-  usage = """objects_insert <bucket>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsInsert, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'contentEncoding',
-        None,
-        u'If set, sets the contentEncoding property of the final object to '
-        u'this value. Setting this parameter is equivalent to setting the '
-        u'contentEncoding metadata property. This can be useful when '
-        u'uploading an object with uploadType=media to indicate the encoding '
-        u'of the content being uploaded.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'name',
-        None,
-        u'Name of the object. Required when the object metadata is not '
-        u"otherwise provided. Overrides the object metadata's name value, if "
-        u'any. For information about how to URL encode object names to be '
-        u'path safe, see Encoding URI Path Parts.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object',
-        None,
-        u'A Object resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of access controls to this object.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl, unless the object '
-        u'resource specifies the acl property, when it defaults to full.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_filename',
-        '',
-        'Filename to use for upload.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'upload_mime_type',
-        '',
-        'MIME type to use for the upload. Only needed if the extension on '
-        '--upload_filename does not determine the correct (or any) MIME '
-        'type.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Stores a new object and metadata.
-
-    Args:
-      bucket: Name of the bucket in which to store the new object. Overrides
-        the provided object metadata's bucket value, if any.
-
-    Flags:
-      contentEncoding: If set, sets the contentEncoding property of the final
-        object to this value. Setting this parameter is equivalent to setting
-        the contentEncoding metadata property. This can be useful when
-        uploading an object with uploadType=media to indicate the encoding of
-        the content being uploaded.
-      ifGenerationMatch: Makes the operation conditional on whether the
-        object's current generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        object's current generation does not match the given value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        object's current metageneration does not match the given value.
-      name: Name of the object. Required when the object metadata is not
-        otherwise provided. Overrides the object metadata's name value, if
-        any. For information about how to URL encode object names to be path
-        safe, see Encoding URI Path Parts.
-      object: A Object resource to be passed as the request body.
-      predefinedAcl: Apply a predefined set of access controls to this object.
-      projection: Set of properties to return. Defaults to noAcl, unless the
-        object resource specifies the acl property, when it defaults to full.
-      upload_filename: Filename to use for upload.
-      upload_mime_type: MIME type to use for the upload. Only needed if the
-        extension on --upload_filename does not determine the correct (or any)
-        MIME type.
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsInsertRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['contentEncoding'].present:
-      request.contentEncoding = FLAGS.contentEncoding.decode('utf8')
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['name'].present:
-      request.name = FLAGS.name.decode('utf8')
-    if FLAGS['object'].present:
-      request.object = apitools_base.JsonToMessage(messages.Object, FLAGS.object)
-    if FLAGS['predefinedAcl'].present:
-      request.predefinedAcl = messages.StorageObjectsInsertRequest.PredefinedAclValueValuesEnum(FLAGS.predefinedAcl)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsInsertRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    upload = None
-    if FLAGS.upload_filename:
-      upload = apitools_base.Upload.FromFile(
-          FLAGS.upload_filename, FLAGS.upload_mime_type,
-          progress_callback=apitools_base.UploadProgressPrinter,
-          finish_callback=apitools_base.UploadCompletePrinter)
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.objects.Insert(
-        request, global_params=global_params, upload=upload, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsList(apitools_base_cli.NewCmd):
-  """Command wrapping objects.List."""
-
-  usage = """objects_list <bucket>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsList, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'delimiter',
-        None,
-        u'Returns results in a directory-like mode. items will contain only '
-        u'objects whose names, aside from the prefix, do not contain '
-        u'delimiter. Objects whose names, aside from the prefix, contain '
-        u'delimiter will have their name, truncated after the delimiter, '
-        u'returned in prefixes. Duplicate prefixes are omitted.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of items plus prefixes to return. As duplicate '
-        u'prefixes are omitted, fewer total results may be returned than '
-        u'requested. The default value of this parameter is 1,000 items.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'A previously-returned page token representing part of the larger '
-        u'set of results to view.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'prefix',
-        None,
-        u'Filter results to objects whose names begin with this prefix.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'versions',
-        None,
-        u'If true, lists all versions of an object as distinct results. The '
-        u'default is false. For more information, see Object Versioning.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Retrieves a list of objects matching the criteria.
-
-    Args:
-      bucket: Name of the bucket in which to look for objects.
-
-    Flags:
-      delimiter: Returns results in a directory-like mode. items will contain
-        only objects whose names, aside from the prefix, do not contain
-        delimiter. Objects whose names, aside from the prefix, contain
-        delimiter will have their name, truncated after the delimiter,
-        returned in prefixes. Duplicate prefixes are omitted.
-      maxResults: Maximum number of items plus prefixes to return. As
-        duplicate prefixes are omitted, fewer total results may be returned
-        than requested. The default value of this parameter is 1,000 items.
-      pageToken: A previously-returned page token representing part of the
-        larger set of results to view.
-      prefix: Filter results to objects whose names begin with this prefix.
-      projection: Set of properties to return. Defaults to noAcl.
-      versions: If true, lists all versions of an object as distinct results.
-        The default is false. For more information, see Object Versioning.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsListRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['delimiter'].present:
-      request.delimiter = FLAGS.delimiter.decode('utf8')
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['prefix'].present:
-      request.prefix = FLAGS.prefix.decode('utf8')
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsListRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    if FLAGS['versions'].present:
-      request.versions = FLAGS.versions
-    result = client.objects.List(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsPatch(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Patch."""
-
-  usage = """objects_patch <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsPatch, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'objectResource',
-        None,
-        u'A Object resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of access controls to this object.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to full.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Updates an object's metadata. This method supports patch semantics.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      ifGenerationMatch: Makes the operation conditional on whether the
-        object's current generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        object's current generation does not match the given value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        object's current metageneration does not match the given value.
-      objectResource: A Object resource to be passed as the request body.
-      predefinedAcl: Apply a predefined set of access controls to this object.
-      projection: Set of properties to return. Defaults to full.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsPatchRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['objectResource'].present:
-      request.objectResource = apitools_base.JsonToMessage(messages.Object, FLAGS.objectResource)
-    if FLAGS['predefinedAcl'].present:
-      request.predefinedAcl = messages.StorageObjectsPatchRequest.PredefinedAclValueValuesEnum(FLAGS.predefinedAcl)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsPatchRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    result = client.objects.Patch(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsRewrite(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Rewrite."""
-
-  usage = """objects_rewrite <sourceBucket> <sourceObject> <destinationBucket> <destinationObject>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsRewrite, self).__init__(name, fv)
-    flags.DEFINE_enum(
-        'destinationPredefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of access controls to the destination '
-        u'object.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the destination object's"
-        u' current metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'current metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifSourceMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the source object's "
-        u'current metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'maxBytesRewrittenPerCall',
-        None,
-        u'The maximum number of bytes that will be rewritten per rewrite '
-        u"request. Most callers shouldn't need to specify this parameter - it"
-        u' is primarily in place to support testing. If specified the value '
-        u'must be an integral multiple of 1 MiB (1048576). Also, this only '
-        u'applies to requests where the source and destination span locations'
-        u' and/or storage classes. Finally, this value must not change across'
-        u" rewrite calls else you'll get an error that the rewriteToken is "
-        u'invalid.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'object',
-        None,
-        u'A Object resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl, unless the object '
-        u'resource specifies the acl property, when it defaults to full.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'rewriteToken',
-        None,
-        u'Include this field (from the previous rewrite response) on each '
-        u'rewrite request after the first one, until the rewrite response '
-        u"'done' flag is true. Calls that provide a rewriteToken can omit all"
-        u' other request fields, but if included those fields must match the '
-        u'values provided in the first rewrite request.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'sourceGeneration',
-        None,
-        u'If present, selects a specific revision of the source object (as '
-        u'opposed to the latest version, the default).',
-        flag_values=fv)
-
-  def RunWithArgs(self, sourceBucket, sourceObject, destinationBucket, destinationObject):
-    """Rewrites a source object to a destination object. Optionally overrides
-    metadata.
-
-    Args:
-      sourceBucket: Name of the bucket in which to find the source object.
-      sourceObject: Name of the source object. For information about how to
-        URL encode object names to be path safe, see Encoding URI Path Parts.
-      destinationBucket: Name of the bucket in which to store the new object.
-        Overrides the provided object metadata's bucket value, if any.
-      destinationObject: Name of the new object. Required when the object
-        metadata is not otherwise provided. Overrides the object metadata's
-        name value, if any. For information about how to URL encode object
-        names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      destinationPredefinedAcl: Apply a predefined set of access controls to
-        the destination object.
-      ifGenerationMatch: Makes the operation conditional on whether the
-        destination object's current generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        destination object's current generation does not match the given
-        value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        destination object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        destination object's current metageneration does not match the given
-        value.
-      ifSourceGenerationMatch: Makes the operation conditional on whether the
-        source object's generation matches the given value.
-      ifSourceGenerationNotMatch: Makes the operation conditional on whether
-        the source object's generation does not match the given value.
-      ifSourceMetagenerationMatch: Makes the operation conditional on whether
-        the source object's current metageneration matches the given value.
-      ifSourceMetagenerationNotMatch: Makes the operation conditional on
-        whether the source object's current metageneration does not match the
-        given value.
-      maxBytesRewrittenPerCall: The maximum number of bytes that will be
-        rewritten per rewrite request. Most callers shouldn't need to specify
-        this parameter - it is primarily in place to support testing. If
-        specified the value must be an integral multiple of 1 MiB (1048576).
-        Also, this only applies to requests where the source and destination
-        span locations and/or storage classes. Finally, this value must not
-        change across rewrite calls else you'll get an error that the
-        rewriteToken is invalid.
-      object: A Object resource to be passed as the request body.
-      projection: Set of properties to return. Defaults to noAcl, unless the
-        object resource specifies the acl property, when it defaults to full.
-      rewriteToken: Include this field (from the previous rewrite response) on
-        each rewrite request after the first one, until the rewrite response
-        'done' flag is true. Calls that provide a rewriteToken can omit all
-        other request fields, but if included those fields must match the
-        values provided in the first rewrite request.
-      sourceGeneration: If present, selects a specific revision of the source
-        object (as opposed to the latest version, the default).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsRewriteRequest(
-        sourceBucket=sourceBucket.decode('utf8'),
-        sourceObject=sourceObject.decode('utf8'),
-        destinationBucket=destinationBucket.decode('utf8'),
-        destinationObject=destinationObject.decode('utf8'),
-        )
-    if FLAGS['destinationPredefinedAcl'].present:
-      request.destinationPredefinedAcl = messages.StorageObjectsRewriteRequest.DestinationPredefinedAclValueValuesEnum(FLAGS.destinationPredefinedAcl)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['ifSourceGenerationMatch'].present:
-      request.ifSourceGenerationMatch = int(FLAGS.ifSourceGenerationMatch)
-    if FLAGS['ifSourceGenerationNotMatch'].present:
-      request.ifSourceGenerationNotMatch = int(FLAGS.ifSourceGenerationNotMatch)
-    if FLAGS['ifSourceMetagenerationMatch'].present:
-      request.ifSourceMetagenerationMatch = int(FLAGS.ifSourceMetagenerationMatch)
-    if FLAGS['ifSourceMetagenerationNotMatch'].present:
-      request.ifSourceMetagenerationNotMatch = int(FLAGS.ifSourceMetagenerationNotMatch)
-    if FLAGS['maxBytesRewrittenPerCall'].present:
-      request.maxBytesRewrittenPerCall = int(FLAGS.maxBytesRewrittenPerCall)
-    if FLAGS['object'].present:
-      request.object = apitools_base.JsonToMessage(messages.Object, FLAGS.object)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsRewriteRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    if FLAGS['rewriteToken'].present:
-      request.rewriteToken = FLAGS.rewriteToken.decode('utf8')
-    if FLAGS['sourceGeneration'].present:
-      request.sourceGeneration = int(FLAGS.sourceGeneration)
-    result = client.objects.Rewrite(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsSetIamPolicy(apitools_base_cli.NewCmd):
-  """Command wrapping objects.SetIamPolicy."""
-
-  usage = """objects_setIamPolicy <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsSetIamPolicy, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'policy',
-        None,
-        u'A Policy resource to be passed as the request body.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Updates an IAM policy for the specified object.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      policy: A Policy resource to be passed as the request body.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsSetIamPolicyRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['policy'].present:
-      request.policy = apitools_base.JsonToMessage(messages.Policy, FLAGS.policy)
-    result = client.objects.SetIamPolicy(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsTestIamPermissions(apitools_base_cli.NewCmd):
-  """Command wrapping objects.TestIamPermissions."""
-
-  usage = """objects_testIamPermissions <bucket> <object> <permissions>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsTestIamPermissions, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object, permissions):
-    """Tests a set of permissions on the given object to see which, if any,
-    are held by the caller.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-      permissions: Permissions to test.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsTestIamPermissionsRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        permissions=permissions.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    result = client.objects.TestIamPermissions(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsUpdate(apitools_base_cli.NewCmd):
-  """Command wrapping objects.Update."""
-
-  usage = """objects_update <bucket> <object>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsUpdate, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'generation',
-        None,
-        u'If present, selects a specific revision of this object (as opposed '
-        u'to the latest version, the default).',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifGenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'generation does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration matches the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'ifMetagenerationNotMatch',
-        None,
-        u"Makes the operation conditional on whether the object's current "
-        u'metageneration does not match the given value.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'objectResource',
-        None,
-        u'A Object resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'predefinedAcl',
-        u'authenticatedRead',
-        [u'authenticatedRead', u'bucketOwnerFullControl', u'bucketOwnerRead', u'private', u'projectPrivate', u'publicRead'],
-        u'Apply a predefined set of access controls to this object.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to full.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'download_filename',
-        '',
-        'Filename to use for download.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'overwrite',
-        'False',
-        'If True, overwrite the existing file when downloading.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket, object):
-    """Updates an object's metadata.
-
-    Args:
-      bucket: Name of the bucket in which the object resides.
-      object: Name of the object. For information about how to URL encode
-        object names to be path safe, see Encoding URI Path Parts.
-
-    Flags:
-      generation: If present, selects a specific revision of this object (as
-        opposed to the latest version, the default).
-      ifGenerationMatch: Makes the operation conditional on whether the
-        object's current generation matches the given value.
-      ifGenerationNotMatch: Makes the operation conditional on whether the
-        object's current generation does not match the given value.
-      ifMetagenerationMatch: Makes the operation conditional on whether the
-        object's current metageneration matches the given value.
-      ifMetagenerationNotMatch: Makes the operation conditional on whether the
-        object's current metageneration does not match the given value.
-      objectResource: A Object resource to be passed as the request body.
-      predefinedAcl: Apply a predefined set of access controls to this object.
-      projection: Set of properties to return. Defaults to full.
-      download_filename: Filename to use for download.
-      overwrite: If True, overwrite the existing file when downloading.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsUpdateRequest(
-        bucket=bucket.decode('utf8'),
-        object=object.decode('utf8'),
-        )
-    if FLAGS['generation'].present:
-      request.generation = int(FLAGS.generation)
-    if FLAGS['ifGenerationMatch'].present:
-      request.ifGenerationMatch = int(FLAGS.ifGenerationMatch)
-    if FLAGS['ifGenerationNotMatch'].present:
-      request.ifGenerationNotMatch = int(FLAGS.ifGenerationNotMatch)
-    if FLAGS['ifMetagenerationMatch'].present:
-      request.ifMetagenerationMatch = int(FLAGS.ifMetagenerationMatch)
-    if FLAGS['ifMetagenerationNotMatch'].present:
-      request.ifMetagenerationNotMatch = int(FLAGS.ifMetagenerationNotMatch)
-    if FLAGS['objectResource'].present:
-      request.objectResource = apitools_base.JsonToMessage(messages.Object, FLAGS.objectResource)
-    if FLAGS['predefinedAcl'].present:
-      request.predefinedAcl = messages.StorageObjectsUpdateRequest.PredefinedAclValueValuesEnum(FLAGS.predefinedAcl)
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsUpdateRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    download = None
-    if FLAGS.download_filename:
-      download = apitools_base.Download.FromFile(FLAGS.download_filename, overwrite=FLAGS.overwrite,
-          progress_callback=apitools_base.DownloadProgressPrinter,
-          finish_callback=apitools_base.DownloadCompletePrinter)
-    result = client.objects.Update(
-        request, global_params=global_params, download=download)
-    print apitools_base_cli.FormatOutput(result)
-
-
-class ObjectsWatchAll(apitools_base_cli.NewCmd):
-  """Command wrapping objects.WatchAll."""
-
-  usage = """objects_watchAll <bucket>"""
-
-  def __init__(self, name, fv):
-    super(ObjectsWatchAll, self).__init__(name, fv)
-    flags.DEFINE_string(
-        'channel',
-        None,
-        u'A Channel resource to be passed as the request body.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'delimiter',
-        None,
-        u'Returns results in a directory-like mode. items will contain only '
-        u'objects whose names, aside from the prefix, do not contain '
-        u'delimiter. Objects whose names, aside from the prefix, contain '
-        u'delimiter will have their name, truncated after the delimiter, '
-        u'returned in prefixes. Duplicate prefixes are omitted.',
-        flag_values=fv)
-    flags.DEFINE_integer(
-        'maxResults',
-        None,
-        u'Maximum number of items plus prefixes to return. As duplicate '
-        u'prefixes are omitted, fewer total results may be returned than '
-        u'requested. The default value of this parameter is 1,000 items.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'pageToken',
-        None,
-        u'A previously-returned page token representing part of the larger '
-        u'set of results to view.',
-        flag_values=fv)
-    flags.DEFINE_string(
-        'prefix',
-        None,
-        u'Filter results to objects whose names begin with this prefix.',
-        flag_values=fv)
-    flags.DEFINE_enum(
-        'projection',
-        u'full',
-        [u'full', u'noAcl'],
-        u'Set of properties to return. Defaults to noAcl.',
-        flag_values=fv)
-    flags.DEFINE_boolean(
-        'versions',
-        None,
-        u'If true, lists all versions of an object as distinct results. The '
-        u'default is false. For more information, see Object Versioning.',
-        flag_values=fv)
-
-  def RunWithArgs(self, bucket):
-    """Watch for changes on all objects in a bucket.
-
-    Args:
-      bucket: Name of the bucket in which to look for objects.
-
-    Flags:
-      channel: A Channel resource to be passed as the request body.
-      delimiter: Returns results in a directory-like mode. items will contain
-        only objects whose names, aside from the prefix, do not contain
-        delimiter. Objects whose names, aside from the prefix, contain
-        delimiter will have their name, truncated after the delimiter,
-        returned in prefixes. Duplicate prefixes are omitted.
-      maxResults: Maximum number of items plus prefixes to return. As
-        duplicate prefixes are omitted, fewer total results may be returned
-        than requested. The default value of this parameter is 1,000 items.
-      pageToken: A previously-returned page token representing part of the
-        larger set of results to view.
-      prefix: Filter results to objects whose names begin with this prefix.
-      projection: Set of properties to return. Defaults to noAcl.
-      versions: If true, lists all versions of an object as distinct results.
-        The default is false. For more information, see Object Versioning.
-    """
-    client = GetClientFromFlags()
-    global_params = GetGlobalParamsFromFlags()
-    request = messages.StorageObjectsWatchAllRequest(
-        bucket=bucket.decode('utf8'),
-        )
-    if FLAGS['channel'].present:
-      request.channel = apitools_base.JsonToMessage(messages.Channel, FLAGS.channel)
-    if FLAGS['delimiter'].present:
-      request.delimiter = FLAGS.delimiter.decode('utf8')
-    if FLAGS['maxResults'].present:
-      request.maxResults = FLAGS.maxResults
-    if FLAGS['pageToken'].present:
-      request.pageToken = FLAGS.pageToken.decode('utf8')
-    if FLAGS['prefix'].present:
-      request.prefix = FLAGS.prefix.decode('utf8')
-    if FLAGS['projection'].present:
-      request.projection = messages.StorageObjectsWatchAllRequest.ProjectionValueValuesEnum(FLAGS.projection)
-    if FLAGS['versions'].present:
-      request.versions = FLAGS.versions
-    result = client.objects.WatchAll(
-        request, global_params=global_params)
-    print apitools_base_cli.FormatOutput(result)
-
-
-def main(_):
-  appcommands.AddCmd('pyshell', PyShell)
-  appcommands.AddCmd('bucketAccessControls_delete', BucketAccessControlsDelete)
-  appcommands.AddCmd('bucketAccessControls_get', BucketAccessControlsGet)
-  appcommands.AddCmd('bucketAccessControls_insert', BucketAccessControlsInsert)
-  appcommands.AddCmd('bucketAccessControls_list', BucketAccessControlsList)
-  appcommands.AddCmd('bucketAccessControls_patch', BucketAccessControlsPatch)
-  appcommands.AddCmd('bucketAccessControls_update', BucketAccessControlsUpdate)
-  appcommands.AddCmd('buckets_delete', BucketsDelete)
-  appcommands.AddCmd('buckets_get', BucketsGet)
-  appcommands.AddCmd('buckets_getIamPolicy', BucketsGetIamPolicy)
-  appcommands.AddCmd('buckets_insert', BucketsInsert)
-  appcommands.AddCmd('buckets_list', BucketsList)
-  appcommands.AddCmd('buckets_patch', BucketsPatch)
-  appcommands.AddCmd('buckets_setIamPolicy', BucketsSetIamPolicy)
-  appcommands.AddCmd('buckets_testIamPermissions', BucketsTestIamPermissions)
-  appcommands.AddCmd('buckets_update', BucketsUpdate)
-  appcommands.AddCmd('channels_stop', ChannelsStop)
-  appcommands.AddCmd('defaultObjectAccessControls_delete', DefaultObjectAccessControlsDelete)
-  appcommands.AddCmd('defaultObjectAccessControls_get', DefaultObjectAccessControlsGet)
-  appcommands.AddCmd('defaultObjectAccessControls_insert', DefaultObjectAccessControlsInsert)
-  appcommands.AddCmd('defaultObjectAccessControls_list', DefaultObjectAccessControlsList)
-  appcommands.AddCmd('defaultObjectAccessControls_patch', DefaultObjectAccessControlsPatch)
-  appcommands.AddCmd('defaultObjectAccessControls_update', DefaultObjectAccessControlsUpdate)
-  appcommands.AddCmd('notifications_delete', NotificationsDelete)
-  appcommands.AddCmd('notifications_get', NotificationsGet)
-  appcommands.AddCmd('notifications_insert', NotificationsInsert)
-  appcommands.AddCmd('notifications_list', NotificationsList)
-  appcommands.AddCmd('objectAccessControls_delete', ObjectAccessControlsDelete)
-  appcommands.AddCmd('objectAccessControls_get', ObjectAccessControlsGet)
-  appcommands.AddCmd('objectAccessControls_insert', ObjectAccessControlsInsert)
-  appcommands.AddCmd('objectAccessControls_list', ObjectAccessControlsList)
-  appcommands.AddCmd('objectAccessControls_patch', ObjectAccessControlsPatch)
-  appcommands.AddCmd('objectAccessControls_update', ObjectAccessControlsUpdate)
-  appcommands.AddCmd('objects_compose', ObjectsCompose)
-  appcommands.AddCmd('objects_copy', ObjectsCopy)
-  appcommands.AddCmd('objects_delete', ObjectsDelete)
-  appcommands.AddCmd('objects_get', ObjectsGet)
-  appcommands.AddCmd('objects_getIamPolicy', ObjectsGetIamPolicy)
-  appcommands.AddCmd('objects_insert', ObjectsInsert)
-  appcommands.AddCmd('objects_list', ObjectsList)
-  appcommands.AddCmd('objects_patch', ObjectsPatch)
-  appcommands.AddCmd('objects_rewrite', ObjectsRewrite)
-  appcommands.AddCmd('objects_setIamPolicy', ObjectsSetIamPolicy)
-  appcommands.AddCmd('objects_testIamPermissions', ObjectsTestIamPermissions)
-  appcommands.AddCmd('objects_update', ObjectsUpdate)
-  appcommands.AddCmd('objects_watchAll', ObjectsWatchAll)
-
-  apitools_base_cli.SetupLogger()
-  if hasattr(appcommands, 'SetDefaultCommand'):
-    appcommands.SetDefaultCommand('pyshell')
-
-
-run_main = apitools_base_cli.run_main
-
-if __name__ == '__main__':
-  appcommands.Run()
diff --git a/samples/uptodate_check_test.py b/samples/uptodate_check_test.py
index 6fbea9c..ec262a4 100644
--- a/samples/uptodate_check_test.py
+++ b/samples/uptodate_check_test.py
@@ -45,7 +45,6 @@
         with test_utils.TempDir() as tmp_dir_path:
             gen_client.main([
                 gen_client.__file__,
-                '--generate_cli',
                 '--init-file', 'empty',
                 '--infile',
                 GetSampleClientPath(api_name, prefix + '.json'),
@@ -56,7 +55,6 @@
                 'client'
             ])
             expected_files = (
-                set([prefix + '.py']) |  # CLI files
                 set([prefix + '_client.py',
                      prefix + '_messages.py',
                      '__init__.py']))
diff --git a/setup.py b/setup.py
index c0ab0b8..88ab29a 100644
--- a/setup.py
+++ b/setup.py
@@ -35,12 +35,10 @@
     ]
 
 CLI_PACKAGES = [
-    'google-apputils>=0.4.0',
-    'python-gflags==3.0.6',  # Starting version 3.0.7 py26 is not supported.
+    'python-gflags>=3.0.6',
 ]
 
 TESTING_PACKAGES = [
-    'google-apputils>=0.4.0',
     'unittest2>=0.5.1',
     'mock>=1.0.1',
 ]
@@ -51,9 +49,6 @@
 
 py_version = platform.python_version()
 
-if py_version < '2.7':
-    REQUIRED_PACKAGES.append('argparse>=1.2.1')
-
 _APITOOLS_VERSION = '0.5.22'
 
 with open('README.rst') as fileobj:
diff --git a/tox.ini b/tox.ini
index c81e32a..dfee48b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -9,7 +9,7 @@
 [testenv]
 deps =
     nose
-    python-gflags==3.0.6
+    python-gflags
     oauth2client1: oauth2client<1.5dev
     oauth2client2: oauth2client>=2,<=3dev
     oauth2client3: oauth2client>=3,<=4dev
@@ -36,8 +36,7 @@
 commands =
     nosetests --with-xunit --with-xcoverage --cover-package=apitools --nocapture --cover-erase --cover-tests --cover-branches []
 deps =
-    google-apputils
-    python-gflags==3.0.6
+    python-gflags
     mock
     nose
     unittest2
