diff --git a/media/webrtc/webrtcvideoengine2.cc b/media/webrtc/webrtcvideoengine2.cc
index 2cd2229..1edb175 100644
--- a/media/webrtc/webrtcvideoengine2.cc
+++ b/media/webrtc/webrtcvideoengine2.cc
@@ -249,6 +249,42 @@
   return _stricmp(codec.name.c_str(), kVp8CodecName) == 0;
 }
 
+DefaultUnsignalledSsrcHandler::DefaultUnsignalledSsrcHandler()
+    : default_recv_ssrc_(0), default_renderer_(NULL) {}
+
+UnsignalledSsrcHandler::Action DefaultUnsignalledSsrcHandler::OnUnsignalledSsrc(
+    VideoMediaChannel* channel,
+    uint32_t ssrc) {
+  if (default_recv_ssrc_ != 0) {  // Already one default stream.
+    LOG(LS_WARNING) << "Unknown SSRC, but default receive stream already set.";
+    return kDropPacket;
+  }
+
+  StreamParams sp;
+  sp.ssrcs.push_back(ssrc);
+  LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
+  if (!channel->AddRecvStream(sp)) {
+    LOG(LS_WARNING) << "Could not create default receive stream.";
+  }
+
+  channel->SetRenderer(ssrc, default_renderer_);
+  default_recv_ssrc_ = ssrc;
+  return kDeliverPacket;
+}
+
+VideoRenderer* DefaultUnsignalledSsrcHandler::GetDefaultRenderer() const {
+  return default_renderer_;
+}
+
+void DefaultUnsignalledSsrcHandler::SetDefaultRenderer(
+    VideoMediaChannel* channel,
+    VideoRenderer* renderer) {
+  default_renderer_ = renderer;
+  if (default_recv_ssrc_ != 0) {
+    channel->SetRenderer(default_recv_ssrc_, default_renderer_);
+  }
+}
+
 WebRtcVideoEngine2::WebRtcVideoEngine2() {
   // Construct without a factory or voice engine.
   Construct(NULL, NULL, new rtc::CpuMonitor(NULL));
@@ -641,7 +677,8 @@
     WebRtcVideoEngine2* engine,
     VoiceMediaChannel* voice_channel,
     WebRtcVideoEncoderFactory2* encoder_factory)
-    : encoder_factory_(encoder_factory) {
+    : encoder_factory_(encoder_factory),
+      unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_) {
   // TODO(pbos): Connect the video and audio with |voice_channel|.
   webrtc::Call::Config config(this);
   Construct(webrtc::Call::Create(config), engine);
@@ -651,7 +688,8 @@
     webrtc::Call* call,
     WebRtcVideoEngine2* engine,
     WebRtcVideoEncoderFactory2* encoder_factory)
-    : encoder_factory_(encoder_factory) {
+    : encoder_factory_(encoder_factory),
+      unsignalled_ssrc_handler_(&default_unsignalled_ssrc_handler_) {
   Construct(call, engine);
 }
 
@@ -660,9 +698,7 @@
   rtcp_receiver_report_ssrc_ = kDefaultRtcpReceiverReportSsrc;
   sending_ = false;
   call_.reset(call);
-  default_renderer_ = NULL;
   default_send_ssrc_ = 0;
-  default_recv_ssrc_ = 0;
 
   SetDefaultOptions();
 }
@@ -928,9 +964,6 @@
 
   uint32 ssrc = sp.first_ssrc();
   assert(ssrc != 0);  // TODO(pbos): Is this ever valid?
-  if (default_recv_ssrc_ == 0) {
-    default_recv_ssrc_ = ssrc;
-  }
 
   // TODO(pbos): Check if any of the SSRCs overlap.
   if (receive_streams_.find(ssrc) != receive_streams_.end()) {
@@ -987,7 +1020,8 @@
 bool WebRtcVideoChannel2::RemoveRecvStream(uint32 ssrc) {
   LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
   if (ssrc == 0) {
-    ssrc = default_recv_ssrc_;
+    LOG(LS_ERROR) << "RemoveRecvStream with 0 ssrc is not supported.";
+    return false;
   }
 
   std::map<uint32, WebRtcVideoReceiveStream*>::iterator stream =
@@ -999,10 +1033,6 @@
   delete stream->second;
   receive_streams_.erase(stream);
 
-  if (ssrc == default_recv_ssrc_) {
-    default_recv_ssrc_ = 0;
-  }
-
   return true;
 }
 
@@ -1010,11 +1040,7 @@
   LOG(LS_INFO) << "SetRenderer: ssrc:" << ssrc << " "
                << (renderer ? "(ptr)" : "NULL");
   if (ssrc == 0) {
-    if (default_recv_ssrc_!= 0) {
-      receive_streams_[default_recv_ssrc_]->SetRenderer(renderer);
-    }
-    ssrc = default_recv_ssrc_;
-    default_renderer_ = renderer;
+    default_unsignalled_ssrc_handler_.SetDefaultRenderer(this, renderer);
     return true;
   }
 
@@ -1030,11 +1056,8 @@
 
 bool WebRtcVideoChannel2::GetRenderer(uint32 ssrc, VideoRenderer** renderer) {
   if (ssrc == 0) {
-    if (default_renderer_ == NULL) {
-      return false;
-    }
-    *renderer = default_renderer_;
-    return true;
+    *renderer = default_unsignalled_ssrc_handler_.GetDefaultRenderer();
+    return *renderer != NULL;
   }
 
   std::map<uint32, WebRtcVideoReceiveStream*>::iterator it =
@@ -1117,26 +1140,23 @@
   }
 
   uint32 ssrc = 0;
-  if (default_recv_ssrc_ != 0) {  // Already one default stream.
-    LOG(LS_WARNING) << "Unknown SSRC, but default receive stream already set.";
-    return;
-  }
-
   if (!GetRtpSsrc(packet->data(), packet->length(), &ssrc)) {
     return;
   }
 
-  StreamParams sp;
-  sp.ssrcs.push_back(ssrc);
-  LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
-  AddRecvStream(sp);
-  SetRenderer(0, default_renderer_);
+  // TODO(pbos): Make sure that the unsignalled SSRC uses the video payload.
+  // Also figure out whether RTX needs to be handled.
+  switch (unsignalled_ssrc_handler_->OnUnsignalledSsrc(this, ssrc)) {
+    case UnsignalledSsrcHandler::kDropPacket:
+      return;
+    case UnsignalledSsrcHandler::kDeliverPacket:
+      break;
+  }
 
   if (call_->Receiver()->DeliverPacket(
           reinterpret_cast<const uint8_t*>(packet->data()), packet->length()) !=
       webrtc::PacketReceiver::DELIVERY_OK) {
-    LOG(LS_WARNING) << "Failed to deliver RTP packet after creating default "
-                       "receiver.";
+    LOG(LS_WARNING) << "Failed to deliver RTP packet on re-delivery.";
     return;
   }
 }
diff --git a/media/webrtc/webrtcvideoengine2.h b/media/webrtc/webrtcvideoengine2.h
index a718e9c..94e9c61 100644
--- a/media/webrtc/webrtcvideoengine2.h
+++ b/media/webrtc/webrtcvideoengine2.h
@@ -82,6 +82,31 @@
 class WebRtcVideoChannel2;
 class WebRtcVideoRenderer;
 
+class UnsignalledSsrcHandler {
+ public:
+  enum Action {
+    kDropPacket,
+    kDeliverPacket,
+  };
+  virtual Action OnUnsignalledSsrc(VideoMediaChannel* engine,
+                                   uint32_t ssrc) = 0;
+};
+
+// TODO(pbos): Remove, use external handlers only.
+class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
+ public:
+  DefaultUnsignalledSsrcHandler();
+  virtual Action OnUnsignalledSsrc(VideoMediaChannel* engine,
+                                   uint32_t ssrc) OVERRIDE;
+
+  VideoRenderer* GetDefaultRenderer() const;
+  void SetDefaultRenderer(VideoMediaChannel* channel, VideoRenderer* renderer);
+
+ private:
+  uint32_t default_recv_ssrc_;
+  VideoRenderer* default_renderer_;
+};
+
 class WebRtcVideoEncoderFactory2 {
  public:
   virtual ~WebRtcVideoEncoderFactory2();
@@ -386,8 +411,9 @@
   bool sending_;
   rtc::scoped_ptr<webrtc::Call> call_;
   uint32_t default_send_ssrc_;
-  uint32_t default_recv_ssrc_;
-  VideoRenderer* default_renderer_;
+
+  DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_;
+  UnsignalledSsrcHandler* const unsignalled_ssrc_handler_;
 
   // Using primary-ssrc (first ssrc) as key.
   std::map<uint32, WebRtcVideoSendStream*> send_streams_;
