       @runMovement backward, sentence
       @collapseSelectionToFocus()
       @runMovements ([0...count].map -> [ forward, sentence ])...
+    else if entity == paragraph
+      # Chrome's paragraph movements are weird: they're not symmetrical, and they tend to stop in odd places
+      # (like mid-paragraph, for example).  Here, we define a paragraph as a new-line delimited entity,
+      # including the terminating newline.
+      char = @getNextBackwardCharacter()
+      while char and char != "\n"
+        return unless @runMovements [ backward, character ], [ backward, lineboundary ]
+        char = @getNextBackwardCharacter()
+      @collapseSelectionToFocus()
+      char = @getNextForwardCharacter()
+      while char and char != "\n"
+        return unless @runMovements [ forward, character ], [ forward, lineboundary ]
+        char = @getNextForwardCharacter()
+      @runMovement forward, character
 
   # Try to scroll the focus into view.
   scrollIntoView: ->

    @exit()
    @yankedText

  # For "daw", "2das", and so on.  We select a lexical entity (a word, a sentence or a paragraph).
  # Note(smblott).  Chrome's paragraph movements are asymmetrical, so we don't support those.  So, just words
  # and sentences, for now.
  selectLexicalEntity: (entity, count = 1) ->
    if entity == word
      if @nextCharacterIsWordCharacter()

      new mode

  # Return the character following the focus, and leave the selection unchanged.
  getNextForwardCharacter: ->
    beforeText = @selection.toString()
    if beforeText.length == 0 or @getDirection() == forward
      @selection.modify "extend", forward, character
