     block = @document.getBlockAtIndex(endLocation.index)
     breaksOnReturn = block.breaksOnReturn()
     previousCharacter = block.text.getStringAtPosition(endLocation.offset - 1)
-
-    if block.hasAttributes()
-      if block.isListItem()
-        if block.isEmpty()
-          @decreaseListLevel()
-          @setSelection(startPosition)
-        else if startLocation.offset is 0
-          document = new Trix.Document [block.copyWithoutText()]
-          @insertDocument(document)
-        else
-          @insertBlockBreak()
-      else
-        if block.isEmpty()
-          @removeLastBlockAttribute()
-        else if breaksOnReturn and startLocation.offset is 0
-          @insertBlockBreak()
-        else if previousCharacter is "\n" or breaksOnReturn
-          @breakFormattedBlock()
-        else
-          @insertString("\n")
+    nextCharacter = block.text.getStringAtPosition(endLocation.offset)
+
+    if @returnShouldDecreaseListLevel()
+      @decreaseListLevel()
+      @setSelection(startPosition)
+    else if @returnShouldPrependListItem()
+      document = new Trix.Document [block.copyWithoutText()]
+      @insertDocument(document)
+    else if @returnShouldInsertBlockBreak()
+      @insertBlockBreak()
+    else if @returnShouldRemoveLastBlockAttribute()
+      @removeLastBlockAttribute()
+    else if @returnShouldBreakFormattedBlock()
+      @breakFormattedBlock()
     else
       @insertString("\n")
 

    utf16string = @document.toUTF16String()
    utf16position = utf16string.offsetFromUCS2Offset(position)
    utf16string.offsetToUCS2Offset(utf16position + offset)

    else
      if nextCharacter is "\n"
        range = [position - 1, position + 1]
      else if offset - 1 isnt 0
        position += 1

    newDocument = new Trix.Document [block.removeLastAttribute().copyWithoutText()]
    @setDocument( document.insertDocumentAtRange(newDocument, range))
    @setSelection(position)

  insertLineBreak: ->
