         }
     }
     
-    private func loadedHeaders(headers : CourseOutlineQuerier.BlockGroup) {
-        self.setupNavigationItem(headers.block)
-        let children = headers.children.map {header in
-            return self.courseQuerier.childrenOfBlockWithID(header.blockID, forMode: self.modeController.currentMode)
-        }
-        rowsLoader.backWithStream(joinStreams(children))
-    }
-    
     private func addListeners() {
-        blockIDStream.listen(self,
-            success: {[weak self] blockID in
-                self?.backHeadersLoaderWithBlockID(blockID)
-            },
-            failure: {[weak self] error in
-                self?.headersLoader.backWithStream(Stream(error: error))
-        })
+        headersLoader.backWithStream(blockIDStream.transform {[weak self] blockID in
+            if let owner = self {
+                return owner.courseQuerier.childrenOfBlockWithID(blockID, forMode: owner.modeController.currentMode)
+            }
+            else {
+                return Stream<CourseOutlineQuerier.BlockGroup>(error: NSError.oex_courseContentLoadError())
+            }}
+        )
+        rowsLoader.backWithStream(headersLoader.transform {[weak self] headers in
+            if let owner = self {
+                let children = headers.children.map {header in
+                    return owner.courseQuerier.childrenOfBlockWithID(header.blockID, forMode: owner.modeController.currentMode)
+                }
+                return joinStreams(children)
+            }
+            else {
+                return Stream(error: NSError.oex_courseContentLoadError())
+            }}
+        )
+        
+        self.blockIDStream.backWithStream(Stream(value: rootID))
         
         headersLoader.listen(self,
             success: {[weak self] headers in
-                self?.loadedHeaders(headers)
+                self?.setupNavigationItem(headers.block)
             },
             failure: {[weak self] error in
-                self?.rowsLoader.backWithStream(Stream(error: error))
                 self?.showErrorIfNecessary(error)
             }
         )

        fixedSpace.width = barButtonFixedSpaceWidth
        navigationItem.rightBarButtonItems = [webController.barButtonItem,fixedSpace,modeController.barItem]
        navigationItem.backBarButtonItem = UIBarButtonItem(title: " ", style: .Plain, target: nil, action: nil)
        
        self.blockIDStream.backWithStream(Stream(value: rootID))
    }

    public required init?(coder aDecoder: NSCoder) {

        self.environment.router?.showContainerForBlockWithID(block.blockID, type:block.displayType, parentID: parent, courseID: courseQuerier.courseID, fromController:self)
    }
    
    //MARK: PullRefreshControllerDelegate
    public func refreshControllerActivated(controller: PullRefreshController) {
        courseQuerier.needsRefresh = true
