diff --git a/src/common/connection.py b/src/common/connection.py
index 6a2f11456d198d145c877b53dc66b015975e7159..18d42c40f1b617dc95aa6e4799e414aa69e19616 100644
--- a/src/common/connection.py
+++ b/src/common/connection.py
@@ -757,6 +757,8 @@ class Connection(CommonConnection, ConnectionHandlers):
             self._nec_agent_info_received)
         gajim.ged.register_event_handler('message-outgoing', ged.OUT_CORE,
             self._nec_message_outgoing)
+        gajim.ged.register_event_handler('gc-message-outgoing', ged.OUT_CORE,
+            self._nec_gc_message_outgoing)
     # END __init__
 
     def cleanup(self):
@@ -769,6 +771,8 @@ class Connection(CommonConnection, ConnectionHandlers):
             self._nec_agent_info_received)
         gajim.ged.remove_event_handler('message-outgoing', ged.OUT_CORE,
             self._nec_message_outgoing)
+        gajim.ged.remove_event_handler('message-outgoing', ged.OUT_CORE,
+            self._nec_gc_message_outgoing)
 
     def get_config_values_or_default(self):
         if gajim.config.get_per('accounts', self.name, 'keep_alives_enabled'):
@@ -2600,6 +2604,42 @@ class Connection(CommonConnection, ConnectionHandlers):
         if callback:
             callback(msg_iq, msg)
 
+    def _nec_gc_message_outgoing(self, obj):
+        if obj.account != self.name:
+            return
+        if not gajim.account_is_connected(self.name):
+            return
+
+        if obj.correction_msg:
+            id_ = obj.correction_msg.getID()
+            if obj.correction_msg.getTag('replace'):
+                obj.correction_msg.delChild('replace')
+            obj.correction_msg.setTag('replace', attrs={'id': id_},
+                namespace=nbxmpp.NS_CORRECT)
+            id2 = self.connection.getAnID()
+            obj.correction_msg.setID(id2)
+            obj.correction_msg.setBody(obj.message)
+            if obj.xhtml:
+                obj.correction_msg.setXHTML(xhtml)
+            self.connection.send(obj.correction_msg)
+            gajim.nec.push_incoming_event(MessageSentEvent(None, conn=self,
+                jid=obj.jid, message=obj.message, keyID=None, chatstate=None))
+            if obj.callback:
+                obj.callback(obj.correction_msg, obj.message)
+            return
+        if not obj.xhtml and gajim.config.get('rst_formatting_outgoing_messages'):
+            from common.rst_xhtml_generator import create_xhtml
+            obj.xhtml = create_xhtml(obj.message)
+        msg_iq = nbxmpp.Message(obj.jid, obj.message, typ='groupchat',
+            xhtml=obj.xhtml)
+        if obj.label is not None:
+            msg_iq.addChild(node=label)
+        self.connection.send(msg_iq)
+        gajim.nec.push_incoming_event(MessageSentEvent(None, conn=self,
+            jid=obj.jid, message=obj.message, keyID=None, chatstate=None))
+        if obj.callback:
+            obj.callback(msg_iq, obj.message)
+
     def send_gc_subject(self, jid, subject):
         if not gajim.account_is_connected(self.name):
             return
diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py
index 0710455e7728471e868b44ebf755b55b2677cf42..aa7d69dbef4d7c9ada3fa2a73062fdcff85e6316 100644
--- a/src/common/connection_handlers_events.py
+++ b/src/common/connection_handlers_events.py
@@ -2444,6 +2444,25 @@ class MessageOutgoingEvent(nec.NetworkOutgoingEvent):
     def generate(self):
         return True
 
+
+class GcMessageOutgoingEvent(nec.NetworkOutgoingEvent):
+    name = 'gc-message-outgoing'
+    base_network_events = []
+
+    def init(self):
+        self.message = ''
+        self.xhtml = None
+        self.label = None
+        self.callback = None
+        self.callback_args = []
+        self.is_loggable = True
+        self.control = None
+        self.correction_msg = None
+
+    def generate(self):
+        return True
+
+
 class ClientCertPassphraseEvent(nec.NetworkIncomingEvent):
     name = 'client-cert-passphrase'
     base_network_events = []
diff --git a/src/groupchat_control.py b/src/groupchat_control.py
index cf2cbae7e39c6fb61526926aa3938fac09eccac0..a12e05039064ee1eec96d3d6dbda0a7a87bbe9d6 100644
--- a/src/groupchat_control.py
+++ b/src/groupchat_control.py
@@ -54,6 +54,7 @@ from common.exceptions import GajimGeneralException
 
 from command_system.implementation.hosts import PrivateChatCommands
 from command_system.implementation.hosts import GroupChatCommands
+from common.connection_handlers_events import GcMessageOutgoingEvent
 
 import logging
 log = logging.getLogger('gajim.groupchat_control')
@@ -1923,9 +1924,10 @@ class GroupchatControl(ChatControlBase):
             else:
                 correction_msg = None
             # Send the message
-            gajim.connections[self.account].send_gc_message(self.room_jid,
-                message, xhtml=xhtml, label=label,
-                correction_msg=correction_msg, callback=_cb)
+            gajim.nec.push_outgoing_event(GcMessageOutgoingEvent(None,
+                account=self.account, jid=self.room_jid, message=message,
+                xhtml=xhtml, label=label, callback=_cb,
+                callback_args=[_cb] + [message], correction_msg=correction_msg))
             self.msg_textview.get_buffer().set_text('')
             self.msg_textview.grab_focus()
 
diff --git a/src/remote_control.py b/src/remote_control.py
index 6efeb09cbd0cc5b08128fa45bc7d75e3e6ff0981..64b25a19c25630cae60120cc8d3a5534c13c4a7b 100644
--- a/src/remote_control.py
+++ b/src/remote_control.py
@@ -37,7 +37,9 @@ from common import helpers
 from time import time
 from dialogs import AddNewContactWindow, NewChatDialog, JoinGroupchatWindow
 from common import ged
-from common.connection_handlers_events import MessageOutgoingEvent
+from common.connection_handlers_events import MessageOutgoingEvent,
+    GcMessageOutgoingEvent
+
 
 from common import dbus_support
 if dbus_support.supported:
@@ -478,6 +480,8 @@ class SignalObject(dbus.service.Object):
         if connected_account:
             connection = gajim.connections[connected_account]
             connection.send_gc_message(room_jid, message)
+            gajim.nec.push_outgoing_event(GcMessageOutgoingEvent(None,
+                account=connected_account, jid=room_jid, message=message))
             return DBUS_BOOLEAN(True)
         return DBUS_BOOLEAN(False)