diff --git a/tests/integration/data/caret.html b/tests/integration/data/caret.html
new file mode 100644
index 000000000..b704d2a83
--- /dev/null
+++ b/tests/integration/data/caret.html
@@ -0,0 +1,11 @@
+
+
+
+
+ Caret mode
+
+
+ one two three
eins zwei drei
+ four five six
vier fünf sechs
+
+
diff --git a/tests/integration/features/caret.feature b/tests/integration/features/caret.feature
new file mode 100644
index 000000000..79faae189
--- /dev/null
+++ b/tests/integration/features/caret.feature
@@ -0,0 +1,260 @@
+Feature: Caret mode
+ In caret mode, the user can select and yank text using the keyboard.
+
+ Background:
+ Given I open data/caret.html
+ And I run :enter-mode caret
+
+ # document
+
+ Scenario: Selecting the entire document
+ When I run :toggle-selection
+ And I run :move-to-end-of-document
+ And I run :yank-selected
+ Then the clipboard should contain:
+ one two three
+ eins zwei drei
+
+ four five six
+ vier fünf sechs
+
+ Scenario: Moving to end and to start of document
+ When I run :move-to-end-of-document
+ And I run :move-to-start-of-document
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "one"
+
+ Scenario: Moving to end and to start of document (with selection)
+ When I run :move-to-end-of-document
+ And I run :toggle-selection
+ And I run :move-to-start-of-document
+ And I run :yank-selected
+ Then the clipboard should contain:
+ one two three
+ eins zwei drei
+
+ four five six
+ vier fünf sechs
+
+ # block
+
+ Scenario: Selecting a block
+ When I run :toggle-selection
+ And I run :move-to-end-of-next-block
+ And I run :yank-selected
+ Then the clipboard should contain:
+ one two three
+ eins zwei drei
+
+ Scenario: Moving back to the end of previous block (with selection)
+ When I run :move-to-end-of-next-block with count 2
+ And I run :toggle-selection
+ And I run :move-to-end-of-prev-block
+ And I run :move-to-prev-word
+ And I run :yank-selected
+ Then the clipboard should contain:
+ drei
+
+ four five six
+
+ Scenario: Moving back to the end of previous block
+ When I run :move-to-end-of-next-block with count 2
+ And I run :move-to-end-of-prev-block
+ And I run :toggle-selection
+ And I run :move-to-prev-word
+ And I run :yank-selected
+ Then the clipboard should contain "drei"
+
+ Scenario: Moving back to the start of previous block (with selection)
+ When I run :move-to-end-of-next-block with count 2
+ And I run :toggle-selection
+ And I run :move-to-start-of-prev-block
+ And I run :yank-selected
+ Then the clipboard should contain:
+ eins zwei drei
+
+ four five six
+
+ Scenario: Moving back to the start of previous block
+ When I run :move-to-end-of-next-block with count 2
+ And I run :move-to-start-of-prev-block
+ And I run :toggle-selection
+ And I run :move-to-next-word
+ And I run :yank-selected
+ Then the clipboard should contain "eins "
+
+ Scenario: Moving to the start of next block (with selection)
+ When I run :toggle-selection
+ And I run :move-to-start-of-next-block
+ And I run :yank-selected
+ Then the clipboard should contain "one two three\n"
+
+ Scenario: Moving to the start of next block
+ When I run :move-to-start-of-next-block
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "eins"
+
+ # line
+
+ Scenario: Selecting a line
+ When I run :toggle-selection
+ And I run :move-to-end-of-line
+ And I run :yank-selected
+ Then the clipboard should contain "one two three"
+
+ Scenario: Moving and selecting a line
+ When I run :move-to-next-line
+ And I run :toggle-selection
+ And I run :move-to-end-of-line
+ And I run :yank-selected
+ Then the clipboard should contain "eins zwei drei"
+
+ Scenario: Selecting next line
+ When I run :toggle-selection
+ And I run :move-to-next-line
+ And I run :yank-selected
+ Then the clipboard should contain "one two three\n"
+
+ Scenario: Moving to end and to start of line
+ When I run :move-to-end-of-line
+ And I run :move-to-start-of-line
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "one"
+
+ Scenario: Selecting a line (backwards)
+ When I run :move-to-end-of-line
+ And I run :toggle-selection
+ When I run :move-to-start-of-line
+ And I run :yank-selected
+ Then the clipboard should contain "one two three"
+
+ Scenario: Selecting previous line
+ When I run :move-to-next-line
+ And I run :toggle-selection
+ When I run :move-to-prev-line
+ And I run :yank-selected
+ Then the clipboard should contain "one two three\n"
+
+ Scenario: Moving to previous line
+ When I run :move-to-next-line
+ When I run :move-to-prev-line
+ And I run :toggle-selection
+ When I run :move-to-next-line
+ And I run :yank-selected
+ Then the clipboard should contain "one two three\n"
+
+ # word
+
+ Scenario: Selecting a word
+ When I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "one"
+
+ Scenario: Moving to end and selecting a word
+ When I run :move-to-end-of-word
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain " two"
+
+ Scenario: Moving to next word and selecting a word
+ When I run :move-to-next-word
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "two"
+
+ Scenario: Moving to next word and selecting until next word
+ When I run :move-to-next-word
+ And I run :toggle-selection
+ And I run :move-to-next-word
+ And I run :yank-selected
+ Then the clipboard should contain "two "
+
+ Scenario: Moving to previous word and selecting a word
+ When I run :move-to-end-of-word
+ And I run :toggle-selection
+ And I run :move-to-prev-word
+ And I run :yank-selected
+ Then the clipboard should contain "one"
+
+ Scenario: Moving to previous word
+ When I run :move-to-end-of-word
+ And I run :move-to-prev-word
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "one"
+
+ # char
+
+ Scenario: Selecting a char
+ When I run :toggle-selection
+ And I run :move-to-next-char
+ And I run :yank-selected
+ Then the clipboard should contain "o"
+
+ Scenario: Moving and selecting a char
+ When I run :move-to-next-char
+ And I run :toggle-selection
+ And I run :move-to-next-char
+ And I run :yank-selected
+ Then the clipboard should contain "n"
+
+ Scenario: Selecting previous char
+ When I run :move-to-end-of-word
+ And I run :toggle-selection
+ And I run :move-to-prev-char
+ And I run :yank-selected
+ Then the clipboard should contain "e"
+
+ Scenario: Moving to previous char
+ When I run :move-to-end-of-word
+ And I run :move-to-prev-char
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the clipboard should contain "e"
+
+ # :yank-selected
+
+ Scenario: :yank-selected without selection
+ When I run :yank-selected
+ Then the message "Nothing to yank" should be shown.
+
+ Scenario: :yank-selected message
+ When I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected
+ Then the message "3 chars yanked to clipboard" should be shown.
+
+ Scenario: :yank-selected message with one char
+ When I run :toggle-selection
+ And I run :move-to-next-char
+ And I run :yank-selected
+ Then the message "1 char yanked to clipboard" should be shown.
+
+ Scenario: :yank-selected with primary selection
+ When selection is supported
+ And I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected --sel
+ Then the message "3 chars yanked to primary selection" should be shown.
+ And the primary selection should contain "one"
+
+ Scenario: :yank-selected with --keep
+ When I run :toggle-selection
+ And I run :move-to-end-of-word
+ And I run :yank-selected --keep
+ And I run :move-to-end-of-word
+ And I run :yank-selected --keep
+ Then the message "3 chars yanked to clipboard" should be shown.
+ And the message "7 chars yanked to clipboard" should be shown.
+ And the clipboard should contain "one two"
diff --git a/tests/integration/features/test_caret.py b/tests/integration/features/test_caret.py
new file mode 100644
index 000000000..652b015f8
--- /dev/null
+++ b/tests/integration/features/test_caret.py
@@ -0,0 +1,39 @@
+# vim: ft=python fileencoding=utf-8 sts=4 sw=4 et:
+
+# Copyright 2015 Florian Bruhin (The Compiler)
+#
+# This file is part of qutebrowser.
+#
+# qutebrowser is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# qutebrowser is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with qutebrowser. If not, see .
+
+import pytest
+
+import pytest_bdd as bdd
+
+from test_yankpaste import skip_with_broken_clipboard
+
+
+# https://github.com/The-Compiler/qutebrowser/issues/1124#issuecomment-158073581
+pytestmark = pytest.mark.qt_log_ignore(
+ '^QXcbClipboard: SelectionRequest too old', extend=True)
+
+
+bdd.scenarios('caret.feature')
+
+
+@bdd.then(bdd.parsers.parse('the clipboard should contain:\n{content}'))
+def clipboard_contains_multiline(qapp, content):
+ data = qapp.clipboard().text()
+ expected = '\n'.join(line.strip() for line in content.splitlines())
+ assert data == expected