diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js
index ab937c07ac..7b1855b678 100644
--- a/src/components/structures/MatrixChat.js
+++ b/src/components/structures/MatrixChat.js
@@ -523,6 +523,9 @@ module.exports = React.createClass({
                     payload.releaseNotes,
                 );
                 break;
+            case 'send_event':
+                this.onSendEvent(payload.room_id, payload.event);
+                break;
         }
     },
 
@@ -1267,6 +1270,27 @@ module.exports = React.createClass({
         });
     },
 
+    onSendEvent: function(roomId, event) {
+        const cli = MatrixClientPeg.get();
+        if (!cli) {
+            dis.dispatch({action: 'message_send_failed'});
+            return;
+        }
+
+        cli.sendEvent(roomId, event.getType(), event.getContent()).done(() => {
+            dis.dispatch({action: 'message_sent'});
+        }, (err) => {
+            if (err.name === 'UnknownDeviceError') {
+                dis.dispatch({
+                    action: 'unknown_device_error',
+                    err: err,
+                    room: cli.getRoom(roomId),
+                });
+            }
+            dis.dispatch({action: 'message_send_failed'});
+        });
+    },
+
     updateStatusIndicator: function(state, prevState) {
         let notifCount = 0;
 
diff --git a/src/components/structures/RoomView.js b/src/components/structures/RoomView.js
index 9306008e71..542b7a3e50 100644
--- a/src/components/structures/RoomView.js
+++ b/src/components/structures/RoomView.js
@@ -168,6 +168,7 @@ module.exports = React.createClass({
             initialEventId: RoomViewStore.getInitialEventId(),
             initialEventPixelOffset: RoomViewStore.getInitialEventPixelOffset(),
             isInitialEventHighlighted: RoomViewStore.isInitialEventHighlighted(),
+            forwardingEvent: RoomViewStore.getForwardingEvent(),
         };
 
         // Temporary logging to diagnose https://github.com/vector-im/riot-web/issues/4307
@@ -452,11 +453,6 @@ module.exports = React.createClass({
                     callState: callState
                 });
 
-                break;
-            case 'forward_event':
-                this.setState({
-                    forwardingEvent: payload.content,
-                });
                 break;
         }
     },
@@ -1164,8 +1160,13 @@ module.exports = React.createClass({
         this.updateTint();
         this.setState({
             editingRoomSettings: false,
-            forwardingEvent: null,
         });
+        if (this.state.forwardingEvent) {
+            dis.dispatch({
+                action: 'forward_event',
+                event: null,
+            });
+        }
         dis.dispatch({action: 'focus_composer'});
     },
 
@@ -1576,7 +1577,7 @@ module.exports = React.createClass({
         } else if (this.state.uploadingRoomSettings) {
             aux = <Loader/>;
         } else if (this.state.forwardingEvent !== null) {
-            aux = <ForwardMessage onCancelClick={this.onCancelClick} currentRoomId={this.state.room.roomId} mxEvent={this.state.forwardingEvent} />;
+            aux = <ForwardMessage onCancelClick={this.onCancelClick} />;
         } else if (this.state.searching) {
             hideCancel = true; // has own cancel
             aux = <SearchBar ref="search_bar" searchInProgress={this.state.searchInProgress } onCancelClick={this.onCancelSearchClick} onSearch={this.onSearch}/>;
diff --git a/src/components/views/rooms/ForwardMessage.js b/src/components/views/rooms/ForwardMessage.js
index 33df201d7c..3c97128a02 100644
--- a/src/components/views/rooms/ForwardMessage.js
+++ b/src/components/views/rooms/ForwardMessage.js
@@ -17,7 +17,6 @@
 
 import React from 'react';
 import { _t } from '../../../languageHandler';
-import MatrixClientPeg from '../../../MatrixClientPeg';
 import dis from '../../../dispatcher';
 import KeyCode from '../../../KeyCode';
 
@@ -26,11 +25,6 @@ module.exports = React.createClass({
     displayName: 'ForwardMessage',
 
     propTypes: {
-        currentRoomId: React.PropTypes.string.isRequired,
-
-        /* the MatrixEvent to be forwarded */
-        mxEvent: React.PropTypes.object.isRequired,
-
         onCancelClick: React.PropTypes.func.isRequired,
     },
 
@@ -44,7 +38,6 @@ module.exports = React.createClass({
     },
 
     componentDidMount: function() {
-        this.dispatcherRef = dis.register(this.onAction);
         document.addEventListener('keydown', this._onKeyDown);
     },
 
@@ -54,30 +47,9 @@ module.exports = React.createClass({
             sideOpacity: 1.0,
             middleOpacity: 1.0,
         });
-        dis.unregister(this.dispatcherRef);
         document.removeEventListener('keydown', this._onKeyDown);
     },
 
-    onAction: function(payload) {
-        if (payload.action === 'view_room') {
-            const event = this.props.mxEvent;
-            const Client = MatrixClientPeg.get();
-            Client.sendEvent(payload.room_id, event.getType(), event.getContent()).done(() => {
-                dis.dispatch({action: 'message_sent'});
-            }, (err) => {
-                if (err.name === "UnknownDeviceError") {
-                    dis.dispatch({
-                        action: 'unknown_device_error',
-                        err: err,
-                        room: Client.getRoom(payload.room_id),
-                    });
-                }
-                dis.dispatch({action: 'message_send_failed'});
-            });
-            if (this.props.currentRoomId === payload.room_id) this.props.onCancelClick();
-        }
-    },
-
     _onKeyDown: function(ev) {
         switch (ev.keyCode) {
             case KeyCode.ESCAPE:
diff --git a/src/stores/RoomViewStore.js b/src/stores/RoomViewStore.js
index ac06d41e81..d68373f0d5 100644
--- a/src/stores/RoomViewStore.js
+++ b/src/stores/RoomViewStore.js
@@ -55,6 +55,8 @@ const INITIAL_STATE = {
     //    pixelOffset: the number of pixels the window is scrolled down
     //        from the focussedEvent.
     scrollStateMap: {},
+
+    forwardingEvent: null,
 };
 
 /**
@@ -116,6 +118,11 @@ class RoomViewStore extends Store {
             case 'update_scroll_state':
                 this._updateScrollState(payload);
                 break;
+            case 'forward_event':
+                this._setState({
+                    forwardingEvent: payload.event,
+                });
+                break;
         }
     }
 
@@ -127,6 +134,7 @@ class RoomViewStore extends Store {
                 initialEventId: payload.event_id,
                 initialEventPixelOffset: undefined,
                 isInitialEventHighlighted: payload.highlighted,
+                forwardingEvent: null,
                 roomLoading: false,
                 roomLoadError: null,
             };
@@ -141,6 +149,14 @@ class RoomViewStore extends Store {
                 }
             }
 
+            if (this._state.forwardingEvent) {
+                dis.dispatch({
+                    action: 'send_event',
+                    room_id: newState.roomId,
+                    event: this._state.forwardingEvent,
+                });
+            }
+
             this._setState(newState);
         } else if (payload.room_alias) {
             // Resolve the alias and then do a second dispatch with the room ID acquired
@@ -276,6 +292,11 @@ class RoomViewStore extends Store {
     getJoinError() {
         return this._state.joinError;
     }
+
+    // The mxEvent if one is about to be forwarded
+    getForwardingEvent() {
+        return this._state.forwardingEvent;
+    }
 }
 
 let singletonRoomViewStore = null;