anchor.diff:      localPrefs = preferences.localStore;
       syncPrefs = preferences.syncStore;
   
  -    actionManager = new ActionManager();
  -
  +    initAnalytics();
  +
  +    addParticipant(new _SparkSetupParticipant(this));
  +
  +    // TODO: this event is not being fired. A bug with chrome apps / Dartium?
  +    chrome.app.window.onClosed.listen((_) {
  +      close();
  +    });
  +
  +    initWorkspace();
  +    initEditor();
  +    initEditorManager();
  +    initEditorArea();
  +    initEditorThemes();
  +    initFilesController();
  +
  +    // Init the bootjack library (a wrapper around bootstrap).
  +    bootjack.Bootjack.useDefault();
  +
  +    createActions();
  +    initToolbar();
  +    initSplitView();
  +  }
  +
  +  String get appName => i18n('app_name');
  +
  +  String get appVersion => chrome.runtime.getManifest()['version'];
  +
  +  PlatformInfo get platformInfo => _platformInfo;
  +
  +  void initAnalytics() {
       analytics.getService('Spark').then((service) {
         // Init the analytics tracker and send a page view for the main page.
         tracker = service.getTracker(_ANALYTICS_ID);
         tracker.sendAppView('main');
         _startTrackingExceptions();
       });
  -
  -    addParticipant(new _SparkSetupParticipant(this));
  -
  -    // TODO: this event is not being fired. A bug with chrome apps / Dartium?
  -    chrome.app.window.onClosed.listen((_) {
  -      close();
  -    });
  -
  +  }
  +
  +  void initSplitView() {
  +    _splitView = new SplitView(querySelector('#splitview'));
  +    _splitView.onResized.listen((_) {
  +      editor.resize();
  +      syncPrefs.setValue('splitViewPosition', _splitView.position.toString());
  +    });
  +    syncPrefs.getValue('splitViewPosition').then((String position) {
  +      if (position != null) {
  +        int value = int.parse(position, onError: (_) => 0);
  +        if (value != 0) {
  +          _splitView.position = value;
  +        }
  +      }
  +    });
  +  }
  +
  +  void initWorkspace() {
       workspace = new ws.Workspace(localPrefs);
  +  }
  +
  +  void initEditorThemes() {
  +    syncPrefs.getValue('aceTheme').then((String theme) {
  +      if (theme != null && AceEditor.THEMES.contains(theme)) {
  +        editor.theme = theme;
  +      }
  +    });
  +  }
  +
  +  void initEditor() {
       editor = new AceEditor(new DivElement());
  -
  +  }
  +
  +  void initEditorManager() {
       editorManager = new EditorManager(workspace, editor, localPrefs);
       editorManager.loaded.then((_) {
         List<ws.Resource> files = editorManager.files.toList();
  
positive.code:   }
  
    void createActions() {
      actionManager.registerAction(new FileNewAction(this));
      actionManager.registerAction(new FileOpenAction(this));
      actionManager.registerAction(new FileSaveAction(this));
  
negative.code:     actionManager.registerAction(new ProjectOpenAction(this));
      actionManager.registerAction(new RunTestsAction(this));
      actionManager.registerAction(new AboutSparkAction(this));
      actionManager.registerKeyListener();
    }
  
    void initToolbar() {
      querySelector("#newFile").onClick.listen(
          (_) => actionManager.getAction('file-new').invoke());
      querySelector("#openFile").onClick.listen(
          (_) => actionManager.getAction('file-open').invoke());
  
      buildMenu();
    }
  
    void buildMenu() {
  