   let osc: OSCService
   let dataSource: SceneDataSource
   let refreshControl: UIRefreshControl
+  let helpMessageView: UITextView
   
   override func viewDidLoad() {
     super.viewDidLoad()
     collectionView!.backgroundColor = UIColor.whiteColor()
+    // TODO autolayout
+    helpMessageView.frame = CGRect(x: UIConstants.margin, y: UIConstants.margin, width: collectionView!.bounds.width - 2 * UIConstants.margin, height: collectionView!.bounds.height)
   }
 
   override func viewDidAppear(animated: Bool) {

  }
  
  private func handleError(error: SceneLoadingError) {
    switch error {
    case let .NoAddressConfigured: showAlert("Welcome to SceneLauncher!", message: "Please start by clicking on the settings icon and configuring your IP address")
    case let .Unknown: showAlert("Unknown error", message: "Could not load scenes")
    case let .LiveOsc(message): showAlert("LiveOSC error", message: message)
    case let .Timeout: showAlert("Timeout loading scenes", message: "Make sure the Ableton Live server address is correct in settings")
    }
  }
  

    self.osc = applicationContext.oscService
    dataSource = SceneDataSource(osc: osc)
    refreshControl = UIRefreshControl()
    helpMessageView = UITextView()
    
    let layout = UICollectionViewFlowLayout()
    layout.minimumInteritemSpacing = 0
    layout.minimumLineSpacing = 0

    super.init(collectionViewLayout: layout)

    collectionView!.registerClass(SceneCell.self, forCellWithReuseIdentifier: CellId)
    collectionView!.dataSource = dataSource
   
    refreshControl.addTarget(self, action: "refreshScenesManually", forControlEvents: .ValueChanged)
    collectionView!.addSubview(refreshControl)
    collectionView!.alwaysBounceVertical = true
    
    collectionView!.addSubview(helpMessageView)
    helpMessageView.font = UIFont(name: UIConstants.fontName, size: 20)
    helpMessageView.scrollEnabled = false
    helpMessageView.editable = false
    
    // TODO jari: move somewhere else
    let sceneNumberChanges: Signal<Int, NoError> =
