diff --git a/message/amd/build/message_send_bulk.min.js b/message/amd/build/message_send_bulk.min.js
new file mode 100644
index 00000000000..124d648916a
--- /dev/null
+++ b/message/amd/build/message_send_bulk.min.js
@@ -0,0 +1,2 @@
+define ("core_message/message_send_bulk",["exports","core/str","core/modal_factory","core/templates","core/modal_events","core/ajax","core/notification"],function(a,b,c,d,e,f,g){"use strict";Object.defineProperty(a,"__esModule",{value:!0});a.sendMessage=a.showModal=void 0;c=h(c);d=h(d);e=h(e);f=h(f);g=h(g);function h(a){return a&&a.__esModule?a:{default:a}}var i=function(a){var f=1.\n\n/**\n * Send bulk message to the given user ids.\n *\n * @module core_message/message_send_bulk\n * @copyright 2019 Shamim Rezaie \n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {get_string} from 'core/str';\nimport ModalFactory from 'core/modal_factory';\nimport Templates from 'core/templates';\nimport ModalEvents from 'core/modal_events';\nimport Ajax from 'core/ajax';\nimport Notification from 'core/notification';\n\n/**\n * Show the send message popup.\n *\n * @method showModal\n * @param {int[]} users\n * @param {Function} callback A callback to apply after the form is closed.\n * @returns {Promise}\n */\nexport const showModal = (users, callback = null) => {\n if (!users.length) {\n // Nothing to do.\n return Promise.resolve();\n }\n let titlePromise = null;\n if (users.length == 1) {\n titlePromise = get_string('sendbulkmessagesingle', 'core_message');\n } else {\n titlePromise = get_string('sendbulkmessage', 'core_message', users.length);\n }\n\n return ModalFactory.create({\n type: ModalFactory.types.SAVE_CANCEL,\n body: Templates.render('core_user/send_bulk_message', {}),\n title: titlePromise,\n })\n .then(function(modal) {\n modal.setSaveButtonText(titlePromise);\n\n // We want to focus on the action select when the dialog is closed.\n modal.getRoot().on(ModalEvents.hidden, function() {\n if (callback) {\n callback();\n }\n modal.getRoot().remove();\n });\n\n modal.getRoot().on(ModalEvents.save, function() {\n let messageText = modal.getRoot().find('form textarea').val();\n sendMessage(messageText, users);\n });\n\n modal.show();\n\n return modal;\n });\n};\n\n/**\n * Send a message to these users.\n *\n * @method sendMessage\n * @param {String} messageText\n * @param {Number[]} users\n * @returns {Promise}\n */\nexport const sendMessage = (messageText, users) => {\n let messages = [];\n\n users.forEach(user => {\n messages.push({\n touserid: user,\n text: messageText\n });\n });\n\n return Ajax.call([{\n methodname: 'core_message_send_instant_messages',\n args: {messages: messages}\n }])[0]\n .then(function(messageIds) {\n if (messageIds.length == 1) {\n return get_string('sendbulkmessagesentsingle', 'core_message');\n } else {\n return get_string('sendbulkmessagesent', 'core_message', messageIds.length);\n }\n })\n .then(function(msg) {\n Notification.addNotification({\n message: msg,\n type: \"success\"\n });\n return true;\n })\n .catch(Notification.exception);\n};\n"],"file":"message_send_bulk.min.js"}
\ No newline at end of file
diff --git a/message/amd/src/message_send_bulk.js b/message/amd/src/message_send_bulk.js
new file mode 100644
index 00000000000..50c56ec3738
--- /dev/null
+++ b/message/amd/src/message_send_bulk.js
@@ -0,0 +1,114 @@
+// This file is part of Moodle - http://moodle.org/
+//
+// Moodle 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.
+//
+// Moodle 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 Moodle. If not, see .
+
+/**
+ * Send bulk message to the given user ids.
+ *
+ * @module core_message/message_send_bulk
+ * @copyright 2019 Shamim Rezaie
+ * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
+ */
+import {get_string} from 'core/str';
+import ModalFactory from 'core/modal_factory';
+import Templates from 'core/templates';
+import ModalEvents from 'core/modal_events';
+import Ajax from 'core/ajax';
+import Notification from 'core/notification';
+
+/**
+ * Show the send message popup.
+ *
+ * @method showModal
+ * @param {int[]} users
+ * @param {Function} callback A callback to apply after the form is closed.
+ * @returns {Promise}
+ */
+export const showModal = (users, callback = null) => {
+ if (!users.length) {
+ // Nothing to do.
+ return Promise.resolve();
+ }
+ let titlePromise = null;
+ if (users.length == 1) {
+ titlePromise = get_string('sendbulkmessagesingle', 'core_message');
+ } else {
+ titlePromise = get_string('sendbulkmessage', 'core_message', users.length);
+ }
+
+ return ModalFactory.create({
+ type: ModalFactory.types.SAVE_CANCEL,
+ body: Templates.render('core_user/send_bulk_message', {}),
+ title: titlePromise,
+ })
+ .then(function(modal) {
+ modal.setSaveButtonText(titlePromise);
+
+ // We want to focus on the action select when the dialog is closed.
+ modal.getRoot().on(ModalEvents.hidden, function() {
+ if (callback) {
+ callback();
+ }
+ modal.getRoot().remove();
+ });
+
+ modal.getRoot().on(ModalEvents.save, function() {
+ let messageText = modal.getRoot().find('form textarea').val();
+ sendMessage(messageText, users);
+ });
+
+ modal.show();
+
+ return modal;
+ });
+};
+
+/**
+ * Send a message to these users.
+ *
+ * @method sendMessage
+ * @param {String} messageText
+ * @param {Number[]} users
+ * @returns {Promise}
+ */
+export const sendMessage = (messageText, users) => {
+ let messages = [];
+
+ users.forEach(user => {
+ messages.push({
+ touserid: user,
+ text: messageText
+ });
+ });
+
+ return Ajax.call([{
+ methodname: 'core_message_send_instant_messages',
+ args: {messages: messages}
+ }])[0]
+ .then(function(messageIds) {
+ if (messageIds.length == 1) {
+ return get_string('sendbulkmessagesentsingle', 'core_message');
+ } else {
+ return get_string('sendbulkmessagesent', 'core_message', messageIds.length);
+ }
+ })
+ .then(function(msg) {
+ Notification.addNotification({
+ message: msg,
+ type: "success"
+ });
+ return true;
+ })
+ .catch(Notification.exception);
+};