diff --git a/bot/reviewbot/tools/fbinfer.py b/bot/reviewbot/tools/fbinfer.py
new file mode 100644
index 0000000000000000000000000000000000000000..a6400712cf4a755d382142965db29522742081fd
--- /dev/null
+++ b/bot/reviewbot/tools/fbinfer.py
@@ -0,0 +1,77 @@
+"""Review Bot tool to run fbinfer."""
+
+from __future__ import unicode_literals
+
+import plistlib
+import shlex
+
+from reviewbot.tools import RepositoryTool
+from reviewbot.utils.filesystem import make_tempfile
+from reviewbot.utils.process import execute, is_exe_in_path
+
+
+class FBInferTool(Tool):
+    """Review Bot tool to run FBInfer."""
+
+    name = 'fbinfer'
+    version = '1.0'
+    description = 'Checks C, C++, Objective-C, and Java syntax errors.'
+    timeout = 30
+
+    def check_dependencies(self):
+        """Verify that the tool's dependencies are installed.
+        Returns:
+            bool:
+            True if all dependencies for the tool are satisfied. If this
+            returns False, the worker will not listed for this Tool's queue,
+            and a warning will be logged.
+        """
+        return is_exe_in_path('infer')
+
+    def handle_file(self, f, settings):
+        """Perform a review of a single file.
+        Args:
+            f (reviewbot.processing.review.File):
+                The file to process.
+            settings (dict):
+                Tool-specific settings.
+        """
+        filename = f.dest_file.lower()
+
+        if not filename.endswith(('.java', '.py')):
+            # Ignore the file.
+            return
+
+        path = f.get_patched_file_path()
+
+        if not path:
+            return
+
+        additional_args = []
+        configured_args = settings.get('cmdline_args')
+
+        if configured_args:
+            additional_args = shlex.split(configured_args)
+
+        outfile = make_tempfile()
+
+        """
+        this is the inffer command for java, use gcc for c,obj-c,c++
+        infer -- javac <java file> 
+        This isn't completed, but basically the idea is to create the command
+        based on the file extension. Then, it'll run it using shell and get
+        the output file to process it and open the issues using reviewBot.
+        This is not completed, but the next step will be to process the output
+        file from infer.
+        """
+        command = ['infer', '--']
+
+        if filename.endswith('.java'):
+            command += ['javac', path]
+        elif filename.endswith('.c', '.h', '.cpp', '.m', '.mm'):
+            command += ['gcc', path]
+
+
+        self.output = execute(command, ignore_errors=True)
+
+        results = plistlib.readPlist(outfile)
diff --git a/bot/setup.py b/bot/setup.py
index 564a179016d63076cb0d21fd4f73a10fb1e84332..6ad6e8863bc16c356f7237ccb4cafedcf6e06ab5 100755
--- a/bot/setup.py
+++ b/bot/setup.py
@@ -24,6 +24,7 @@ setup(
             'cppcheck = reviewbot.tools.cppcheck:CPPCheckTool',
             'cpplint = reviewbot.tools.cpplint:CPPLintTool',
             'flake8 = reviewbot.tools.flake8:Flake8Tool',
+            'fbinfer = reviewbot.tools.fbinfer:FBInferTool',
             'jshint = reviewbot.tools.jshint:JSHintTool',
             'pmd = reviewbot.tools.pmd:PMDTool',
             'pycodestyle = reviewbot.tools.pycodestyle:PycodestyleTool',
