diff --git a/blacklist.txt b/blacklist.txt
new file mode 100644
index 0000000000..b3d3f8bad5
--- /dev/null
+++ b/blacklist.txt
@@ -0,0 +1,6 @@
+flake8
+hacking
+mccabe
+pep8
+pyflakes
+pylint
diff --git a/openstack_requirements/generate.py b/openstack_requirements/generate.py
index 9e044e87ec..9fd34cf5fc 100644
--- a/openstack_requirements/generate.py
+++ b/openstack_requirements/generate.py
@@ -87,7 +87,7 @@ def _freeze(requirements, python):
             % ('\n'.join(output), exc))
 
 
-def _combine_freezes(freezes):
+def _combine_freezes(freezes, blacklist=None):
     """Combine multiple freezes into a single structure.
 
     This deals with the variation between different python versions by
@@ -95,9 +95,12 @@ def _combine_freezes(freezes):
     versions of a dependency.
 
     :param freezes: A list of (python_version, frozen_requirements) tuples.
+    :param blacklist: An iterable of package names to exclude. These packages
+        won't be included in the output.
     :return: A list of '\n' terminated lines for a requirements file.
     """
     packages = {}  # {package : {version : [py_version]}}
+    excludes = frozenset((s.lower() for s in blacklist) if blacklist else ())
     reference_versions = []
     for py_version, freeze in freezes:
         if py_version in reference_versions:
@@ -108,6 +111,8 @@ def _combine_freezes(freezes):
                 package, {}).setdefault(version, []).append(py_version)
 
     for package, versions in sorted(packages.items()):
+        if package.lower() in excludes:
+            continue
         if len(versions) != 1 or versions.values()[0] != reference_versions:
             # markers
             for version, py_versions in sorted(versions.items()):
@@ -140,6 +145,18 @@ def _validate_options(options):
         raise Exception(
             "Requirements file %(req)s not found."
             % dict(req=options.requirementes))
+    if options.blacklist and not os.path.exists(options.blacklist):
+        raise Exception(
+            "Blacklist file %(path)s not found."
+            % dict(path=options.blacklist))
+
+
+def _parse_blacklist(path):
+    """Return the strings from path if it is not None."""
+    if path is None:
+        return []
+    with open(path, 'rt') as f:
+        return [l.strip() for l in f]
 
 
 def main(argv=None, stdout=None):
@@ -150,11 +167,15 @@ def main(argv=None, stdout=None):
              "e.g. -p /usr/bin/python3.4")
     parser.add_option(
         "-r", dest="requirements", help="Requirements file to process.")
+    parser.add_option(
+        "-b", dest="blacklist",
+        help="Filename of a list of package names to exclude.")
     options, args = parser.parse_args(argv)
     if stdout is None:
         stdout = sys.stdout
     _validate_options(options)
     freezes = [
         _freeze(options.requirements, python) for python in options.pythons]
-    stdout.writelines(_combine_freezes(freezes))
+    blacklist = _parse_blacklist(options.blacklist)
+    stdout.writelines(_combine_freezes(freezes, blacklist))
     stdout.flush()
diff --git a/openstack_requirements/tests/test_generate.py b/openstack_requirements/tests/test_generate.py
index dc975dc0f9..799a991a33 100644
--- a/openstack_requirements/tests/test_generate.py
+++ b/openstack_requirements/tests/test_generate.py
@@ -80,3 +80,12 @@ class TestCombine(testtools.TestCase):
     def test_duplicate_pythons(self):
         with testtools.ExpectedException(Exception):
             list(generate._combine_freezes([('2.7', []), ('2.7', [])]))
+
+    def test_blacklist(self):
+        blacklist = ['Fixtures']
+        freeze_27 = ('2.7', [('fixtures', '1.2.0')])
+        freeze_34 = ('3.4', [('fixtures', '1.2.0'), ('enum', '1.5.0')])
+        self.assertEqual(
+            ["enum===1.5.0;python_version=='3.4'\n"],
+            list(generate._combine_freezes(
+                [freeze_27, freeze_34], blacklist=blacklist)))