           withName: task.name,
           expirationHandler: { [weak self] in
             if let strong = self {
-              strong.application.endBackgroundTask(ID) // SIDE EFFECT!
               strong.model.backgroundTasks = Set(
-                strong.model.backgroundTasks
-                .filter { $0.name == task.name }
-                .map {
-                  var edit = $0
-                  edit.state = .expired
-                  return edit
+                strong.model.backgroundTasks.map {
+                  if $0.name == task.name {
+                    var edit = $0
+                    edit.state = .expiring
+                    return edit
+                  } else {
+                    return $0
+                  }
                 }
               )
               strong.output.on(.next(strong.model))

        case pending
        case progressing(UIBackgroundTaskIdentifier) // Readonly
        case complete(UIBackgroundTaskIdentifier)
        case expired // Readonly
      }
    }
    enum TartgetActionProcess {

     Tasks marked completed are ended.
     Tasks marked in-progress that were removed are considered canceled and are removed.
     */
    let finished = model.backgroundTasks.flatMap { x -> UIBackgroundTaskIdentifier? in
      switch x.state {
      case .complete: return x.ID
      case .expiring: return x.ID
      default: return nil
      }
    }

    let deletions = RxUIApplication.deletions(
      old: Array(old.backgroundTasks),
      new: Array(model.backgroundTasks)
