diff --git a/zorg/buildbot/commands/AnalyzerCompareCommand.py b/zorg/buildbot/commands/AnalyzerCompareCommand.py
deleted file mode 100644
index 5c83d68..0000000
--- a/zorg/buildbot/commands/AnalyzerCompareCommand.py
+++ /dev/null
@@ -1,109 +0,0 @@
-import sys
-import os
-
-from buildbot.steps import shell
-from buildbot.status import builder
-from buildbot.process import buildstep
-
-class AnalyzerCompareCommand(shell.ShellCommand):
-  """Command suitable for displaying a comparison of two static analyzer
-  runs, as output by the clang 'utils/analyzer/CmpRun' tool."""
-
-  class Observer(buildstep.LogLineObserver):
-    def __init__(self):
-      buildstep.LogLineObserver.__init__(self)
-
-      # Counts of various reports.
-      self.num_reports = None
-      self.num_added = 0
-      self.num_removed = 0
-      self.num_changed = 0
-
-      # Reports to notify the user about; a list of tuples of (title,
-      # name, html-report).
-      self.reports = []
-
-      # Lines we couldn't parse.
-      self.invalid_lines = []
-
-      # Make sure we get all the data.
-      self.setMaxLineLength(sys.maxint)
-
-    def outLineReceived(self, line):
-      """This is called once with each line of the test log."""
-
-      # Ignore empty lines.
-      line = line.strip()
-      if not line:
-        return
-
-      # Everything else should be eval()able.
-      try:
-        data = eval(line)
-        key = data[0]
-      except:
-        self.invalid_lines.append(line)
-        return
-
-      # FIXME: Improve error checking.
-      if key == 'ADDED':
-        _,name,report = data
-        self.num_added += 1
-        self.reports.append(('added', str(name), str(report)))
-      elif key == 'REMOVED':
-        _,name,report = data
-        self.num_removed += 1
-        self.reports.append(('removed', str(name), str(report)))
-      elif key == 'CHANGED':
-        _,name,old_name,report,old_report = data
-        self.num_removed += 1
-        self.reports.append(('modified', str(name), str(report)))
-      elif key == 'TOTAL':
-        if self.num_reports is not None:
-          self.invalid_lines.append(line)
-          return
-
-        _,count = data
-        self.num_reports = count
-      else:
-        self.invalid_lines.append(line)
-        
-  def __init__(self, **kwargs):
-    shell.ShellCommand.__init__(self, **kwargs)
-    self.observer = AnalyzerCompareCommand.Observer()
-    self.addLogObserver('comparison-data', self.observer)
-
-  def getText(self, cmd, results):
-    basic_info = self.describe(True)
-    
-    added = self.observer.num_added
-    removed = self.observer.num_removed
-    changed = self.observer.num_changed
-    total = self.observer.num_reports
-
-    if total is not None:
-      basic_info.append('%d reports' % total)
-    for name,count in (("added", self.observer.num_added),
-                       ("removed", self.observer.num_removed),
-                       ("changed", self.observer.num_changed)):
-      if count:
-        basic_info.append('%d %s' % (count, name))
-
-    return basic_info
-
-  def createSummary(self, log):
-    # Add the "interesting" reports.
-    for title,name,data in self.observer.reports:
-      self.addHTMLLog("%s:%s" % (title, os.path.basename(name)), data)
-
-  def evaluateCommand(self, cmd):
-    # Always fail if the command itself failed.
-    if cmd.rc != 0:
-      return builder.FAILURE
-
-    # Warn about added reports.
-    if self.observer.num_added:
-      return builder.WARNINGS
-
-    return builder.SUCCESS
-
diff --git a/zorg/buildbot/commands/BatchFileDownload.py b/zorg/buildbot/commands/BatchFileDownload.py
deleted file mode 100644
index 933eb27..0000000
--- a/zorg/buildbot/commands/BatchFileDownload.py
+++ /dev/null
@@ -1,27 +0,0 @@
-from buildbot.steps.transfer import FileDownload
-
-class BatchFileDownload(FileDownload):
-    # FIXME: It would be nice to form a BatchedShellCommand step out of this.
-    def __init__(self, **kwargs):
-        if 'command' in kwargs:
-            if 'mastersrc' in kwargs:
-                raise ValueError,"Unexpected 'mastersrc' argument."
-            if 'slavedest' in kwargs:
-                raise ValueError,"Unexpected 'slavedest' argument."
-
-            # This is the initial construction, create a temporary
-            # batch file to run the command.
-            import os
-            import tempfile
-
-            command = kwargs.pop('command')
-            tf = tempfile.NamedTemporaryFile(delete=False)
-            print >>tf, '@echo on'
-            print >>tf, ' '.join('"%s"' % a for a in command)
-            tf.close()
-
-            remotename = kwargs.get('name', 'batched-command')
-            kwargs['mastersrc'] = os.path.abspath(tf.name)
-            kwargs['slavedest'] = '%s.bat' % remotename
-
-        FileDownload.__init__(self, **kwargs)
diff --git a/zorg/buildbot/commands/DejaGNUCommand.py b/zorg/buildbot/commands/DejaGNUCommand.py
deleted file mode 100644
index f08cf08..0000000
--- a/zorg/buildbot/commands/DejaGNUCommand.py
+++ /dev/null
@@ -1,72 +0,0 @@
-import re
-import urllib
-import buildbot
-import buildbot.status.builder
-from buildbot.status.results import FAILURE, SUCCESS
-import buildbot.steps.shell
-from buildbot.process.buildstep import LogLineObserver
-from buildbot.steps.shell import Test
-
-class DejaGNULogObserver(LogLineObserver):
-    kStartLineRE = re.compile(r'Running .*/(.*/.*\.exp) \.\.\.');
-    kFinishLineRE = re.compile(r'testcase .*/(.*/.*\.exp) completed in .* seconds');
-    kTestStateLineRE = re.compile(r'(FAIL|PASS|XFAIL|XPASS|KFAIL|KPASS|UNRESOLVED|UNTESTED|UNSUPPORTED): .*')
-    failingCodes = set(['FAIL', 'XPASS', 'KPASS', 'UNRESOLVED'])
-    def __init__(self):
-        LogLineObserver.__init__(self)
-        self.resultCounts = {}
-        self.currentLines = ''
-        self.currentFailed = False
-        self.anyFailed = False
-    def outLineReceived(self, line):
-        if len(self.currentLines):
-            self.currentLines += '\n' + line
-            m = self.kTestStateLineRE.search(line)
-            if m:
-                resultCode, = m.groups()
-                if resultCode in self.failingCodes:
-                    self.hasFailed = True
-                    self.currentFailed = True
-                    self.anyFailed = True
-                if not resultCode in self.resultCounts:
-                    self.resultCounts[resultCode] = 0
-                self.resultCounts[resultCode] += 1
-            m = self.kFinishLineRE.match(line)
-            if m:
-                name, = m.groups()
-                if self.currentFailed:
-                    self.step.addCompleteLog(name.replace('/', '__'), self.currentLines)
-                self.currentLines = ''
-        else:
-            m = self.kStartLineRE.match(line)
-            if m:
-                self.currentLines = line
-                self.currentFailed = False
-
-class DejaGNUCommand(Test):
-    resultNames = {'FAIL':'unexpected failures',
-                   'PASS':'expected passes',
-                   'XFAIL':'expected failures',
-                   'XPASS':'unexpected passes',
-                   'KFAIL':'known failures',
-                   'KPASS':'unknown passes',
-                   'UNRESOLVED':'unresolved testcases',
-                   'UNTESTED':'untested testcases',
-                   'UNSUPPORTED':'unsupported tests'}
-
-    def __init__(self, ignore=[], flaky=[], max_logs=20,
-                 *args, **kwargs):
-        Test.__init__(self, *args, **kwargs)
-        self.logObserver = DejaGNULogObserver()
-        self.addLogObserver('gdb.log', self.logObserver)
-
-    def evaluateCommand(self, cmd):
-        if self.logObserver.anyFailed:
-            return FAILURE
-        return SUCCESS
-
-    def describe(self, done=False):
-        description = Test.describe(self, done)
-        for name, count in self.logObserver.resultCounts.iteritems():
-            description.append('{0} {1}'.format(count, self.resultNames[name]))
-        return description
diff --git a/zorg/buildbot/commands/GTestCommand.py b/zorg/buildbot/commands/GTestCommand.py
deleted file mode 100644
index 84ea097..0000000
--- a/zorg/buildbot/commands/GTestCommand.py
+++ /dev/null
@@ -1,158 +0,0 @@
-#!/usr/bin/python
-# Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE.chromium.TXT file.
-
-"""A buildbot command for running and interpreting GTest tests."""
-
-import re
-from buildbot.steps import shell
-from buildbot.status import builder
-from buildbot.process import buildstep
-
-class TestObserver(buildstep.LogLineObserver):
-  """This class knows how to understand GTest test output."""
-
-  def __init__(self):
-    buildstep.LogLineObserver.__init__(self)
-
-    # State tracking for log parsing
-    self._current_test_case = ''
-    self._current_test = ''
-    self._current_failure = None
-    self._suites_started = 0
-    self._suites_ended = 0
-
-    # This may be either text or a number. It will be used in the phrase
-    # '%s disabled' on the waterfall display.
-    self.disabled_tests = 0
-
-    # Failures are stored here as 'test name': [failure description]
-    self.failed_tests = {}
-
-    # Regular expressions for parsing GTest logs
-    self._test_case_start = re.compile('\[----------\] \d+ tests? from (\w+)')
-    self._test_start = re.compile('^\[ RUN      \] .+\.(\w+)')
-    self._test_end   = re.compile('^^\[(       OK |  FAILED  )] .+\.(\w+)')
-    self._disabled   = re.compile('  YOU HAVE (\d+) DISABLED TEST')
-    self._suite_start = re.compile(
-        '^\[==========\] Running \d+ tests? from \d+ test cases?.')
-    self._suite_end  = re.compile(
-        '^\[==========\] \d+ tests? from \d+ test cases? ran.')
-
-  def RunningTests(self):
-    """Returns True if we appear to be in the middle of running tests."""
-    return self._suites_started > self._suites_ended
-
-  def outLineReceived(self, line):
-    """This is called once with each line of the test log."""
-
-    # Is it the first line of the suite?
-    results = self._suite_start.search(line)
-    if results:
-      self._suites_started += 1
-      return
-
-    # Is it a line reporting disabled tests?
-    results = self._disabled.search(line)
-    if results:
-      try:
-        disabled = int(results.group(1))
-      except ValueError:
-        disabled = 0
-      if disabled > 0 and isinstance(self.disabled_tests, int):
-        self.disabled_tests += disabled
-      else:
-        # If we can't parse the line, at least give a heads-up. This is a
-        # safety net for a case that shouldn't happen but isn't a fatal error.
-        self.disabled_tests = 'some'
-      return
-
-    # We don't care about anything else if we're not in the list of tests.
-    if not self.RunningTests():
-      return
-
-    # Is it the first line in a test case?
-    results = self._test_case_start.search(line)
-    if results:
-      self._current_test = ''
-      self._failure_description = []
-      self._current_test_case = results.group(1)
-      return
-
-    # Is it the last line of the suite (if so, clear state)?
-    results = self._suite_end.search(line)
-    if results:
-      self._suites_ended += 1
-      self._current_test_case = ''
-      self._current_test = ''
-      self._failure_description = []
-      return
-
-    # Is it the start of an individual test?
-    results = self._test_start.search(line)
-    if results:
-      self._current_test = results.group(1)
-      test_name = '.'.join([self._current_test_case, self._current_test])
-      self._failure_description = ['%s:' % test_name]
-      return
-
-    # Is it a test result line?
-    results = self._test_end.search(line)
-    if results:
-      if results.group(1) == '  FAILED  ':
-        test_name = '.'.join([self._current_test_case, self._current_test])
-        self.failed_tests[test_name] = self._failure_description
-      self._current_test = ''
-      self._failure_description = []
-
-    # Random line: if we're in a test, collect it for the failure description.
-    if self._current_test:
-      self._failure_description.append(line)
-
-
-class GTestCommand(shell.ShellCommand):
-  """Buildbot command that knows how to display GTest output."""
-
-  def __init__(self, **kwargs):
-    shell.ShellCommand.__init__(self, **kwargs)
-    self.test_observer = TestObserver()
-    self.addLogObserver('stdio', self.test_observer)
-
-  def getText(self, cmd, results):
-    basic_info = self.describe(True)
-    disabled = self.test_observer.disabled_tests
-    if disabled:
-      basic_info.append('%s disabled' % str(disabled))
-
-    if results == builder.SUCCESS:
-      return basic_info
-    elif results == builder.WARNINGS:
-      return basic_info + ['warnings']
-
-    if self.test_observer.RunningTests():
-      basic_info += ['did not complete']
-
-    if len(self.test_observer.failed_tests) > 0:
-      failure_text = ['failed %d' % len(self.test_observer.failed_tests)]
-    else:
-      failure_text = ['crashed or hung']
-    return basic_info + failure_text
-
-  def _TestAbbrFromTestID(self, id):
-    """Split the test's individual name from GTest's full identifier.
-    The name is assumed to be everything after the final '.', if any.
-    """
-    return id.split('.')[-1]
-
-  def createSummary(self, log):
-    observer = self.test_observer
-    if observer.failed_tests:
-      for failure in observer.failed_tests:
-        # GTest test identifiers are of the form TestCase.TestName. We display
-        # the test names only.  Unfortunately, addCompleteLog uses the name as
-        # both link text and part of the text file name, so we can't incude
-        # HTML tags such as <abbr> in it.
-        self.addCompleteLog(self._TestAbbrFromTestID(failure),
-                            '\n'.join(observer.failed_tests[failure]))
-
diff --git a/zorg/buildbot/commands/LICENSE.chromium.TXT b/zorg/buildbot/commands/LICENSE.chromium.TXT
deleted file mode 100644
index 9314092..0000000
--- a/zorg/buildbot/commands/LICENSE.chromium.TXT
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//    * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//    * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//    * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/zorg/buildbot/commands/MakeCommand.py b/zorg/buildbot/commands/MakeCommand.py
deleted file mode 100644
index 623a1b0..0000000
--- a/zorg/buildbot/commands/MakeCommand.py
+++ /dev/null
@@ -1,82 +0,0 @@
-import re
-
-from buildbot.process.properties import WithProperties
-from buildbot.steps.shell import WarningCountingShellCommand
-
-class MakeCommand(WarningCountingShellCommand):
-
-    @staticmethod
-    def sanitize_kwargs(kwargs):
-        # kwargs we could get and must not pass through
-        # to the buildstep.RemoteShellCommand constructor.
-        # Note: This is a workaround of the buildbot design issue,
-        # thus should be removed once the original issue gets fixed.
-        consume_kwargs = [
-                             "jobs",
-                         ]
-
-        sanitized_kwargs = kwargs.copy()
-        for k in consume_kwargs:
-            if k in sanitized_kwargs.keys():
-                del sanitized_kwargs[k]
-
-        return sanitized_kwargs
-
-
-    def __init__(self, prefixCommand=None, options=None, targets=None, **kwargs):
-        self.prefixCommand = prefixCommand
-        self.targets = targets
-
-        command = []
-        if prefixCommand:
-            command += prefixCommand
-
-        command += ["make"]
-
-        if options is None:
-            self.options = list()
-        else:
-            self.options = list(options)
-
-        j_opt = re.compile(r'^-j$|^-j\d+$')
-
-        # We can get jobs in the options. If so, we would use that.
-        if not any(j_opt.search(opt) for opt in self.options if isinstance(opt, basestring)):
-            # Otherwise let's see if we got it in the kwargs.
-            if kwargs.get('jobs', None):
-                self.options += ["-j", kwargs['jobs']]
-            else:
-                # Use the property if option was not explicitly
-                # specified.
-                command += [
-                    WithProperties("%(jobs:+-j)s"),
-                    WithProperties("%(jobs:-)s"),
-                    ]
-
-        if self.options:
-            command += self.options
-
-        if targets:
-            command += targets
-
-        # Remove here all the kwargs any of our LLVM buildbot command could consume.
-        # Note: We will remove all the empty items from the command at start, as we
-        # still didn't get yet WithProperties rendered.
-        sanitized_kwargs = self.sanitize_kwargs(kwargs)
-
-        sanitized_kwargs["command"] = command
-
-        # And upcall to let the base class do its work
-        WarningCountingShellCommand.__init__(self, **sanitized_kwargs)
-
-        self.addFactoryArguments(prefixCommand=prefixCommand,
-                                 options=self.options,
-                                 targets=targets)
-
-
-    def start(self):
-        # Don't forget to remove all the empty items from the command,
-        # which we could get because of WithProperties rendered as empty strings.
-        self.command = filter(bool, self.command)
-        # Then upcall.
-        WarningCountingShellCommand.start(self)
diff --git a/zorg/buildbot/commands/NightlyTestCommand.py b/zorg/buildbot/commands/NightlyTestCommand.py
deleted file mode 100644
index 7279776..0000000
--- a/zorg/buildbot/commands/NightlyTestCommand.py
+++ /dev/null
@@ -1,86 +0,0 @@
-import itertools
-import re
-import os
-
-import buildbot
-import buildbot.steps.shell
-
-class NightlyTestCommand(buildbot.steps.shell.Test):
-
-    def __init__(self, xfails=[], *args, **kwargs):
-        buildbot.steps.shell.Test.__init__(self, *args, **kwargs)
-
-        self.expectedFailures = set(xfails)
-        self.addFactoryArguments(xfails=list(xfails))
-
-    def evaluateCommand(self, cmd):
-        # Always fail if the command itself failed.
-        #
-        # Disabled for now, nightlytest is so broken.
-        #if cmd.rc != 0:
-        #    return buildbot.status.builder.FAILURE
-    
-        failures = {}
-        xfailures = {}
-        xpasses = {}
-        num_passes = 0
-        num_tests = 0
-        for item in parse_report(self.getLog('report').readlines()):
-            name = item.pop('Program')
-            for key,value in item.items():
-                if '/' in key:
-                    continue
-                kname = '%s.%s' % (key,name)
-                if value == '*':
-                    if kname in self.expectedFailures:
-                        xfailures[key] = xfailures.get(key,[])
-                        xfailures[key].append(kname)
-                    else:
-                        failures[key] = failures.get(key,[])
-                        failures[key].append(kname)
-                else:
-                    if kname in self.expectedFailures:
-                        xpasses[key] = xpasses.get(key,[])
-                        xpasses[key].append(kname)
-                    else:
-                        num_passes += 1
-            num_tests += 1
-
-        num_fails = num_xfails = num_xpasses = 0
-        for type,items in failures.items():
-            if len(items) == num_tests: # Assume these are disabled.
-                continue
-            self.addCompleteLog('fail.%s' % type, '\n'.join(items) + '\n')
-            num_fails += len(items)
-        for type,items in xfailures.items():
-            self.addCompleteLog('xfail.%s' % type, '\n'.join(items) + '\n')
-            num_xfails += len(items)
-        for type,items in xpasses.items():
-            self.addCompleteLog('xpass.%s' % type, '\n'.join(items) + '\n')
-            num_xpasses += len(items)
-    
-        self.setTestResults(total=(num_passes + num_fails + num_xfails +
-                                   num_xpasses),
-                            failed=num_fails,
-                            passed=num_passes + num_xpasses,
-                            warnings=num_xfails + num_xpasses)
-        if num_fails:
-          return buildbot.status.builder.FAILURE
-        return buildbot.status.builder.SUCCESS
-  
-def parse_report(lines):
-    def split_row(ln):
-        return ln.split()
-
-    header = None
-    for ln in lines:
-        if not ln.strip():
-            continue
-
-        if header is None:
-            ln = ln.replace(' compile', '_compile')
-            ln = ln.replace(' codegen', '_codegen')
-            header = split_row(ln)
-        else:
-            row = split_row(ln)
-            yield dict(zip(header, split_row(ln)))
diff --git a/zorg/buildbot/commands/StandardizedTest.py b/zorg/buildbot/commands/StandardizedTest.py
deleted file mode 100644
index fba70b6..0000000
--- a/zorg/buildbot/commands/StandardizedTest.py
+++ /dev/null
@@ -1,122 +0,0 @@
-import re
-import urllib
-import buildbot
-import buildbot.status.builder
-import buildbot.steps.shell
-
-class StandardizedTest(buildbot.steps.shell.Test):
-    # FIXME: We should process things in a test observer instead of at the end.
-
-    knownCodes = ['FAIL', 'XFAIL', 'PASS', 'XPASS',
-                  'UNRESOLVED', 'UNSUPPORTED', 'IMPROVED', 'REGRESSED']
-    failingCodes = set(['FAIL', 'XPASS', 'UNRESOLVED'])
-    warningCodes = set(['IGNORE PASS', 'IGNORE XFAIL', 'REGRESSED'])
-
-    # The list of all possible codes, including flaky and ignored codes. This is
-    # the display order, as well.
-    allKnownCodes = (knownCodes + ['IGNORE ' + c for c in knownCodes] +
-                     ['FLAKY ' + c for c in knownCodes])
-
-    testLogName = 'stdio'
-
-    def __init__(self, ignore=[], flaky=[], max_logs=20,
-                 *args, **kwargs):
-        buildbot.steps.shell.Test.__init__(self, *args, **kwargs)
-
-        self.flakyTests = set(flaky)
-        self.ignoredTests = set(ignore)
-        self.maxLogs = int(max_logs)
-        self.addFactoryArguments(flaky=list(flaky))
-        self.addFactoryArguments(ignore=list(ignore))
-        self.addFactoryArguments(max_logs=max_logs)
-
-    def parseLog(self, log_lines):
-        """parseLog(log_lines) -> [(result_code, test_name, test_log), ...]"""
-        raise RuntimeError("Abstract method.")
-
-    def evaluateCommand(self, cmd):
-        results_by_code = {}
-        logs = []
-        lines = self.getLog(self.testLogName).readlines()
-        hasIgnored = False
-        for result,test,log in self.parseLog(lines):
-            test = test.strip()
-            if result not in self.allKnownCodes:
-                raise ValueError,'test command return invalid result code!'
-
-            # Convert codes for flaky and ignored tests.
-            if test in self.flakyTests:
-                result = 'FLAKY ' + result
-            elif test in self.ignoredTests:
-                result = 'IGNORE ' + result
-
-            if result.startswith('FLAKY ') or result.startswith('IGNORE '):
-                hasIgnored = True
-                
-
-            results_by_code.setdefault(result, []).append(test)
-
-            # Add logs for failures.
-            if result in self.failingCodes and len(logs) < self.maxLogs:
-                if log is not None and log.strip():
-                    # Buildbot 0.8 doesn't properly quote slashes, replace them.
-                    test = test.replace("/", "___")
-                    logs.append((test, log))
-
-        # Explicitly remove any ignored warnings for tests which are
-        # also in the an ignored failing set (some tests may appear
-        # twice).
-        ignored_failures = set()
-        for code in self.failingCodes:
-            results = results_by_code.get('IGNORE ' + code)
-            if results:
-                ignored_failures |= set(results)
-        for code in self.warningCodes:
-            results = results_by_code.get(code)
-            if results:
-                results_by_code[code] = [x for x in results_by_code[code]
-                                         if x not in ignored_failures]
-
-        # Summarize result counts.
-        total = failed = passed = warnings = 0
-        for code in self.allKnownCodes:
-            results = results_by_code.get(code)
-            if not results:
-                continue
-
-            total += len(results)
-            if code in self.failingCodes:
-                failed += len(results)
-            elif code in self.warningCodes:
-                warnings += len(results)
-            else:
-                passed += len(results)
-
-            # Add a list of the tests in each category, for everything except
-            # PASS.
-            if code != 'PASS':
-                results.sort()
-                self.addCompleteLog('tests.%s' % code,
-                                    '\n'.join(results) + '\n')
-
-        self.setTestResults(total=total, failed=failed,
-                            passed=passed, warnings=warnings)
-
-        # Add the logs.
-        logs.sort()
-        for test, log in logs:
-            self.addCompleteLog(test, log)
-
-        # Always fail if the command itself failed, unless we have ignored some
-        # test results (which presumably would have caused the actual test
-        # runner to fail).
-        if not hasIgnored and cmd.rc != 0:
-            return buildbot.status.builder.FAILURE
-
-        # Report failure/warnings beased on the test status.
-        if failed:
-            return buildbot.status.builder.FAILURE
-        if warnings:
-            return buildbot.status.builder.WARNINGS
-
-        return buildbot.status.builder.SUCCESS
diff --git a/zorg/buildbot/commands/SuppressionDejaGNUCommand.py b/zorg/buildbot/commands/SuppressionDejaGNUCommand.py
deleted file mode 100644
index 22fd830..0000000
--- a/zorg/buildbot/commands/SuppressionDejaGNUCommand.py
+++ /dev/null
@@ -1,33 +0,0 @@
-import re
-import StandardizedTest
-
-class SuppressionDejaGNUCommand(StandardizedTest.StandardizedTest):
-    kRunningRE = re.compile(r'Running (.*) ...')
-    kRunningRE = re.compile(r'Running (.*) ...')
-    kTestStateLineRE = re.compile(r'(FAIL|PASS|XFAIL|XPASS|UNRESOLVED): (.*)')
-
-    testLogName = 'dg.sum'
-
-    def parseLog(self, lines):
-        results = []
-
-        test_suite = None
-        for ln in lines:
-            m = self.kRunningRE.match(ln)
-            if m is not None:
-                test_suite, = m.groups()
-                continue
-
-            m = self.kTestStateLineRE.match(ln)
-            if m is not None:
-                code,name = m.groups()
-                results.append((code, name, None))
-                continue
-
-        return results
-
-if __name__ == '__main__':
-    import sys
-    t = SuppressionDejaGNUCommand()
-    for res in t.parseLog(open(sys.argv[1]).readlines()):
-        print res
