diff --git a/zorg/buildbot/commands/NinjaCommand.py b/zorg/buildbot/commands/NinjaCommand.py
index 47054b8..2b55456 100644
--- a/zorg/buildbot/commands/NinjaCommand.py
+++ b/zorg/buildbot/commands/NinjaCommand.py
@@ -1,9 +1,11 @@
+# TODO: Use Interpolate instead of WithProperties.
 import re
 
 from buildbot.process.properties import WithProperties
 from buildbot.steps.shell import WarningCountingShellCommand
 
 class NinjaCommand(WarningCountingShellCommand):
+    DEFAULT_NINJA = 'ninja'
 
     @staticmethod
     def sanitize_kwargs(kwargs):
@@ -23,27 +25,37 @@
 
         return sanitized_kwargs
 
+    name = "build"
+    haltOnFailure = True
+    description = ["building"]
+    descriptionDone = ["build"]
+    renderables = (
+        'options',
+        'targets',
+        'ninja',
+    )
 
-    def __init__(self, prefixCommand=None, options=None, targets=None, **kwargs):
-        self.prefixCommand = prefixCommand
+    def __init__(self, options=None, targets=None, ninja=DEFAULT_NINJA, logObserver=None, **kwargs):
+        self.ninja = ninja
         self.targets = targets
 
-        command = []
-        if prefixCommand:
-            command += prefixCommand
-
-        command += ["ninja"]
-
         if options is None:
             self.options = list()
         else:
             self.options = list(options)
 
+        if logObserver:
+            self.logObserver = logObserver
+            self.addLogObserver('stdio', self.logObserver)
+
         j_opt = re.compile(r'^-j$|^-j\d+$')
         l_opt = re.compile(r'^-l$|^-l\d+(\.(\d+)?)?$')
 
+        command = list()
+        command += [self.ninja]
+
         # 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)):
+        if not any(j_opt.search(opt) for opt in self.options if isinstance(opt, str)):
             # Otherwise let's see if we got it in the kwargs.
             if kwargs.get('jobs', None):
                 self.options += ["-j", kwargs['jobs']]
@@ -55,8 +67,8 @@
                     WithProperties("%(jobs:-)s"),
                     ]
 
-        # The same logic is for hanling the loadaverage option.
-        if not any(l_opt.search(opt) for opt in self.options if isinstance(opt, basestring)):
+        # The same logic is for handling the loadaverage option.
+        if not any(l_opt.search(opt) for opt in self.options if isinstance(opt, str)):
             if kwargs.get('loadaverage', None):
                 self.options += ["-l", kwargs['loadaverage']]
             else:
@@ -68,8 +80,8 @@
         if self.options:
             command += self.options
 
-        if targets:
-            command += targets
+        if self.targets:
+            command += self.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
@@ -79,26 +91,20 @@
         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)
-
+        super().__init__(**sanitized_kwargs)
 
     def setupEnvironment(self, cmd):
         # First upcall to get everything prepared.
-        WarningCountingShellCommand.setupEnvironment(self, cmd)
+        super().setupEnvironment(cmd)
 
         # Set default status format string.
         if cmd.args['env'] is None:
             cmd.args['env'] = {}
         cmd.args['env']['NINJA_STATUS'] = cmd.args['env'].get('NINJA_STATUS', "%e [%u/%r/%f] ")
 
-
-    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)
+    def buildCommandKwargs(self, warnings):
+        kwargs = super().buildCommandKwargs(warnings)
+        # Remove all the empty items from the command list,
+        # which we could get if Interpolate rendered to empty strings.
+        kwargs['command'] = [cmd for cmd in kwargs['command'] if cmd]
+        return kwargs
