--- /dev/null
+Contexts
+========
+
+Before Behat 3, each test suite was limited to a single context class. As of
+Behat 3, it is possible to flexibly structure your code by using multiple
+contexts in a single test suite.
+
+Available Contexts
+------------------
+
+In accordance with this new capability, The Drupal Extension includes the
+following contexts:
+
+*RawDrupalContext*
+ A context that provides no step definitions, but all of the
+ necessary functionality for interacting with Drupal, and with the
+ browser via Mink sessions.
+
+*DrupalContext*
+ Provides step-definitions for creating users, terms, and nodes.
+
+*MinkContext*
+ Builds on top of the Mink Extension and adds steps specific to regions and
+ forms.
+
+*MarkupContext*
+ Contains step definitions that deal with low-level markup (such as tags,
+ classes, and attributes).
+
+*MessageContext*
+ Step-definitions that are specific to Drupal messages that get displayed
+ (notice, warning, and error).
+
+*DrushContext*
+ Allows steps to directly call drush commands.
+
+Custom Contexts
+---------------
+
+You can structure your own code with additional contexts. See Behat's `testing features <http://docs.behat.org/en/latest/guides/4.contexts.html>`_ documentation for a detailed discussion of how contexts work.
+
+.. Important::
+
+ Every context you want to use in a suite must declare it in the behat.yml
+ file.
+
+Example
+#######
+
+In this example, you would have access to:
+
+ * pre-written step definitions for users, terms, and nodes
+ (from the ``DrupalContext``)
+ * steps you've implemented in the main
+ ``features/bootstrap/FeatureContext.php`` file
+ * steps you've implemented in the ``CustomContext`` class
+
+You would not have access to the steps from the ``MarkupContext``,
+``MessageContext``, or ``DrushContext``, however.
+
+.. code-block:: yaml
+ :linenos:
+
+ default:
+ suites:
+ default:
+ contexts:
+ - Drupal\DrupalExtension\Context\DrupalContext
+ - FeatureContext
+ - CustomContext
+
+Context communication
+---------------------
+
+Since Behat 3 can have many concurrent contexts active, communication between those contexts can be important.
+
+The following will gather any specified contexts before a given scenario is run:
+
+ .. literalinclude:: _static/snippets/context-communication.inc
+ :language: php
+ :linenos:
+
+Drupal Extension Hooks
+----------------------
+
+In addition to the `hooks provided by Behat
+<http://behat.readthedocs.org/en/v2.5/guides/3.hooks.html>`_, the Drupal
+Extension provides three additional ways to tag the methods in your
+``CustomContext`` class in order to have them fire before certain events.
+
+ 1. ``@beforeNodeCreate``
+ 2. ``@beforeTermCreate``
+ 3. ``@beforeUserCreate``
+
+Example
+#######
+
+.. code-block:: php
+ :linenos:
+
+ use Drupal\DrupalExtension\Hook\Scope\EntityScope;
+ ...
+ /**
+ * Call this function before nodes are created.
+ *
+ * @beforeNodeCreate
+ */
+ public function alterNodeObject(EntityScope $scope) {
+ $node = $scope->getEntity();
+ // Alter node object as needed.
+ }
+