     @fileSubscriptions.add @file.onDidRename =>
       @emitter.emit 'did-change-path', @getPath()
       @emit "path-changed", this
+
+  onDidFileChange: ->
+    @conflict = true if @isModified()
+    previousContents = @cachedDiskContents
+
+    # Synchrounously update the disk contents because the {File} has already cached them. If the
+    # contents updated asynchrounously multiple `conlict` events could trigger for the same disk
+    # contents.
+    @updateCachedDiskContentsSync()
+    return if previousContents == @cachedDiskContents
+
+    if @conflict
+      @emitter.emit 'did-conflict'
+      @emit "contents-conflicted"
+    else
+      @reload()
 
   # Identifies if the buffer belongs to multiple editors.
   #

  # Public: Sets the encoding for this buffer.
  #
  # * `encoding` The {String} encoding to use such as 'utf8'
  setEncoding: (@encoding) -> @file?.setEncoding(@encoding)

  # Public: Returns the {String} encoding of this buffer.
  getEncoding: -> @encoding ? @file.getEncoding()

    @fileSubscriptions = new CompositeDisposable

    @fileSubscriptions.add @file.onDidChange =>
      @onDidFileChange()

    @fileSubscriptions.add @file.onDidDelete =>
      modified = @getText() != @cachedDiskContents
