anchor.diff:  class LiveDeployManager {
       static final LiveDeployManager _singleton = new LiveDeployManager._internal();
   
  +    StreamSubscription _sub;
  +    Function _onError;
  +
       factory LiveDeployManager() {
         return _singleton;
       }
   
       void _init(Project currentProject) {
         if (SparkFlags.liveDeployMode) {
  -        currentProject.workspace.onResourceChange.forEach((ResourceChangeEvent event) {
  +        if (_sub != null) _sub.cancel();
  +        _sub = currentProject.workspace.onResourceChange.listen(null);
  +        _sub.onData((ResourceChangeEvent event) {
             event.modifiedProjects.forEach((Project p) {
               if (p == currentProject) {
  -              return localPrefs.getValue("live-deployment").then((value) {
  +              return _localPrefs.getValue("live-deployment").then((value) {
                   if (value == true) {
                     return _liveDeploy(getAppContainerFor(p));
                   }
  
positive.code:         setDeploymentTime(deployContainer,
              (new DateTime.now()).millisecondsSinceEpoch);
        }).catchError((e) {
        }).whenComplete(() {
          _monitor = null;
        });
  
negative.code:       }
      }
  
      static startLiveDeploy(Project currentProject,
          {void onError(var exception)}) {
        _singleton._init(currentProject);
        _singleton._onError = onError;
      }
  
      LiveDeployManager._internal();
  
      Future _liveDeploy(Container deployContainer) {
        ProgressMonitor _monitor = new ProgressMonitor();
        MobileDeploy deployer = new MobileDeploy(deployContainer, _localPrefs);
  
        // Invoke the deployer methods in Futures in order to capture exceptions.
        Future f = new Future(() {
  