diff --git a/lib/classes/message/manager.php b/lib/classes/message/manager.php
index c016bd530c6..234cc93ab51 100644
--- a/lib/classes/message/manager.php
+++ b/lib/classes/message/manager.php
@@ -50,13 +50,19 @@ class manager {
      *
      * NOTE: to be used from message_send() only.
      *
-     * @param \stdClass $eventdata fully prepared event data for processors
+     * @param \stdClass|\core\message\message $eventdata fully prepared event data for processors
      * @param \stdClass $savemessage the message saved in 'message' table
      * @param array $processorlist list of processors for target user
      * @return int $messageid the id from 'message' or 'message_read' table (false is not returned)
      */
-    public static function send_message(\stdClass $eventdata, \stdClass $savemessage, array $processorlist) {
+    public static function send_message($eventdata, \stdClass $savemessage, array $processorlist) {
         global $CFG;
+
+        if (!($eventdata instanceof \stdClass) && !($eventdata instanceof message)) {
+            // Not a valid object.
+            throw new \coding_exception('Message should be of type stdClass or \core\message\message');
+        }
+
         require_once($CFG->dirroot.'/message/lib.php'); // This is most probably already included from messagelib.php file.
 
         if (empty($processorlist)) {
@@ -85,12 +91,13 @@ class manager {
     /**
      * Send message to message processors.
      *
-     * @param \stdClass $eventdata
+     * @param \stdClass|\core\message\message $eventdata
      * @param \stdClass $savemessage
      * @param array $processorlist
      * @return int $messageid
      */
-    protected static function send_message_to_processors(\stdClass $eventdata, \stdClass $savemessage, array $processorlist) {
+    protected static function send_message_to_processors($eventdata, \stdClass $savemessage, array
+    $processorlist) {
         global $CFG, $DB;
 
         // We cannot communicate with external systems in DB transactions,
@@ -114,7 +121,9 @@ class manager {
 
         $failed = false;
         foreach ($processorlist as $procname) {
-            if (!$processors[$procname]->object->send_message($eventdata)) {
+            // Let new messaging class add custom content based on the processor.
+            $proceventdata = ($eventdata instanceof message) ? $eventdata->get_eventobject_for_processor($procname) : $eventdata;
+            if (!$processors[$procname]->object->send_message($proceventdata)) {
                 debugging('Error calling message processor ' . $procname);
                 $failed = true;
                 // Previously the $messageid = false here was overridden
diff --git a/lib/messagelib.php b/lib/messagelib.php
index 8f9ee6a25a5..d700bcabac7 100644
--- a/lib/messagelib.php
+++ b/lib/messagelib.php
@@ -51,7 +51,7 @@ require_once(dirname(dirname(__FILE__)) . '/message/lib.php');
  *       earlier versions did not do it consistently either.
  *
  * @category message
- * @param stdClass $eventdata information about the message (component, userfrom, userto, ...)
+ * @param stdClass|\core\message\message $eventdata information about the message (component, userfrom, userto, ...)
  * @return mixed the integer ID of the new message or false if there was a problem with submitted data
  */
 function message_send($eventdata) {