   execute = (go) ->
     input = _input().trim()
     unless input
-      if go
-        return go null
-      else
-        return
-
-    renderer = _renderer()
+      return if go then go() else undefined 
+
+    render = _render()
     _isBusy yes
-    renderer.render input, (error, results) ->
-      if error
+    # Clear any existing outputs
+    _outputs []
+    _hasError no
+    render input,
+      data: (result) ->
+        _outputs.push result
+      error: (error) ->
         _hasError yes
         #XXX review
         if error.cause?
-          _outputs [
+          _outputs.push
             error: error
             template: 'flow-error'
-          ]
         else
-          _outputs [
+          _outputs.push
             text: JSON.stringify error, null, 2
             template: 'flow-raw'
-          ]
-      else
-        _hasError no
-        outputs = for [ error, result ] in results
-          if error
-            _hasError yes
-            error: error
-            template: 'flow-error'
-          else
-            result
-
-        _outputs outputs
-        _hasInput renderer.isCode
-
-      _isBusy no
-      go _hasError() if go
+      end: ->
+        _hasInput render.isCode
+        _isBusy no
+        go() if go
 
     _isActive no
 

Flow.Cell = (_, _renderers, type='cs', input='') ->
  _guid = do uniqueId
  _type = node$ type
  _renderer = lift$ _type, (type) -> _renderers[type] _guid
  _isSelected = node$ no
  _isActive = node$ no
  _hasError = node$ no

    if isActive
      _.selectCell self
      _hasInput yes
      _outputs [] unless _render().isCode
    return

  # deactivate when deselected
