diff --git a/rbtools/commands/__init__.py b/rbtools/commands/__init__.py
index ce82f5ddd86c0eef334dee5ead3c1dbd03fd4eb2..c37fc829500044d9a1dc48a20a62341a2708f3d2 100644
--- a/rbtools/commands/__init__.py
+++ b/rbtools/commands/__init__.py
@@ -3,6 +3,7 @@ from __future__ import print_function, unicode_literals
 import argparse
 import getpass
 import inspect
+import itertools
 import logging
 import pkg_resources
 import platform
@@ -10,6 +11,8 @@ import os
 import sys
 
 import colorama
+import six
+
 from six.moves import input
 from six.moves.urllib.parse import urlparse
 
@@ -64,22 +67,21 @@ class SmartHelpFormatter(argparse.HelpFormatter):
 class Option(object):
     """Represents an option for a command.
 
-    The arguments to the constructor should be treated like those
-    to argparse's add_argument, with the exception that the keyword
-    argument 'config_key' is also valid. If config_key is provided
-    it will be used to retrieve the config value as a default if the
-    option is not specified. This will take precedence over the
-    default argument.
+    The arguments to the constructor should be treated like those to argparse's
+    add_argument, with the exception that the keyword argument 'config_key' is
+    also valid. If config_key is provided it will be used to retrieve the
+    config value as a default if the option is not specified. This will take
+    precedence over the default argument.
 
-    Serves as a wrapper around the ArgumentParser options, allowing us
-    to specify defaults which will be grabbed from the configuration
-    after it is loaded.
+    Serves as a wrapper around the ArgumentParser options, allowing us to
+    specify defaults which will be grabbed from the configuration after it is
+    loaded.
     """
     def __init__(self, *opts, **attrs):
         self.opts = opts
         self.attrs = attrs
 
-    def add_to(self, parent, config={}, argv=[]):
+    def add_to(self, parent, argv=[]):
         """Adds the option to the parent parser or group.
 
         If the option maps to a configuration key, this will handle figuring
@@ -90,19 +92,12 @@ class Option(object):
         """
         attrs = self.attrs.copy()
 
-        if 'config_key' in attrs:
-            config_key = attrs.pop('config_key')
-
-            if config_key in config:
-                attrs['default'] = config[config_key]
-
         if 'deprecated_in' in attrs:
             attrs['help'] += '\n[Deprecated since %s]' % attrs['deprecated_in']
 
-        # These are used for other purposes, and are not supported by
-        # argparse.
+        # These are used for other purposes, and are not supported by argparse.
         for attr in ('added_in', 'deprecated_in', 'extended_help',
-                     'versions_changed'):
+                     'versions_changed', 'default', 'config_key'):
             attrs.pop(attr, None)
 
         parent.add_argument(*self.opts, **attrs)
@@ -111,9 +106,9 @@ class Option(object):
 class OptionGroup(object):
     """Represents a named group of options.
 
-    Each group has a name, an optional description, and a list of options.
-    It serves as a way to organize related options, making it easier for
-    users to scan for the options they want.
+    Each group has a name, an optional description, and a list of options. It
+    serves as a way to organize related options, making it easier for users to
+    scan for the options they want.
 
     This works like argparse's argument groups, but is designed to work with
     our special Option class.
@@ -123,20 +118,20 @@ class OptionGroup(object):
         self.description = description
         self.option_list = option_list
 
-    def add_to(self, parser, config={}, argv=[]):
+    def add_to(self, parser, argv=[]):
         """Adds the group and all its contained options to the parser."""
         group = parser.add_argument_group(self.name, self.description)
 
         for option in self.option_list:
-            option.add_to(group, config, argv)
+            option.add_to(group, argv)
 
 
 class LogLevelFilter(logging.Filter):
     """Filters log messages of a given level.
 
-    Only log messages that have the specified level will be allowed by
-    this filter. This prevents propagation of higher level types to lower
-    log handlers.
+    Only log messages that have the specified level will be allowed by this
+    filter. This prevents propagation of higher level types to lower log
+    handlers.
     """
     def __init__(self, level):
         self.level = level
@@ -148,21 +143,21 @@ class LogLevelFilter(logging.Filter):
 class Command(object):
     """Base class for rb commands.
 
-    This class will handle retrieving the configuration, and parsing
-    command line options.
+    This class will handle retrieving the configuration, and parsing command
+    line options.
 
     ``description`` is a string containing a short description of the
     command which is suitable for display in usage text.
 
-    ``usage`` is a list of usage strings each showing a use case. These
-    should not include the main rbt command or the command name; they
-    will be added automatically.
+    ``usage`` is a list of usage strings each showing a use case. These should
+    not include the main rbt command or the command name; they will be added
+    automatically.
 
     ``args`` is a string containing the usage text for what arguments the
     command takes.
 
-    ``option_list`` is a list of command line options for the command.
-    Each list entry should be an Option or OptionGroup instance.
+    ``option_list`` is a list of command line options for the command. Each
+    list entry should be an Option or OptionGroup instance.
     """
     name = ''
     author = ''
@@ -178,6 +173,11 @@ class Command(object):
                help='Displays debug output.',
                extended_help='This information can be valuable when debugging '
                              'problems running the command.'),
+        Option('--disable-reviewboardrc',
+               dest='disable_reviewboardrc',
+               action='store_true',
+               default=False,
+               help='Command-line flag to disable use of .reviewboardrc.',)
     ]
 
     server_options = OptionGroup(
@@ -337,6 +337,7 @@ class Command(object):
             Option('-I', '--include',
                    metavar='FILENAME',
                    dest='include_files',
+                   default=[],
                    action='append',
                    help='Includes only the specified file in the diff. '
                         'This can be used multiple times to specify '
@@ -350,6 +351,7 @@ class Command(object):
                    dest='exclude_patterns',
                    action='append',
                    config_key='EXCLUDE_PATTERNS',
+                   default=[],
                    help='Excludes all files that match the given pattern '
                         'from the diff. This can be used multiple times to '
                         'specify multiple patterns. UNIX glob syntax is used '
@@ -531,22 +533,6 @@ class Command(object):
     def __init__(self):
         self.log = logging.getLogger('rb.%s' % self.name)
 
-    def create_parser(self, config, argv=[]):
-        """Create and return the argument parser for this command."""
-        parser = argparse.ArgumentParser(
-            prog=RB_MAIN,
-            usage=self.usage(),
-            add_help=False,
-            formatter_class=SmartHelpFormatter)
-
-        for option in self.option_list:
-            option.add_to(parser, config, argv)
-
-        for option in self._global_options:
-            option.add_to(parser, config, argv)
-
-        return parser
-
     def post_process_options(self):
         if self.options.disable_ssl_verification:
             try:
@@ -586,7 +572,7 @@ class Command(object):
         color = ''
         reset = ''
 
-        if sys.stdout.isatty():
+        if sys.stdout.isatty() and not self.options.disable_reviewboardrc:
             color_name = self.config['COLOR'].get(level.upper())
 
             if color_name:
@@ -640,8 +626,8 @@ class Command(object):
         handler.addFilter(LogLevelFilter(logging.INFO))
         root.addHandler(handler)
 
-        # Handlers for warnings, errors, and criticals. They'll show the
-        # level prefix and the message.
+        # Handlers for warnings, errors, and criticals. They'll show the level
+        # prefix and the message.
         levels = (
             ('WARNING', logging.WARNING),
             ('ERROR', logging.ERROR),
@@ -673,22 +659,69 @@ class Command(object):
             argparse.ArgumentParser:
             Argument parser for commandline arguments
         """
-        self.config = load_config()
-        parser = self.create_parser(self.config, argv)
+        parser = argparse.ArgumentParser(
+          prog=RB_MAIN,
+          usage=self.usage(),
+          add_help=False,
+          formatter_class=SmartHelpFormatter,
+          argument_default=argparse.SUPPRESS)
+
+        for option in self.option_list:
+            option.add_to(parser, argv)
+
+        for option in self._global_options:
+            option.add_to(parser, argv)
+
         parser.add_argument('args', nargs=argparse.REMAINDER)
 
         return parser
 
+    def all_options(self):
+        for option in itertools.chain(self.option_list, self._global_options):
+            if isinstance(option, OptionGroup):
+                for sub_option in option.option_list:
+                    yield sub_option
+            else:
+                assert isinstance(option, Option)
+                yield option
+
     def run_from_argv(self, argv):
         """Execute the command using the provided arguments.
 
-        The options and commandline arguments will be parsed
-        from ``argv`` and the commands ``main`` method will
-        be called.
+        The options and commandline arguments will be parsed from ``argv`` and
+        the commands ``main`` method will be called.
         """
         parser = self.create_arg_parser(argv)
         self.options = parser.parse_args(argv[2:])
 
+        if not getattr(self.options, 'disable_reviewboardrc', False):
+            self.config = load_config()
+
+            for option in self.all_options():
+                dest = option.attrs['dest']
+
+                if not hasattr(option, dest):
+                    if 'config_key' in option.attrs:
+                        key = option.attrs['config_key']
+                        if key in self.config:
+                            setattr(self.options, dest, self.config[key])
+        else:
+            self.config = {}
+
+        defaults = {}
+
+        for option in self.all_options():
+            try:
+                default = option.attrs['default']
+                dest = option.attrs['dest']
+                defaults[dest] = default
+            except Exception:
+                pass
+
+        for option_name, option_value in six.iteritems(defaults):
+            if not hasattr(self.options, option_name):
+                setattr(self.options, option_name, option_value)
+
         args = self.options.args
 
         # Check that the proper number of arguments have been provided.
@@ -724,10 +757,9 @@ class Command(object):
         except CommandExit as e:
             exit_code = e.exit_code
         except Exception as e:
-            # If debugging is on, we'll let python spit out the
-            # stack trace and report the exception, otherwise
-            # we'll suppress the trace and print the exception
-            # manually.
+            # If debugging is on, we'll let python spit out the stack trace and
+            # report the exception, otherwise we'll suppress the trace and
+            # print the exception manually.
             if self.options.debug:
                 raise
 
@@ -789,9 +821,9 @@ class Command(object):
                            *args, **kwargs):
         """Prompt the user for credentials using the command line.
 
-        This will prompt the user, and then return the provided
-        username and password. This is used as a callback in the
-        API when the user requires authorization.
+        This will prompt the user, and then return the provided username and
+        password. This is used as a callback in the API when the user requires
+        authorization.
         """
         if username is None or password is None:
             if getattr(self.options, 'diff_filename', None) == '-':
@@ -833,9 +865,9 @@ class Command(object):
     def otp_token_prompt(self, uri, token_method, *args, **kwargs):
         """Prompt the user for a one-time password token.
 
-        Their account is configured with two-factor authentication. The
-        server will have sent a token to their configured mobile device
-        or application. The user will be prompted for this token.
+        Their account is configured with two-factor authentication. The server
+        will have sent a token to their configured mobile device or
+        application. The user will be prompted for this token.
         """
         if getattr(self.options, 'diff_filename', None) == '-':
             raise CommandError('A two-factor authentication token is '
@@ -864,8 +896,8 @@ class Command(object):
     def _make_api_client(self, server_url):
         """Return an RBClient object for the server.
 
-        The RBClient will be instantiated with the proper arguments
-        for talking to the provided Review Board server url.
+        The RBClient will be instantiated with the proper arguments for talking
+        to the provided Review Board server url.
         """
         return RBClient(
             server_url,
@@ -885,8 +917,8 @@ class Command(object):
     def get_api(self, server_url):
         """Returns an RBClient instance and the associated root resource.
 
-        Commands should use this method to gain access to the API,
-        instead of instantianting their own client.
+        Commands should use this method to gain access to the API, instead of
+        instantiating their own client.
         """
         if not urlparse(server_url).scheme:
             server_url = '%s%s' % ('http://', server_url)
@@ -930,9 +962,9 @@ def find_entry_point_for_command(command_name):
 
     If no entry point is found, None is returned.
     """
-    # Attempt to retrieve the command class from the entry points. We
-    # first look in rbtools for the commands, and failing that, we look
-    # for third-party commands.
+    # Attempt to retrieve the command class from the entry points. We first
+    # look in rbtools for the commands, and failing that, we look for
+    # third-party commands.
     entry_point = pkg_resources.get_entry_info('rbtools', 'rbtools_commands',
                                                command_name)
 
