diff --git a/rbtools/commands/__init__.py b/rbtools/commands/__init__.py
index 598735c552afc6db132b6ffb125ae3e0488eaf83..3a71d5d2df431c7d32b62ea78239b859950830e7 100644
--- a/rbtools/commands/__init__.py
+++ b/rbtools/commands/__init__.py
@@ -659,6 +659,23 @@ class Command(object):
         logging.debug('Home = %s', get_home_path())
         logging.debug('Current directory = %s', os.getcwd())
 
+    def create_arg_parser(self, argv):
+        """Create and return the argument parser.
+
+        Args:
+            argv (list of unicode):
+                A list of command line arguments
+
+        Returns:
+            argparse.ArgumentParser:
+            Argument parser for commandline arguments
+        """
+        self.config = load_config()
+        parser = self.create_parser(self.config, argv)
+        parser.add_argument('args', nargs=argparse.REMAINDER)
+
+        return parser
+
     def run_from_argv(self, argv):
         """Execute the command using the provided arguments.
 
@@ -666,12 +683,9 @@ class Command(object):
         from ``argv`` and the commands ``main`` method will
         be called.
         """
-        self.config = load_config()
-
-        parser = self.create_parser(self.config, argv)
-        parser.add_argument('args', nargs=argparse.REMAINDER)
-
+        parser = self.create_arg_parser(argv)
         self.options = parser.parse_args(argv[2:])
+
         args = self.options.args
 
         # Check that the proper number of arguments have been provided.
diff --git a/rbtools/commands/post.py b/rbtools/commands/post.py
index 9ed25f9e8b584bc7c7116fb6bdbaa11d4a7dbbcc..97e406e02d6a3d6936992ec52e2022882c0b884a 100644
--- a/rbtools/commands/post.py
+++ b/rbtools/commands/post.py
@@ -15,6 +15,7 @@ from rbtools.utils.review_request import (get_draft_or_current_value,
                                           get_revisions,
                                           guess_existing_review_request)
 
+
 class Post(Command):
     """Create and update review requests."""
     name = 'post'
@@ -22,6 +23,9 @@ class Post(Command):
     description = 'Uploads diffs to create and update review requests.'
     args = '[revisions]'
 
+    #: Reserved built-in fields that can be set using the ``--field`` argument.
+    reserved_fields = ('description', 'testing-done', 'summary')
+
     GUESS_AUTO = 'auto'
     GUESS_YES = 'yes'
     GUESS_NO = 'no'
@@ -119,6 +123,15 @@ class Post(Command):
             description='Options for setting the contents of fields in the '
                         'review request.',
             option_list=[
+                Option('-f', '--field',
+                       dest='fields',
+                       action='append',
+                       default=None,
+                       metavar='FIELD_NAME=VALUE',
+                       help='Sets custom fields into the extra_data of a '
+                            'review request. Can also be used to set '
+                            'built-in fields like description, summary, '
+                            'testing-done.'),
                 Option('-g', '--guess-fields',
                        dest='guess_fields',
                        action='store',
@@ -256,6 +269,39 @@ class Post(Command):
     def post_process_options(self):
         super(Post, self).post_process_options()
 
+        extra_fields = {}
+
+        if self.options.fields is None:
+            self.options.fields = []
+
+        for field in self.options.fields:
+            key_value_pair = field.split('=', 1)
+
+            if len(key_value_pair) != 2:
+                raise CommandError(
+                    'The --field argument should be in the form of: '
+                    '--field name=value; got "%s" instead.'
+                    % field
+                )
+
+            key, value = key_value_pair
+
+            if key in self.reserved_fields:
+                key_var = key.replace('-', '_')
+
+                if getattr(self.options, key_var):
+                    raise CommandError(
+                        'The "{0}" field was provided by both --{0}= '
+                        'and --field {0}=. Please use --{0} instead.'
+                        .format(key)
+                    )
+
+                setattr(self.options, key_var, value)
+            else:
+                extra_fields['extra_data.%s' % key] = value
+
+        self.options.extra_fields = extra_fields
+
         # -g implies --guess-summary and --guess-description
         if self.options.guess_fields:
             self.options.guess_fields = self.normalize_guess_value(
@@ -533,6 +579,8 @@ class Post(Command):
         # by the user, or configuration.
         update_fields = {}
 
+        update_fields.update(self.options.extra_fields)
+
         if self.options.target_groups:
             update_fields['target_groups'] = self.options.target_groups
 
diff --git a/rbtools/commands/tests/__init__.py b/rbtools/commands/tests/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/rbtools/commands/tests/test_post.py b/rbtools/commands/tests/test_post.py
new file mode 100644
index 0000000000000000000000000000000000000000..e87e3f919d76da4884e1479043078e43c3db286a
--- /dev/null
+++ b/rbtools/commands/tests/test_post.py
@@ -0,0 +1,100 @@
+"""Test for RBTools post command."""
+
+from __future__ import unicode_literals
+
+from rbtools.commands import CommandError
+from rbtools.commands.post import Post
+from rbtools.utils.testbase import RBTestBase
+
+
+class PostCommandTests(RBTestBase):
+    """Tests for rbt post command."""
+
+    def _create_post_command(self, fields):
+        """Create an argument parser with the given extra fields.
+
+        Args:
+            fields (list of unicode):
+                A list of key-value pairs for the field argument.
+
+                Each pair should be of the form key=value.
+
+        Returns:
+            argparse.ArgumentParser:
+            Argument parser for commandline arguments
+        """
+        post = Post()
+        argv = ['rbt', 'post']
+        parser = post.create_arg_parser(argv)
+        post.options = parser.parse_args(argv[2:])
+        post.options.fields = fields
+
+        return post
+
+    def test_post_one_extra_fields(self):
+        """Testing one extra field argument with rbt post --field foo=bar"""
+        post = self._create_post_command(['foo=bar'])
+        post.post_process_options()
+        self.assertEqual(
+            post.options.extra_fields,
+            {'extra_data.foo': 'bar'})
+
+    def test_post_multiple_extra_fields(self):
+        """Testing multiple extra field arguments with rbt post --field
+        foo=bar --field desc=new
+        """
+        post = self._create_post_command(['foo=bar', 'desc=new'])
+        post.post_process_options()
+        self.assertEqual(
+            post.options.extra_fields,
+            {
+                'extra_data.foo': 'bar',
+                'extra_data.desc': 'new',
+            })
+
+    def test_native_fields_through_extra_fields(self):
+        """Testing built-in fields through extra_fields with rbt post --field
+        description=testing --field summary='native testing' --field
+        testing-done='No tests'
+        """
+        post = self._create_post_command([
+            'description=testing',
+            'summary=native testing',
+            'testing-done=No tests',
+        ])
+        post.post_process_options()
+        self.assertEqual(post.options.description, 'testing')
+        self.assertEqual(post.options.summary, 'native testing')
+        self.assertEqual(post.options.testing_done, 'No tests')
+
+    def test_wrong_argument_entry(self):
+        """Testing built-in fields through extra_fields with rbt post --field
+        description and rbt post --field testing_done='No tests'
+        """
+        post = self._create_post_command(['testing_done=No tests'])
+        self.assertIsNone(post.options.testing_done)
+        post = self._create_post_command(['description'])
+
+        with self.assertRaises(CommandError):
+            post.post_process_options()
+
+    def test_multiple_delimiter(self):
+        """Testing multiple delimiters with rbt post --field
+        myField=this=string=has=equals=signs
+        """
+        post = self._create_post_command(
+            ['myField=this=string=has=equals=signs'])
+        post.post_process_options()
+        self.assertEqual(
+            post.options.extra_fields,
+            {'extra_data.myField': 'this=string=has=equals=signs'})
+
+    def test_arg_field_set_again_by_custom_fields(self):
+        """Testing argument duplication with rbt post --field
+        myField=test --description test
+        """
+        post = self._create_post_command(['description=test'])
+        post.options.description = 'test'
+
+        with self.assertRaises(CommandError):
+            post.post_process_options()
