diff --git a/providers/core/core.rtcdatachannel.js b/providers/core/core.rtcdatachannel.js
index <HASH>..<HASH> 100644
--- a/providers/core/core.rtcdatachannel.js
+++ b/providers/core/core.rtcdatachannel.js
@@ -18,9 +18,17 @@ var allocateChannel = function (dataChannel) {
   pendingEvents[id] = [];
   eventNames.forEach(function(eventName) {
     // This listener will be overridden (re-set) after the constructor runs.
-    dataChannel[eventName] = function(event) {
-      pendingEvents[id].push(event);
+    var handler = function(event) {
+      var currentHandler = dataChannel[eventName]
+      if (currentHandler === handler) {
+        pendingEvents[id].push(event);
+      } else if (typeof currentHandler === 'function') {
+        // If an event somehow runs on this event handler after it has been
+        // replaced, forward that event to the new event handler.
+        currentHandler(event);
+      }
     };
+    dataChannel[eventName] = handler;
   });
   return id;
 };
Tolerate late events on datachannel.on* event handlers.

In shippable, we have observed a strange error that is consistent
with messages being sent to old event handlers after they are
replaced.  This could happen if the pending call to that specific
handler is queued up before the handler is removed.