Refactor the internal API to the rtp/rtcp module.
Combination of previous CLs in revisions 2211, 2212, 2214, 2215, 2216.
Review URL: https://webrtc-codereview.appspot.com/570008

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2231 4adac7df-926f-26a2-2b94-8c16560cd09d
diff --git a/src/modules/interface/module.h b/src/modules/interface/module.h
index 37e5027..55f8491 100644
--- a/src/modules/interface/module.h
+++ b/src/modules/interface/module.h
@@ -19,9 +19,6 @@
 
 class Module {
  public:
-  // Change the unique identifier of this object.
-  virtual int32_t ChangeUniqueId(const int32_t id) = 0;
-
   // Returns the number of milliseconds until the module want a worker
   // thread to call Process.
   virtual int32_t TimeUntilNextProcess() = 0;
diff --git a/src/modules/rtp_rtcp/interface/rtp_rtcp.h b/src/modules/rtp_rtcp/interface/rtp_rtcp.h
index eb6c8e3..c1f9a4a 100644
--- a/src/modules/rtp_rtcp/interface/rtp_rtcp.h
+++ b/src/modules/rtp_rtcp/interface/rtp_rtcp.h
@@ -13,122 +13,75 @@
 
 #include <vector>
 
-#include "module.h"
-#include "rtp_rtcp_defines.h"
+#include "modules/interface/module.h"
+#include "modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
 
 namespace webrtc {
 // forward declaration
 class Transport;
 
-class RtpRtcp : public Module
-{
-public:
-    /*
-    *   create a RTP/RTCP module object using the system clock
-    *
-    *   id      - unique identifier of this RTP/RTCP module object
-    *   audio   - true for a audio version of the RTP/RTCP module object false will create a video version
+class RtpRtcp : public Module {
+ public:
+  struct Configuration {
+    Configuration()
+        : id(-1),
+          audio(false),
+          clock(NULL),
+          default_module(NULL),
+          incoming_data(NULL),
+          incoming_messages(NULL),
+          outgoing_transport(NULL),
+          rtcp_feedback(NULL),
+          intra_frame_callback(NULL),
+          bandwidth_callback(NULL),
+          audio_messages(NULL),
+          bitrate_observer(NULL) {
+    }
+   /*  id                   - Unique identifier of this RTP/RTCP module object
+    *  audio                - True for a audio version of the RTP/RTCP module
+    *                         object false will create a video version
+    *  clock                - The clock to use to read time. If NULL object
+    *                         will be using the system clock.
+    *  incoming_data        - Callback object that will receive the incoming
+    *                         data
+    *  incoming_messages    - Callback object that will receive the incoming
+    *                         RTP messages.
+    *  outgoing_transport   - Transport object that will be called when packets
+    *                         are ready to be sent out on the network
+    *  rtcp_feedback        - Callback object that will receive the incoming
+    *                         RTP messages.
+    *  intra_frame_callback - Called when the receiver request a intra frame.
+    *  bandwidth_callback   - Called when we receive a changed estimate from
+    *                         the receiver of out stream.
+    *  audio_messages       - Telehone events.
+    *  bitrate_observer     - Called when the estimate of the incoming RTP
+    *                         stream changes.
     */
-    static RtpRtcp* CreateRtpRtcp(const WebRtc_Word32 id,
-                                  const bool audio);
+    int32_t id;
+    bool audio;
+    RtpRtcpClock* clock;
+    RtpRtcp* default_module;
+    RtpData* incoming_data;
+    RtpFeedback* incoming_messages;
+    Transport* outgoing_transport;
+    RtcpFeedback* rtcp_feedback;
+    RtcpIntraFrameObserver* intra_frame_callback;
+    RtcpBandwidthObserver* bandwidth_callback;
+    RtpAudioFeedback* audio_messages;
+    RtpRemoteBitrateObserver* bitrate_observer;
+  };
+  /*
+   *   Create a RTP/RTCP module object using the system clock.
+   *
+   *   configuration  - Configuration of the RTP/RTCP module.
+   */
+  static RtpRtcp* CreateRtpRtcp(const RtpRtcp::Configuration& configuration);
 
-    /*
-    *   create a RTP/RTCP module object
-    *
-    *   id      - unique identifier of this RTP/RTCP module object
-    *   audio   - true for a audio version of the RTP/RTCP module object
-    *             false will create a video version
-    *   clock   - the clock to use to read time; must not be NULL
-    */
-    static RtpRtcp* CreateRtpRtcp(const WebRtc_Word32 id,
-                                  const bool audio,
-                                  RtpRtcpClock* clock);
-
-    /*
-    *   destroy a RTP/RTCP module object
-    *
-    *   module  - object to destroy
-    */
-    static void DestroyRtpRtcp(RtpRtcp* module);
-
-    /*
-    *   Change the unique identifier of this object
-    *
-    *   id      - new unique identifier of this RTP/RTCP module object
-    */
-    virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id) = 0;
-
-    /*
-    *   De-muxing functionality for conferencing
-    *
-    *   register a module that will act as a default module for this module
-    *   used for feedback messages back to the encoder when one encoded stream
-    *   is sent to multiple destinations
-    *
-    *   module  - default module
-    */
-    virtual WebRtc_Word32 RegisterDefaultModule(RtpRtcp* module) = 0;
-
-    /*
-    *   unregister the default module
-    *   will stop the demuxing feedback
-    */
-    virtual WebRtc_Word32 DeRegisterDefaultModule() = 0;
-
-    /*
-    *   returns true if a default module is registered, false otherwise
-    */
-    virtual bool DefaultModuleRegistered() = 0;
-
-    /*
-    *   returns number of registered child modules
-    */
-    virtual WebRtc_UWord32 NumberChildModules() = 0;
-
-    /*
-    *   Lip-sync between voice-video
-    *
-    *   module  - audio module
-    *
-    *   Note: only allowed on a video module
-    */
-    virtual WebRtc_Word32 RegisterSyncModule(RtpRtcp* module) = 0;
-
-    /*
-    *   Turn off lip-sync between voice-video
-    */
-    virtual WebRtc_Word32 DeRegisterSyncModule() = 0;
-
-    /**************************************************************************
-    *
-    *   Receiver functions
-    *
-    ***************************************************************************/
-
-    /*
-    *   Initialize receive side
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 InitReceiver() = 0;
-
-    /*
-    *   Used by the module to deliver the incoming data to the codec module
-    *
-    *   incomingDataCallback    - callback object that will receive the incoming data
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 RegisterIncomingDataCallback(RtpData* incomingDataCallback) = 0;
-
-    /*
-    *   Used by the module to deliver messages to the codec module/appliation
-    *
-    *   incomingMessagesCallback    - callback object that will receive the incoming messages
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 RegisterIncomingRTPCallback(RtpFeedback* incomingMessagesCallback) = 0;
+  /**************************************************************************
+   *
+   *   Receiver functions
+   *
+   ***************************************************************************/
 
     /*
     *   configure a RTP packet timeout value
@@ -138,30 +91,35 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetPacketTimeout(const WebRtc_UWord32 RTPtimeoutMS,
-                                         const WebRtc_UWord32 RTCPtimeoutMS) = 0;
+    virtual WebRtc_Word32 SetPacketTimeout(
+        const WebRtc_UWord32 RTPtimeoutMS,
+        const WebRtc_UWord32 RTCPtimeoutMS) = 0;
 
     /*
     *   Set periodic dead or alive notification
     *
     *   enable              - turn periodic dead or alive notification on/off
-    *   sampleTimeSeconds   - sample interval in seconds for dead or alive notifications
+    *   sampleTimeSeconds   - sample interval in seconds for dead or alive
+    *                         notifications
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetPeriodicDeadOrAliveStatus(const bool enable,
-                                                     const WebRtc_UWord8 sampleTimeSeconds) = 0;
+    virtual WebRtc_Word32 SetPeriodicDeadOrAliveStatus(
+        const bool enable,
+        const WebRtc_UWord8 sampleTimeSeconds) = 0;
 
     /*
     *   Get periodic dead or alive notification status
     *
     *   enable              - periodic dead or alive notification on/off
-    *   sampleTimeSeconds   - sample interval in seconds for dead or alive notifications
+    *   sampleTimeSeconds   - sample interval in seconds for dead or alive
+    *                         notifications
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 PeriodicDeadOrAliveStatus(bool &enable,
-                                                  WebRtc_UWord8 &sampleTimeSeconds) = 0;
+    virtual WebRtc_Word32 PeriodicDeadOrAliveStatus(
+        bool& enable,
+        WebRtc_UWord8& sampleTimeSeconds) = 0;
 
     /*
     *   set voice codec name and payload type
@@ -231,7 +189,8 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 EstimatedRemoteTimeStamp(WebRtc_UWord32& timestamp) const = 0;
+    virtual WebRtc_Word32 EstimatedRemoteTimeStamp(
+        WebRtc_UWord32& timestamp) const = 0;
 
     /*
     *   Get incoming SSRC
@@ -245,7 +204,8 @@
     *
     *   return -1 on failure else the number of valid entries in the list
     */
-    virtual WebRtc_Word32 RemoteCSRCs( WebRtc_UWord32 arrOfCSRC[kRtpCsrcSize]) const  = 0;
+    virtual WebRtc_Word32 RemoteCSRCs(
+        WebRtc_UWord32 arrOfCSRC[kRtpCsrcSize]) const  = 0;
 
     /*
     *   get the currently configured SSRC filter
@@ -289,20 +249,6 @@
     virtual WebRtc_Word32 IncomingPacket(const WebRtc_UWord8* incomingPacket,
                                          const WebRtc_UWord16 packetLength) = 0;
 
-
-    /*
-    *    Option when not using the RegisterSyncModule function
-    *
-    *    Inform the module about the received audion NTP
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 IncomingAudioNTP(
-        const WebRtc_UWord32 audioReceivedNTPsecs,
-        const WebRtc_UWord32 audioReceivedNTPfrac,
-        const WebRtc_UWord32 audioRTCPArrivalTimeSecs,
-        const WebRtc_UWord32 audioRTCPArrivalTimeFrac) = 0;
-
     /**************************************************************************
     *
     *   Sender
@@ -310,22 +256,6 @@
     ***************************************************************************/
 
     /*
-    *   Initialize send side
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 InitSender() = 0;
-
-    /*
-    *   Used by the module to send RTP and RTCP packet to the network module
-    *
-    *   outgoingTransport   - transport object that will be called when packets are ready to be sent out on the network
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 RegisterSendTransport(Transport* outgoingTransport) = 0;
-
-    /*
     *   set MTU
     *
     *   size    -  Max transfer unit in bytes, default is 1500
@@ -340,18 +270,21 @@
     *
     *   TCP                     - true for TCP false UDP
     *   IPv6                    - true for IP version 6 false for version 4
-    *   authenticationOverhead  - number of bytes to leave for an authentication header
+    *   authenticationOverhead  - number of bytes to leave for an
+    *                             authentication header
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetTransportOverhead(const bool TCP,
-                                             const bool IPV6,
-                                             const WebRtc_UWord8 authenticationOverhead = 0) = 0;
+    virtual WebRtc_Word32 SetTransportOverhead(
+        const bool TCP,
+        const bool IPV6,
+        const WebRtc_UWord8 authenticationOverhead = 0) = 0;
 
     /*
     *   Get max payload length
     *
-    *   A combination of the configuration MaxTransferUnit and TransportOverhead.
+    *   A combination of the configuration MaxTransferUnit and
+    *   TransportOverhead.
     *   Does not account FEC/ULP/RED overhead if FEC is enabled.
     *   Does not account for RTP headers
     */
@@ -360,7 +293,8 @@
     /*
     *   Get max data payload length
     *
-    *   A combination of the configuration MaxTransferUnit, headers and TransportOverhead.
+    *   A combination of the configuration MaxTransferUnit, headers and
+    *   TransportOverhead.
     *   Takes into account FEC/ULP/RED overhead if FEC is enabled.
     *   Takes into account RTP headers
     */
@@ -490,7 +424,6 @@
                                            const bool setSSRC,
                                            const WebRtc_UWord32 SSRC) = 0;
 
-
     /*
     * Get status of sending RTX (RFC 4588) on a specific SSRC.
     */
@@ -540,14 +473,16 @@
         WebRtc_UWord32* available_bandwidth) const = 0;
 
     /*
-    *   Used by the codec module to deliver a video or audio frame for packetization
+    *   Used by the codec module to deliver a video or audio frame for
+    *   packetization.
     *
     *   frameType       - type of frame to send
     *   payloadType     - payload type of frame to send
     *   timestamp       - timestamp of frame to send
     *   payloadData     - payload buffer of frame to send
     *   payloadSize     - size of payload buffer to send
-    *   fragmentation   - fragmentation offset data for fragmented frames such as layers or RED
+    *   fragmentation   - fragmentation offset data for fragmented frames such
+    *                     as layers or RED
     *
     *   return -1 on failure else 0
     */
@@ -567,16 +502,6 @@
     ***************************************************************************/
 
     /*
-    *   Register a callback objects that will receive callbacks for video
-    *   related events such as an incoming key frame request and events that
-    *   could indicate bandwidth overuse.
-    */
-    virtual void RegisterRtcpObservers(
-        RtcpIntraFrameObserver* intraFrameCallback,
-        RtcpBandwidthObserver* bandwidthCallback,
-        RtcpFeedback* callback) = 0;
-
-    /*
     *    Get RTCP status
     */
     virtual RTCPMethod RTCP() const = 0;
@@ -664,18 +589,21 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SendRTCP(WebRtc_UWord32 rtcpPacketType = kRtcpReport) = 0;
+    virtual WebRtc_Word32 SendRTCP(
+        WebRtc_UWord32 rtcpPacketType = kRtcpReport) = 0;
 
     /*
     *    Good state of RTP receiver inform sender
     */
-    virtual WebRtc_Word32 SendRTCPReferencePictureSelection(const WebRtc_UWord64 pictureID) = 0;
+    virtual WebRtc_Word32 SendRTCPReferencePictureSelection(
+        const WebRtc_UWord64 pictureID) = 0;
 
     /*
     *    Send a RTCP Slice Loss Indication (SLI)
     *    6 least significant bits of pictureID
     */
-    virtual WebRtc_Word32 SendRTCPSliceLossIndication(const WebRtc_UWord8 pictureID) = 0;
+    virtual WebRtc_Word32 SendRTCPSliceLossIndication(
+        const WebRtc_UWord8 pictureID) = 0;
 
     /*
     *   Reset RTP statistics
@@ -689,11 +617,12 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 StatisticsRTP(WebRtc_UWord8  *fraction_lost,  // scale 0 to 255
-                                      WebRtc_UWord32 *cum_lost,       // number of lost packets
-                                      WebRtc_UWord32 *ext_max,        // highest sequence number received
-                                      WebRtc_UWord32 *jitter,
-                                      WebRtc_UWord32 *max_jitter = NULL) const = 0;
+    virtual WebRtc_Word32 StatisticsRTP(
+        WebRtc_UWord8* fraction_lost,  // scale 0 to 255
+        WebRtc_UWord32* cum_lost,      // number of lost packets
+        WebRtc_UWord32* ext_max,       // highest sequence number received
+        WebRtc_UWord32* jitter,
+        WebRtc_UWord32* max_jitter = NULL) const = 0;
 
     /*
     *   Reset RTP data counters for the receiving side
@@ -714,10 +643,11 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 DataCountersRTP(WebRtc_UWord32 *bytesSent,
-                                        WebRtc_UWord32 *packetsSent,
-                                        WebRtc_UWord32 *bytesReceived,
-                                        WebRtc_UWord32 *packetsReceived) const = 0;
+    virtual WebRtc_Word32 DataCountersRTP(
+        WebRtc_UWord32* bytesSent,
+        WebRtc_UWord32* packetsSent,
+        WebRtc_UWord32* bytesReceived,
+        WebRtc_UWord32* packetsReceived) const = 0;
     /*
     *   Get received RTCP sender info
     *
@@ -753,16 +683,18 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetRTCPApplicationSpecificData(const WebRtc_UWord8 subType,
-                                                       const WebRtc_UWord32 name,
-                                                       const WebRtc_UWord8* data,
-                                                       const WebRtc_UWord16 length) = 0;
+    virtual WebRtc_Word32 SetRTCPApplicationSpecificData(
+        const WebRtc_UWord8 subType,
+        const WebRtc_UWord32 name,
+        const WebRtc_UWord8* data,
+        const WebRtc_UWord16 length) = 0;
     /*
     *   (XR) VOIP metric
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetRTCPVoIPMetrics(const RTCPVoIPMetric* VoIPMetric) = 0;
+    virtual WebRtc_Word32 SetRTCPVoIPMetrics(
+        const RTCPVoIPMetric* VoIPMetric) = 0;
 
     /*
     *  (REMB) Receiver Estimated Max Bitrate
@@ -775,11 +707,6 @@
                                       const WebRtc_UWord8 numberOfSSRC,
                                       const WebRtc_UWord32* SSRC) = 0;
 
-    // Registers an observer to call when the estimate of the incoming channel
-    // changes.
-    virtual bool SetRemoteBitrateObserver(
-        RtpRemoteBitrateObserver* observer) = 0;
-
     /*
     *   (IJ) Extended jitter report.
     */
@@ -839,11 +766,14 @@
                                    const WebRtc_UWord16 size) = 0;
 
     /*
-    *   Store the sent packets, needed to answer to a Negative acknowledgement requests
+    *   Store the sent packets, needed to answer to a Negative acknowledgement
+    *   requests
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetStorePacketsStatus(const bool enable, const WebRtc_UWord16 numberToStore = 200) = 0;
+    virtual WebRtc_Word32 SetStorePacketsStatus(
+        const bool enable,
+        const WebRtc_UWord16 numberToStore = 200) = 0;
 
     /**************************************************************************
     *
@@ -852,27 +782,23 @@
     ***************************************************************************/
 
     /*
-    *   RegisterAudioCallback
+    *   set audio packet size, used to determine when it's time to send a DTMF
+    *   packet in silence (CNG)
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 RegisterAudioCallback(RtpAudioFeedback* messagesCallback) = 0;
-
-    /*
-    *   set audio packet size, used to determine when it's time to send a DTMF packet in silence (CNG)
-    *
-    *   return -1 on failure else 0
-    */
-    virtual WebRtc_Word32 SetAudioPacketSize(const WebRtc_UWord16 packetSizeSamples) = 0;
+    virtual WebRtc_Word32 SetAudioPacketSize(
+        const WebRtc_UWord16 packetSizeSamples) = 0;
 
     /*
     *   Outband TelephoneEvent(DTMF) detection
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetTelephoneEventStatus(const bool enable,
-                                                const bool forwardToDecoder,
-                                                const bool detectEndOfTone = false) = 0;
+    virtual WebRtc_Word32 SetTelephoneEventStatus(
+        const bool enable,
+        const bool forwardToDecoder,
+        const bool detectEndOfTone = false) = 0;
 
     /*
     *   Is outband TelephoneEvent(DTMF) turned on/off?
@@ -888,55 +814,61 @@
     /*
     *   SendTelephoneEventActive
     *
-    *   return true if we currently send a telephone event and 100 ms after an event is sent
-    *   used to prevent teh telephone event tone to be recorded by the microphone and send inband
-    *   just after the tone has ended
+    *   return true if we currently send a telephone event and 100 ms after an
+    *   event is sent used to prevent the telephone event tone to be recorded
+    *   by the microphone and send inband just after the tone has ended.
     */
-    virtual bool SendTelephoneEventActive(WebRtc_Word8& telephoneEvent) const = 0;
+    virtual bool SendTelephoneEventActive(
+        WebRtc_Word8& telephoneEvent) const = 0;
 
     /*
     *   Send a TelephoneEvent tone using RFC 2833 (4733)
     *
     *   return -1 on failure else 0
     */
-      virtual WebRtc_Word32 SendTelephoneEventOutband(const WebRtc_UWord8 key,
-                                                  const WebRtc_UWord16 time_ms,
-                                                  const WebRtc_UWord8 level) = 0;
+    virtual WebRtc_Word32 SendTelephoneEventOutband(
+        const WebRtc_UWord8 key,
+        const WebRtc_UWord16 time_ms,
+        const WebRtc_UWord8 level) = 0;
 
     /*
     *   Set payload type for Redundant Audio Data RFC 2198
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetSendREDPayloadType(const WebRtc_Word8 payloadType) = 0;
+    virtual WebRtc_Word32 SetSendREDPayloadType(
+        const WebRtc_Word8 payloadType) = 0;
 
     /*
     *   Get payload type for Redundant Audio Data RFC 2198
     *
     *   return -1 on failure else 0
     */
-     virtual WebRtc_Word32 SendREDPayloadType(WebRtc_Word8& payloadType) const = 0;
+     virtual WebRtc_Word32 SendREDPayloadType(
+         WebRtc_Word8& payloadType) const = 0;
 
      /*
      * Set status and ID for header-extension-for-audio-level-indication.
-     * See https://datatracker.ietf.org/doc/draft-lennox-avt-rtp-audio-level-exthdr/
-     * for more details.
+     * See http://tools.ietf.org/html/rfc6464 for more details.
      *
      * return -1 on failure else 0
      */
-     virtual WebRtc_Word32 SetRTPAudioLevelIndicationStatus(const bool enable,
-                                                          const WebRtc_UWord8 ID) = 0;
+     virtual WebRtc_Word32 SetRTPAudioLevelIndicationStatus(
+         const bool enable,
+         const WebRtc_UWord8 ID) = 0;
 
      /*
      * Get status and ID for header-extension-for-audio-level-indication.
      *
      * return -1 on failure else 0
      */
-     virtual WebRtc_Word32 GetRTPAudioLevelIndicationStatus(bool& enable,
-                                                          WebRtc_UWord8& ID) const = 0;
+     virtual WebRtc_Word32 GetRTPAudioLevelIndicationStatus(
+         bool& enable,
+         WebRtc_UWord8& ID) const = 0;
 
      /*
-     * Store the audio level in dBov for header-extension-for-audio-level-indication.
+     * Store the audio level in dBov for header-extension-for-audio-level-
+     * indication.
      * This API shall be called before transmision of an RTP packet to ensure
      * that the |level| part of the extended RTP header is updated.
      *
@@ -967,9 +899,10 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetGenericFECStatus(const bool enable,
-                                            const WebRtc_UWord8 payloadTypeRED,
-                                            const WebRtc_UWord8 payloadTypeFEC) = 0;
+    virtual WebRtc_Word32 SetGenericFECStatus(
+        const bool enable,
+        const WebRtc_UWord8 payloadTypeRED,
+        const WebRtc_UWord8 payloadTypeFEC) = 0;
 
     /*
     *   Get generic FEC setting
@@ -977,8 +910,8 @@
     *   return -1 on failure else 0
     */
     virtual WebRtc_Word32 GenericFECStatus(bool& enable,
-                                         WebRtc_UWord8& payloadTypeRED,
-                                         WebRtc_UWord8& payloadTypeFEC) = 0;
+                                           WebRtc_UWord8& payloadTypeRED,
+                                           WebRtc_UWord8& payloadTypeFEC) = 0;
 
 
     virtual WebRtc_Word32 SetFecParameters(
@@ -990,7 +923,8 @@
     *
     *   return -1 on failure else 0
     */
-    virtual WebRtc_Word32 SetKeyFrameRequestMethod(const KeyFrameRequestMethod method) = 0;
+    virtual WebRtc_Word32 SetKeyFrameRequestMethod(
+        const KeyFrameRequestMethod method) = 0;
 
     /*
     *   send a request for a keyframe
diff --git a/src/modules/rtp_rtcp/interface/rtp_rtcp_defines.h b/src/modules/rtp_rtcp/interface/rtp_rtcp_defines.h
index 3b6b4a8..110b08c 100644
--- a/src/modules/rtp_rtcp/interface/rtp_rtcp_defines.h
+++ b/src/modules/rtp_rtcp/interface/rtp_rtcp_defines.h
@@ -139,10 +139,6 @@
 class RtcpFeedback
 {
 public:
-    // if audioVideoOffset > 0 video is behind audio
-    virtual void OnLipSyncUpdate(const WebRtc_Word32 /*id*/,
-                                 const WebRtc_Word32 /*audioVideoOffset*/)  {};
-
     virtual void OnApplicationDataReceived(const WebRtc_Word32 /*id*/,
                                            const WebRtc_UWord8 /*subType*/,
                                            const WebRtc_UWord32 /*name*/,
diff --git a/src/modules/rtp_rtcp/source/Bitrate.h b/src/modules/rtp_rtcp/source/Bitrate.h
index ab5637b..3859aaa 100644
--- a/src/modules/rtp_rtcp/source/Bitrate.h
+++ b/src/modules/rtp_rtcp/source/Bitrate.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -25,9 +25,6 @@
 public:
     Bitrate(RtpRtcpClock* clock);
 
-    // initialize members
-    void Init();
-
     // calculate rates
     void Process();
 
diff --git a/src/modules/rtp_rtcp/source/bitrate.cc b/src/modules/rtp_rtcp/source/bitrate.cc
index be0c7dd..0fbb7ad 100644
--- a/src/modules/rtp_rtcp/source/bitrate.cc
+++ b/src/modules/rtp_rtcp/source/bitrate.cc
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -29,21 +29,6 @@
 }
 
 void
-Bitrate::Init()
-{
-    _packetRate = 0;
-    _bitrate = 0;
-    _timeLastRateUpdate = 0;
-    _bytesCount = 0;
-    _packetCount = 0;
-    _bitrateNextIdx = 0;
-
-    memset(_packetRateArray, 0, sizeof(_packetRateArray));
-    memset(_bitrateDiffMS, 0, sizeof(_bitrateDiffMS));
-    memset(_bitrateArray, 0, sizeof(_bitrateArray));
-}
-
-void
 Bitrate::Update(const WebRtc_Word32 bytes)
 {
     _bytesCount += bytes;
diff --git a/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc b/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
index 9fdd6ca..d937f35 100644
--- a/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_format_remb_unittest.cc
@@ -70,7 +70,11 @@
 
 void RtcpFormatRembTest::SetUp() {
   system_clock_ = ModuleRTPUtility::GetSystemClock();
-  dummy_rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(0, false, system_clock_);
+  RtpRtcp::Configuration configuration;
+  configuration.id = 0;
+  configuration.audio = false;
+  configuration.clock = system_clock_;
+  dummy_rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
   rtcp_sender_ = new RTCPSender(0, false, system_clock_, dummy_rtp_rtcp_impl_);
   rtcp_receiver_ = new RTCPReceiver(0, system_clock_, dummy_rtp_rtcp_impl_);
   test_transport_ = new TestTransport(rtcp_receiver_);
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.cc b/src/modules/rtp_rtcp/source/rtcp_receiver.cc
index 2fc7c83..d9365e9 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver.cc
@@ -165,9 +165,6 @@
       GetReportBlockInformation(remoteSSRC);
 
   if (reportBlock == NULL) {
-    WEBRTC_TRACE(kTraceError, kTraceRtpRtcp, _id,
-                 "\tfailed to GetReportBlockInformation(%u)",
-                 remoteSSRC);
     return -1;
   }
   if (RTT) {
@@ -202,16 +199,6 @@
   return 0;
 }
 
-void
-RTCPReceiver::UpdateLipSync(const WebRtc_Word32 audioVideoOffset) const
-{
-    CriticalSectionScoped lock(_criticalSectionFeedbacks);
-    if(_cbRtcpFeedback)
-    {
-        _cbRtcpFeedback->OnLipSyncUpdate(_id,audioVideoOffset);
-    }
-};
-
 WebRtc_Word32
 RTCPReceiver::NTP(WebRtc_UWord32 *ReceivedNTPsecs,
                   WebRtc_UWord32 *ReceivedNTPfrac,
@@ -1247,9 +1234,6 @@
     // Might trigger a OnReceivedBandwidthEstimateUpdate.
     UpdateTMMBR();
   }
-  if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSr) {
-    _rtpRtcp.OnReceivedNTP();
-  }
   if (rtcpPacketInformation.rtcpPacketTypeFlags & kRtcpSrReq) {
     _rtpRtcp.OnRequestSendReport();
   }
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver.h b/src/modules/rtp_rtcp/source/rtcp_receiver.h
index 294e67d..df2d18b4 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver.h
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver.h
@@ -76,8 +76,6 @@
 
     WebRtc_Word32 ResetRTT(const WebRtc_UWord32 remoteSSRC);
 
-    void UpdateLipSync(const WebRtc_Word32 audioVideoOffset) const;
-
     WebRtc_Word32 SenderInfoReceived(RTCPSenderInfo* senderInfo) const;
 
     // get statistics
diff --git a/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
index 5bfdb73..9598a43 100644
--- a/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc
@@ -151,10 +151,12 @@
 class TestTransport : public Transport,
                       public RtpData {
  public:
-  explicit TestTransport(RTCPReceiver* rtcp_receiver) :
-    rtcp_receiver_(rtcp_receiver) {
+  explicit TestTransport()
+      : rtcp_receiver_(NULL) {
   }
-
+  void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) {
+    rtcp_receiver_ = rtcp_receiver;
+  }
   virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) {
     ADD_FAILURE();  // FAIL() gives a compile error.
     return -1;
@@ -180,10 +182,15 @@
   RtcpReceiverTest() {
     // system_clock_ = ModuleRTPUtility::GetSystemClock();
     system_clock_ = new FakeSystemClock();
-    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(0, false, system_clock_);
+    test_transport_ = new TestTransport();
+    RtpRtcp::Configuration configuration;
+    configuration.id = 0;
+    configuration.audio = false;
+    configuration.clock = system_clock_;
+    configuration.outgoing_transport = test_transport_;
+    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
     rtcp_receiver_ = new RTCPReceiver(0, system_clock_, rtp_rtcp_impl_);
-    test_transport_ = new TestTransport(rtcp_receiver_);
-    EXPECT_EQ(0, rtp_rtcp_impl_->RegisterIncomingDataCallback(test_transport_));
+    test_transport_->SetRTCPReceiver(rtcp_receiver_);
   }
   ~RtcpReceiverTest() {
     delete rtcp_receiver_;
diff --git a/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc b/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
index 2d86682..17fbafc 100644
--- a/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
+++ b/src/modules/rtp_rtcp/source/rtcp_sender_unittest.cc
@@ -59,10 +59,12 @@
 class TestTransport : public Transport,
                       public RtpData {
  public:
-  TestTransport(RTCPReceiver* rtcp_receiver) :
-    rtcp_receiver_(rtcp_receiver) {
+  TestTransport()
+      : rtcp_receiver_(NULL) {
   }
-
+  void SetRTCPReceiver(RTCPReceiver* rtcp_receiver) {
+    rtcp_receiver_ = rtcp_receiver;
+  }
   virtual int SendPacket(int /*ch*/, const void* /*data*/, int /*len*/) {
     return -1;
   }
@@ -83,8 +85,9 @@
 
   virtual int OnReceivedPayloadData(const WebRtc_UWord8* payloadData,
                                     const WebRtc_UWord16 payloadSize,
-                                    const WebRtcRTPHeader* rtpHeader)
-                                    {return 0;}
+                                    const WebRtcRTPHeader* rtpHeader) {
+    return 0;
+  }
   RTCPReceiver* rtcp_receiver_;
   RTCPHelp::RTCPPacketInformation rtcp_packet_info_;
 };
@@ -93,14 +96,22 @@
  protected:
   RtcpSenderTest() {
     system_clock_ = ModuleRTPUtility::GetSystemClock();
-    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(0, false, system_clock_);
+    test_transport_ = new TestTransport();
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = 0;
+    configuration.audio = false;
+    configuration.clock = system_clock_;
+    configuration.incoming_data = test_transport_;
+    configuration.outgoing_transport = test_transport_;
+
+    rtp_rtcp_impl_ = new ModuleRtpRtcpImpl(configuration);
     rtcp_sender_ = new RTCPSender(0, false, system_clock_, rtp_rtcp_impl_);
     rtcp_receiver_ = new RTCPReceiver(0, system_clock_, rtp_rtcp_impl_);
-    test_transport_ = new TestTransport(rtcp_receiver_);
+    test_transport_->SetRTCPReceiver(rtcp_receiver_);
     // Initialize
     EXPECT_EQ(0, rtcp_sender_->Init());
     EXPECT_EQ(0, rtcp_sender_->RegisterSendTransport(test_transport_));
-    EXPECT_EQ(0, rtp_rtcp_impl_->RegisterIncomingDataCallback(test_transport_));
   }
   ~RtcpSenderTest() {
     delete rtcp_sender_;
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver.cc b/src/modules/rtp_rtcp/source/rtp_receiver.cc
index ef5e721..40eb6b0 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver.cc
+++ b/src/modules/rtp_rtcp/source/rtp_receiver.cc
@@ -123,75 +123,6 @@
   WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__);
 }
 
-void RTPReceiver::Init() {
-  CriticalSectionScoped lock(_criticalSectionRTPReceiver);
-
-  _lastReceiveTime = 0;
-  _lastReceivedPayloadLength = 0;
-  _packetTimeOutMS = 0;
-  _lastReceivedPayloadType = -1;
-  _lastReceivedMediaPayloadType = -1;
-  _redPayloadType = -1;
-
-  memset(&_lastReceivedAudioSpecific, 0, sizeof(_lastReceivedAudioSpecific));
-  _lastReceivedAudioSpecific.channels = 1;
-
-  _lastReceivedVideoSpecific.videoCodecType = kRtpNoVideo;
-  _lastReceivedVideoSpecific.maxRate = 0;
-  _SSRC = 0;
-  _numCSRCs = 0;
-  _numEnergy = 0;
-  _jitterQ4 = 0;
-  _jitterMaxQ4 = 0;
-  _cumulativeLoss = 0;
-  _jitterQ4TransmissionTimeOffset = 0;
-  _useSSRCFilter = false;
-  _SSRCFilter = 0;
-
-  _localTimeLastReceivedTimestamp = 0;
-  _lastReceivedTimestamp = 0;
-  _lastReceivedSequenceNumber = 0;
-  _lastReceivedTransmissionTimeOffset = 0;
-
-  _receivedSeqFirst = 0;
-  _receivedSeqMax = 0;
-  _receivedSeqWraps = 0;
-
-  _receivedPacketOH = 12; // RTP header
-  _receivedByteCount = 0;
-  _receivedOldPacketCount = 0;
-  _receivedInorderPacketCount = 0;
-
-  _lastReportInorderPackets = 0;
-  _lastReportOldPackets = 0;
-  _lastReportSeqMax = 0;
-  _lastReportFractionLost = 0;
-  _lastReportCumulativeLost = 0;
-  _lastReportExtendedHighSeqNum = 0;
-  _lastReportJitter = 0;
-  _lastReportJitterTransmissionTimeOffset = 0;
-
-  _rtpHeaderExtensionMap.Erase();
-
-  while (!_payloadTypeMap.empty()) {
-    std::map<WebRtc_Word8, Payload*>::iterator it = _payloadTypeMap.begin();
-    delete it->second;
-    _payloadTypeMap.erase(it);
-  }
-
-  Bitrate::Init();
-  RTPReceiverAudio::Init();
-  RTPReceiverVideo::Init();
-}
-
-void
-RTPReceiver::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-    RTPReceiverAudio::ChangeUniqueId(id);
-    RTPReceiverVideo::ChangeUniqueId(id);
-}
-
 RtpVideoCodecTypes
 RTPReceiver::VideoCodecType() const
 {
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver.h b/src/modules/rtp_rtcp/source/rtp_receiver.h
index f283676..d6ecfaa 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver.h
+++ b/src/modules/rtp_rtcp/source/rtp_receiver.h
@@ -39,10 +39,6 @@
 
     virtual ~RTPReceiver();
 
-    virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
-    void Init();
-
     RtpVideoCodecTypes VideoCodecType() const;
     WebRtc_UWord32 MaxConfiguredBitrate() const;
 
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc b/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc
index 1b870e2..a57da75 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_audio.cc
@@ -40,30 +40,6 @@
     delete _criticalSectionFeedback;
 }
 
-WebRtc_Word32 RTPReceiverAudio::Init() {
-  _lastReceivedFrequency = 8000;
-  _telephoneEvent = false;
-  _telephoneEventForwardToDecoder = false;
-  _telephoneEventDetectEndOfTone = false;
-  _telephoneEventPayloadType = -1;
-
-  _telephoneEventReported.clear();
-
-  _cngNBPayloadType = -1;
-  _cngWBPayloadType = -1;
-  _cngSWBPayloadType = -1;
-  _cngPayloadType = -1;
-  _G722PayloadType = -1;
-  _lastReceivedG722 = false;
-  return 0;
-}
-
-void
-RTPReceiverAudio::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-}
-
 WebRtc_Word32
 RTPReceiverAudio::RegisterIncomingAudioCallback(RtpAudioFeedback* incomingMessagesCallback)
 {
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_audio.h b/src/modules/rtp_rtcp/source/rtp_receiver_audio.h
index 89cd062..0b0ba30 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_audio.h
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_audio.h
@@ -27,10 +27,6 @@
     RTPReceiverAudio(const WebRtc_Word32 id);
     virtual ~RTPReceiverAudio();
 
-    virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
-    WebRtc_Word32 Init();
-
     WebRtc_Word32 RegisterIncomingAudioCallback(RtpAudioFeedback* incomingMessagesCallback);
 
     ModuleRTPUtility::Payload* RegisterReceiveAudioPayload(
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_video.cc b/src/modules/rtp_rtcp/source/rtp_receiver_video.cc
index c5f99bd..94d49e0 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_video.cc
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_video.cc
@@ -58,16 +58,6 @@
     delete _receiveFEC;
 }
 
-void RTPReceiverVideo::Init() {
-  _currentFecFrameDecoded = false;
-  _packetOverHead = 28;
-  ResetOverUseDetector();
-}
-
-void RTPReceiverVideo::ChangeUniqueId(const WebRtc_Word32 id) {
-  _id = id;
-}
-
 ModuleRTPUtility::Payload* RTPReceiverVideo::RegisterReceiveVideoPayload(
     const char payloadName[RTP_PAYLOAD_NAME_SIZE],
     const WebRtc_Word8 payloadType,
diff --git a/src/modules/rtp_rtcp/source/rtp_receiver_video.h b/src/modules/rtp_rtcp/source/rtp_receiver_video.h
index f2e223e..ce32293 100644
--- a/src/modules/rtp_rtcp/source/rtp_receiver_video.h
+++ b/src/modules/rtp_rtcp/source/rtp_receiver_video.h
@@ -32,10 +32,6 @@
 
   virtual ~RTPReceiverVideo();
 
-  virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
-  void Init();
-
   ModuleRTPUtility::Payload* RegisterReceiveVideoPayload(
       const char payloadName[RTP_PAYLOAD_NAME_SIZE],
       const WebRtc_Word8 payloadType,
diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
index 8906e20..e2ab811 100644
--- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
+++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.cc
@@ -36,222 +36,103 @@
 
 const WebRtc_UWord16 kDefaultRtt = 200;
 
-RtpRtcp* RtpRtcp::CreateRtpRtcp(const WebRtc_Word32 id,
-                                bool audio) {
-  if(audio) {
-    WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, id, "CreateRtpRtcp(audio)");
+RtpRtcp* RtpRtcp::CreateRtpRtcp(const RtpRtcp::Configuration& configuration) {
+  if (configuration.clock) {
+    return new ModuleRtpRtcpImpl(configuration);
   } else {
-    WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, id, "CreateRtpRtcp(video)");
-  }
-  // ModuleRTPUtility::GetSystemClock() creates a new instance of a system
-  // clock implementation. The OwnsClock() function informs the module that
-  // it is responsible for deleting the instance.
-  ModuleRtpRtcpImpl* rtp_rtcp_instance = new ModuleRtpRtcpImpl(id,
-      audio, ModuleRTPUtility::GetSystemClock());
-  rtp_rtcp_instance->OwnsClock();
-  return rtp_rtcp_instance;
-}
-
-RtpRtcp* RtpRtcp::CreateRtpRtcp(const WebRtc_Word32 id,
-                                const bool audio,
-                                RtpRtcpClock* clock) {
-  if (audio) {
-    WEBRTC_TRACE(kTraceModuleCall,
-                 kTraceRtpRtcp,
-                 id,
-                 "CreateRtpRtcp(audio)");
-  } else {
-    WEBRTC_TRACE(kTraceModuleCall,
-                 kTraceRtpRtcp,
-                 id,
-                 "CreateRtpRtcp(video)");
-  }
-  return new ModuleRtpRtcpImpl(id, audio, clock);
-}
-
-void RtpRtcp::DestroyRtpRtcp(RtpRtcp* module) {
-  if (module) {
-    WEBRTC_TRACE(kTraceModuleCall,
-                 kTraceRtpRtcp,
-                 static_cast<ModuleRtpRtcpImpl*>(module)->Id(),
-                 "DestroyRtpRtcp()");
-    delete static_cast<ModuleRtpRtcpImpl*>(module);
+    RtpRtcp::Configuration configuration_copy;
+    memcpy(&configuration_copy, &configuration,
+           sizeof(RtpRtcp::Configuration));
+    configuration_copy.clock = ModuleRTPUtility::GetSystemClock();
+    ModuleRtpRtcpImpl* rtp_rtcp_instance =
+        new ModuleRtpRtcpImpl(configuration_copy);
+    rtp_rtcp_instance->OwnsClock();
+    return rtp_rtcp_instance;
   }
 }
 
-ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const WebRtc_Word32 id,
-                                     const bool audio,
-                                     RtpRtcpClock* clock):
-  _rtpSender(id, audio, clock),
-  _rtpReceiver(id, audio, clock, this),
-  _rtcpSender(id, audio, clock, this),
-  _rtcpReceiver(id, clock, this),
-  _owns_clock(false),
-  _clock(*clock),
-  _id(id),
-  _audio(audio),
-  _collisionDetected(false),
-  _lastProcessTime(clock->GetTimeInMS()),
-  _lastBitrateProcessTime(clock->GetTimeInMS()),
-  _lastPacketTimeoutProcessTime(clock->GetTimeInMS()),
-  _packetOverHead(28), // IPV4 UDP
-  _criticalSectionModulePtrs(CriticalSectionWrapper::CreateCriticalSection()),
-  _criticalSectionModulePtrsFeedback(
-    CriticalSectionWrapper::CreateCriticalSection()),
-  _defaultModule(NULL),
-  _audioModule(NULL),
-  _videoModule(NULL),
-  _deadOrAliveActive(false),
-  _deadOrAliveTimeoutMS(0),
-  _deadOrAliveLastTimer(0),
-  _receivedNTPsecsAudio(0),
-  _receivedNTPfracAudio(0),
-  _RTCPArrivalTimeSecsAudio(0),
-  _RTCPArrivalTimeFracAudio(0),
-  _nackMethod(kNackOff),
-  _nackLastTimeSent(0),
-  _nackLastSeqNumberSent(0),
-  _simulcast(false),
-  _keyFrameReqMethod(kKeyFrameReqFirRtp)
+ModuleRtpRtcpImpl::ModuleRtpRtcpImpl(const Configuration& configuration)
+    : _rtpSender(configuration.id, configuration.audio, configuration.clock),
+      _rtpReceiver(configuration.id, configuration.audio, configuration.clock,
+                   this),
+      _rtcpSender(configuration.id, configuration.audio, configuration.clock,
+                  this),
+      _rtcpReceiver(configuration.id, configuration.clock, this),
+      _owns_clock(false),
+      _clock(*configuration.clock),
+      _id(configuration.id),
+      _audio(configuration.audio),
+      _collisionDetected(false),
+      _lastProcessTime(configuration.clock->GetTimeInMS()),
+      _lastBitrateProcessTime(configuration.clock->GetTimeInMS()),
+      _lastPacketTimeoutProcessTime(configuration.clock->GetTimeInMS()),
+      _packetOverHead(28),  // IPV4 UDP
+      _criticalSectionModulePtrs(
+          CriticalSectionWrapper::CreateCriticalSection()),
+      _criticalSectionModulePtrsFeedback(
+          CriticalSectionWrapper::CreateCriticalSection()),
+      _defaultModule(
+          static_cast<ModuleRtpRtcpImpl*>(configuration.default_module)),
+      _deadOrAliveActive(false),
+      _deadOrAliveTimeoutMS(0),
+      _deadOrAliveLastTimer(0),
+      _nackMethod(kNackOff),
+      _nackLastTimeSent(0),
+      _nackLastSeqNumberSent(0),
+      _simulcast(false),
+      _keyFrameReqMethod(kKeyFrameReqFirRtp)
 #ifdef MATLAB
-  , _plot1(NULL)
+       , _plot1(NULL)
 #endif
 {
   _sendVideoCodec.codecType = kVideoCodecUnknown;
+
+  if (_defaultModule) {
+    _defaultModule->RegisterChildModule(this);
+  }
+  // TODO(pwestin) move to constructors of each rtp/rtcp sender/receiver object.
+  _rtpReceiver.RegisterIncomingDataCallback(configuration.incoming_data);
+  _rtpReceiver.RegisterIncomingRTPCallback(configuration.incoming_messages);
+  _rtcpReceiver.RegisterRtcpObservers(configuration.intra_frame_callback,
+                                      configuration.bandwidth_callback,
+                                      configuration.rtcp_feedback);
+  _rtpSender.RegisterAudioCallback(configuration.audio_messages);
+  _rtpReceiver.RegisterIncomingAudioCallback(configuration.audio_messages);
+
+  _rtpSender.RegisterSendTransport(configuration.outgoing_transport);
+  _rtcpSender.RegisterSendTransport(configuration.outgoing_transport);
+
+  _rtcpSender.SetRemoteBitrateObserver(configuration.bitrate_observer);
+
   // make sure that RTCP objects are aware of our SSRC
   WebRtc_UWord32 SSRC = _rtpSender.SSRC();
   _rtcpSender.SetSSRC(SSRC);
 
-  WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, id, "%s created", __FUNCTION__);
+  WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s created", __FUNCTION__);
 }
 
 ModuleRtpRtcpImpl::~ModuleRtpRtcpImpl() {
   WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__);
 
-  // make sure to unregister this module from other modules
+  // All child modules MUST be deleted before deleting the default.
+  assert(_childModules.empty());
 
-  const bool defaultInstance(_childModules.empty() ? false : true);
-
-  if (defaultInstance) {
-    // deregister for the default module
-    // will go in to the child modules and remove it self
-    std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
-    while (it != _childModules.end()) {
-      RtpRtcp* module = *it;
-      _childModules.erase(it);
-      if (module) {
-        module->DeRegisterDefaultModule();
-      }
-      it = _childModules.begin();
-    }
-  } else {
-    // deregister for the child modules
-    // will go in to the default and remove it self
-    DeRegisterDefaultModule();
+  // Deregister for the child modules
+  // will go in to the default and remove it self
+  if (_defaultModule) {
+    _defaultModule->DeRegisterChildModule(this);
   }
-
-  if (_audio) {
-    DeRegisterVideoModule();
-  } else {
-    DeRegisterSyncModule();
-  }
-
 #ifdef MATLAB
   if (_plot1) {
     eng.DeletePlot(_plot1);
     _plot1 = NULL;
   }
 #endif
-
-  delete _criticalSectionModulePtrs;
-  delete _criticalSectionModulePtrsFeedback;
   if (_owns_clock) {
     delete &_clock;
   }
 }
 
-WebRtc_Word32 ModuleRtpRtcpImpl::ChangeUniqueId(const WebRtc_Word32 id) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "ChangeUniqueId(new id:%d)", id);
-
-  _id = id;
-
-  _rtpReceiver.ChangeUniqueId(id);
-  _rtcpReceiver.ChangeUniqueId(id);
-  _rtpSender.ChangeUniqueId(id);
-  _rtcpSender.ChangeUniqueId(id);
-  return 0;
-}
-
-// default encoder that we need to multiplex out
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterDefaultModule(RtpRtcp* module) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterDefaultModule(module:0x%x)", module);
-
-  if (module == NULL) {
-    return -1;
-  }
-  if (module == this) {
-    WEBRTC_TRACE(kTraceError,
-                 kTraceRtpRtcp,
-                 _id,
-                 "RegisterDefaultModule can't register self as default");
-    return -1;
-  }
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-
-  if (_defaultModule) {
-    _defaultModule->DeRegisterChildModule(this);
-  }
-  _defaultModule = (ModuleRtpRtcpImpl*)module;
-  _defaultModule->RegisterChildModule(this);
-  return 0;
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::DeRegisterDefaultModule() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DeRegisterDefaultModule()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_defaultModule) {
-    _defaultModule->DeRegisterChildModule(this);
-    _defaultModule = NULL;
-  }
-  return 0;
-}
-
-bool ModuleRtpRtcpImpl::DefaultModuleRegistered() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DefaultModuleRegistered()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_defaultModule) {
-    return true;
-  }
-  return false;
-}
-
-WebRtc_UWord32 ModuleRtpRtcpImpl::NumberChildModules() {
-  WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, _id, "NumberChildModules");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback);
-  // we use two locks for protecting _childModules one
-  // (_criticalSectionModulePtrsFeedback) for incoming  messages
-  // (BitrateSent and UpdateTMMBR) and _criticalSectionModulePtrs for
-  //  all outgoing messages sending packets etc
-
-  return _childModules.size();
-}
-
 void ModuleRtpRtcpImpl::RegisterChildModule(RtpRtcp* module) {
   WEBRTC_TRACE(kTraceModuleCall,
                kTraceRtpRtcp,
@@ -259,9 +140,9 @@
                "RegisterChildModule(module:0x%x)",
                module);
 
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
+  CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
-  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback);
+  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback.get());
   // we use two locks for protecting _childModules one
   // (_criticalSectionModulePtrsFeedback) for incoming
   // messages (BitrateSent) and _criticalSectionModulePtrs
@@ -275,9 +156,9 @@
                _id,
                "DeRegisterChildModule(module:0x%x)", removeModule);
 
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
+  CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
-  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback);
+  CriticalSectionScoped doubleLock(_criticalSectionModulePtrsFeedback.get());
 
   std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
   while (it != _childModules.end()) {
@@ -290,76 +171,6 @@
   }
 }
 
-// Lip-sync between voice-video engine,
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterSyncModule(RtpRtcp* audioModule) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterSyncModule(module:0x%x)",
-               audioModule);
-
-  if (audioModule == NULL) {
-    return -1;
-  }
-  if (_audio) {
-    return -1;
-  }
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  _audioModule = (ModuleRtpRtcpImpl*)audioModule;
-  return _audioModule->RegisterVideoModule(this);
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::DeRegisterSyncModule() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DeRegisterSyncModule()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_audioModule) {
-    ModuleRtpRtcpImpl* audioModule = _audioModule;
-    _audioModule = NULL;
-    _receivedNTPsecsAudio = 0;
-    _receivedNTPfracAudio = 0;
-    _RTCPArrivalTimeSecsAudio = 0;
-    _RTCPArrivalTimeFracAudio = 0;
-    audioModule->DeRegisterVideoModule();
-  }
-  return 0;
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterVideoModule(RtpRtcp* videoModule) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterVideoModule(module:0x%x)",
-               videoModule);
-
-  if (videoModule == NULL) {
-    return -1;
-  }
-  if (!_audio) {
-    return -1;
-  }
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  _videoModule = (ModuleRtpRtcpImpl*)videoModule;
-  return 0;
-}
-
-void ModuleRtpRtcpImpl::DeRegisterVideoModule() {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "DeRegisterVideoModule()");
-
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
-  if (_videoModule) {
-    ModuleRtpRtcpImpl* videoModule = _videoModule;
-    _videoModule = NULL;
-    videoModule->DeRegisterSyncModule();
-  }
-}
-
 // returns the number of milliseconds until the module want a worker thread
 // to call Process
 WebRtc_Word32 ModuleRtpRtcpImpl::TimeUntilNextProcess() {
@@ -436,20 +247,6 @@
 *   Receiver
 */
 
-WebRtc_Word32 ModuleRtpRtcpImpl::InitReceiver() {
-  WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, _id, "InitReceiver()");
-
-  _packetOverHead = 28; // default is IPV4 UDP
-  _receivedNTPsecsAudio = 0;
-  _receivedNTPfracAudio = 0;
-  _RTCPArrivalTimeSecsAudio = 0;
-  _RTCPArrivalTimeFracAudio = 0;
-
-  _rtpReceiver.Init();
-  _rtpReceiver.SetPacketOverHead(_packetOverHead);
-  return 0;
-}
-
 void ModuleRtpRtcpImpl::ProcessDeadOrAliveTimer() {
   if (_deadOrAliveActive) {
     const WebRtc_UWord32 now = _clock.GetTimeInMS();
@@ -687,7 +484,6 @@
                _id,
                "IncomingPacket(packetLength:%u)",
                incomingPacketLength);
-
   // minimum RTP is 12 bytes
   // minimum RTCP is 8 bytes (RTCP BYE)
   if (incomingPacketLength < 8 || incomingPacket == NULL) {
@@ -754,85 +550,10 @@
   }
 }
 
-WebRtc_Word32 ModuleRtpRtcpImpl::IncomingAudioNTP(
-  const WebRtc_UWord32 audioReceivedNTPsecs,
-  const WebRtc_UWord32 audioReceivedNTPfrac,
-  const WebRtc_UWord32 audioRTCPArrivalTimeSecs,
-  const WebRtc_UWord32 audioRTCPArrivalTimeFrac) {
-  _receivedNTPsecsAudio = audioReceivedNTPsecs;
-  _receivedNTPfracAudio = audioReceivedNTPfrac;
-  _RTCPArrivalTimeSecsAudio = audioRTCPArrivalTimeSecs;
-  _RTCPArrivalTimeFracAudio = audioRTCPArrivalTimeFrac;
-  return 0;
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterIncomingDataCallback(
-  RtpData* incomingDataCallback) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterIncomingDataCallback(incomingDataCallback:0x%x)",
-               incomingDataCallback);
-
-  return _rtpReceiver.RegisterIncomingDataCallback(incomingDataCallback);
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterIncomingRTPCallback(
-  RtpFeedback* incomingMessagesCallback) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterIncomingRTPCallback(incomingMessagesCallback:0x%x)",
-               incomingMessagesCallback);
-
-  return _rtpReceiver.RegisterIncomingRTPCallback(incomingMessagesCallback);
-}
-
-void ModuleRtpRtcpImpl::RegisterRtcpObservers(
-    RtcpIntraFrameObserver* intra_frame_callback,
-    RtcpBandwidthObserver* bandwidth_callback,
-    RtcpFeedback* feedback_callback) {
-  _rtcpReceiver.RegisterRtcpObservers(intra_frame_callback, bandwidth_callback,
-                                      feedback_callback);
-}
-
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterAudioCallback(
-  RtpAudioFeedback* messagesCallback) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterAudioCallback(messagesCallback:0x%x)",
-               messagesCallback);
-
-  if (_rtpSender.RegisterAudioCallback(messagesCallback) == 0) {
-    return _rtpReceiver.RegisterIncomingAudioCallback(messagesCallback);
-  }
-  return -1;
-}
-
 /**
 *   Sender
 */
 
-WebRtc_Word32 ModuleRtpRtcpImpl::InitSender() {
-  WEBRTC_TRACE(kTraceModuleCall, kTraceRtpRtcp, _id, "InitSender()");
-
-  _collisionDetected = false;
-
-  // if we are already receiving inform our sender to avoid collision
-  if (_rtpSender.Init(_rtpReceiver.SSRC()) != 0) {
-    return -1;
-  }
-  WebRtc_Word32 retVal = _rtcpSender.Init();
-
-  // make sure that RTCP objects are aware of our SSRC
-  // (it could have changed due to collision)
-  WebRtc_UWord32 SSRC = _rtpSender.SSRC();
-  _rtcpReceiver.SetSSRC(SSRC);
-  _rtcpSender.SetSSRC(SSRC);
-  return retVal;
-}
-
 WebRtc_Word32 ModuleRtpRtcpImpl::RegisterSendPayload(
   const CodecInst& voiceCodec) {
   WEBRTC_TRACE(kTraceModuleCall,
@@ -962,7 +683,7 @@
 
   if (defaultInstance) {
     // for default we need to update all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
@@ -1060,7 +781,7 @@
     return _rtpSender.SendingMedia();
   }
 
-  CriticalSectionScoped lock(_criticalSectionModulePtrs);
+  CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
   std::list<ModuleRtpRtcpImpl*>::const_iterator it = _childModules.begin();
   while (it != _childModules.end()) {
     RTPSender& rtpSender = (*it)->_rtpSender;
@@ -1072,19 +793,6 @@
   return false;
 }
 
-WebRtc_Word32 ModuleRtpRtcpImpl::RegisterSendTransport(
-  Transport* outgoingTransport) {
-  WEBRTC_TRACE(kTraceModuleCall,
-               kTraceRtpRtcp,
-               _id,
-               "RegisterSendTransport(0x%x)", outgoingTransport);
-
-  if (_rtpSender.RegisterSendTransport(outgoingTransport) == 0) {
-    return _rtcpSender.RegisterSendTransport(outgoingTransport);
-  }
-  return -1;
-}
-
 WebRtc_Word32 ModuleRtpRtcpImpl::SendOutgoingData(
     FrameType frameType,
     WebRtc_Word8 payloadType,
@@ -1121,7 +829,7 @@
       return -1;
     }
     int idx = 0;
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     for (; idx < rtpVideoHdr->simulcastIdx; idx++) {
       it++;
@@ -1144,7 +852,7 @@
                                       NULL,
                                       &(rtpVideoHdr->codecHeader));
   } else {
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     // TODO(pwestin) remove codecInfo from SendOutgoingData
     VideoCodecInformation* codecInfo = NULL;
 
@@ -1198,7 +906,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance) {
     // for default we need to update all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::const_iterator it =
       _childModules.begin();
     while (it != _childModules.end()) {
@@ -1563,11 +1271,6 @@
   return _rtcpSender.SetREMBData(bitrate, numberOfSSRC, SSRC);
 }
 
-bool ModuleRtpRtcpImpl::SetRemoteBitrateObserver(
-  RtpRemoteBitrateObserver* observer) {
-  return _rtcpSender.SetRemoteBitrateObserver(observer);
-}
-
 /*
  *   (IJ) Extended jitter report.
  */
@@ -1655,7 +1358,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance) {
     // for default we need to check all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::const_iterator it =
       _childModules.begin();
     while (it != _childModules.end()) {
@@ -1918,7 +1621,7 @@
 
   const bool haveChildModules(_childModules.empty() ? false : true);
   if (haveChildModules) {
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     if (_simulcast) {
       uint32_t bitrate_remainder = bitrate;
       std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
@@ -1994,7 +1697,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
 
   if (defaultInstance) {
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
@@ -2041,7 +1744,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance) {
     // for default we need to check all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
       RtpRtcp* module = *it;
@@ -2075,7 +1778,7 @@
   const bool defaultInstance(_childModules.empty() ? false : true);
   if (defaultInstance)  {
     // for default we need to update all child modules too
-    CriticalSectionScoped lock(_criticalSectionModulePtrs);
+    CriticalSectionScoped lock(_criticalSectionModulePtrs.get());
 
     std::list<ModuleRtpRtcpImpl*>::iterator it = _childModules.begin();
     while (it != _childModules.end()) {
@@ -2128,7 +1831,7 @@
 
   if (defaultInstance) {
     // for default we need to update the send bitrate
-    CriticalSectionScoped lock(_criticalSectionModulePtrsFeedback);
+    CriticalSectionScoped lock(_criticalSectionModulePtrsFeedback.get());
 
     if (totalRate != NULL)
       *totalRate = 0;
@@ -2183,66 +1886,6 @@
   return 0;
 }
 
-// for lip sync
-void ModuleRtpRtcpImpl::OnReceivedNTP() {
-  // don't do anything if we are the audio module
-  // video module is responsible for sync
-  if (!_audio) {
-    WebRtc_Word32 diff = 0;
-    WebRtc_UWord32 receivedNTPsecs = 0;
-    WebRtc_UWord32 receivedNTPfrac = 0;
-    WebRtc_UWord32 RTCPArrivalTimeSecs = 0;
-    WebRtc_UWord32 RTCPArrivalTimeFrac = 0;
-
-    if (0 == _rtcpReceiver.NTP(&receivedNTPsecs,
-                               &receivedNTPfrac,
-                               &RTCPArrivalTimeSecs,
-                               &RTCPArrivalTimeFrac)) {
-      CriticalSectionScoped lock(_criticalSectionModulePtrs);
-
-      if (_audioModule) {
-        if (0 != _audioModule->RemoteNTP(&_receivedNTPsecsAudio,
-                                         &_receivedNTPfracAudio,
-                                         &_RTCPArrivalTimeSecsAudio,
-                                         &_RTCPArrivalTimeFracAudio)) {
-          // failed ot get audio NTP
-          return;
-        }
-      }
-      if (_receivedNTPfracAudio != 0) {
-        // ReceivedNTPxxx is NTP at sender side when sent.
-        // RTCPArrivalTimexxx is NTP at receiver side when received.
-        // can't use ConvertNTPTimeToMS since calculation can be
-        //  negative
-
-        WebRtc_Word32 NTPdiff = (WebRtc_Word32)
-                                ((_receivedNTPsecsAudio - receivedNTPsecs) *
-                                 1000); // ms
-        NTPdiff += (WebRtc_Word32)
-                   (_receivedNTPfracAudio / FracMS - receivedNTPfrac / FracMS);
-
-        WebRtc_Word32 RTCPdiff =
-            static_cast<WebRtc_Word32> ((_RTCPArrivalTimeSecsAudio -
-                                         RTCPArrivalTimeSecs) * 1000);
-        RTCPdiff += (WebRtc_Word32)
-                    (_RTCPArrivalTimeFracAudio / FracMS -
-                     RTCPArrivalTimeFrac / FracMS);
-
-        diff = NTPdiff - RTCPdiff;
-        // if diff is + video is behind
-        if (diff < -1000 || diff > 1000) {
-          // unresonable ignore value.
-          diff = 0;
-          return;
-        }
-      }
-    }
-    // export via callback
-    // after release of critsect
-    _rtcpReceiver.UpdateLipSync(diff);
-  }
-}
-
 RateControlRegion ModuleRtpRtcpImpl::OnOverUseStateUpdate(
   const RateControlInput& rateControlInput) {
 
diff --git a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h
index f71c9d2..8724d78 100644
--- a/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h
+++ b/src/modules/rtp_rtcp/source/rtp_rtcp_impl.h
@@ -13,11 +13,12 @@
 
 #include <list>
 
-#include "rtcp_receiver.h"
-#include "rtcp_sender.h"
-#include "rtp_receiver.h"
-#include "rtp_rtcp.h"
-#include "rtp_sender.h"
+#include "modules/rtp_rtcp/interface/rtp_rtcp.h"
+#include "modules/rtp_rtcp/source/rtcp_receiver.h"
+#include "modules/rtp_rtcp/source/rtcp_sender.h"
+#include "modules/rtp_rtcp/source/rtp_receiver.h"
+#include "modules/rtp_rtcp/source/rtp_sender.h"
+#include "system_wrappers/interface/scoped_ptr.h"
 
 #ifdef MATLAB
 class MatlabPlot;
@@ -25,34 +26,12 @@
 
 namespace webrtc {
 
-class ModuleRtpRtcpImpl : public RtpRtcp
-{
-public:
-    ModuleRtpRtcpImpl(const WebRtc_Word32 id,
-                      const bool audio,
-                      RtpRtcpClock* clock);
+class ModuleRtpRtcpImpl : public RtpRtcp {
+ public:
+    explicit ModuleRtpRtcpImpl(const RtpRtcp::Configuration& configuration);
 
     virtual ~ModuleRtpRtcpImpl();
 
-    // get Module ID
-    WebRtc_Word32 Id()   {return _id;}
-
-    virtual WebRtc_Word32 ChangeUniqueId(const WebRtc_Word32 id);
-
-    // De-muxing functionality for
-    virtual WebRtc_Word32 RegisterDefaultModule(RtpRtcp* module);
-    virtual WebRtc_Word32 DeRegisterDefaultModule();
-    virtual bool DefaultModuleRegistered();
-
-    virtual WebRtc_UWord32 NumberChildModules();
-
-    // Lip-sync between voice-video
-    virtual WebRtc_Word32 RegisterSyncModule(RtpRtcp* module);
-    virtual WebRtc_Word32 DeRegisterSyncModule();
-
-    virtual WebRtc_Word32 RegisterVideoModule(RtpRtcp* videoModule);
-    virtual void DeRegisterVideoModule();
-
     // returns the number of milliseconds until the module want a worker thread to call Process
     virtual WebRtc_Word32 TimeUntilNextProcess();
 
@@ -62,8 +41,6 @@
     /**
     *   Receiver
     */
-    virtual WebRtc_Word32 InitReceiver();
-
     // configure a timeout value
     virtual WebRtc_Word32 SetPacketTimeout(const WebRtc_UWord32 RTPtimeoutMS,
                                            const WebRtc_UWord32 RTCPtimeoutMS);
@@ -125,31 +102,9 @@
     virtual WebRtc_Word32 IncomingPacket( const WebRtc_UWord8* incomingPacket,
                                         const WebRtc_UWord16 packetLength);
 
-    virtual WebRtc_Word32 IncomingAudioNTP(const WebRtc_UWord32 audioReceivedNTPsecs,
-                                         const WebRtc_UWord32 audioReceivedNTPfrac,
-                                         const WebRtc_UWord32 audioRTCPArrivalTimeSecs,
-                                         const WebRtc_UWord32 audioRTCPArrivalTimeFrac);
-
-    // Used by the module to deliver the incoming data to the codec module
-    virtual WebRtc_Word32 RegisterIncomingDataCallback(
-        RtpData* incomingDataCallback);
-
-    // Used by the module to deliver messages to the codec module/appliation
-    virtual WebRtc_Word32 RegisterIncomingRTPCallback(
-        RtpFeedback* incomingMessagesCallback);
-
-    virtual void RegisterRtcpObservers(
-        RtcpIntraFrameObserver* intraFrameCallback,
-        RtcpBandwidthObserver* bandwidthCallback,
-        RtcpFeedback* callback);
-
-    virtual WebRtc_Word32 RegisterAudioCallback(RtpAudioFeedback* messagesCallback);
-
     /**
     *   Sender
     */
-    virtual WebRtc_Word32 InitSender();
-
     virtual WebRtc_Word32 RegisterSendPayload(const CodecInst& voiceCodec);
 
     virtual WebRtc_Word32 RegisterSendPayload(const VideoCodec& videoCodec);
@@ -216,9 +171,6 @@
 
     virtual bool SendingMedia() const;
 
-    // Used by the module to send RTP and RTCP packet to the network module
-    virtual WebRtc_Word32 RegisterSendTransport(Transport* outgoingTransport);
-
     // Used by the codec module to deliver a video or audio frame for packetization
     virtual WebRtc_Word32 SendOutgoingData(
         const FrameType frameType,
@@ -325,7 +277,6 @@
                                       const WebRtc_UWord8 numberOfSSRC,
                                       const WebRtc_UWord32* SSRC);
 
-    virtual bool SetRemoteBitrateObserver(RtpRemoteBitrateObserver* observer);
     /*
     *   (IJ) Extended jitter report.
     */
@@ -482,8 +433,6 @@
     // good state of RTP receiver inform sender
     virtual WebRtc_Word32 SendRTCPReferencePictureSelection(const WebRtc_UWord64 pictureID);
 
-    void OnReceivedNTP() ;
-
     void OnReceivedTMMBR();
 
     // bad state of RTP receiver request a keyframe
@@ -539,23 +488,15 @@
     WebRtc_UWord32            _lastPacketTimeoutProcessTime;
     WebRtc_UWord16            _packetOverHead;
 
-    CriticalSectionWrapper*       _criticalSectionModulePtrs;
-    CriticalSectionWrapper*       _criticalSectionModulePtrsFeedback;
+    scoped_ptr<CriticalSectionWrapper> _criticalSectionModulePtrs;
+    scoped_ptr<CriticalSectionWrapper> _criticalSectionModulePtrsFeedback;
     ModuleRtpRtcpImpl*            _defaultModule;
-    ModuleRtpRtcpImpl*            _audioModule;
-    ModuleRtpRtcpImpl*            _videoModule;
     std::list<ModuleRtpRtcpImpl*> _childModules;
 
     // Dead or alive
     bool                  _deadOrAliveActive;
     WebRtc_UWord32        _deadOrAliveTimeoutMS;
     WebRtc_UWord32        _deadOrAliveLastTimer;
-
-    WebRtc_UWord32        _receivedNTPsecsAudio;
-    WebRtc_UWord32        _receivedNTPfracAudio;
-    WebRtc_UWord32        _RTCPArrivalTimeSecsAudio;
-    WebRtc_UWord32        _RTCPArrivalTimeFracAudio;
-
     // send side
     NACKMethod            _nackMethod;
     WebRtc_UWord32        _nackLastTimeSent;
diff --git a/src/modules/rtp_rtcp/source/rtp_sender.cc b/src/modules/rtp_rtcp/source/rtp_sender.cc
index e877692b..945171c 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender.cc
@@ -117,7 +117,7 @@
 
   WEBRTC_TRACE(kTraceMemory, kTraceRtpRtcp, _id, "%s deleted", __FUNCTION__);
 }
-
+/*
 WebRtc_Word32
 RTPSender::Init(const WebRtc_UWord32 remoteSSRC)
 {
@@ -173,19 +173,7 @@
     }
     return(0);
 }
-
-void
-RTPSender::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-    if(_audioConfigured)
-    {
-        _audio->ChangeUniqueId(id);
-    } else
-    {
-        _video->ChangeUniqueId(id);
-    }
-}
+*/
 
 void RTPSender::SetTargetSendBitrate(const WebRtc_UWord32 bits) {
   _targetSendBitrate = static_cast<uint16_t>(bits / 1000);
diff --git a/src/modules/rtp_rtcp/source/rtp_sender.h b/src/modules/rtp_rtcp/source/rtp_sender.h
index 3906e8c..37eec48 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender.h
+++ b/src/modules/rtp_rtcp/source/rtp_sender.h
@@ -68,9 +68,6 @@
     RTPSender(const WebRtc_Word32 id, const bool audio, RtpRtcpClock* clock);
     virtual ~RTPSender();
 
-    WebRtc_Word32 Init(const WebRtc_UWord32 remoteSSRC);
-    void ChangeUniqueId(const WebRtc_Word32 id);
-
     void ProcessBitrate();
     void ProcessSendToNetwork();
 
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_audio.cc b/src/modules/rtp_rtcp/source/rtp_sender_audio.cc
index ee3c414..361aea5 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_audio.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender_audio.cc
@@ -51,30 +51,6 @@
 }
 
 WebRtc_Word32
-RTPSenderAudio::Init()
-{
-    CriticalSectionScoped cs(_sendAudioCritsect);
-
-    _dtmfPayloadType = -1;
-    _inbandVADactive = false;
-    _cngNBPayloadType = -1;
-    _cngWBPayloadType = -1;
-    _cngSWBPayloadType = -1;
-    _lastPayloadType = -1;
-    _REDPayloadType = -1;
-    _dtmfTimeLastSent = 0;
-    _dtmfTimestampLastSent = 0;
-    ResetDTMF();
-    return 0;
-}
-
-void
-RTPSenderAudio::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-}
-
-WebRtc_Word32
 RTPSenderAudio::RegisterAudioCallback(RtpAudioFeedback* messagesCallback)
 {
     CriticalSectionScoped cs(_audioFeedbackCritsect);
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_audio.h b/src/modules/rtp_rtcp/source/rtp_sender_audio.h
index 5fda2ef..1ea2fab 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_audio.h
+++ b/src/modules/rtp_rtcp/source/rtp_sender_audio.h
@@ -28,10 +28,6 @@
                    RTPSenderInterface* rtpSender);
     virtual ~RTPSenderAudio();
 
-    void ChangeUniqueId(const WebRtc_Word32 id);
-
-    WebRtc_Word32 Init();
-
     WebRtc_Word32 RegisterAudioPayload(
         const char payloadName[RTP_PAYLOAD_NAME_SIZE],
         const WebRtc_Word8 payloadType,
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_video.cc b/src/modules/rtp_rtcp/source/rtp_sender_video.cc
index 8f44973..f1e3c74 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_video.cc
+++ b/src/modules/rtp_rtcp/source/rtp_sender_video.cc
@@ -67,29 +67,6 @@
     delete _sendVideoCritsect;
 }
 
-WebRtc_Word32
-RTPSenderVideo::Init()
-{
-    CriticalSectionScoped cs(_sendVideoCritsect);
-
-    _retransmissionSettings = kRetransmitBaseLayer;
-    _fecEnabled = false;
-    _payloadTypeRED = -1;
-    _payloadTypeFEC = -1;
-    _numberFirstPartition = 0;
-    memset(&delta_fec_params_, 0, sizeof(delta_fec_params_));
-    memset(&key_fec_params_, 0, sizeof(key_fec_params_));
-    delta_fec_params_.max_fec_frames = key_fec_params_.max_fec_frames = 1;
-    _fecOverheadRate.Init();
-    return 0;
-}
-
-void
-RTPSenderVideo::ChangeUniqueId(const WebRtc_Word32 id)
-{
-    _id = id;
-}
-
 void
 RTPSenderVideo::SetVideoCodecType(RtpVideoCodecTypes videoType)
 {
diff --git a/src/modules/rtp_rtcp/source/rtp_sender_video.h b/src/modules/rtp_rtcp/source/rtp_sender_video.h
index 18f39ca..5c3f70c 100644
--- a/src/modules/rtp_rtcp/source/rtp_sender_video.h
+++ b/src/modules/rtp_rtcp/source/rtp_sender_video.h
@@ -37,10 +37,6 @@
                    RTPSenderInterface* rtpSender);
     virtual ~RTPSenderVideo();
 
-    WebRtc_Word32 Init();
-
-    virtual void ChangeUniqueId(const WebRtc_Word32 id);
-
     virtual RtpVideoCodecTypes VideoCodecType() const;
 
     WebRtc_UWord16 FECPacketOverhead() const;
diff --git a/src/modules/rtp_rtcp/test/testAPI/test_api.cc b/src/modules/rtp_rtcp/test/testAPI/test_api.cc
index 7c1a309..dd12c45 100644
--- a/src/modules/rtp_rtcp/test/testAPI/test_api.cc
+++ b/src/modules/rtp_rtcp/test/testAPI/test_api.cc
@@ -33,13 +33,15 @@
   ~RtpRtcpAPITest() {}
 
   virtual void SetUp() {
-    module = RtpRtcp::CreateRtpRtcp(test_id, true, &fake_clock);
-    EXPECT_EQ(0, module->InitReceiver());
-    EXPECT_EQ(0, module->InitSender());
+    RtpRtcp::Configuration configuration;
+    configuration.id = test_id;
+    configuration.audio = true;
+    configuration.clock = &fake_clock;
+    module = RtpRtcp::CreateRtpRtcp(configuration);
   }
 
   virtual void TearDown() {
-    RtpRtcp::DestroyRtpRtcp(module);
+    delete module;
   }
 
   int test_id;
diff --git a/src/modules/rtp_rtcp/test/testAPI/test_api.h b/src/modules/rtp_rtcp/test/testAPI/test_api.h
index c4ff916..ed9d75a 100644
--- a/src/modules/rtp_rtcp/test/testAPI/test_api.h
+++ b/src/modules/rtp_rtcp/test/testAPI/test_api.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -40,10 +40,13 @@
 // with optional packet loss.
 class LoopBackTransport : public webrtc::Transport {
  public:
-  LoopBackTransport(RtpRtcp* rtpRtcpModule)
+  LoopBackTransport()
     : _count(0),
       _packetLoss(0),
-      _rtpRtcpModule(rtpRtcpModule) {
+      _rtpRtcpModule(NULL) {
+  }
+  void SetSendModule(RtpRtcp* rtpRtcpModule) {
+    _rtpRtcpModule = rtpRtcpModule;
   }
   void DropEveryNthPacket(int n) {
     _packetLoss = n;
diff --git a/src/modules/rtp_rtcp/test/testAPI/test_api_audio.cc b/src/modules/rtp_rtcp/test/testAPI/test_api_audio.cc
index e92f8b6..25b91a0 100644
--- a/src/modules/rtp_rtcp/test/testAPI/test_api_audio.cc
+++ b/src/modules/rtp_rtcp/test/testAPI/test_api_audio.cc
@@ -24,8 +24,6 @@
 
 class VerifyingAudioReceiver : public RtpData {
  public:
-  VerifyingAudioReceiver(RtpRtcp* rtpRtcpModule) {}
-
   virtual WebRtc_Word32 OnReceivedPayloadData(
       const WebRtc_UWord8* payloadData,
       const WebRtc_UWord16 payloadSize,
@@ -132,30 +130,41 @@
   ~RtpRtcpAudioTest() {}
 
   virtual void SetUp() {
-    module1 = RtpRtcp::CreateRtpRtcp(test_id, true, &fake_clock);
-    module2 = RtpRtcp::CreateRtpRtcp(test_id+1, true, &fake_clock);
-
-    EXPECT_EQ(0, module1->InitReceiver());
-    EXPECT_EQ(0, module1->InitSender());
-    EXPECT_EQ(0, module2->InitReceiver());
-    EXPECT_EQ(0, module2->InitSender());
-    data_receiver1 = new VerifyingAudioReceiver(module1);
-    EXPECT_EQ(0, module1->RegisterIncomingDataCallback(data_receiver1));
-    data_receiver2 = new VerifyingAudioReceiver(module2);
-    EXPECT_EQ(0, module2->RegisterIncomingDataCallback(data_receiver2));
-    transport1 = new LoopBackTransport(module2);
-    EXPECT_EQ(0, module1->RegisterSendTransport(transport1));
-    transport2 = new LoopBackTransport(module1);
-    EXPECT_EQ(0, module2->RegisterSendTransport(transport2));
+    audioFeedback = new AudioFeedback();
+    data_receiver1 = new VerifyingAudioReceiver();
+    data_receiver2 = new VerifyingAudioReceiver();
     rtp_callback = new RTPCallback();
-    EXPECT_EQ(0, module2->RegisterIncomingRTPCallback(rtp_callback));
+    transport1 = new LoopBackTransport();
+    transport2 = new LoopBackTransport();
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = test_id;
+    configuration.audio = true;
+    configuration.clock = &fake_clock;
+    configuration.incoming_data = data_receiver1;
+    configuration.outgoing_transport = transport1;
+    configuration.audio_messages = audioFeedback;
+
+    module1 = RtpRtcp::CreateRtpRtcp(configuration);
+
+    configuration.id = test_id + 1;
+    configuration.incoming_data = data_receiver2;
+    configuration.incoming_messages = rtp_callback;
+    configuration.outgoing_transport = transport2;
+    configuration.audio_messages = audioFeedback;
+
+    module2 = RtpRtcp::CreateRtpRtcp(configuration);
+
+    transport1->SetSendModule(module2);
+    transport2->SetSendModule(module1);
   }
 
   virtual void TearDown() {
-    RtpRtcp::DestroyRtpRtcp(module1);
-    RtpRtcp::DestroyRtpRtcp(module2);
+    delete module1;
+    delete module2;
     delete transport1;
     delete transport2;
+    delete audioFeedback;
     delete data_receiver1;
     delete data_receiver2;
     delete rtp_callback;
@@ -168,6 +177,7 @@
   VerifyingAudioReceiver* data_receiver2;
   LoopBackTransport* transport1;
   LoopBackTransport* transport2;
+  AudioFeedback* audioFeedback;
   RTPCallback* rtp_callback;
   WebRtc_UWord32 test_ssrc;
   WebRtc_UWord32 test_timestamp;
@@ -283,9 +293,6 @@
   EXPECT_EQ(0, module1->SetStartTimestamp(test_timestamp));
   EXPECT_EQ(0, module1->SetSendingStatus(true));
 
-  AudioFeedback* audioFeedback = new AudioFeedback();
-  EXPECT_EQ(0, module2->RegisterAudioCallback(audioFeedback));
-
   // Prepare for DTMF.
   voiceCodec.pltype = 97;
   voiceCodec.plfreq = 8000;
diff --git a/src/modules/rtp_rtcp/test/testAPI/test_api_nack.cc b/src/modules/rtp_rtcp/test/testAPI/test_api_nack.cc
index ec4d2bb..ad4dd6a 100644
--- a/src/modules/rtp_rtcp/test/testAPI/test_api_nack.cc
+++ b/src/modules/rtp_rtcp/test/testAPI/test_api_nack.cc
@@ -50,12 +50,15 @@
 
 class NackLoopBackTransport : public webrtc::Transport {
  public:
-  NackLoopBackTransport(RtpRtcp* rtp_rtcp_module, uint32_t rtx_ssrc)
+  NackLoopBackTransport(uint32_t rtx_ssrc)
     : count_(0),
       packet_loss_(0),
       rtx_ssrc_(rtx_ssrc),
       count_rtx_ssrc_(0),
-      module_(rtp_rtcp_module) {
+      module_(NULL) {
+  }
+  void SetSendModule(RtpRtcp* rtpRtcpModule) {
+    module_ = rtpRtcpModule;
   }
   void DropEveryNthPacket(int n) {
     packet_loss_ = n;
@@ -95,9 +98,17 @@
   ~RtpRtcpNackTest() {}
 
   virtual void SetUp() {
-    video_module_ = RtpRtcp::CreateRtpRtcp(kTestId, false, &fake_clock);
-    EXPECT_EQ(0, video_module_->InitReceiver());
-    EXPECT_EQ(0, video_module_->InitSender());
+    transport_ = new NackLoopBackTransport(kTestSsrc + 1);
+    nack_receiver_ = new VerifyingNackReceiver();
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = kTestId;
+    configuration.audio = false;
+    configuration.clock = &fake_clock;
+    configuration.incoming_data = nack_receiver_;
+    configuration.outgoing_transport = transport_;
+    video_module_ = RtpRtcp::CreateRtpRtcp(configuration);
+
     EXPECT_EQ(0, video_module_->SetRTCPStatus(kRtcpCompound));
     EXPECT_EQ(0, video_module_->SetSSRC(kTestSsrc));
     EXPECT_EQ(0, video_module_->SetNACKStatus(kNackRtcp));
@@ -106,11 +117,7 @@
     EXPECT_EQ(0, video_module_->SetSequenceNumber(kTestSequenceNumber));
     EXPECT_EQ(0, video_module_->SetStartTimestamp(111111));
 
-    transport_ = new NackLoopBackTransport(video_module_, kTestSsrc + 1);
-    EXPECT_EQ(0, video_module_->RegisterSendTransport(transport_));
-
-    nack_receiver_ = new VerifyingNackReceiver();
-    EXPECT_EQ(0, video_module_->RegisterIncomingDataCallback(nack_receiver_));
+    transport_->SetSendModule(video_module_);
 
     VideoCodec video_codec;
     memset(&video_codec, 0, sizeof(video_codec));
@@ -128,7 +135,7 @@
   }
 
   virtual void TearDown() {
-    RtpRtcp::DestroyRtpRtcp(video_module_);
+    delete video_module_;
     delete transport_;
     delete nack_receiver_;
   }
diff --git a/src/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc b/src/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc
index 9773620..bdf3c6b 100644
--- a/src/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc
+++ b/src/modules/rtp_rtcp/test/testAPI/test_api_rtcp.cc
@@ -24,7 +24,7 @@
 
 class RtcpCallback : public RtcpFeedback, public RtcpIntraFrameObserver {
  public:
-  RtcpCallback(RtpRtcp* module) {
+  void SetModule(RtpRtcp* module) {
     _rtpRtcpModule = module;
   };
   virtual void OnRTCPPacketTimeout(const WebRtc_Word32 id) {
@@ -85,32 +85,32 @@
   ~RtpRtcpRtcpTest() {}
 
   virtual void SetUp() {
-    module1 = RtpRtcp::CreateRtpRtcp(test_id, true, &fake_clock);
-    module2 = RtpRtcp::CreateRtpRtcp(test_id+1, true, &fake_clock);
-
-    EXPECT_EQ(0, module1->InitReceiver());
-    EXPECT_EQ(0, module1->InitSender());
-    EXPECT_EQ(0, module2->InitReceiver());
-    EXPECT_EQ(0, module2->InitSender());
     receiver = new RtpReceiver();
-    EXPECT_EQ(0, module2->RegisterIncomingDataCallback(receiver));
-    transport1 = new LoopBackTransport(module2);
-    EXPECT_EQ(0, module1->RegisterSendTransport(transport1));
-    transport2 = new LoopBackTransport(module1);
-    EXPECT_EQ(0, module2->RegisterSendTransport(transport2));
-  }
+    transport1 = new LoopBackTransport();
+    transport2 = new LoopBackTransport();
+    myRTCPFeedback1 = new RtcpCallback();
+    myRTCPFeedback2 = new RtcpCallback();
 
-  virtual void TearDown() {
-    RtpRtcp::DestroyRtpRtcp(module1);
-    RtpRtcp::DestroyRtpRtcp(module2);
-    delete transport1;
-    delete transport2;
-    delete receiver;
-  }
+    RtpRtcp::Configuration configuration;
+    configuration.id = test_id;
+    configuration.audio = false;
+    configuration.clock = &fake_clock;
+    configuration.outgoing_transport = transport1;
+    configuration.rtcp_feedback = myRTCPFeedback1;
+    configuration.intra_frame_callback = myRTCPFeedback1;
 
-  void SetUpCallFromModule1(RtcpCallback* feedback1, RtcpCallback* feedback2 ) {
-    module1->RegisterRtcpObservers(feedback1, NULL, feedback1);
-    module2->RegisterRtcpObservers(feedback2, NULL, feedback2);
+    module1 = RtpRtcp::CreateRtpRtcp(configuration);
+
+    configuration.id = test_id + 1;
+    configuration.outgoing_transport = transport2;
+    configuration.rtcp_feedback = myRTCPFeedback2;
+    configuration.intra_frame_callback = myRTCPFeedback2;
+    module2 = RtpRtcp::CreateRtpRtcp(configuration);
+
+    transport1->SetSendModule(module2);
+    transport2->SetSendModule(module1);
+    myRTCPFeedback1->SetModule(module1);
+    myRTCPFeedback2->SetModule(module2);
 
     EXPECT_EQ(0, module1->SetRTCPStatus(kRtcpCompound));
     EXPECT_EQ(0, module2->SetRTCPStatus(kRtcpCompound));
@@ -143,12 +143,23 @@
                                            0, test, 8));
   }
 
+  virtual void TearDown() {
+    delete module1;
+    delete module2;
+    delete transport1;
+    delete transport2;
+    delete receiver;
+  }
+
   int test_id;
   RtpRtcp* module1;
   RtpRtcp* module2;
   RtpReceiver* receiver;
   LoopBackTransport* transport1;
   LoopBackTransport* transport2;
+  RtcpCallback* myRTCPFeedback1;
+  RtcpCallback* myRTCPFeedback2;
+
   WebRtc_UWord32 test_ssrc;
   WebRtc_UWord32 test_timestamp;
   WebRtc_UWord16 test_sequence_number;
@@ -157,20 +168,11 @@
 };
 
 TEST_F(RtpRtcpRtcpTest, RTCP_PLI_RPSI) {
-  RtcpCallback* myRTCPFeedback1 = new RtcpCallback(module1);
-  RtcpCallback* myRTCPFeedback2 = new RtcpCallback(module2);
-
-  SetUpCallFromModule1(myRTCPFeedback1, myRTCPFeedback2);
-
   EXPECT_EQ(0, module1->SendRTCPReferencePictureSelection(kTestPictureId));
   EXPECT_EQ(0, module1->SendRTCPSliceLossIndication(156));
 }
 
 TEST_F(RtpRtcpRtcpTest, RTCP_CNAME) {
-  RtcpCallback* myRTCPFeedback1 = new RtcpCallback(module1);
-  RtcpCallback* myRTCPFeedback2 = new RtcpCallback(module2);
-
-  SetUpCallFromModule1(myRTCPFeedback1, myRTCPFeedback2);
   WebRtc_UWord32 testOfCSRC[webrtc::kRtpCsrcSize];
   EXPECT_EQ(2, module2->RemoteCSRCs(testOfCSRC));
   EXPECT_EQ(test_CSRC[0], testOfCSRC[0]);
@@ -210,10 +212,6 @@
 }
 
 TEST_F(RtpRtcpRtcpTest, RTCP) {
-  RtcpCallback* myRTCPFeedback1 = new RtcpCallback(module1);
-  RtcpCallback* myRTCPFeedback2 = new RtcpCallback(module2);
-
-  SetUpCallFromModule1(myRTCPFeedback1, myRTCPFeedback2);
   RTCPReportBlock reportBlock;
   reportBlock.cumulativeLost = 1;
   reportBlock.delaySinceLastSR = 2;
@@ -316,10 +314,6 @@
 TEST_F(RtpRtcpRtcpTest, RemoteRTCPStatRemote) {
   std::vector<RTCPReportBlock> report_blocks;
 
-  RtcpCallback feedback1(module1);
-  RtcpCallback feedback2(module2);
-
-  SetUpCallFromModule1(&feedback1, &feedback2);
   EXPECT_EQ(0, module1->RemoteRTCPStat(&report_blocks));
   EXPECT_EQ(0u, report_blocks.size());
 
diff --git a/src/modules/rtp_rtcp/test/testAPI/test_api_video.cc b/src/modules/rtp_rtcp/test/testAPI/test_api_video.cc
index 7a06ef7..c5b134a 100644
--- a/src/modules/rtp_rtcp/test/testAPI/test_api_video.cc
+++ b/src/modules/rtp_rtcp/test/testAPI/test_api_video.cc
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -31,20 +31,24 @@
   ~RtpRtcpVideoTest() {}
 
   virtual void SetUp() {
-    video_module = RtpRtcp::CreateRtpRtcp(test_id, false, &fake_clock);
-    EXPECT_EQ(0, video_module->InitReceiver());
-    EXPECT_EQ(0, video_module->InitSender());
+    transport = new LoopBackTransport();
+    receiver = new RtpReceiver();
+    RtpRtcp::Configuration configuration;
+    configuration.id = test_id;
+    configuration.audio = false;
+    configuration.clock = &fake_clock;
+    configuration.incoming_data = receiver;
+    configuration.outgoing_transport = transport;
+
+    video_module = RtpRtcp::CreateRtpRtcp(configuration);
+
     EXPECT_EQ(0, video_module->SetRTCPStatus(kRtcpCompound));
     EXPECT_EQ(0, video_module->SetSSRC(test_ssrc));
     EXPECT_EQ(0, video_module->SetNACKStatus(kNackRtcp));
     EXPECT_EQ(0, video_module->SetStorePacketsStatus(true));
     EXPECT_EQ(0, video_module->SetSendingStatus(true));
 
-    transport = new LoopBackTransport(video_module);
-    EXPECT_EQ(0, video_module->RegisterSendTransport(transport));
-
-    receiver = new RtpReceiver();
-    EXPECT_EQ(0, video_module->RegisterIncomingDataCallback(receiver));
+    transport->SetSendModule(video_module);
 
     VideoCodec video_codec;
     memset(&video_codec, 0, sizeof(video_codec));
@@ -62,7 +66,7 @@
   }
 
   virtual void TearDown() {
-    RtpRtcp::DestroyRtpRtcp(video_module);
+    delete video_module;
     delete transport;
     delete receiver;
   }
diff --git a/src/modules/video_coding/main/test/generic_codec_test.cc b/src/modules/video_coding/main/test/generic_codec_test.cc
index 56b3c86..8d12325 100644
--- a/src/modules/video_coding/main/test/generic_codec_test.cc
+++ b/src/modules/video_coding/main/test/generic_codec_test.cc
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -398,10 +398,14 @@
     /********************************/
     /* Encoder Packet Size Test     */
     /********************************/
-    RtpRtcp& rtpModule = *RtpRtcp::CreateRtpRtcp(1, false);
-    TEST(rtpModule.InitSender() == 0);
     RTPSendCallback_SizeTest sendCallback;
-    rtpModule.RegisterSendTransport(&sendCallback);
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = 1;
+    configuration.audio = false;
+    configuration.outgoing_transport = &sendCallback;
+
+    RtpRtcp& rtpModule = *RtpRtcp::CreateRtpRtcp(configuration);
 
     VCMRTPEncodeCompleteCallback encCompleteCallback(&rtpModule);
     _vcm->InitializeSender();
@@ -485,7 +489,7 @@
         IncrementDebugClock(_frameRate);
     } // first frame encoded
 
-    RtpRtcp::DestroyRtpRtcp(&rtpModule);
+    delete &rtpModule;
     Print();
     delete tmpBuffer;
     delete _decodeCallback;
diff --git a/src/modules/video_coding/main/test/media_opt_test.cc b/src/modules/video_coding/main/test/media_opt_test.cc
index f7679197..b20fce8 100644
--- a/src/modules/video_coding/main/test/media_opt_test.cc
+++ b/src/modules/video_coding/main/test/media_opt_test.cc
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -19,8 +19,6 @@
 #include <vector>
 
 #include "../source/event.h"
-#include "receiver_tests.h" // receive side callbacks
-#include "test_callbacks.h"
 #include "test_macros.h"
 #include "test_util.h" // send side callback
 #include "testsupport/metrics/video_metrics.h"
@@ -67,35 +65,34 @@
 }
 
 
-MediaOptTest::MediaOptTest(VideoCodingModule* vcm, TickTimeBase* clock):
-_vcm(vcm),
-_clock(clock),
-_width(0),
-_height(0),
-_lengthSourceFrame(0),
-_timeStamp(0),
-_frameRate(30.0f),
-_nackEnabled(false),
-_fecEnabled(false),
-_rttMS(0),
-_bitRate(300.0f),
-_lossRate(0.0f),
-_renderDelayMs(0),
-_frameCnt(0),
-_sumEncBytes(0),
-_numFramesDropped(0),
-_numberOfCores(4)
-{
-    _rtp = RtpRtcp::CreateRtpRtcp(1, false);
+MediaOptTest::MediaOptTest(VideoCodingModule* vcm, TickTimeBase* clock)
+    : _vcm(vcm),
+      _rtp(NULL),
+      _outgoingTransport(NULL),
+      _dataCallback(NULL),
+      _clock(clock),
+      _width(0),
+      _height(0),
+      _lengthSourceFrame(0),
+      _timeStamp(0),
+      _frameRate(30.0f),
+      _nackEnabled(false),
+      _fecEnabled(false),
+      _rttMS(0),
+      _bitRate(300.0f),
+      _lossRate(0.0f),
+      _renderDelayMs(0),
+      _frameCnt(0),
+      _sumEncBytes(0),
+      _numFramesDropped(0),
+      _numberOfCores(4) {
 }
 
-MediaOptTest::~MediaOptTest()
-{
-    RtpRtcp::DestroyRtpRtcp(_rtp);
+MediaOptTest::~MediaOptTest() {
+  delete _rtp;
 }
-void
-MediaOptTest::Setup(int testType, CmdArgs& args)
-{
+
+void MediaOptTest::Setup(int testType, CmdArgs& args) {
     /*TEST USER SETTINGS*/
     // test parameters
     _inname = args.inputFile;
@@ -168,7 +165,6 @@
    _lengthSourceFrame  = 3*_width*_height/2;
     _log.open((test::OutputPath() + "VCM_MediaOptLog.txt").c_str(),
               std::fstream::out | std::fstream::app);
-    return;
 }
 
 void
@@ -193,15 +189,6 @@
         printf("Cannot read file %s.\n", _actualSourcename.c_str());
         exit(1);
     }
-
-    if (_rtp->InitReceiver() < 0)
-    {
-        exit(1);
-    }
-    if (_rtp->InitSender() < 0)
-    {
-        exit(1);
-    }
     if (_vcm->InitializeReceiver() < 0)
     {
         exit(1);
@@ -210,6 +197,17 @@
     {
         exit(1);
     }
+    _outgoingTransport = new RTPSendCompleteCallback(_clock);
+    _dataCallback = new RtpDataCallback(_vcm);
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = 1;
+    configuration.audio = false;
+    configuration.incoming_data = _dataCallback;
+    configuration.outgoing_transport = _outgoingTransport;
+    _rtp = RtpRtcp::CreateRtpRtcp(configuration);
+
+    _outgoingTransport->SetRtpModule(_rtp);
 
     // Registering codecs for the RTP module
 
@@ -262,8 +260,6 @@
 
     _vcm->SetRenderDelay(_renderDelayMs);
     _vcm->SetMinimumPlayoutDelay(minPlayoutDelayMs);
-
-    return;
 }
 // The following test shall be conducted under release tests
 
@@ -272,33 +268,23 @@
 WebRtc_Word32
 MediaOptTest::Perform()
 {
-    //Setup();
-    EventWrapper* waitEvent = EventWrapper::Create();
+    VCMDecodeCompleteCallback receiveCallback(_decodedFile);
 
-    // callback settings
     VCMRTPEncodeCompleteCallback* encodeCompleteCallback = new VCMRTPEncodeCompleteCallback(_rtp);
     _vcm->RegisterTransportCallback(encodeCompleteCallback);
     encodeCompleteCallback->SetCodecType(ConvertCodecType(_codecName.c_str()));
     encodeCompleteCallback->SetFrameDimensions(_width, _height);
-    // frame ready to be sent to network
-    RTPSendCompleteCallback* outgoingTransport =
-        new RTPSendCompleteCallback(_rtp, _clock);
-    _rtp->RegisterSendTransport(outgoingTransport);
-    //FrameReceiveCallback
-    VCMDecodeCompleteCallback receiveCallback(_decodedFile);
-    RtpDataCallback dataCallback(_vcm);
-    _rtp->RegisterIncomingDataCallback(&dataCallback);
 
+    // callback settings
     VideoProtectionCallback  protectionCallback;
     protectionCallback.RegisterRtpModule(_rtp);
     _vcm->RegisterProtectionCallback(&protectionCallback);
 
     // set error resilience / test parameters:
-    outgoingTransport->SetLossPct(_lossRate);
-    if (_nackFecEnabled == 1)
+    _outgoingTransport->SetLossPct(_lossRate);
+    if (_nackFecEnabled == 1) {
         _vcm->SetVideoProtection(kProtectionNackFEC, _nackFecEnabled);
-    else
-    {
+    } else {
         _vcm->SetVideoProtection(kProtectionNack, _nackEnabled);
         _vcm->SetVideoProtection(kProtectionFEC, _fecEnabled);
     }
@@ -349,13 +335,10 @@
         }
 
         _sumEncBytes += encBytes;
-         //waitEvent->Wait(33);
     }
 
     //END TEST
-    delete waitEvent;
     delete encodeCompleteCallback;
-    delete outgoingTransport;
     delete tmpBuffer;
 
 return 0;
@@ -441,17 +424,10 @@
 
                 printf("**FOR RUN: **%d %d %d %d \n",_nackEnabled,_fecEnabled,int(lossPctVec[j]),int(_bitRate));
                */
-                 if (_rtp != NULL)
-                 {
-                     RtpRtcp::DestroyRtpRtcp(_rtp);
-                 }
-                 _rtp = RtpRtcp::CreateRtpRtcp(1, false);
                  GeneralSetup();
                  Perform();
                  Print(1);
                  TearDown();
-                 RtpRtcp::DestroyRtpRtcp(_rtp);
-                 _rtp = NULL;
 
                  printf("\n");
                   //printf("**DONE WITH RUN: **%d %d %f %d \n",_nackEnabled,_fecEnabled,lossPctVec[j],int(_bitRate));
@@ -549,12 +525,15 @@
     TEST(psnr.average > 10); // low becuase of possible frame dropping (need to verify that OK for all packet loss values/ rates)
 }
 
-void
-MediaOptTest::TearDown()
-{
-    _log.close();
-    fclose(_sourceFile);
-    fclose(_decodedFile);
-    fclose(_actualSourceFile);
-    return;
+void MediaOptTest::TearDown() {
+  delete _rtp;
+  _rtp = NULL;
+  delete _outgoingTransport;
+  _outgoingTransport = NULL;
+  delete _dataCallback;
+  _dataCallback = NULL;
+  _log.close();
+  fclose(_sourceFile);
+  fclose(_decodedFile);
+  fclose(_actualSourceFile);
 }
diff --git a/src/modules/video_coding/main/test/media_opt_test.h b/src/modules/video_coding/main/test/media_opt_test.h
index 7d4e226..5f210e6 100644
--- a/src/modules/video_coding/main/test/media_opt_test.h
+++ b/src/modules/video_coding/main/test/media_opt_test.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -15,7 +15,9 @@
 
 #include <string>
 
+#include "receiver_tests.h"  // receive side callbacks
 #include "rtp_rtcp.h"
+#include "test_callbacks.h"
 #include "test_util.h"
 #include "video_coding.h"
 #include "video_source.h"
@@ -52,6 +54,9 @@
 
     webrtc::VideoCodingModule*       _vcm;
     webrtc::RtpRtcp*                 _rtp;
+    webrtc::RTPSendCompleteCallback* _outgoingTransport;
+    RtpDataCallback*                 _dataCallback;
+
     webrtc::TickTimeBase*            _clock;
     std::string                      _inname;
     std::string                      _outname;
diff --git a/src/modules/video_coding/main/test/mt_rx_tx_test.cc b/src/modules/video_coding/main/test/mt_rx_tx_test.cc
index dc20b32..3eac939 100644
--- a/src/modules/video_coding/main/test/mt_rx_tx_test.cc
+++ b/src/modules/video_coding/main/test/mt_rx_tx_test.cc
@@ -138,17 +138,20 @@
         printf("Cannot read file %s.\n", outname.c_str());
         return -1;
     }
+    TickTimeBase clock;
+    VideoCodingModule* vcm = VideoCodingModule::Create(1, &clock);
+    RtpDataCallback dataCallback(vcm);
 
-    //RTP
-    RtpRtcp* rtp = RtpRtcp::CreateRtpRtcp(1, false);
-    if (rtp->InitReceiver() < 0)
-    {
-        return -1;
-    }
-    if (rtp->InitSender() < 0)
-    {
-        return -1;
-    }
+    RTPSendCompleteCallback* outgoingTransport =
+        new RTPSendCompleteCallback(&clock, "dump.rtp");
+
+    RtpRtcp::Configuration configuration;
+    configuration.id = 1;
+    configuration.audio = false;
+    configuration.incoming_data = &dataCallback;
+    configuration.outgoing_transport = outgoingTransport;
+    RtpRtcp* rtp = RtpRtcp::CreateRtpRtcp(configuration);
+
     // registering codecs for the RTP module
     VideoCodec videoCodec;
     strncpy(videoCodec.plName, "ULPFEC", 32);
@@ -170,8 +173,6 @@
     TEST(rtp->SetGenericFECStatus(fecEnabled, VCM_RED_PAYLOAD_TYPE, VCM_ULPFEC_PAYLOAD_TYPE) == 0);
 
     //VCM
-    TickTimeBase clock;
-    VideoCodingModule* vcm = VideoCodingModule::Create(1, &clock);
     if (vcm->InitializeReceiver() < 0)
     {
         return -1;
@@ -216,13 +217,8 @@
     encodeCompleteCallback->SetCodecType(ConvertCodecType(args.codecName.c_str()));
     encodeCompleteCallback->SetFrameDimensions(width, height);
     // frame ready to be sent to network
-    RTPSendCompleteCallback* outgoingTransport =
-        new RTPSendCompleteCallback(rtp, &clock, "dump.rtp");
-    rtp->RegisterSendTransport(outgoingTransport);
-    // FrameReceiveCallback
+
     VCMDecodeCompleteCallback receiveCallback(decodedFile);
-    RtpDataCallback dataCallback(vcm);
-    rtp->RegisterIncomingDataCallback(&dataCallback);
     vcm->RegisterReceiveCallback(&receiveCallback);
 
     VideoProtectionCallback protectionCallback;
@@ -351,7 +347,7 @@
     delete encodeCompleteCallback;
     delete outgoingTransport;
     VideoCodingModule::Destroy(vcm);
-    RtpRtcp::DestroyRtpRtcp(rtp);
+    delete rtp;
     rtp = NULL;
     vcm = NULL;
     Trace::ReturnTrace();
diff --git a/src/modules/video_coding/main/test/mt_test_common.cc b/src/modules/video_coding/main/test/mt_test_common.cc
index e3ebd97..ece0d9c 100644
--- a/src/modules/video_coding/main/test/mt_test_common.cc
+++ b/src/modules/video_coding/main/test/mt_test_common.cc
@@ -17,12 +17,8 @@
 
 namespace webrtc {
 
-TransportCallback::TransportCallback(webrtc::RtpRtcp* rtp,
-                                     TickTimeBase* clock,
-                                     const char* filename):
-RTPSendCompleteCallback(rtp, clock, filename)
-{
-    //
+TransportCallback::TransportCallback(TickTimeBase* clock, const char* filename)
+    : RTPSendCompleteCallback(clock, filename) {
 }
 
 TransportCallback::~TransportCallback()
diff --git a/src/modules/video_coding/main/test/mt_test_common.h b/src/modules/video_coding/main/test/mt_test_common.h
index 438f0be..c17d269 100644
--- a/src/modules/video_coding/main/test/mt_test_common.h
+++ b/src/modules/video_coding/main/test/mt_test_common.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
@@ -47,8 +47,7 @@
 {
  public:
     // constructor input: (receive side) rtp module to send encoded data to
-    TransportCallback(webrtc::RtpRtcp* rtp, TickTimeBase* clock,
-                      const char* filename = NULL);
+    TransportCallback(TickTimeBase* clock, const char* filename = NULL);
     virtual ~TransportCallback();
     // Add packets to list
     // Incorporate network conditions - delay and packet loss
diff --git a/src/modules/video_coding/main/test/receiver_tests.h b/src/modules/video_coding/main/test/receiver_tests.h
index 33d9f5f..cb45ca1 100644
--- a/src/modules/video_coding/main/test/receiver_tests.h
+++ b/src/modules/video_coding/main/test/receiver_tests.h
@@ -1,5 +1,5 @@
 /*
- *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
+ *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
  *
  *  Use of this source code is governed by a BSD-style license
  *  that can be found in the LICENSE file in the root of the source
diff --git a/src/modules/video_coding/main/test/rtp_player.cc b/src/modules/video_coding/main/test/rtp_player.cc
index 5361e31..9eacf34 100644
--- a/src/modules/video_coding/main/test/rtp_player.cc
+++ b/src/modules/video_coding/main/test/rtp_player.cc
@@ -140,7 +140,7 @@
                      TickTimeBase* clock)
 :
 _clock(clock),
-_rtpModule(*RtpRtcp::CreateRtpRtcp(1, false)),
+_rtpModule(NULL),
 _nextRtpTime(0),
 _dataCallback(callback),
 _firstPacket(true),
@@ -165,7 +165,7 @@
 
 RTPPlayer::~RTPPlayer()
 {
-    RtpRtcp::DestroyRtpRtcp(&_rtpModule);
+    delete _rtpModule;
     if (_rtpFile != NULL)
     {
         fclose(_rtpFile);
@@ -179,28 +179,26 @@
 
 WebRtc_Word32 RTPPlayer::Initialize(const PayloadTypeList* payloadList)
 {
+    RtpRtcp::Configuration configuration;
+    configuration.id = 1;
+    configuration.audio = false;
+    configuration.incoming_data = _dataCallback;
+    _rtpModule = RtpRtcp::CreateRtpRtcp(configuration);
+
     std::srand(321);
     for (int i=0; i < RAND_VEC_LENGTH; i++)
     {
         _randVec[i] = rand();
     }
     _randVecPos = 0;
-    WebRtc_Word32 ret = _rtpModule.SetNACKStatus(kNackOff);
+    WebRtc_Word32 ret = _rtpModule->SetNACKStatus(kNackOff);
     if (ret < 0)
     {
         return -1;
     }
-    ret = _rtpModule.InitReceiver();
-    if (ret < 0)
-    {
-        return -1;
-    }
+    _rtpModule->SetRTCPStatus(kRtcpNonCompound);
+    _rtpModule->SetTMMBRStatus(true);
 
-    _rtpModule.InitSender();
-    _rtpModule.SetRTCPStatus(kRtcpNonCompound);
-    _rtpModule.SetTMMBRStatus(true);
-
-    ret = _rtpModule.RegisterIncomingDataCallback(_dataCallback);
     if (ret < 0)
     {
         return -1;
@@ -214,7 +212,7 @@
             VideoCodec videoCodec;
             strncpy(videoCodec.plName, payloadType->name.c_str(), 32);
             videoCodec.plType = payloadType->payloadType;
-            if (_rtpModule.RegisterReceivePayload(videoCodec) < 0)
+            if (_rtpModule->RegisterReceivePayload(videoCodec) < 0)
             {
                 return -1;
             }
@@ -305,7 +303,7 @@
     // Send any packets from rtp file
     if (!_endOfFile && (TimeUntilNextPacket() == 0 || _firstPacket))
     {
-        _rtpModule.Process();
+        _rtpModule->Process();
         if (_firstPacket)
         {
             _firstPacketRtpTime = static_cast<WebRtc_Word64>(_nextRtpTime);
@@ -362,7 +360,7 @@
     }
     else if (rtpLen > 0)
     {
-        WebRtc_Word32 ret = _rtpModule.IncomingPacket(rtpData, rtpLen);
+        WebRtc_Word32 ret = _rtpModule->IncomingPacket(rtpData, rtpLen);
         if (ret < 0)
         {
             return -1;
diff --git a/src/modules/video_coding/main/test/rtp_player.h b/src/modules/video_coding/main/test/rtp_player.h
index eac6ba8..9920d0c 100644
--- a/src/modules/video_coding/main/test/rtp_player.h
+++ b/src/modules/video_coding/main/test/rtp_player.h
@@ -95,7 +95,7 @@
     WebRtc_Word32 ReadHeader();
     webrtc::TickTimeBase* _clock;
     FILE*              _rtpFile;
-    webrtc::RtpRtcp&   _rtpModule;
+    webrtc::RtpRtcp*   _rtpModule;
     WebRtc_UWord32     _nextRtpTime;
     webrtc::RtpData*   _dataCallback;
     bool               _firstPacket;
diff --git a/src/modules/video_coding/main/test/test_callbacks.cc b/src/modules/video_coding/main/test/test_callbacks.cc
index da28073..348cbcc 100644
--- a/src/modules/video_coding/main/test/test_callbacks.cc
+++ b/src/modules/video_coding/main/test/test_callbacks.cc
@@ -195,12 +195,11 @@
     return _decodedBytes;
 }
 
-RTPSendCompleteCallback::RTPSendCompleteCallback(RtpRtcp* rtp,
-                                                 TickTimeBase* clock,
+RTPSendCompleteCallback::RTPSendCompleteCallback(TickTimeBase* clock,
                                                  const char* filename):
     _clock(clock),
     _sendCount(0),
-    _rtp(rtp),
+    _rtp(NULL),
     _lossPct(0),
     _burstLength(0),
     _networkDelayMs(0),
@@ -282,6 +281,7 @@
         }
 
         _rtpPackets.pop_front();
+        assert(_rtp);  // We must have a configured RTP module for this test.
         // Send to receive side
         if (_rtp->IncomingPacket((const WebRtc_UWord8*)packet->data,
                                  packet->length) < 0)
diff --git a/src/modules/video_coding/main/test/test_callbacks.h b/src/modules/video_coding/main/test/test_callbacks.h
index 2c25931..9f179e2 100644
--- a/src/modules/video_coding/main/test/test_callbacks.h
+++ b/src/modules/video_coding/main/test/test_callbacks.h
@@ -155,9 +155,11 @@
 {
 public:
     // Constructor input: (receive side) rtp module to send encoded data to
-    RTPSendCompleteCallback(RtpRtcp* rtp, TickTimeBase* clock,
+    RTPSendCompleteCallback(TickTimeBase* clock,
                             const char* filename = NULL);
     virtual ~RTPSendCompleteCallback();
+
+    void SetRtpModule(RtpRtcp* rtp_module) { _rtp = rtp_module; }
     // Send Packet to receive side RTP module
     virtual int SendPacket(int channel, const void *data, int len);
     // Send RTCP Packet to receive side RTP module