anchor.diff:          if id = Api.userId then failwith "Can't chat with yourself"
   
           Async.startNetworkWithContinuation
  -            (PrivateChat.session id)
  +            (PrivateChat.session id false false)
               (function
                   | Api.ApiOk (newSession, _) ->
                       let user =
  
positive.code:         loop ()
      )
  
      let webViewDelegate = {
          new UIWebViewDelegate() with
          override this.ShouldStartLoad (view, request, navigationType) =
              let uri = new Uri(request.Url.AbsoluteString)
              match uri.Segments with
              | [| _; "users/"; slug |] when slug = user.Slug -> Navigation.navigate (sprintf "/users/%s" slug) (Some user)
              | [| _; "users/"; slug |] when slug = identity.Slug -> Navigation.navigate (sprintf "/users/%s" slug) (Some { Id = identity.Id; Label = identity.Name; Slug = identity.Slug; Image = identity.Avatar })
              | segments -> Navigation.navigate (uri.ToString()) None
              false
      }
  
      let showMore () =
          let sheet = new UIActionSheet (Title = "Private Message Options")
          sheet.AddButton "Close Chat" |> ignore
          sheet.AddButton "Cancel" |> ignore
          sheet.DestructiveButtonIndex <- 0
          sheet.CancelButtonIndex <- 1
  
          sheet.ShowInView (this.View)
          sheet.Dismissed.Add(fun args ->
              match args.ButtonIndex with
              | 0 -> 
                  Async.startInBackgroundWithContinuation
                      (fun _ -> DB.removeChatHistoryById user.Id)
                      (fun _ ->
                          this.Leave user.Id
                          Navigation.navigate "/home" None
                      )
              | _ -> ()
          )
  
      static member val buttonImage = UIImage.FromFile "UIButtonBarProfile.png" with get
  
      member val Leave:(string -> unit) = (fun (slug:string) -> ()) with get, set
  
      [<Outlet>]
      member val WebView: UIWebView = null with get, set
  
      [<Outlet>]
      member val SendButton: UIButton = null with get, set
  
      [<Outlet>]
      member val Text: UITextField = null with get, set
  
      [<Outlet>]
      member val Progress: UIActivityIndicatorView = null with get, set
  
      member this.UserButton:UIBarButtonItem =
          new UIBarButtonItem(PrivateChatSessionViewController.buttonImage, UIBarButtonItemStyle.Plain, new EventHandler(fun (s:obj) (e:EventArgs) -> 
              Navigation.navigate (sprintf "/users/%s" user.Slug) (Some user)
          ))
  
      member this.MoreButton:UIBarButtonItem =
          new UIBarButtonItem(UIImage.FromFile "UITabBarMoreTemplateSelected.png", UIBarButtonItemStyle.Plain, new EventHandler(fun (s:obj) (e:EventArgs) -> showMore()))
  
  
      member this.ViewDidBecomeActive notification = 
          inactiveBufferFlush ()
  
      member this.ViewWillResignActive notification =
          active <- false
  
      override this.ViewDidLoad () =
          this.NavigationItem.LeftItemsSupplementBackButton <- true
          this.NavigationItem.RightBarButtonItems <-
              [|
                  this.MoreButton
                  this.UserButton
              |]
          // Prevents a 64px offset on a webviews scrollview
          this.AutomaticallyAdjustsScrollViewInsets <- false
          this.WebView.BackgroundColor <- Utility.grayLightAccent
  
          this.NavigationItem.Title <- user.Label
  
      override this.ViewDidAppear animated = 
          if loaded = false then
              this.WebView.LoadRequest(new NSUrlRequest(new NSUrl(Api.webUrl + "/api/chat/privateChatTemplate")))
              this.WebView.LoadError.Add(fun error -> showSimpleAlert "Error" error.Error.Description "Close")
              this.WebView.LoadFinished.Add(fun _ ->
                  this.WebView.Delegate <- webViewDelegate
                  this.WebView.SetBodyBackgroundColor (colorToCss Utility.grayLightAccent)
  
                  Async.startNetworkWithContinuation
                      (async {
                          let! session = PrivateChat.session user.Id
                          let history = DB.fetchChatEventHistoryByEntity user.Id
                          return session, history
                      })
                      (function
                          | Api.ApiOk (newSession, historyRemote), historyLocal ->
                              session <- Some newSession
  
                              let history =
                                  [
                                      for event in historyRemote do yield Some event
                                      for event in historyLocal do
                                          if String.IsNullOrEmpty event.EventJson = false then
                                              yield
                                                  try
                                                      Some (JsonConvert.DeserializeObject<ChannelEvent>(event.EventJson))
                                                  with
                                                  | ex ->
                                                      printfn "%A %s" event ex.Message
                                                      None
  
                                  ] |> List.choose id
  
                              let lines = new List<string>()
                              for event in history.OrderBy(fun e -> e.Sequence) do processEvent event (fun l _ -> lines.Add l)
                              addLines (lines.ToArray())
  
                              // Send message
                              this.Text.ShouldReturn <- (fun _ -> sendMessage this.Text.Text; false)
                              this.SendButton.TouchUpInside.Add(fun args -> sendMessage this.Text.Text )
                              this.Progress.StopAnimating ()
  
                              if loaded = false then
                                  loaded <- true
                                  processor.Start()
  
                          | error, _ -> this.HandleApiFailure error
                      )
              )
  
          Async.startInBackgroundWithContinuation 
              (fun _ ->
                  DB.updateChatHistoryReadById user.Id
  
negative.code:     let start (user:Entity) =
          let _, controller =
              let controllerAdd = new PrivateChatSessionViewController (user) 
              controllerAdd.OnLeave <- leave
  
              sessions.AddOrUpdate (
                  user.Id,
  