diff --git a/bot/reviewbot/tools/shellcheck.py b/bot/reviewbot/tools/shellcheck.py
new file mode 100644
index 0000000000000000000000000000000000000000..64fd8f0be985c3e1ba4a10aa34ffb3b90b683bae
--- /dev/null
+++ b/bot/reviewbot/tools/shellcheck.py
@@ -0,0 +1,88 @@
+import logging
+
+from reviewbot.tools import Tool
+from reviewbot.tools.process import execute
+from reviewbot.utils import is_exe_in_path
+
+
+class ShellCheckTool(Tool):
+    """ShellCheck tool plugin implementation."""
+
+    name = 'ShellCheck'
+    version = '0.1'
+    description = (
+        'Checks shell scripts for style errors and '
+        'potential bugs using ShellCheck.')
+    options = [
+        {
+            'name': 'suppress_emission',
+            'default': '',
+            'field_type': 'django.forms.CharField',
+            'field_options': {
+                'label': 'exclude',
+                'help_text': 'Diagnostic codes consist of four decimal '
+                             'digits. all the codes can be specified at '
+                             'once, comma-separated as a single argument.',
+                'required': False,
+            },
+        },
+        {
+            'name': 'specify_dialect',
+            'default': 'bash',
+            'field_type': 'django.forms.ChoiceField',
+            'field_options': {
+                'label': 'shell',
+                'help_text': 'Select shell dialect. Available '
+                             'shells are bash, ksh (Korn shell), sh '
+                             '(POSIX compatible), and zsh.',
+                'choices': (
+                    ('bash', 'bash'),
+                    ('ksh', 'ksh'),
+                    ('sh', 'sh'),
+                    ('zsh', 'zsh')
+                ),
+                'initial': 'bash',
+                'required': True,
+            },
+        },
+    ]
+
+    def check_dependencies(self):
+        return is_exe_in_path('shellcheck')
+
+    def handle_file(self, f):
+        # Example of shellcheck output:
+        # test.sh:2:10: error: Iterating over ls output is fragile.
+        #     Use globs.
+        if not f.dest_file.endswith('.sh'):
+            return False
+
+        path = f.get_patched_file_path()
+
+        if not path:
+            return False
+
+        command_line = ['shellcheck', '-f', 'gcc']
+
+        if self.settings['specify_dialect']:
+            command_line.append('--format=%s'
+                                % self.settings['specify_dialect'])
+
+        if self.settings['suppress_emission']:
+            command_line.append('--exclude=%s'
+                                % self.settings['suppress_emission'])
+
+        command_line.append(path)
+        output = execute(
+            command_line,
+            split_lines=True,
+            ignore_errors=True)
+
+        for line in output:
+            try:
+                line_num, col_num, msg = line.split(':', 3)[1:]
+                f.comment('Col: %s\n%s' % (col_num, msg), int(line_num))
+            except ValueError or IndexError:
+                logging.error('Failed to executeno not valid input')
+
+        return True
diff --git a/bot/setup.py b/bot/setup.py
index d9abfa8ccd65723447b640a20348eb7d0d914989..c5d979d7a8f57f7a6dfb9b718118293f7b8113f1 100755
--- a/bot/setup.py
+++ b/bot/setup.py
@@ -24,6 +24,7 @@ setup(
             'jshint = reviewbot.tools.jshint:JSHintTool',
             'pep8 = reviewbot.tools.pep8:PEP8Tool',
             'pyflakes = reviewbot.tools.pyflakes:PyflakesTool',
+            'shellcheck = reviewbot.tools.shellcheck:ShellCheckTool',
         ],
     },
     install_requires=[
