diff --git a/_images/components/message/overview.png b/_images/components/message/overview.png
new file mode 100644
index 00000000000..074255b4667
Binary files /dev/null and b/_images/components/message/overview.png differ
diff --git a/components/message.rst b/components/message.rst
new file mode 100644
index 00000000000..ebc6703fd85
--- /dev/null
+++ b/components/message.rst
@@ -0,0 +1,235 @@
+.. index::
+ single: Message
+ single: Components; Message
+
+The Message Component
+=====================
+
+ The Message component helps application to send and receive messages
+ to/from other applications or via
+
+Concepts
+--------
+
+.. image:: /_images/components/message/overview.png
+
+1. **Sender**
+ Responsible for serializing and sending the message to _something_. This something can be a message broker or a 3rd
+ party API for example.
+
+2. **Receiver**
+ Responsible for deserializing and forwarding the messages to handler(s). This can be a message queue puller or an API
+ endpoint for example.
+
+3. **Handler**
+ Given a received message, contains the user business logic related to the message. In practice, that is just a PHP
+ callable.
+
+Bus
+---
+
+The bus is used to dispatch messages. MessageBus' behaviour is in its ordered middleware stack. When using
+the message bus with Symfony's FrameworkBundle, the following middlewares are configured for you:
+
+1. `LoggingMiddleware` (log the processing of your messages)
+2. `SendMessageMiddleware` (enable asynchronous processing)
+3. `HandleMessageMiddleware` (call the registered handle)
+
+ use App\Message\MyMessage;
+
+ $result = $this->get('message_bus')->handle(new MyMessage(/* ... */));
+
+Handlers
+--------
+
+Once dispatched to the bus, messages will be handled by a "message handler". A message handler is a PHP callable
+(i.e. a function or an instance of a class) that will do the required processing for your message. It _might_ return a
+result.
+
+ namespace App\MessageHandler;
+
+ use App\Message\MyMessage;
+
+ class MyMessageHandler
+ {
+ public function __invoke(MyMessage $message)
+ {
+ // Message processing...
+ }
+ }
+
+
+
Made by '.$message->getUsername().'
', + 'text/html' + ) + ); + } + } + +2. Register your sender service + + services: + App\MessageSender\ImportantActionToEmailSender: + arguments: + - "@mailer" + - "%to_email%" + + tags: + - message.sender + +3. Route your important message to the sender + + framework: + message: + routing: + 'App\Message\ImportantAction': [App\MessageSender\ImportantActionToEmailSender, ~] + +**Note:** this example shows you how you can at the same time send your message and directly handle it using a `null` +(`~`) sender. + +Your own receiver +----------------- + +A consumer is responsible of receiving messages from a source and dispatching them to the application. + +Let's say you already proceed some "orders" on your application using a `NewOrder` message. Now you want to integrate with +a 3rd party or a legacy application but you can't use an API and need to use a shared CSV file with new orders. + +You will read this CSV file and dispatch a `NewOrder` message. All you need to do is your custom CSV consumer and Symfony will do the rest. + +1. Create your receiver + + namespace App\MessageReceiver; + + use Symfony\Component\Message\ReceiverInterface; + use Symfony\Component\Serializer\SerializerInterface; + + use App\Message\NewOrder; + + class NewOrdersFromCsvFile implements ReceiverInterface + { + private $serializer; + private $filePath; + + public function __construct(SerializerInteface $serializer, string $filePath) + { + $this->serializer = $serializer; + $this->filePath = $filePath; + } + + public function receive() : \Generator + { + $ordersFromCsv = $this->serializer->deserialize(file_get_contents($this->filePath), 'csv'); + + foreach ($ordersFromCsv as $orderFromCsv) { + yield new NewOrder($orderFromCsv['id'], $orderFromCsv['account_id'], $orderFromCsv['amount']); + } + } + } + +2. Register your receiver service + + services: + App\MessageReceiver\NewOrdersFromCsvFile: + arguments: + - "@serializer" + - "%new_orders_csv_file_path%" + + tags: + - message.receiver + +3. Use your consumer + + $ bin/console message:consume App\MessageReceived\NewOrdersFromCsvFile