Backed out 10 changesets (bug 1091242) for Android/b2g non-unified build bustage
authorPhil Ringnalda <philringnalda@gmail.com>
Mon, 08 Dec 2014 20:53:07 -0800
changeset 218811 960303b07c909e69db87467d0b499351d65c82af
parent 218810 62bd0993a4553a941287594df99cd6bc24c969d1
child 218812 c8da0f3cee92cb0b7447d11c1674bd29206d93b1
push id10304
push usercbook@mozilla.com
push dateTue, 09 Dec 2014 12:18:28 +0000
treeherderfx-team@19855f676807 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
bugs1091242
milestone37.0a1
backs out7f72b55c5de7ff0304b3f9e38992d27b73daf436
f1501aa243975fb8298ababc09ef6004c78f87d6
7fde5994aee5d053baee4bc9142a8ea79a567fcc
59b415714087055d5c8800236a6ca31184dd8556
dadb65fedc087afa6009e4f058421cb688709a85
21be81424e4e1ee44a7e596aa08877ff171cd017
498fb1dafba55d5616cb822b37b7e1ad9d0b7c71
8d0653eb85ab002399a3b288807e901153b75d06
c82d484e135a69da07f84e1319a2ea8f9a5ed2ed
3e0c8932f1b17b6e44e8ba4ea889848031041f1b
Backed out 10 changesets (bug 1091242) for Android/b2g non-unified build bustage CLOSED TREE Backed out changeset 7f72b55c5de7 (bug 1091242) Backed out changeset f1501aa24397 (bug 1091242) Backed out changeset 7fde5994aee5 (bug 1091242) Backed out changeset 59b415714087 (bug 1091242) Backed out changeset dadb65fedc08 (bug 1091242) Backed out changeset 21be81424e4e (bug 1091242) Backed out changeset 498fb1dafba5 (bug 1091242) Backed out changeset 8d0653eb85ab (bug 1091242) Backed out changeset c82d484e135a (bug 1091242) Backed out changeset 3e0c8932f1b1 (bug 1091242)
build/automation.py.in
build/automationutils.py
dom/bindings/Bindings.conf
dom/bindings/moz.build
dom/media/PeerConnection.js
dom/media/PeerConnection.manifest
dom/media/bridge/IPeerConnection.idl
dom/media/bridge/MediaModule.cpp
dom/media/bridge/moz.build
dom/media/tests/mochitest/identity/test_fingerprints.html
dom/media/tests/mochitest/mochitest.ini
dom/media/tests/mochitest/pc.js
dom/media/tests/mochitest/templates.js
dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html
dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html
dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html
dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html
dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html
dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html
dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html
dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html
dom/webidl/PeerConnectionImpl.webidl
media/mtransport/dtlsidentity.cpp
media/mtransport/dtlsidentity.h
media/mtransport/logging.h
media/mtransport/nricectx.cpp
media/mtransport/nricectx.h
media/mtransport/nricemediastream.cpp
media/mtransport/nricemediastream.h
media/mtransport/test/ice_unittest.cpp
media/mtransport/test/moz.build
media/mtransport/test/transport_unittests.cpp
media/mtransport/third_party/nICEr/src/ice/ice_candidate.c
media/mtransport/third_party/nICEr/src/ice/ice_component.c
media/mtransport/third_party/nICEr/src/ice/ice_ctx.c
media/mtransport/third_party/nICEr/src/ice/ice_parser.c
media/mtransport/third_party/nICEr/src/ice/ice_peer_ctx.c
media/mtransport/transportlayerice.cpp
media/mtransport/transportlayerice.h
media/webrtc/moz.build
media/webrtc/signaling/include/CC_Call.h
media/webrtc/signaling/include/CC_CallInfo.h
media/webrtc/signaling/include/CC_CallServerInfo.h
media/webrtc/signaling/include/CC_CallTypes.h
media/webrtc/signaling/include/CC_Common.h
media/webrtc/signaling/include/CC_Device.h
media/webrtc/signaling/include/CC_DeviceInfo.h
media/webrtc/signaling/include/CC_FeatureInfo.h
media/webrtc/signaling/include/CC_Line.h
media/webrtc/signaling/include/CC_LineInfo.h
media/webrtc/signaling/include/CC_Observer.h
media/webrtc/signaling/include/CC_Service.h
media/webrtc/signaling/include/CSFAudioControl.h
media/webrtc/signaling/include/CSFVideoControl.h
media/webrtc/signaling/include/CallControlManager.h
media/webrtc/signaling/include/ECC_Observer.h
media/webrtc/signaling/include/ECC_Types.h
media/webrtc/signaling/include/PhoneDetails.h
media/webrtc/signaling/include/SharedPtr.h
media/webrtc/signaling/include/debug-psipcc-types.h
media/webrtc/signaling/signaling.gyp
media/webrtc/signaling/src/callcontrol/CC_CallTypes.cpp
media/webrtc/signaling/src/callcontrol/CallControlManager.cpp
media/webrtc/signaling/src/callcontrol/CallControlManagerImpl.cpp
media/webrtc/signaling/src/callcontrol/CallControlManagerImpl.h
media/webrtc/signaling/src/callcontrol/ECC_Types.cpp
media/webrtc/signaling/src/callcontrol/PhoneDetailsImpl.cpp
media/webrtc/signaling/src/callcontrol/PhoneDetailsImpl.h
media/webrtc/signaling/src/callcontrol/debug-psipcc-types.cpp
media/webrtc/signaling/src/common/browser_logging/CSFLog.cpp
media/webrtc/signaling/src/common/time_profiling/timecard.c
media/webrtc/signaling/src/jsep/JsepCodecDescription.h
media/webrtc/signaling/src/jsep/JsepSession.h
media/webrtc/signaling/src/jsep/JsepSessionImpl.cpp
media/webrtc/signaling/src/jsep/JsepSessionImpl.h
media/webrtc/signaling/src/jsep/JsepTrack.h
media/webrtc/signaling/src/jsep/JsepTrackImpl.h
media/webrtc/signaling/src/jsep/JsepTransport.h
media/webrtc/signaling/src/media-conduit/AudioConduit.cpp
media/webrtc/signaling/src/media-conduit/CodecConfig.h
media/webrtc/signaling/src/media-conduit/VideoConduit.cpp
media/webrtc/signaling/src/media/CSFVideoControlWrapper.cpp
media/webrtc/signaling/src/media/VcmSIPCCBinding.cpp
media/webrtc/signaling/src/media/VcmSIPCCBinding.h
media/webrtc/signaling/src/media/cip_Sipcc_CodecMask.h
media/webrtc/signaling/src/mediapipeline/MediaPipeline.h
media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.cpp
media/webrtc/signaling/src/peerconnection/MediaPipelineFactory.h
media/webrtc/signaling/src/peerconnection/MediaStreamList.cpp
media/webrtc/signaling/src/peerconnection/MediaStreamList.h
media/webrtc/signaling/src/peerconnection/PeerConnectionCtx.cpp
media/webrtc/signaling/src/peerconnection/PeerConnectionCtx.h
media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.cpp
media/webrtc/signaling/src/peerconnection/PeerConnectionImpl.h
media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.cpp
media/webrtc/signaling/src/peerconnection/PeerConnectionMedia.h
media/webrtc/signaling/src/peerconnection/WebrtcGlobalInformation.cpp
media/webrtc/signaling/src/peerconnection/WebrtcGlobalInformation.h
media/webrtc/signaling/src/sdp/Sdp.h
media/webrtc/signaling/src/sdp/SdpAttribute.cpp
media/webrtc/signaling/src/sdp/SdpAttribute.h
media/webrtc/signaling/src/sdp/SdpAttributeList.h
media/webrtc/signaling/src/sdp/SdpEnum.h
media/webrtc/signaling/src/sdp/SdpErrorHolder.h
media/webrtc/signaling/src/sdp/SdpMediaSection.h
media/webrtc/signaling/src/sdp/SipccSdp.cpp
media/webrtc/signaling/src/sdp/SipccSdp.h
media/webrtc/signaling/src/sdp/SipccSdpAttributeList.cpp
media/webrtc/signaling/src/sdp/SipccSdpAttributeList.h
media/webrtc/signaling/src/sdp/SipccSdpMediaSection.cpp
media/webrtc/signaling/src/sdp/SipccSdpMediaSection.h
media/webrtc/signaling/src/sdp/SipccSdpParser.cpp
media/webrtc/signaling/src/sdp/SipccSdpParser.h
media/webrtc/signaling/src/sdp/sipcc/ccsdp.c
media/webrtc/signaling/src/sdp/sipcc/ccsdp.h
media/webrtc/signaling/src/sdp/sipcc/ccsdp_rtcp_fb.h
media/webrtc/signaling/src/sdp/sipcc/cpr_darwin_types.h
media/webrtc/signaling/src/sdp/sipcc/cpr_linux_types.h
media/webrtc/signaling/src/sdp/sipcc/cpr_string.c
media/webrtc/signaling/src/sdp/sipcc/cpr_string.h
media/webrtc/signaling/src/sdp/sipcc/cpr_strings.h
media/webrtc/signaling/src/sdp/sipcc/cpr_types.h
media/webrtc/signaling/src/sdp/sipcc/cpr_win_types.h
media/webrtc/signaling/src/sdp/sipcc/sdp.h
media/webrtc/signaling/src/sdp/sipcc/sdp_access.c
media/webrtc/signaling/src/sdp/sipcc/sdp_attr.c
media/webrtc/signaling/src/sdp/sipcc/sdp_attr_access.c
media/webrtc/signaling/src/sdp/sipcc/sdp_base64.c
media/webrtc/signaling/src/sdp/sipcc/sdp_base64.h
media/webrtc/signaling/src/sdp/sipcc/sdp_config.c
media/webrtc/signaling/src/sdp/sipcc/sdp_main.c
media/webrtc/signaling/src/sdp/sipcc/sdp_os_defs.h
media/webrtc/signaling/src/sdp/sipcc/sdp_private.h
media/webrtc/signaling/src/sdp/sipcc/sdp_services_unix.c
media/webrtc/signaling/src/sdp/sipcc/sdp_services_win32.c
media/webrtc/signaling/src/sdp/sipcc/sdp_token.c
media/webrtc/signaling/src/sdp/sipcc/sdp_utils.c
media/webrtc/signaling/src/sipcc/core/ccapp/CCProvider.h
media/webrtc/signaling/src/sipcc/core/ccapp/call_logger.c
media/webrtc/signaling/src/sipcc/core/ccapp/call_logger.h
media/webrtc/signaling/src/sipcc/core/ccapp/capability_set.c
media/webrtc/signaling/src/sipcc/core/ccapp/capability_set.h
media/webrtc/signaling/src/sipcc/core/ccapp/cc_blf.c
media/webrtc/signaling/src/sipcc/core/ccapp/cc_call_feature.c
media/webrtc/signaling/src/sipcc/core/ccapp/cc_config.c
media/webrtc/signaling/src/sipcc/core/ccapp/cc_device_feature.c
media/webrtc/signaling/src/sipcc/core/ccapp/cc_device_manager.c
media/webrtc/signaling/src/sipcc/core/ccapp/cc_device_manager.h
media/webrtc/signaling/src/sipcc/core/ccapp/cc_info.c
media/webrtc/signaling/src/sipcc/core/ccapp/cc_service.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_call.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_call_info.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_config.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_device.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_device_info.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_feature_info.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_line.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_line_info.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_service.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_snapshot.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapi_snapshot.h
media/webrtc/signaling/src/sipcc/core/ccapp/ccapp_task.c
media/webrtc/signaling/src/sipcc/core/ccapp/ccapp_task.h
media/webrtc/signaling/src/sipcc/core/ccapp/ccprovider.c
media/webrtc/signaling/src/sipcc/core/ccapp/conf_roster.c
media/webrtc/signaling/src/sipcc/core/ccapp/conf_roster.h
media/webrtc/signaling/src/sipcc/core/ccapp/sessionHash.c
media/webrtc/signaling/src/sipcc/core/ccapp/sessionHash.h
media/webrtc/signaling/src/sipcc/core/common/cfgfile_utils.c
media/webrtc/signaling/src/sipcc/core/common/cfgfile_utils.h
media/webrtc/signaling/src/sipcc/core/common/config_api.c
media/webrtc/signaling/src/sipcc/core/common/config_parser.c
media/webrtc/signaling/src/sipcc/core/common/config_parser.h
media/webrtc/signaling/src/sipcc/core/common/init.c
media/webrtc/signaling/src/sipcc/core/common/logger.c
media/webrtc/signaling/src/sipcc/core/common/logger.h
media/webrtc/signaling/src/sipcc/core/common/logmsg.h
media/webrtc/signaling/src/sipcc/core/common/misc.c
media/webrtc/signaling/src/sipcc/core/common/plat.c
media/webrtc/signaling/src/sipcc/core/common/platform_api.c
media/webrtc/signaling/src/sipcc/core/common/prot_cfgmgr_private.h
media/webrtc/signaling/src/sipcc/core/common/prot_configmgr.c
media/webrtc/signaling/src/sipcc/core/common/prot_configmgr.h
media/webrtc/signaling/src/sipcc/core/common/resource_manager.c
media/webrtc/signaling/src/sipcc/core/common/resource_manager.h
media/webrtc/signaling/src/sipcc/core/common/sip_socket_api.c
media/webrtc/signaling/src/sipcc/core/common/subscription_handler.c
media/webrtc/signaling/src/sipcc/core/common/subscription_handler.h
media/webrtc/signaling/src/sipcc/core/common/text_strings.c
media/webrtc/signaling/src/sipcc/core/common/text_strings.h
media/webrtc/signaling/src/sipcc/core/common/ui.c
media/webrtc/signaling/src/sipcc/core/gsm/ccapi.c
media/webrtc/signaling/src/sipcc/core/gsm/ccapi_strings.c
media/webrtc/signaling/src/sipcc/core/gsm/dcsm.c
media/webrtc/signaling/src/sipcc/core/gsm/fim.c
media/webrtc/signaling/src/sipcc/core/gsm/fsm.c
media/webrtc/signaling/src/sipcc/core/gsm/fsmb2bcnf.c
media/webrtc/signaling/src/sipcc/core/gsm/fsmcac.c
media/webrtc/signaling/src/sipcc/core/gsm/fsmcnf.c
media/webrtc/signaling/src/sipcc/core/gsm/fsmdef.c
media/webrtc/signaling/src/sipcc/core/gsm/fsmxfr.c
media/webrtc/signaling/src/sipcc/core/gsm/gsm.c
media/webrtc/signaling/src/sipcc/core/gsm/gsm_sdp.c
media/webrtc/signaling/src/sipcc/core/gsm/gsm_sdp_crypto.c
media/webrtc/signaling/src/sipcc/core/gsm/h/fim.h
media/webrtc/signaling/src/sipcc/core/gsm/h/fsm.h
media/webrtc/signaling/src/sipcc/core/gsm/h/gsm.h
media/webrtc/signaling/src/sipcc/core/gsm/h/gsm_sdp.h
media/webrtc/signaling/src/sipcc/core/gsm/h/lsm.h
media/webrtc/signaling/src/sipcc/core/gsm/h/lsm_private.h
media/webrtc/signaling/src/sipcc/core/gsm/h/sm.h
media/webrtc/signaling/src/sipcc/core/gsm/lsm.c
media/webrtc/signaling/src/sipcc/core/gsm/media_cap_tbl.c
media/webrtc/signaling/src/sipcc/core/gsm/sm.c
media/webrtc/signaling/src/sipcc/core/gsm/subapi.c
media/webrtc/signaling/src/sipcc/core/includes/ccSession.h
media/webrtc/signaling/src/sipcc/core/includes/ccapi.h
media/webrtc/signaling/src/sipcc/core/includes/check_sync.h
media/webrtc/signaling/src/sipcc/core/includes/ci.h
media/webrtc/signaling/src/sipcc/core/includes/config.h
media/webrtc/signaling/src/sipcc/core/includes/configapp.h
media/webrtc/signaling/src/sipcc/core/includes/configmgr.h
media/webrtc/signaling/src/sipcc/core/includes/debug.h
media/webrtc/signaling/src/sipcc/core/includes/dialplan.h
media/webrtc/signaling/src/sipcc/core/includes/dialplanint.h
media/webrtc/signaling/src/sipcc/core/includes/digcalc.h
media/webrtc/signaling/src/sipcc/core/includes/dns_utils.h
media/webrtc/signaling/src/sipcc/core/includes/dtmf.h
media/webrtc/signaling/src/sipcc/core/includes/embedded.h
media/webrtc/signaling/src/sipcc/core/includes/intelpentiumtypes.h
media/webrtc/signaling/src/sipcc/core/includes/kpml_common_util.h
media/webrtc/signaling/src/sipcc/core/includes/kpmlmap.h
media/webrtc/signaling/src/sipcc/core/includes/md5.h
media/webrtc/signaling/src/sipcc/core/includes/memory.h
media/webrtc/signaling/src/sipcc/core/includes/misc_apps_task.h
media/webrtc/signaling/src/sipcc/core/includes/misc_util.h
media/webrtc/signaling/src/sipcc/core/includes/phntask.h
media/webrtc/signaling/src/sipcc/core/includes/phone.h
media/webrtc/signaling/src/sipcc/core/includes/phone_debug.h
media/webrtc/signaling/src/sipcc/core/includes/phone_platform_constants.h
media/webrtc/signaling/src/sipcc/core/includes/phone_types.h
media/webrtc/signaling/src/sipcc/core/includes/platform_api.h
media/webrtc/signaling/src/sipcc/core/includes/pres_sub_not_handler.h
media/webrtc/signaling/src/sipcc/core/includes/publish_int.h
media/webrtc/signaling/src/sipcc/core/includes/rcc_int_types.h
media/webrtc/signaling/src/sipcc/core/includes/regexp.h
media/webrtc/signaling/src/sipcc/core/includes/ringlist.h
media/webrtc/signaling/src/sipcc/core/includes/rtp_defs.h
media/webrtc/signaling/src/sipcc/core/includes/scSession.h
media/webrtc/signaling/src/sipcc/core/includes/session.h
media/webrtc/signaling/src/sipcc/core/includes/sessionConstants.h
media/webrtc/signaling/src/sipcc/core/includes/sessionTypes.h
media/webrtc/signaling/src/sipcc/core/includes/sessuri.h
media/webrtc/signaling/src/sipcc/core/includes/singly_link_list.h
media/webrtc/signaling/src/sipcc/core/includes/sip_socket_api.h
media/webrtc/signaling/src/sipcc/core/includes/sntp.h
media/webrtc/signaling/src/sipcc/core/includes/string_lib.h
media/webrtc/signaling/src/sipcc/core/includes/subapi.h
media/webrtc/signaling/src/sipcc/core/includes/task.h
media/webrtc/signaling/src/sipcc/core/includes/time2.h
media/webrtc/signaling/src/sipcc/core/includes/timer.h
media/webrtc/signaling/src/sipcc/core/includes/tnpphone.h
media/webrtc/signaling/src/sipcc/core/includes/uart.h
media/webrtc/signaling/src/sipcc/core/includes/uiapi.h
media/webrtc/signaling/src/sipcc/core/includes/upgrade.h
media/webrtc/signaling/src/sipcc/core/includes/util_ios_queue.h
media/webrtc/signaling/src/sipcc/core/includes/util_parse.h
media/webrtc/signaling/src/sipcc/core/includes/util_string.h
media/webrtc/signaling/src/sipcc/core/includes/www.h
media/webrtc/signaling/src/sipcc/core/includes/xml_defs.h
media/webrtc/signaling/src/sipcc/core/sdp/ccsdp.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp.h
media/webrtc/signaling/src/sipcc/core/sdp/sdp_access.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_attr.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_attr_access.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_base64.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_base64.h
media/webrtc/signaling/src/sipcc/core/sdp/sdp_config.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_main.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_os_defs.h
media/webrtc/signaling/src/sipcc/core/sdp/sdp_private.h
media/webrtc/signaling/src/sipcc/core/sdp/sdp_services_unix.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_services_win32.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_token.c
media/webrtc/signaling/src/sipcc/core/sdp/sdp_utils.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_callinfo.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_cc.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_common_util.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_core.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_debug.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_info.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_messaging.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_platform.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_platform_tcp.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_platform_timers.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_platform_tls.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_platform_udp.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_pmh.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_publish.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_register.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_reldev.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_sdp.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_spi_utils.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_subsmanager.c
media/webrtc/signaling/src/sipcc/core/sipstack/ccsip_task.c
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_callinfo.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_cc.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_common_cb.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_core.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_credentials.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_macros.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_messaging.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_platform.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_platform_tcp.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_platform_timers.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_platform_tls.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_platform_udp.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_pmh.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_protocol.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_publish.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_register.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_reldev.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sdp.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_sim.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_spi_utils.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_subsmanager.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/ccsip_task.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/httpish.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/httpish_protocol.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/pmhdefs.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/pmhutils.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/regmgrapi.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/sip_ccm_transport.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/sip_common_regmgr.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/sip_common_transport.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/sip_csps_transport.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/sip_interface_regmgr.h
media/webrtc/signaling/src/sipcc/core/sipstack/h/sip_platform_task.h
media/webrtc/signaling/src/sipcc/core/sipstack/httpish.c
media/webrtc/signaling/src/sipcc/core/sipstack/pmhutils.c
media/webrtc/signaling/src/sipcc/core/sipstack/sip_common_regmgr.c
media/webrtc/signaling/src/sipcc/core/sipstack/sip_common_transport.c
media/webrtc/signaling/src/sipcc/core/sipstack/sip_csps_transport.c
media/webrtc/signaling/src/sipcc/core/sipstack/sip_interface_regmgr.c
media/webrtc/signaling/src/sipcc/core/sipstack/sip_platform_task.c
media/webrtc/signaling/src/sipcc/core/sipstack/sip_platform_win32_task.c
media/webrtc/signaling/src/sipcc/core/src-common/configapp.c
media/webrtc/signaling/src/sipcc/core/src-common/dialplan.c
media/webrtc/signaling/src/sipcc/core/src-common/dialplanint.c
media/webrtc/signaling/src/sipcc/core/src-common/digcalc.c
media/webrtc/signaling/src/sipcc/core/src-common/kpml_common_util.c
media/webrtc/signaling/src/sipcc/core/src-common/kpmlmap.c
media/webrtc/signaling/src/sipcc/core/src-common/md5.c
media/webrtc/signaling/src/sipcc/core/src-common/misc_apps_task.c
media/webrtc/signaling/src/sipcc/core/src-common/pres_sub_not_handler.c
media/webrtc/signaling/src/sipcc/core/src-common/publish_int.c
media/webrtc/signaling/src/sipcc/core/src-common/singly_link_list.c
media/webrtc/signaling/src/sipcc/core/src-common/sll_lite.c
media/webrtc/signaling/src/sipcc/core/src-common/string_lib.c
media/webrtc/signaling/src/sipcc/core/src-common/util_ios_queue.c
media/webrtc/signaling/src/sipcc/core/src-common/util_parse.c
media/webrtc/signaling/src/sipcc/core/src-common/util_string.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_align.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_assert.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_errno.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_errno.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_in.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_init.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_private.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_rand.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_socket.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_socket.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_stdio.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_stdio.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_string.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_string.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_strings.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_threads.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_time.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_timers.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_timers_using_select.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_tst.c
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_tst.h
media/webrtc/signaling/src/sipcc/cpr/android/cpr_android_types.h
media/webrtc/signaling/src/sipcc/cpr/common/cpr_ipc.c
media/webrtc/signaling/src/sipcc/cpr/common/cpr_string.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_align.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_assert.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_errno.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_errno.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_in.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_init.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_private.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_rand.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_socket.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_socket.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_stdio.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_stdio.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_string.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_string.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_strings.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_threads.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_time.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_timers.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_timers_using_select.c
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_tst.h
media/webrtc/signaling/src/sipcc/cpr/darwin/cpr_darwin_types.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_assert.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_debug.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_errno.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_in.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_ipc.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_locks.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_memory.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_rand.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_socket.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_stddef.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_stdio.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_stdlib.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_string.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_strings.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_threads.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_time.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_timers.h
media/webrtc/signaling/src/sipcc/cpr/include/cpr_types.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_align.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_assert.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_errno.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_errno.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_in.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_init.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_private.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_rand.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_socket.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_socket.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_stdio.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_stdio.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_string.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_string.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_strings.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_threads.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_time.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_timers.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_timers_using_select.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_tst.c
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_tst.h
media/webrtc/signaling/src/sipcc/cpr/linux/cpr_linux_types.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_assert.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_debug.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_debug.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_defines.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_errno.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_errno.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_in.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_init.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_locks.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_locks.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_rand.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_rand.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_socket.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_socket.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_stdio.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_stdio.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_string.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_string.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_strings.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_threads.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_threads.cpp
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_time.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_timers.c
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_timers.h
media/webrtc/signaling/src/sipcc/cpr/win32/cpr_win_types.h
media/webrtc/signaling/src/sipcc/include/cc_blf.h
media/webrtc/signaling/src/sipcc/include/cc_blf_listener.h
media/webrtc/signaling/src/sipcc/include/cc_call_feature.h
media/webrtc/signaling/src/sipcc/include/cc_call_listener.h
media/webrtc/signaling/src/sipcc/include/cc_config.h
media/webrtc/signaling/src/sipcc/include/cc_constants.h
media/webrtc/signaling/src/sipcc/include/cc_debug.h
media/webrtc/signaling/src/sipcc/include/cc_device_feature.h
media/webrtc/signaling/src/sipcc/include/cc_device_listener.h
media/webrtc/signaling/src/sipcc/include/cc_info.h
media/webrtc/signaling/src/sipcc/include/cc_info_listener.h
media/webrtc/signaling/src/sipcc/include/cc_service.h
media/webrtc/signaling/src/sipcc/include/cc_service_listener.h
media/webrtc/signaling/src/sipcc/include/cc_types.h
media/webrtc/signaling/src/sipcc/include/ccapi_call.h
media/webrtc/signaling/src/sipcc/include/ccapi_call_info.h
media/webrtc/signaling/src/sipcc/include/ccapi_call_listener.h
media/webrtc/signaling/src/sipcc/include/ccapi_calllog.h
media/webrtc/signaling/src/sipcc/include/ccapi_conf_roster.h
media/webrtc/signaling/src/sipcc/include/ccapi_device.h
media/webrtc/signaling/src/sipcc/include/ccapi_device_info.h
media/webrtc/signaling/src/sipcc/include/ccapi_device_listener.h
media/webrtc/signaling/src/sipcc/include/ccapi_feature_info.h
media/webrtc/signaling/src/sipcc/include/ccapi_line.h
media/webrtc/signaling/src/sipcc/include/ccapi_line_info.h
media/webrtc/signaling/src/sipcc/include/ccapi_line_listener.h
media/webrtc/signaling/src/sipcc/include/ccapi_service.h
media/webrtc/signaling/src/sipcc/include/ccapi_types.h
media/webrtc/signaling/src/sipcc/include/ccsdp.h
media/webrtc/signaling/src/sipcc/include/ccsdp_rtcp_fb.h
media/webrtc/signaling/src/sipcc/include/config_api.h
media/webrtc/signaling/src/sipcc/include/dns_util.h
media/webrtc/signaling/src/sipcc/include/fsmdef_states.h
media/webrtc/signaling/src/sipcc/include/peer_connection_types.h
media/webrtc/signaling/src/sipcc/include/plat_api.h
media/webrtc/signaling/src/sipcc/include/reset_api.h
media/webrtc/signaling/src/sipcc/include/sll_lite.h
media/webrtc/signaling/src/sipcc/include/vcm.h
media/webrtc/signaling/src/sipcc/include/xml_parser_defines.h
media/webrtc/signaling/src/sipcc/plat/common/dns_utils.c
media/webrtc/signaling/src/sipcc/plat/common/plat_debug.h
media/webrtc/signaling/src/sipcc/plat/common/tnp_blf.h
media/webrtc/signaling/src/sipcc/plat/csf2g/model.c
media/webrtc/signaling/src/sipcc/plat/csf2g/reset_api.c
media/webrtc/signaling/src/sipcc/plat/darwin/netif.c
media/webrtc/signaling/src/sipcc/plat/darwin/plat_api_stub.c
media/webrtc/signaling/src/sipcc/plat/unix-common/random.c
media/webrtc/signaling/src/sipcc/plat/win32/dns_utils.c
media/webrtc/signaling/src/sipcc/plat/win32/mystub.c
media/webrtc/signaling/src/sipcc/plat/win32/plat_api_stub.c
media/webrtc/signaling/src/sipcc/plat/win32/plat_api_win.c
media/webrtc/signaling/src/sipcc/stub/cc_blf_stub.c
media/webrtc/signaling/src/sipcc/stub/vcm_stub.c
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCall.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCall.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCallInfo.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCallInfo.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCallServerInfo.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCCallServerInfo.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCDevice.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCDevice.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCDeviceInfo.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCDeviceInfo.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCFeatureInfo.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCFeatureInfo.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCLine.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCLine.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCLineInfo.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCLineInfo.h
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCService.cpp
media/webrtc/signaling/src/softphonewrapper/CC_SIPCCService.h
media/webrtc/signaling/src/softphonewrapper/ccapi_plat_api_impl.cpp
media/webrtc/signaling/test/FakePCObserver.h
media/webrtc/signaling/test/jsep_session_unittest.cpp
media/webrtc/signaling/test/mediaconduit_unittests.cpp
media/webrtc/signaling/test/mediapipeline_unittest.cpp
media/webrtc/signaling/test/moz.build
media/webrtc/signaling/test/sdp_unittests.cpp
media/webrtc/signaling/test/signaling_unittests.cpp
modules/libpref/init/all.js
testing/mozbase/mozrunner/mozrunner/base/device.py
--- a/build/automation.py.in
+++ b/build/automation.py.in
@@ -502,17 +502,17 @@ class Automation(object):
     # override the user's choice here.  See bug 1049688.
     env.setdefault('MOZ_DISABLE_NONLOCAL_CONNECTIONS', '1')
 
     env['GNOME_DISABLE_CRASH_DIALOG'] = '1'
     env['XRE_NO_WINDOWS_CRASH_DIALOG'] = '1'
     env['NS_TRACE_MALLOC_DISABLE_STACKS'] = '1'
 
     # Set WebRTC logging in case it is not set yet
-    env.setdefault('NSPR_LOG_MODULES', 'signaling:5,mtransport:5,datachannel:5,jsep:5,MediaPipelineFactory:5')
+    env.setdefault('NSPR_LOG_MODULES', 'signaling:5,mtransport:5,datachannel:5')
     env.setdefault('R_LOG_LEVEL', '6')
     env.setdefault('R_LOG_DESTINATION', 'stderr')
     env.setdefault('R_LOG_VERBOSE', '1')
 
     # ASan specific environment stuff
     if self.IS_ASAN and (self.IS_LINUX or self.IS_MAC):
       # Symbolizer support
       llvmsym = os.path.join(xrePath, "llvm-symbolizer")
--- a/build/automationutils.py
+++ b/build/automationutils.py
@@ -405,17 +405,17 @@ def environment(xrePath, env=None, crash
 
   # Crash on non-local network connections by default.
   # MOZ_DISABLE_NONLOCAL_CONNECTIONS can be set to "0" to temporarily
   # enable non-local connections for the purposes of local testing.  Don't
   # override the user's choice here.  See bug 1049688.
   env.setdefault('MOZ_DISABLE_NONLOCAL_CONNECTIONS', '1')
 
   # Set WebRTC logging in case it is not set yet
-  env.setdefault('NSPR_LOG_MODULES', 'signaling:5,mtransport:5,datachannel:5,jsep:5,MediaPipelineFactory:5')
+  env.setdefault('NSPR_LOG_MODULES', 'signaling:5,mtransport:5,datachannel:5')
   env.setdefault('R_LOG_LEVEL', '6')
   env.setdefault('R_LOG_DESTINATION', 'stderr')
   env.setdefault('R_LOG_VERBOSE', '1')
 
   # ASan specific environment stuff
   asan = bool(mozinfo.info.get("asan"))
   if asan and (mozinfo.isLinux or mozinfo.isMac):
     try:
--- a/dom/bindings/Bindings.conf
+++ b/dom/bindings/Bindings.conf
@@ -857,17 +857,17 @@ DOMInterfaces = {
 },
 
 'Path2D': {
     'nativeType': 'mozilla::dom::CanvasPath',
     'headerFile': 'CanvasRenderingContext2D.h'
 },
 
 'PeerConnectionImpl': {
-    'nativeType': 'mozilla::PeerConnectionImpl',
+    'nativeType': 'sipcc::PeerConnectionImpl',
     'headerFile': 'PeerConnectionImpl.h',
     'wrapperCache': False
 },
 
 'Performance': [{
     'nativeType': 'nsPerformance',
 },
 {
--- a/dom/bindings/moz.build
+++ b/dom/bindings/moz.build
@@ -59,17 +59,16 @@ LOCAL_INCLUDES += [
     '/dom/xslt/xpath',
     '/dom/xul',
     '/js/ipc',
     '/js/xpconnect/src',
     '/js/xpconnect/wrappers',
     '/layout/style',
     '/layout/xul/tree',
     '/media/mtransport',
-    '/media/webrtc/',
     '/media/webrtc/signaling/src/common/time_profiling',
     '/media/webrtc/signaling/src/peerconnection',
 ]
 
 UNIFIED_SOURCES += [
     'BindingUtils.cpp',
     'CallbackInterface.cpp',
     'CallbackObject.cpp',
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -20,17 +20,17 @@ const PC_ICE_CONTRACT = "@mozilla.org/do
 const PC_SESSION_CONTRACT = "@mozilla.org/dom/rtcsessiondescription;1";
 const PC_MANAGER_CONTRACT = "@mozilla.org/dom/peerconnectionmanager;1";
 const PC_STATS_CONTRACT = "@mozilla.org/dom/rtcstatsreport;1";
 const PC_IDENTITY_CONTRACT = "@mozilla.org/dom/rtcidentityassertion;1";
 const PC_STATIC_CONTRACT = "@mozilla.org/dom/peerconnectionstatic;1";
 const PC_SENDER_CONTRACT = "@mozilla.org/dom/rtpsender;1";
 const PC_RECEIVER_CONTRACT = "@mozilla.org/dom/rtpreceiver;1";
 
-const PC_CID = Components.ID("{bdc2e533-b308-4708-ac8e-a8bfade6d851}");
+const PC_CID = Components.ID("{00e0e20d-1494-4776-8e0e-0f0acbea3c79}");
 const PC_OBS_CID = Components.ID("{d1748d4c-7f6a-4dc5-add6-d55b7678537e}");
 const PC_ICE_CID = Components.ID("{02b9970c-433d-4cc2-923d-f7028ac66073}");
 const PC_SESSION_CID = Components.ID("{1775081b-b62d-4954-8ffe-a067bbf508a7}");
 const PC_MANAGER_CID = Components.ID("{7293e901-2be3-4c02-b4bd-cbef6fc24f78}");
 const PC_STATS_CID = Components.ID("{7fe6e18b-0da3-4056-bf3b-440ef3809e06}");
 const PC_IDENTITY_CID = Components.ID("{1abc7499-3c54-43e0-bd60-686e2703f072}");
 const PC_STATIC_CID = Components.ID("{0fb47c47-a205-4583-a9fc-cbadf8c95880}");
 const PC_SENDER_CID = Components.ID("{4fff5d46-d827-4cd4-a970-8fd53977440e}");
@@ -844,17 +844,17 @@ RTCPeerConnection.prototype = {
   },
 
   _addIceCandidate: function(cand, onSuccess, onError) {
     this._onAddIceCandidateSuccess = onSuccess || null;
     this._onAddIceCandidateError = onError || null;
 
     this._impl.addIceCandidate(cand.candidate, cand.sdpMid || "",
                                (cand.sdpMLineIndex === null) ? 0 :
-                                 cand.sdpMLineIndex);
+                                 cand.sdpMLineIndex + 1);
   },
 
   addStream: function(stream) {
     stream.getTracks().forEach(track => this.addTrack(track, stream));
   },
 
   removeStream: function(stream) {
      // Bug 844295: Not implementing this functionality.
@@ -1117,17 +1117,17 @@ PeerConnectionObserver.prototype = {
     this._dompc = dompc._innerObject;
   },
 
   newError: function(code, message) {
     // These strings must match those defined in the WebRTC spec.
     const reasonName = [
       "",
       "InternalError",
-      "InvalidCandidateError",
+      "InternalError",
       "InvalidParameter",
       "InvalidStateError",
       "InvalidSessionDescriptionError",
       "IncompatibleSessionDescriptionError",
       "InternalError",
       "IncompatibleMediaStreamTrackError",
       "InternalError"
     ];
@@ -1216,17 +1216,17 @@ PeerConnectionObserver.prototype = {
   onIceCandidate: function(level, mid, candidate) {
     if (candidate == "") {
       this.foundIceCandidate(null);
     } else {
       this.foundIceCandidate(new this._dompc._win.mozRTCIceCandidate(
           {
               candidate: candidate,
               sdpMid: mid,
-              sdpMLineIndex: level
+              sdpMLineIndex: level - 1
           }
       ));
     }
   },
 
 
   // This method is primarily responsible for updating iceConnectionState.
   // This state is defined in the WebRTC specification as follows:
--- a/dom/media/PeerConnection.manifest
+++ b/dom/media/PeerConnection.manifest
@@ -1,20 +1,20 @@
-component {bdc2e533-b308-4708-ac8e-a8bfade6d851} PeerConnection.js
+component {00e0e20d-1494-4776-8e0e-0f0acbea3c79} PeerConnection.js
 component {d1748d4c-7f6a-4dc5-add6-d55b7678537e} PeerConnection.js
 component {02b9970c-433d-4cc2-923d-f7028ac66073} PeerConnection.js
 component {1775081b-b62d-4954-8ffe-a067bbf508a7} PeerConnection.js
 component {7293e901-2be3-4c02-b4bd-cbef6fc24f78} PeerConnection.js
 component {7fe6e18b-0da3-4056-bf3b-440ef3809e06} PeerConnection.js
 component {1abc7499-3c54-43e0-bd60-686e2703f072} PeerConnection.js
 component {0fb47c47-a205-4583-a9fc-cbadf8c95880} PeerConnection.js
 component {4fff5d46-d827-4cd4-a970-8fd53977440e} PeerConnection.js
 component {d974b814-8fde-411c-8c45-b86791b81030} PeerConnection.js
 
-contract @mozilla.org/dom/peerconnection;1 {bdc2e533-b308-4708-ac8e-a8bfade6d851}
+contract @mozilla.org/dom/peerconnection;1 {00e0e20d-1494-4776-8e0e-0f0acbea3c79}
 contract @mozilla.org/dom/peerconnectionobserver;1 {d1748d4c-7f6a-4dc5-add6-d55b7678537e}
 contract @mozilla.org/dom/rtcicecandidate;1 {02b9970c-433d-4cc2-923d-f7028ac66073}
 contract @mozilla.org/dom/rtcsessiondescription;1 {1775081b-b62d-4954-8ffe-a067bbf508a7}
 contract @mozilla.org/dom/peerconnectionmanager;1 {7293e901-2be3-4c02-b4bd-cbef6fc24f78}
 contract @mozilla.org/dom/rtcstatsreport;1 {7fe6e18b-0da3-4056-bf3b-440ef3809e06}
 contract @mozilla.org/dom/rtcidentityassertion;1 {1abc7499-3c54-43e0-bd60-686e2703f072}
 contract @mozilla.org/dom/peerconnectionstatic;1 {0fb47c47-a205-4583-a9fc-cbadf8c95880}
 contract @mozilla.org/dom/rtpsender;1 {4fff5d46-d827-4cd4-a970-8fd53977440e}
--- a/dom/media/bridge/IPeerConnection.idl
+++ b/dom/media/bridge/IPeerConnection.idl
@@ -54,17 +54,16 @@ interface IPeerConnection : nsISupports
 
   /* for 'type' in DataChannelInit dictionary */
   const unsigned short kDataChannelReliable = 0;
   const unsigned short kDataChannelPartialReliableRexmit = 1;
   const unsigned short kDataChannelPartialReliableTimed = 2;
 
   /* Constants for 'name' in error callbacks */
   const unsigned long kNoError                          = 0; // Test driver only
-  const unsigned long kInvalidCandidate                 = 2;
   const unsigned long kInvalidMediastreamTrack          = 3;
   const unsigned long kInvalidState                     = 4;
   const unsigned long kInvalidSessionDescription        = 5;
   const unsigned long kIncompatibleSessionDescription   = 6;
   const unsigned long kIncompatibleMediaStreamTrack     = 8;
   const unsigned long kInternalError                    = 9;
   const unsigned long kMaxErrorType                     = 9; // Same as final error
 };
--- a/dom/media/bridge/MediaModule.cpp
+++ b/dom/media/bridge/MediaModule.cpp
@@ -16,27 +16,27 @@
 
 #include "stun_udp_socket_filter.h"
 
 NS_DEFINE_NAMED_CID(NS_STUN_UDP_SOCKET_FILTER_HANDLER_CID)
 
 NS_GENERIC_FACTORY_CONSTRUCTOR(nsStunUDPSocketFilterHandler)
 
 
-namespace mozilla
+namespace sipcc
 {
-// Factory defined in mozilla::, defines mozilla::PeerConnectionImplConstructor
+// Factory defined in sipcc::, defines sipcc::PeerConnectionImplConstructor
 NS_GENERIC_FACTORY_CONSTRUCTOR(PeerConnectionImpl)
 }
 
 // Defines kPEERCONNECTION_CID
 NS_DEFINE_NAMED_CID(PEERCONNECTION_CID);
 
 static const mozilla::Module::CIDEntry kCIDs[] = {
-  { &kPEERCONNECTION_CID, false, nullptr, mozilla::PeerConnectionImplConstructor },
+  { &kPEERCONNECTION_CID, false, nullptr, sipcc::PeerConnectionImplConstructor },
   { &kNS_STUN_UDP_SOCKET_FILTER_HANDLER_CID, false, nullptr, nsStunUDPSocketFilterHandlerConstructor },
   { nullptr }
 };
 
 static const mozilla::Module::ContractIDEntry kContracts[] = {
   { PEERCONNECTION_CONTRACTID, &kPEERCONNECTION_CID },
   { NS_STUN_UDP_SOCKET_FILTER_HANDLER_CONTRACTID, &kNS_STUN_UDP_SOCKET_FILTER_HANDLER_CID },
   { nullptr }
--- a/dom/media/bridge/moz.build
+++ b/dom/media/bridge/moz.build
@@ -12,17 +12,17 @@ XPIDL_MODULE = 'peerconnection'
 
 SOURCES += [
     'MediaModule.cpp',
 ]
 
 LOCAL_INCLUDES += [
     '/ipc/chromium/src',
     '/media/mtransport',
-    '/media/mtransport',
-    '/media/webrtc/',
+    '/media/webrtc/signaling/include',
     '/media/webrtc/signaling/src/common/time_profiling',
     '/media/webrtc/signaling/src/media-conduit',
     '/media/webrtc/signaling/src/mediapipeline',
     '/media/webrtc/signaling/src/peerconnection',
+    '/media/webrtc/signaling/src/sipcc/include',
 ]
 
 FINAL_LIBRARY = 'xul'
--- a/dom/media/tests/mochitest/identity/test_fingerprints.html
+++ b/dom/media/tests/mochitest/identity/test_fingerprints.html
@@ -48,17 +48,17 @@ function makeFingerprints(algo, digest) 
   }
   return fingerprints;
 }
 
 var fingerprintRegex = /^a=fingerprint:(\S+) (\S+)/m;
 var identityRegex = /^a=identity:(\S+)/m;
 
 function fingerprintSdp(fingerprints) {
-  return fingerprints.map(fp => "a=fInGeRpRiNt:" + fp.algorithm +
+  return fingerprints.map(fp => "a=fInGeRpRiNt=" + fp.algorithm +
                                 " " + fp.digest + "\n").join("");
 }
 
 // Firefox only uses a single fingerprint
 // that doesn't mean we can't have SDP that describes two
 function testMultipleFingerprints() {
   // this one fails setRemoteDescription if the identity is not good
   var pcStrict = new mozRTCPeerConnection({ peerIdentity: 'someone@example.com'});
@@ -73,30 +73,30 @@ function testMultipleFingerprints() {
   }
 
   navigator.mozGetUserMedia({ audio: true, fake: true }, function(stream) {
     ok(stream, "Got fake stream");
     pcDouble.addStream(stream);
 
     pcDouble.createOffer(function(offer) {
       ok(offer, "Got offer");
-      var fp = offer.sdp.match(fingerprintRegex);
-      if (!fp) {
+      var m = offer.sdp.match(fingerprintRegex);
+      if (!m) {
         finished(false, "No fingerprint in offer SDP");
         return;
       }
 
-      var fingerprints = makeFingerprints(fp[1], fp[2]);
+      var fingerprints = makeFingerprints(m[1], m[2]);
       getIdentityAssertion(fingerprints, function(assertion) {
         ok(assertion, "Should have assertion");
 
-        var sdp = offer.sdp.slice(0, fp.index) +
+        var sdp = offer.sdp.slice(0, m.index) +
           "a=identity:" + assertion + "\n" +
           fingerprintSdp(fingerprints.slice(1)) +
-          offer.sdp.slice(fp.index);
+          offer.sdp.slice(m.index);
 
         var desc = new mozRTCSessionDescription({ type: "offer", sdp: sdp });
         pcStrict.setRemoteDescription(desc, function() {
           finished(true, "session description was OK");
         }, function(err) {
           finished(false, "error setting the session description: " + err);
         });
       });
--- a/dom/media/tests/mochitest/mochitest.ini
+++ b/dom/media/tests/mochitest/mochitest.ini
@@ -123,17 +123,10 @@ skip-if = toolkit == 'gonk' # b2g (Bug 1
 skip-if = toolkit == 'gonk' # b2g (Bug 1059867)
 [test_peerConnection_setRemoteOfferInHaveLocalOffer.html]
 skip-if = toolkit == 'gonk' # b2g (Bug 1059867)
 [test_peerConnection_throwInCallbacks.html]
 skip-if = toolkit == 'gonk' # b2g(Bug 960442, video support for WebRTC is disabled on b2g)
 [test_peerConnection_toJSON.html]
 skip-if = toolkit == 'gonk' # b2g (Bug 1059867)
 
-# multistream is not ready quite yet (bug 1056650)
-# [test_peerConnection_twoAudioStreams.html]
-# [test_peerConnection_twoAudioVideoStreams.html]
-# [test_peerConnection_twoAudioVideoStreamsCombined.html]
-# [test_peerConnection_twoVideoStreams.html]
-# [test_peerConnection_addSecondAudioStream.html]
-
 # Bug 950317: Hack for making a cleanup hook after finishing all WebRTC cases
 [test_zmedia_cleanup.html]
--- a/dom/media/tests/mochitest/pc.js
+++ b/dom/media/tests/mochitest/pc.js
@@ -1750,53 +1750,51 @@ PeerConnectionWrapper.prototype = {
     element.play();
   },
 
   /**
    * Requests all the media streams as specified in the constrains property.
    *
    * @param {function} onSuccess
    *        Callback to execute if all media has been requested successfully
-   * @param {array} constraintsList
-   *        Array of constraints for GUM calls
    */
-  getAllUserMedia : function PCW_GetAllUserMedia(constraintsList, onSuccess) {
+  getAllUserMedia : function PCW_GetAllUserMedia(onSuccess) {
     var self = this;
 
-    function _getAllUserMedia(index) {
+    function _getAllUserMedia(constraintsList, index) {
       if (index < constraintsList.length) {
         var constraints = constraintsList[index];
 
         getUserMedia(constraints, function (stream) {
           var type = '';
 
           if (constraints.audio) {
             type = 'audio';
           }
 
           if (constraints.video) {
             type += 'video';
           }
 
           self.attachMedia(stream, type, 'local');
 
-          _getAllUserMedia(index + 1);
+          _getAllUserMedia(constraintsList, index + 1);
         }, generateErrorCallback());
       } else {
         onSuccess();
       }
     }
 
-    if (constraintsList.length === 0) {
+    if (this.constraints.length === 0) {
       info("Skipping GUM: no UserMedia requested");
       onSuccess();
     }
     else {
-      info("Get " + constraintsList.length + " local streams");
-      _getAllUserMedia(0);
+      info("Get " + this.constraints.length + " local streams");
+      _getAllUserMedia(this.constraints, 0);
     }
   },
 
   /**
    * Create a new data channel instance
    *
    * @param {Object} options
    *        Options which get forwarded to nsIPeerConnection.createDataChannel
@@ -2171,23 +2169,23 @@ PeerConnectionWrapper.prototype = {
    * @param constraints
    *        The contraint to be examined.
    */
   countAudioTracksInMediaConstraint : function
     PCW_countAudioTracksInMediaConstraint(constraints) {
     if ((!constraints) || (constraints.length === 0)) {
       return 0;
     }
-    var numAudioTracks = 0;
+    var audioTracks = 0;
     for (var i = 0; i < constraints.length; i++) {
       if (constraints[i].audio) {
-        numAudioTracks++;
+        audioTracks++;
       }
     }
-    return numAudioTracks;
+    return audioTracks;
   },
 
   /**
    * Checks for audio in given offer options.
    *
    * @param options
    *        The options to be examined.
    */
@@ -2220,23 +2218,23 @@ PeerConnectionWrapper.prototype = {
    * @param constraint
    *        The contraint to be examined.
    */
   countVideoTracksInMediaConstraint : function
     PCW_countVideoTracksInMediaConstraint(constraints) {
     if ((!constraints) || (constraints.length === 0)) {
       return 0;
     }
-    var numVideoTracks = 0;
+    var videoTracks = 0;
     for (var i = 0; i < constraints.length; i++) {
       if (constraints[i].video) {
-        numVideoTracks++;
+        videoTracks++;
       }
     }
-    return numVideoTracks;
+    return videoTracks;
   },
 
   /**
    * Checks for video in given offer options.
    *
    * @param options
    *        The options to be examined.
    */
@@ -2269,39 +2267,39 @@ PeerConnectionWrapper.prototype = {
    * @param streams
    *        An array of streams (as returned by getLocalStreams()) to be
    *        examined.
    */
   countAudioTracksInStreams : function PCW_countAudioTracksInStreams(streams) {
     if (!streams || (streams.length === 0)) {
       return 0;
     }
-    var numAudioTracks = 0;
+    var audioTracks = 0;
     streams.forEach(function(st) {
-      numAudioTracks += st.getAudioTracks().length;
+      audioTracks += st.getAudioTracks().length;
     });
-    return numAudioTracks;
+    return audioTracks;
   },
 
   /*
    * Counts the amount of video tracks in a given set of streams.
    *
    * @param streams
    *        An array of streams (as returned by getLocalStreams()) to be
    *        examined.
    */
   countVideoTracksInStreams: function PCW_countVideoTracksInStreams(streams) {
     if (!streams || (streams.length === 0)) {
       return 0;
     }
-    var numVideoTracks = 0;
+    var videoTracks = 0;
     streams.forEach(function(st) {
-      numVideoTracks += st.getVideoTracks().length;
+      videoTracks += st.getVideoTracks().length;
     });
-    return numVideoTracks;
+    return videoTracks;
   },
 
   /**
    * Checks that we are getting the media tracks we expect.
    *
    * @param {object} constraintsRemote
    *        The media constraints of the local and remote peer connection object
    */
@@ -2364,19 +2362,20 @@ PeerConnectionWrapper.prototype = {
         if (!self.onAddStreamFired) {
           onSuccess();
         }
       }, 60000);
     }
   },
 
   verifySdp : function PCW_verifySdp(desc, expectedType, offerConstraintsList,
-      offerOptions, trickleIceCallback) {
+      answerConstraintsList, offerOptions, trickleIceCallback) {
     info("Examining this SessionDescription: " + JSON.stringify(desc));
     info("offerConstraintsList: " + JSON.stringify(offerConstraintsList));
+    info("answerConstraintsList: " + JSON.stringify(answerConstraintsList));
     info("offerOptions: " + JSON.stringify(offerOptions));
     ok(desc, "SessionDescription is not null");
     is(desc.type, expectedType, "SessionDescription type is " + expectedType);
     ok(desc.sdp.length > 10, "SessionDescription body length is plausible");
     ok(desc.sdp.contains("a=ice-ufrag"), "ICE username is present in SDP");
     ok(desc.sdp.contains("a=ice-pwd"), "ICE password is present in SDP");
     ok(desc.sdp.contains("a=fingerprint"), "ICE fingerprint is present in SDP");
     //TODO: update this for loopback support bug 1027350
@@ -2386,33 +2385,35 @@ PeerConnectionWrapper.prototype = {
       trickleIceCallback(false);
     } else {
       info("No ICE candidate in SDP -> requiring trickle ICE");
       trickleIceCallback(true);
     }
     //TODO: how can we check for absence/presence of m=application?
 
     var audioTracks =
-      this.countAudioTracksInMediaConstraint(offerConstraintsList) ||
+      Math.max(this.countAudioTracksInMediaConstraint(offerConstraintsList),
+               this.countAudioTracksInMediaConstraint(answerConstraintsList)) ||
       this.audioInOfferOptions(offerOptions);
 
     info("expected audio tracks: " + audioTracks);
     if (audioTracks == 0) {
       ok(!desc.sdp.contains("m=audio"), "audio m-line is absent from SDP");
     } else {
       ok(desc.sdp.contains("m=audio"), "audio m-line is present in SDP");
       ok(desc.sdp.contains("a=rtpmap:109 opus/48000/2"), "OPUS codec is present in SDP");
       //TODO: ideally the rtcp-mux should be for the m=audio, and not just
       //      anywhere in the SDP (JS SDP parser bug 1045429)
       ok(desc.sdp.contains("a=rtcp-mux"), "RTCP Mux is offered in SDP");
 
     }
 
     var videoTracks =
-      this.countVideoTracksInMediaConstraint(offerConstraintsList) ||
+      Math.max(this.countVideoTracksInMediaConstraint(offerConstraintsList),
+               this.countVideoTracksInMediaConstraint(answerConstraintsList)) ||
       this.videoInOfferOptions(offerOptions);
 
     info("expected video tracks: " + videoTracks);
     if (videoTracks == 0) {
       ok(!desc.sdp.contains("m=video"), "video m-line is absent from SDP");
     } else {
       ok(desc.sdp.contains("m=video"), "video m-line is present in SDP");
       if (this.h264) {
@@ -2631,56 +2632,16 @@ PeerConnectionWrapper.prototype = {
          (lIp === serverIp || rIp === serverIp), "One peer uses a relay");
     } else {
       info("P2P configured");
       ok(((lType !== "relayed") && (rType !== "relayed")), "Pure peer to peer call without a relay");
     }
   },
 
   /**
-   * Compares amount of established ICE connection according to ICE candidate
-   * pairs in the stats reporting with the expected amount of connection based
-   * on the constraints.
-   *
-   * @param {object} stats
-   *        The stats to check for ICE candidate pairs
-   * @param {object} counters
-   *        The counters for media and data tracks based on constraints
-   * @param {object} answer
-   *        The SDP answer to check for SDP bundle support
-   */
-  checkStatsIceConnections : function PCW_checkStatsIceConnections(stats,
-      offerConstraintsList, offerOptions, numDataTracks, answer) {
-    var numIceConnections = 0;
-    Object.keys(stats).forEach(function(key) {
-      if ((stats[key].type === "candidatepair") && stats[key].selected) {
-        numIceConnections += 1;
-      }
-    });
-    info("ICE connections according to stats: " + numIceConnections);
-    if (answer.sdp.contains('a=group:BUNDLE')) {
-      is(numIceConnections, 1, "stats reports exactly 1 ICE connection");
-    } else {
-      // This code assumes that no media sections have been rejected due to
-      // codec mismatch or other unrecoverable negotiation failures.
-      var numAudioTracks =
-        this.countAudioTracksInMediaConstraint(offerConstraintsList) ||
-        this.audioInOfferOptions(offerOptions);
-
-      var numVideoTracks =
-        this.countVideoTracksInMediaConstraint(offerConstraintsList) ||
-        this.videoInOfferOptions(offerOptions);
-
-      var numAudioVideoDataTracks = numAudioTracks + numVideoTracks + numDataTracks;
-      info("expected audio + video + data tracks: " + numAudioVideoDataTracks);
-      is(numAudioVideoDataTracks, numIceConnections, "stats ICE connections matches expected A/V tracks");
-    }
-  },
-
-  /**
    * Property-matching function for finding a certain stat in passed-in stats
    *
    * @param {object} stats
    *        The stats to check from this PeerConnectionWrapper
    * @param {object} props
    *        The properties to look for
    * @returns {boolean} Whether an entry containing all match-props was found.
    */
--- a/dom/media/tests/mochitest/templates.js
+++ b/dom/media/tests/mochitest/templates.js
@@ -106,25 +106,25 @@ var commandsPeerConnection = [
     function (test) {
       test.pcRemote.logSignalingState();
       test.next();
     }
   ],
   [
     'PC_LOCAL_GUM',
     function (test) {
-      test.pcLocal.getAllUserMedia(test.pcLocal.constraints, function () {
+      test.pcLocal.getAllUserMedia(function () {
         test.next();
       });
     }
   ],
   [
     'PC_REMOTE_GUM',
     function (test) {
-      test.pcRemote.getAllUserMedia(test.pcRemote.constraints, function () {
+      test.pcRemote.getAllUserMedia(function () {
         test.next();
       });
     }
   ],
   [
     'PC_LOCAL_CHECK_INITIAL_SIGNALINGSTATE',
     function (test) {
       is(test.pcLocal.signalingState, STABLE,
@@ -227,28 +227,28 @@ var commandsPeerConnection = [
         test.next();
       });
     }
   ],
   [
     'PC_LOCAL_SANE_LOCAL_SDP',
     function (test) {
       test.pcLocal.verifySdp(test._local_offer, "offer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function(trickle) {
           test.pcLocal.localRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_REMOTE_SANE_REMOTE_SDP',
     function (test) {
       test.pcRemote.verifySdp(test._local_offer, "offer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function (trickle) {
           test.pcRemote.remoteRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_REMOTE_CREATE_ANSWER',
@@ -351,28 +351,28 @@ var commandsPeerConnection = [
         }
       );
     }
   ],
   [
     'PC_REMOTE_SANE_LOCAL_SDP',
     function (test) {
       test.pcRemote.verifySdp(test._remote_answer, "answer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function (trickle) {
           test.pcRemote.localRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_LOCAL_SANE_REMOTE_SDP',
     function (test) {
       test.pcLocal.verifySdp(test._remote_answer, "answer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function (trickle) {
           test.pcLocal.remoteRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_LOCAL_WAIT_FOR_ICE_CONNECTED',
@@ -518,42 +518,16 @@ var commandsPeerConnection = [
     function (test) {
       test.pcRemote.getStats(null, function(stats) {
         test.pcRemote.checkStatsIceConnectionType(stats);
         test.next();
       });
     }
   ],
   [
-    'PC_LOCAL_CHECK_ICE_CONNECTIONS',
-    function (test) {
-      test.pcLocal.getStats(null, function(stats) {
-        test.pcLocal.checkStatsIceConnections(stats,
-                                              test._offer_constraints,
-                                              test._offer_options,
-                                              0,
-                                              test.originalAnswer);
-        test.next();
-      });
-    }
-  ],
-  [
-    'PC_REMOTE_CHECK_ICE_CONNECTIONS',
-    function (test) {
-      test.pcRemote.getStats(null, function(stats) {
-        test.pcRemote.checkStatsIceConnections(stats,
-                                               test._offer_constraints,
-                                               test._offer_options,
-                                               0,
-                                               test.originalAnswer);
-        test.next();
-      });
-    }
-  ],
-  [
     'PC_LOCAL_CHECK_GETSTATS_AUDIOTRACK_OUTBOUND',
     function (test) {
       var pc = test.pcLocal;
       var stream = pc._pc.getLocalStreams()[0];
       var track = stream && stream.getAudioTracks()[0];
       if (track) {
         var msg = "pcLocal.HasStat outbound audio rtp ";
         pc.getStats(track, function(stats) {
@@ -749,17 +723,17 @@ var commandsDataChannel = [
     function (test) {
       test.pcRemote.logSignalingState();
       test.next();
     }
   ],
   [
     'PC_LOCAL_GUM',
     function (test) {
-      test.pcLocal.getAllUserMedia(test.pcLocal.constraints, function () {
+      test.pcLocal.getAllUserMedia(function () {
         test.next();
       });
     }
   ],
   [
     'PC_LOCAL_INITIAL_SIGNALINGSTATE',
     function (test) {
       is(test.pcLocal.signalingState, STABLE,
@@ -773,17 +747,17 @@ var commandsDataChannel = [
       is(test.pcLocal.iceConnectionState, ICE_NEW,
         "Initial local ICE connection state is 'new'");
       test.next();
     }
   ],
   [
     'PC_REMOTE_GUM',
     function (test) {
-      test.pcRemote.getAllUserMedia(test.pcRemote.constraints, function () {
+      test.pcRemote.getAllUserMedia(function () {
       test.next();
       });
     }
   ],
   [
     'PC_REMOTE_INITIAL_SIGNALINGSTATE',
     function (test) {
       is(test.pcRemote.signalingState, STABLE,
@@ -888,28 +862,28 @@ var commandsDataChannel = [
         test.next();
       });
     }
   ],
   [
     'PC_LOCAL_SANE_LOCAL_SDP',
     function (test) {
       test.pcLocal.verifySdp(test._local_offer, "offer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function(trickle) {
           test.pcLocal.localRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_REMOTE_SANE_REMOTE_SDP',
     function (test) {
       test.pcRemote.verifySdp(test._local_offer, "offer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function (trickle) {
           test.pcRemote.remoteRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_REMOTE_CREATE_ANSWER',
@@ -992,28 +966,28 @@ var commandsDataChannel = [
         }
       );
     }
   ],
   [
     'PC_REMOTE_SANE_LOCAL_SDP',
     function (test) {
       test.pcRemote.verifySdp(test._remote_answer, "answer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function (trickle) {
           test.pcRemote.localRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_LOCAL_SANE_REMOTE_SDP',
     function (test) {
       test.pcLocal.verifySdp(test._remote_answer, "answer",
-        test._offer_constraints, test._offer_options,
+        test._offer_constraints, test._answer_constraints, test._offer_options,
         function (trickle) {
           test.pcLocal.remoteRequiresTrickleIce = trickle;
         });
       test.next();
     }
   ],
   [
     'PC_LOCAL_WAIT_FOR_ICE_CONNECTED',
@@ -1151,42 +1125,16 @@ var commandsDataChannel = [
     'PC_REMOTE_CHECK_MEDIA_FLOW_PRESENT',
     function (test) {
       test.pcRemote.checkMediaFlowPresent(function () {
         test.next();
       });
     }
   ],
   [
-    'PC_LOCAL_CHECK_ICE_CONNECTIONS',
-    function (test) {
-      test.pcLocal.getStats(null, function(stats) {
-        test.pcLocal.checkStatsIceConnections(stats,
-                                              test._offer_constraints,
-                                              test._offer_options,
-                                              1,
-                                              test.originalAnswer);
-        test.next();
-      });
-    }
-  ],
-  [
-    'PC_REMOTE_CHECK_ICE_CONNECTIONS',
-    function (test) {
-      test.pcRemote.getStats(null, function(stats) {
-        test.pcRemote.checkStatsIceConnections(stats,
-                                               test._offer_constraints,
-                                               test._offer_options,
-                                               1,
-                                               test.originalAnswer);
-        test.next();
-      });
-    }
-  ],
-  [
     'SEND_MESSAGE',
     function (test) {
       var message = "Lorem ipsum dolor sit amet";
 
       test.send(message, function (channel, data) {
         is(data, message, "Message correctly transmitted from pcLocal to pcRemote.");
 
         test.next();
deleted file mode 100644
--- a/dom/media/tests/mochitest/test_peerConnection_addSecondAudioStream.html
+++ /dev/null
@@ -1,102 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="head.js"></script>
-  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
-  <script type="application/javascript" src="pc.js"></script>
-  <script type="application/javascript" src="templates.js"></script>
-  <script type="application/javascript" src="turnConfig.js"></script>
-</head>
-<body>
-<pre id="test">
-<script type="application/javascript">
-  createHTML({
-    bug: "1091242",
-    title: "Renegotiation: add second audio stream"
-  });
-
-  var test;
-  runNetworkTest(function (options) {
-    test = new PeerConnectionTest(options);
-    test.chain.append([
-    [
-      'PC_LOCAL_SETUP_NEGOTIATION_CALLBACK',
-      function (test) {
-        test.pcLocal.onNegotiationneededFired = false;
-        test.pcLocal._pc.onnegotiationneeded = function (anEvent) {
-          info("pcLocal.onnegotiationneeded fired");
-          test.pcLocal.onNegotiationneededFired = true;
-        };
-        test.next();
-      }
-    ],
-    [
-      'PC_LOCAL_ADD_SECOND_STREAM',
-      function (test) {
-        test.pcLocal.getAllUserMedia([{audio: true}], function () {
-          test.next();
-        });
-      }
-    ],
-    [
-      'PC_LOCAL_CREATE_NEW_OFFER',
-      function (test) {
-        ok(test.pcLocal.onNegotiationneededFired, "onnegotiationneeded");
-        test.createOffer(test.pcLocal, function (offer) {
-          test._new_offer = offer;
-          test.next();
-        });
-      }
-    ],
-    [
-      'PC_LOCAL_SET_NEW_LOCAL_DESCRIPTION',
-      function (test) {
-        test.setLocalDescription(test.pcLocal, test._new_offer, HAVE_LOCAL_OFFER, function () {
-          test.next();
-        });
-      }
-    ],
-    [
-      'PC_REMOTE_SET_NEW_REMOTE_DESCRIPTION',
-      function (test) {
-        test.setRemoteDescription(test.pcRemote, test._new_offer, HAVE_REMOTE_OFFER, function () {
-          test.next();
-        });
-      }
-    ],
-    [
-      'PC_REMOTE_CREATE_NEW_ANSWER',
-      function (test) {
-        test.createAnswer(test.pcRemote, function (answer) {
-          test._new_answer = answer;
-          test.next();
-        });
-      }
-    ],
-    [
-      'PC_REMOTE_SET_NEW_LOCAL_DESCRIPTION',
-      function (test) {
-        test.setLocalDescription(test.pcRemote, test._new_answer, STABLE, function () {
-          test.next();
-        });
-      }
-    ],
-    [
-      'PC_LOCAL_SET_NEW_REMOTE_DESCRIPTION',
-      function (test) {
-        test.setRemoteDescription(test.pcLocal, test._new_answer, STABLE, function () {
-          test.next();
-        });
-      }
-    ]
-    // TODO(bug 1093835): figure out how to verify if media flows through the new stream
-    ]);
-    test.setMediaConstraints([{audio: true}], [{audio: true}]);
-    test.run();
-  });
-</script>
-</pre>
-</body>
-</html>
--- a/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html
+++ b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveAudio.html
@@ -13,17 +13,17 @@
 <script type="application/javascript">
   createHTML({
     bug: "850275",
     title: "Simple offer media constraint test with audio"
   });
 
   runNetworkTest(function() {
     var test = new PeerConnectionTest();
-    test.setMediaConstraints([], [{audio: true}]);
+
     // TODO: Stop using old constraint-like RTCOptions soon (Bug 1064223).
     // Watch out for case-difference when fixing: { offerToReceiveAudio: true }
     test.setOfferOptions({ mandatory: { OfferToReceiveAudio: true } });
     test.run();
   });
 </script>
 </pre>
 </body>
--- a/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html
+++ b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideo.html
@@ -13,17 +13,16 @@
 <script type="application/javascript">
   createHTML({
     bug: "850275",
     title: "Simple offer media constraint test with video"
   });
 
   runNetworkTest(function() {
     var test = new PeerConnectionTest();
-    test.setMediaConstraints([], [{video: true}]);
     // TODO: Stop using old constraint-like RTCOptions soon (Bug 1064223).
     // Watch out for case-difference when fixing: { offerToReceiveVideo: true }
     test.setOfferOptions({ optional: [{ OfferToReceiveVideo: true }] });
     test.run();
   });
 </script>
 </pre>
 </body>
--- a/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html
+++ b/dom/media/tests/mochitest/test_peerConnection_offerRequiresReceiveVideoAudio.html
@@ -13,16 +13,18 @@
 <script type="application/javascript">
   createHTML({
     bug: "850275",
     title: "Simple offer media constraint test with video/audio"
   });
 
   runNetworkTest(function() {
     var test = new PeerConnectionTest();
-    test.setMediaConstraints([], [{audio: true, video: true}]);
-    test.setOfferOptions({ offerToReceiveVideo: true, offerToReceiveAudio: true });
+    test.setOfferOptions({
+      offerToReceiveVideo: true,
+      offerToReceiveAudio: true
+    });
     test.run();
   });
 </script>
 </pre>
 </body>
 </html>
deleted file mode 100644
--- a/dom/media/tests/mochitest/test_peerConnection_twoAudioStreams.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="head.js"></script>
-  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
-  <script type="application/javascript" src="pc.js"></script>
-  <script type="application/javascript" src="templates.js"></script>
-  <script type="application/javascript" src="turnConfig.js"></script>
-</head>
-<body>
-<pre id="test">
-<script type="application/javascript">
-  createHTML({
-    bug: "1091242",
-    title: "Multistream: Two audio streams"
-  });
-
-  var test;
-  runNetworkTest(function (options) {
-    test = new PeerConnectionTest(options);
-    test.setMediaConstraints([{audio: true}, {audio: true}],
-                             [{audio: true}, {audio: true}]);
-    test.run();
-  });
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreams.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="head.js"></script>
-  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
-  <script type="application/javascript" src="pc.js"></script>
-  <script type="application/javascript" src="templates.js"></script>
-  <script type="application/javascript" src="turnConfig.js"></script>
-</head>
-<body>
-<pre id="test">
-<script type="application/javascript">
-
-  createHTML({
-    bug: "1091242",
-    title: "Multistream: Two audio streams, two video streams"
-  });
-
-  var test;
-  runNetworkTest(function (options) {
-    test = new PeerConnectionTest(options);
-    test.setMediaConstraints([{audio: true}, {video: true}, {audio: true},
-                                {video: true}],
-                             [{audio: true}, {video: true}, {audio: true},
-                                {video: true}]);
-    test.run();
-  });
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/dom/media/tests/mochitest/test_peerConnection_twoAudioVideoStreamsCombined.html
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="head.js"></script>
-  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
-  <script type="application/javascript" src="pc.js"></script>
-  <script type="application/javascript" src="templates.js"></script>
-  <script type="application/javascript" src="turnConfig.js"></script>
-</head>
-<body>
-<pre id="test">
-<script type="application/javascript">
-
-  createHTML({
-    bug: "1091242",
-    title: "Multistream: Two audio/video streams"
-  });
-
-  var test;
-  runNetworkTest(function (options) {
-    test = new PeerConnectionTest(options);
-    test.setMediaConstraints([{audio: true, video: true},
-                                {audio: true, video: true}],
-                             [{audio: true, video: true},
-                                {audio: true, video: true}]);
-    test.run();
-  });
-</script>
-</pre>
-</body>
-</html>
deleted file mode 100644
--- a/dom/media/tests/mochitest/test_peerConnection_twoVideoStreams.html
+++ /dev/null
@@ -1,30 +0,0 @@
-<!DOCTYPE HTML>
-<html>
-<head>
-  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
-  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
-  <script type="application/javascript" src="head.js"></script>
-  <script type="application/javascript" src="mediaStreamPlayback.js"></script>
-  <script type="application/javascript" src="pc.js"></script>
-  <script type="application/javascript" src="templates.js"></script>
-  <script type="application/javascript" src="turnConfig.js"></script>
-</head>
-<body>
-<pre id="test">
-<script type="application/javascript">
-  createHTML({
-    bug: "1091242",
-    title: "Multistream: Two video streams"
-  });
-
-  var test;
-  runNetworkTest(function (options) {
-    test = new PeerConnectionTest(options);
-    test.setMediaConstraints([{video: true}, {video: true}],
-                             [{video: true}, {video: true}]);
-    test.run();
-  });
-</script>
-</pre>
-</body>
-</html>
--- a/dom/webidl/PeerConnectionImpl.webidl
+++ b/dom/webidl/PeerConnectionImpl.webidl
@@ -62,24 +62,24 @@ interface PeerConnectionImpl  {
 
   /* Puts the SIPCC engine back to 'kIdle', shuts down threads, deletes state */
   void close();
 
   /* Notify DOM window if this plugin crash is ours. */
   boolean pluginCrash(unsigned long long pluginId, DOMString name, DOMString pluginDumpID);
 
   /* Attributes */
-  [Constant]
   readonly attribute DOMString fingerprint;
   readonly attribute DOMString localDescription;
   readonly attribute DOMString remoteDescription;
 
   readonly attribute PCImplIceConnectionState iceConnectionState;
   readonly attribute PCImplIceGatheringState iceGatheringState;
   readonly attribute PCImplSignalingState signalingState;
+  readonly attribute PCImplSipccState sipccState;
   attribute DOMString id;
 
   attribute DOMString peerIdentity;
   readonly attribute boolean privacyRequested;
 
   /* Data channels */
   [Throws]
   DataChannel createDataChannel(DOMString label, DOMString protocol,
--- a/media/mtransport/dtlsidentity.cpp
+++ b/media/mtransport/dtlsidentity.cpp
@@ -12,24 +12,27 @@
 #include "keyhi.h"
 #include "pk11pub.h"
 #include "sechash.h"
 #include "nsError.h"
 #include "dtlsidentity.h"
 
 namespace mozilla {
 
+MOZ_MTLOG_MODULE("mtransport")
+
 DtlsIdentity::~DtlsIdentity() {
   // XXX: make cert_ a smart pointer to avoid this, after we figure
   // out the linking problem.
   if (cert_)
     CERT_DestroyCertificate(cert_);
 }
 
 const std::string DtlsIdentity::DEFAULT_HASH_ALGORITHM = "sha-256";
+const size_t DtlsIdentity::HASH_ALGORITHM_MAX_LENGTH = 64;
 
 TemporaryRef<DtlsIdentity> DtlsIdentity::Generate() {
 
   ScopedPK11SlotInfo slot(PK11_GetInternalSlot());
   if (!slot) {
     return nullptr;
   }
 
@@ -202,9 +205,94 @@ nsresult DtlsIdentity::ComputeFingerprin
   if (rv != SECSuccess)
     return NS_ERROR_FAILURE;
 
   *digest_length = ho->length;
 
   return NS_OK;
 }
 
+// Format the fingerprint in RFC 4572 Section 5 attribute format, including both
+// the hash name and the fingerprint, colons and all.
+// returns an empty string if there is a problem
+std::string DtlsIdentity::GetFormattedFingerprint(const std::string &algorithm) {
+  unsigned char digest[HASH_ALGORITHM_MAX_LENGTH];
+  size_t digest_length;
+
+  nsresult res = this->ComputeFingerprint(algorithm,
+                                          digest,
+                                          sizeof(digest),
+                                          &digest_length);
+  if (NS_FAILED(res)) {
+    MOZ_MTLOG(ML_ERROR, "Unable to compute " << algorithm
+              << " hash for identity: nsresult = 0x"
+              << std::hex << std::uppercase
+              << static_cast<uint32_t>(res)
+              << std::nouppercase << std::dec);
+    return "";
+  }
+
+  return algorithm + " " + this->FormatFingerprint(digest, digest_length);
+}
+
+std::string DtlsIdentity::FormatFingerprint(const unsigned char *digest,
+                                            std::size_t size) {
+  std::string str("");
+  char group[3];
+
+  for (std::size_t i=0; i < size; i++) {
+    PR_snprintf(group, sizeof(group), "%.2X", digest[i]);
+    if (i != 0) {
+      str += ":";
+    }
+    str += group;
+  }
+
+  MOZ_ASSERT(str.size() == (size * 3 - 1));  // Check result length
+  return str;
+}
+
+// Parse a fingerprint in RFC 4572 format.
+// Note that this tolerates some badly formatted data, in particular:
+// (a) arbitrary runs of colons
+// (b) colons at the beginning or end.
+nsresult DtlsIdentity::ParseFingerprint(const std::string fp,
+                                        unsigned char *digest,
+                                        size_t size,
+                                        size_t *length) {
+  size_t offset = 0;
+  bool top_half = true;
+  uint8_t val = 0;
+
+  for (size_t i=0; i<fp.length(); i++) {
+    if (offset >= size) {
+      // Note: no known way for offset to get > size
+      MOZ_MTLOG(ML_ERROR, "Fingerprint too long for buffer");
+      return NS_ERROR_INVALID_ARG;
+    }
+
+    if (top_half && (fp[i] == ':')) {
+      continue;
+    } else if ((fp[i] >= '0') && (fp[i] <= '9')) {
+      val |= fp[i] - '0';
+    } else if ((fp[i] >= 'A') && (fp[i] <= 'F')) {
+      val |= fp[i] - 'A' + 10;
+    } else {
+      MOZ_MTLOG(ML_ERROR, "Invalid fingerprint value " << fp[i]);
+      return NS_ERROR_ILLEGAL_VALUE;
+    }
+
+    if (top_half) {
+      val <<= 4;
+      top_half = false;
+    } else {
+      digest[offset++] = val;
+      top_half = true;
+      val = 0;
+    }
+  }
+
+  *length = offset;
+
+  return NS_OK;
+}
+
 }  // close namespace
--- a/media/mtransport/dtlsidentity.h
+++ b/media/mtransport/dtlsidentity.h
@@ -28,36 +28,44 @@ class DtlsIdentity {
 
   // Note: the following two functions just provide access. They
   // do not transfer ownership. If you want a pointer that lasts
   // past the lifetime of the DtlsIdentity, you must make
   // a copy yourself.
   CERTCertificate *cert() { return cert_; }
   SECKEYPrivateKey *privkey() { return privkey_; }
 
+  std::string GetFormattedFingerprint(const std::string &algorithm = DEFAULT_HASH_ALGORITHM);
+
   nsresult ComputeFingerprint(const std::string algorithm,
                               unsigned char *digest,
                               std::size_t size,
                               std::size_t *digest_length);
 
   static nsresult ComputeFingerprint(const CERTCertificate *cert,
                                      const std::string algorithm,
                                      unsigned char *digest,
                                      std::size_t size,
                                      std::size_t *digest_length);
-  static const std::string DEFAULT_HASH_ALGORITHM;
-  enum {
-    HASH_ALGORITHM_MAX_LENGTH = 64
-  };
+
+  static nsresult ParseFingerprint(const std::string fp,
+                                   unsigned char *digest,
+                                   size_t size, size_t *length);
 
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(DtlsIdentity)
 
-private:
+ private:
   DtlsIdentity(SECKEYPrivateKey *privkey, CERTCertificate *cert)
       : privkey_(privkey), cert_(cert) {}
   DISALLOW_COPY_ASSIGN(DtlsIdentity);
 
+  static const std::string DEFAULT_HASH_ALGORITHM;
+  static const size_t HASH_ALGORITHM_MAX_LENGTH;
+
+  std::string FormatFingerprint(const unsigned char *digest,
+                                std::size_t size);
+
   ScopedSECKEYPrivateKey privkey_;
   CERTCertificate *cert_;  // TODO: Using a smart pointer here causes link
                            // errors.
 };
 }  // close namespace
 #endif
--- a/media/mtransport/logging.h
+++ b/media/mtransport/logging.h
@@ -35,11 +35,12 @@
     std::stringstream str;                                              \
     str << b;                                                           \
     PR_LOG(getLogModule(), level, ("%s", str.str().c_str())); } while(0)
 
 #else
 // PR_LOGGING is off --> make no-op MTLOG macros
 #define MOZ_MTLOG_MODULE(n)
 #define MOZ_MTLOG(level, b)
+
 #endif // defined(PR_LOGGING)
 
 #endif // logging_h__
--- a/media/mtransport/nricectx.cpp
+++ b/media/mtransport/nricectx.cpp
@@ -528,31 +528,21 @@ NrIceCtx::~NrIceCtx() {
   delete ice_handler_;
 }
 
 RefPtr<NrIceMediaStream>
 NrIceCtx::CreateStream(const std::string& name, int components) {
   RefPtr<NrIceMediaStream> stream =
     NrIceMediaStream::Create(this, name, components);
 
-  if (stream) {
-    streams_.push_back(stream);
-  }
+  streams_.push_back(stream);
 
   return stream;
 }
 
-std::string NrIceCtx::ufrag() const {
-  return ctx_->ufrag;
-}
-
-std::string NrIceCtx::pwd() const {
-  return ctx_->pwd;
-}
-
 void NrIceCtx::destroy_peer_ctx() {
   nr_ice_peer_ctx_destroy(&peer_);
 }
 
 nsresult NrIceCtx::SetControlling(Controlling controlling) {
   peer_->controlling = (controlling == ICE_CONTROLLING)? 1 : 0;
 
   MOZ_MTLOG(ML_DEBUG, "ICE ctx " << name_ << " setting controlling to" <<
--- a/media/mtransport/nricectx.h
+++ b/media/mtransport/nricectx.h
@@ -202,30 +202,19 @@ class NrIceCtx {
 
   // Testing only.
   void destroy_peer_ctx();
 
   // Create a media stream
   RefPtr<NrIceMediaStream> CreateStream(const std::string& name,
                                                  int components);
 
-  RefPtr<NrIceMediaStream> GetStream(size_t index) {
-    if (index < streams_.size()) {
-      return streams_[index];
-    }
-    return nullptr;
-  }
-
   // The name of the ctx
   const std::string& name() const { return name_; }
 
-  // Get ufrag and password.
-  std::string ufrag() const;
-  std::string pwd() const;
-
   // Current state
   ConnectionState connection_state() const {
     return connection_state_;
   }
 
   // Current state
   GatheringState gathering_state() const {
     return gathering_state_;
--- a/media/mtransport/nricemediastream.cpp
+++ b/media/mtransport/nricemediastream.cpp
@@ -333,37 +333,16 @@ nsresult NrIceMediaStream::GetCandidateP
     }
 
     out_pairs->push_back(pair);
   }
 
   return NS_OK;
 }
 
-nsresult NrIceMediaStream::GetDefaultCandidate(
-    NrIceCandidate* candidate) const {
-
-  nr_ice_candidate *cand;
-
-  int r = nr_ice_media_stream_get_default_candidate(stream_, 1, &cand);
-  if (r) {
-    MOZ_MTLOG(ML_ERROR, "Couldn't get default ICE candidate for '"
-              << name_ << "'");
-    return NS_ERROR_FAILURE;
-  }
-
-  if (!ToNrIceCandidate(*cand, candidate)) {
-    MOZ_MTLOG(ML_ERROR, "Failed to convert default ICE candidate for '"
-              << name_ << "'");
-    return NS_ERROR_FAILURE;
-  }
-
-  return NS_OK;
-}
-
 std::vector<std::string> NrIceMediaStream::GetCandidates() const {
   char **attrs = 0;
   int attrct;
   int r;
   std::vector<std::string> ret;
 
   r = nr_ice_media_stream_get_attributes(stream_,
                                          &attrs, &attrct);
--- a/media/mtransport/nricemediastream.h
+++ b/media/mtransport/nricemediastream.h
@@ -131,36 +131,32 @@ class NrIceMediaStream {
 
   nsresult GetLocalCandidates(std::vector<NrIceCandidate>* candidates) const;
   nsresult GetRemoteCandidates(std::vector<NrIceCandidate>* candidates) const;
 
   // Get all candidate pairs, whether in the check list or triggered check
   // queue, in priority order. |out_pairs| is cleared before being filled.
   nsresult GetCandidatePairs(std::vector<NrIceCandidatePair>* out_pairs) const;
 
-  // TODO(bug 1096795): This needs to take a component number, so we can get
-  // default candidates for rtcp.
-  nsresult GetDefaultCandidate(NrIceCandidate* candidate) const;
-
   // Parse remote attributes
   nsresult ParseAttributes(std::vector<std::string>& candidates);
 
   // Parse trickle ICE candidate
   nsresult ParseTrickleCandidate(const std::string& candidate);
 
   // Disable a component
   nsresult DisableComponent(int component);
 
   // Get the candidate pair currently active. It's the
   // caller's responsibility to free these.
   nsresult GetActivePair(int component,
                          NrIceCandidate** local, NrIceCandidate** remote);
 
   // The number of components
-  size_t components() const { return components_; }
+  int components() const { return components_; }
 
   // The underlying nICEr stream
   nr_ice_media_stream *stream() { return stream_; }
   // Signals to indicate events. API users can (and should)
   // register for these.
 
   // Send a packet
   nsresult SendPacket(int component_id, const unsigned char *data, size_t len);
@@ -187,31 +183,31 @@ class NrIceMediaStream {
   sigslot::signal1<NrIceMediaStream *> SignalFailed;  // Candidate pair failed.
   sigslot::signal4<NrIceMediaStream *, int, const unsigned char *, int>
   SignalPacketReceived;  // Incoming packet
 
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(NrIceMediaStream)
 
  private:
   NrIceMediaStream(NrIceCtx *ctx,  const std::string& name,
-                   size_t components) :
+                   int components) :
       state_(ICE_CONNECTING),
       ctx_(ctx),
       name_(name),
       components_(components),
       stream_(nullptr),
       level_(0) {}
 
   ~NrIceMediaStream();
 
   DISALLOW_COPY_ASSIGN(NrIceMediaStream);
 
   State state_;
   NrIceCtx *ctx_;
   const std::string name_;
-  const size_t components_;
+  const int components_;
   nr_ice_media_stream *stream_;
   uint16_t level_;
 };
 
 
 }  // close namespace
 #endif
--- a/media/mtransport/test/ice_unittest.cpp
+++ b/media/mtransport/test/ice_unittest.cpp
@@ -277,20 +277,16 @@ class IceTestPeer : public sigslot::has_
     streams_.push_back(stream);
     stream->SignalCandidate.connect(this, &IceTestPeer::CandidateInitialized);
     stream->SignalReady.connect(this, &IceTestPeer::StreamReady);
     stream->SignalFailed.connect(this, &IceTestPeer::StreamFailed);
     stream->SignalPacketReceived.connect(this, &IceTestPeer::PacketReceived);
   }
 
   void SetStunServer(const std::string addr, uint16_t port) {
-    if (addr.empty()) {
-      // Happens when MOZ_DISABLE_NONLOCAL_CONNECTIONS is set
-      return;
-    }
 
     std::vector<NrIceStunServer> stun_servers;
     ScopedDeletePtr<NrIceStunServer> server(NrIceStunServer::Create(addr,
                                                                     port));
     stun_servers.push_back(*server);
     ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetStunServers(stun_servers)));
   }
 
@@ -315,24 +311,22 @@ class IceTestPeer : public sigslot::has_
   }
 
   void SetTurnServers(const std::vector<NrIceTurnServer> servers) {
     ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetTurnServers(servers)));
   }
 
   void SetFakeResolver() {
     ASSERT_TRUE(NS_SUCCEEDED(dns_resolver_->Init()));
-    if (!g_stun_server_address.empty() && !g_stun_server_hostname.empty()) {
-      PRNetAddr addr;
-      PRStatus status = PR_StringToNetAddr(g_stun_server_address.c_str(),
-                                            &addr);
-      addr.inet.port = kDefaultStunServerPort;
-      ASSERT_EQ(PR_SUCCESS, status);
-      fake_resolver_.SetAddr(g_stun_server_hostname, addr);
-    }
+    PRNetAddr addr;
+    PRStatus status = PR_StringToNetAddr(g_stun_server_address.c_str(),
+                                          &addr);
+    addr.inet.port = kDefaultStunServerPort;
+    ASSERT_EQ(PR_SUCCESS, status);
+    fake_resolver_.SetAddr(g_stun_server_hostname, addr);
     ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetResolver(
         fake_resolver_.AllocateResolver())));
   }
 
   void SetDNSResolver() {
     ASSERT_TRUE(NS_SUCCEEDED(dns_resolver_->Init()));
     ASSERT_TRUE(NS_SUCCEEDED(ice_ctx_->SetResolver(
         dns_resolver_->AllocateResolver())));
@@ -546,17 +540,17 @@ class IceTestPeer : public sigslot::has_
               << " codeword="
               << cand.codeword
               << std::endl;
   }
 
   void DumpAndCheckActiveCandidates_s() {
     std::cerr << "Active candidates:" << std::endl;
     for (size_t i=0; i < streams_.size(); ++i) {
-      for (size_t j=0; j < streams_[i]->components(); ++j) {
+      for (int j=0; j < streams_[i]->components(); ++j) {
         std::cerr << "Stream " << i << " component " << j+1 << std::endl;
 
         NrIceCandidate *local;
         NrIceCandidate *remote;
 
         nsresult res = streams_[i]->GetActivePair(j+1, &local, &remote);
         if (res == NS_ERROR_NOT_AVAILABLE) {
           std::cerr << "Component unpaired or disabled." << std::endl;
@@ -1276,71 +1270,51 @@ class PacketFilterTest : public ::testin
   }
 
   nsCOMPtr<nsIUDPSocketFilter> filter_;
   RefPtr<NrIceCtx> ice_ctx_;
 };
 }  // end namespace
 
 TEST_F(IceGatherTest, TestGatherFakeStunServerHostnameNoResolver) {
-  if (g_stun_server_hostname.empty()) {
-    return;
-  }
-
   EnsurePeer();
   peer_->SetStunServer(g_stun_server_hostname, kDefaultStunServerPort);
   Gather();
 }
 
 TEST_F(IceGatherTest, TestGatherFakeStunServerIpAddress) {
-  if (g_stun_server_address.empty()) {
-    return;
-  }
-
   EnsurePeer();
   peer_->SetStunServer(g_stun_server_address, kDefaultStunServerPort);
   peer_->SetFakeResolver();
   Gather();
 }
 
 TEST_F(IceGatherTest, TestGatherFakeStunServerHostname) {
-  if (g_stun_server_hostname.empty()) {
-    return;
-  }
-
   EnsurePeer();
   peer_->SetStunServer(g_stun_server_hostname, kDefaultStunServerPort);
   peer_->SetFakeResolver();
   Gather();
 }
 
 TEST_F(IceGatherTest, TestGatherFakeStunBogusHostname) {
   EnsurePeer();
   peer_->SetStunServer(kBogusStunServerHostname, kDefaultStunServerPort);
   peer_->SetFakeResolver();
   Gather();
 }
 
 TEST_F(IceGatherTest, TestGatherDNSStunServerIpAddress) {
-  if (g_stun_server_address.empty()) {
-    return;
-  }
-
   EnsurePeer();
   peer_->SetStunServer(g_stun_server_address, kDefaultStunServerPort);
   peer_->SetDNSResolver();
   Gather();
   // TODO(jib@mozilla.com): ensure we get server reflexive candidates Bug 848094
 }
 
 TEST_F(IceGatherTest, TestGatherDNSStunServerHostname) {
-  if (g_stun_server_hostname.empty()) {
-    return;
-  }
-
   EnsurePeer();
   peer_->SetStunServer(g_stun_server_hostname, kDefaultStunServerPort);
   peer_->SetDNSResolver();
   Gather();
 }
 
 TEST_F(IceGatherTest, TestGatherDNSStunBogusHostname) {
   EnsurePeer();
@@ -1363,22 +1337,18 @@ TEST_F(IceGatherTest, TestGatherTurnTcp)
   if (g_turn_server.empty())
     return;
   peer_->SetTurnServer(g_turn_server, kDefaultStunServerPort,
                        g_turn_user, g_turn_password, kNrIceTransportTcp);
   Gather();
 }
 
 TEST_F(IceGatherTest, TestGatherDisableComponent) {
-  if (g_stun_server_hostname.empty()) {
-    return;
-  }
-
   EnsurePeer();
-  peer_->SetStunServer(g_stun_server_hostname, kDefaultStunServerPort);
+  peer_->SetStunServer(kDefaultStunServerHostname, kDefaultStunServerPort);
   peer_->AddStream(2);
   peer_->DisableComponent(1, 2);
   Gather();
   std::vector<std::string> candidates =
     peer_->GetCandidates(1);
 
   for (size_t i=0; i<candidates.size(); ++i) {
     size_t sp1 = candidates[i].find(' ');
@@ -2117,27 +2087,16 @@ int main(int argc, char **argv)
   if (tmp != "")
     g_stun_server_address = tmp;
 
 
   tmp = get_environment("STUN_SERVER_HOSTNAME");
   if (tmp != "")
     g_stun_server_hostname = tmp;
 
-  tmp = get_environment("MOZ_DISABLE_NONLOCAL_CONNECTIONS");
-
-  if ((tmp != "" && tmp != "0") || getenv("MOZ_UPLOAD_DIR")) {
-    // We're assuming that MOZ_UPLOAD_DIR is only set on tbpl;
-    // MOZ_DISABLE_NONLOCAL_CONNECTIONS probably should be set when running the
-    // cpp unit-tests, but is not presently.
-    g_stun_server_address = "";
-    g_stun_server_hostname = "";
-    g_turn_server = "";
-  }
-
   test_utils = new MtransportTestUtils();
   NSS_NoDB_Init(nullptr);
   NSS_SetDomesticPolicy();
 
   // Start the tests
   ::testing::InitGoogleTest(&argc, argv);
 
   ::testing::TestEventListeners& listeners =
--- a/media/mtransport/test/moz.build
+++ b/media/mtransport/test/moz.build
@@ -2,27 +2,32 @@
 # vim: set filetype=python:
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 if CONFIG['OS_TARGET'] != 'WINNT' and CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk':
     GeckoCppUnitTests([
         'buffered_stun_socket_unittest',
-        'ice_unittest',
         'nrappkit_unittest',
         'rlogringbuffer_unittest',
         'runnable_utils_unittest',
         'simpletokenbucket_unittest',
         'sockettransportservice_unittest',
         'TestSyncRunnable',
         'transport_unittests',
         'turn_unittest',
     ])
 
+    # Bug 1037618 - Cross-tree (network related?) failures on OSX
+    if CONFIG['OS_TARGET'] != 'Darwin':
+        GeckoCppUnitTests([
+            'ice_unittest',
+        ])
+
     if CONFIG['MOZ_SCTP']:
         GeckoCppUnitTests([
             'sctp_unittest',
         ])
 
 FAIL_ON_WARNINGS = True
 
 for var in ('HAVE_STRDUP', 'NR_SOCKET_IS_VOID_PTR', 'SCTP_DEBUG', 'INET'):
--- a/media/mtransport/test/transport_unittests.cpp
+++ b/media/mtransport/test/transport_unittests.cpp
@@ -602,18 +602,17 @@ class TransportTestPeer : public sigslot
     ASSERT_TRUE(stream != nullptr);
     streams_.push_back(stream);
 
     // Listen for candidates
     stream->SignalCandidate.
         connect(this, &TransportTestPeer::GotCandidate);
 
     // Create the transport layer
-    ice_ = new TransportLayerIce(name);
-    ice_->SetParameters(ice_ctx_, stream, 1);
+    ice_ = new TransportLayerIce(name, ice_ctx_, stream, 1);
 
     // Assemble the stack
     nsAutoPtr<std::queue<mozilla::TransportLayer *> > layers(
       new std::queue<mozilla::TransportLayer *>);
     layers->push(ice_);
     layers->push(dtls_);
 
     test_utils->sts_target()->Dispatch(
--- a/media/mtransport/third_party/nICEr/src/ice/ice_candidate.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_candidate.c
@@ -458,19 +458,17 @@ int nr_ice_candidate_initialize(nr_ice_c
     cand->done_cb=ready_cb;
     cand->cb_arg=cb_arg;
 
     switch(cand->type){
       case HOST:
         if(r=nr_socket_getaddr(cand->isock->sock,&cand->addr))
           ABORT(r);
         cand->osock=cand->isock->sock;
-        // This is actually ready, but we set this anyway to prevent it from
-        // being paired twice.
-        cand->state=NR_ICE_CAND_STATE_INITIALIZING;
+        cand->state=NR_ICE_CAND_STATE_INITIALIZED;
         // Post this so that it doesn't happen in-line
         cand->ready_cb = ready_cb;
         cand->ready_cb_arg = cb_arg;
         NR_ASYNC_TIMER_SET(0, nr_ice_candidate_fire_ready_cb, (void *)cand, &cand->ready_cb_timer);
         break;
 #ifdef USE_TURN
       case RELAYED:
         protocol=NR_RESOLVE_PROTOCOL_TURN;
--- a/media/mtransport/third_party/nICEr/src/ice/ice_component.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_component.c
@@ -788,21 +788,20 @@ int nr_ice_component_pair_candidate(nr_i
 
         1. Pair remote candidates which have not been paired
            (used in initial pairing or in processing the other side's
            trickle candidates).
         2. Pair any remote candidate (used when processing our own
            trickle candidates).
       */
       if (pair_all_remote || (pcand->state == NR_ICE_CAND_PEER_CANDIDATE_UNPAIRED)) {
-        if (pair_all_remote) {
-          /* When a remote candidate arrives after the start of checking, but
-           * before the gathering of local candidates, it can be in UNPAIRED */
-          pcand->state = NR_ICE_CAND_PEER_CANDIDATE_PAIRED;
-        }
+        /* If we are pairing our own trickle candidates, the remote candidate should
+           all be paired */
+        if (pair_all_remote)
+          assert (pcand->state == NR_ICE_CAND_PEER_CANDIDATE_PAIRED);
 
         nr_ice_compute_codeword(pcand->label,strlen(pcand->label),codeword);
         r_log(LOG_ICE,LOG_DEBUG,"ICE-PEER(%s)/CAND(%s): Pairing with peer candidate %s", pctx->label, codeword, pcand->label);
 
         if(r=nr_ice_candidate_pair_create(pctx,lcand,pcand,&pair))
           ABORT(r);
 
         if(r=nr_ice_component_insert_pair(pcomp, pair))
@@ -1097,22 +1096,20 @@ int nr_ice_component_insert_pair(nr_ice_
       assert(0);
       ABORT(R_BAD_ARGS);
     }
 
     if(r=nr_ice_candidate_pair_insert(&pair->remote->stream->check_list,pair))
       ABORT(r);
 
     /* Make sure the check timer is running, if the stream was previously
-     * started. We will not start streams just because a pair was created,
-     * unless it is the first pair to be created across all streams. */
+     * started. We will not start streams just because a pair was created. */
     r_log(LOG_ICE,LOG_DEBUG,"ICE-PEER(%s)/CAND-PAIR(%s): Ensure that check timer is running for new pair %s.",pair->remote->stream->pctx->label, pair->codeword, pair->as_string);
 
-    if(pair->remote->stream->ice_state == NR_ICE_MEDIA_STREAM_CHECKS_ACTIVE ||
-       !pair->remote->stream->pctx->checks_started){
+    if(pair->remote->stream->ice_state == NR_ICE_MEDIA_STREAM_CHECKS_ACTIVE){
       if(nr_ice_media_stream_start_checks(pair->remote->stream->pctx, pair->remote->stream)) {
         r_log(LOG_ICE,LOG_WARNING,"ICE-PEER(%s)/CAND-PAIR(%s): Could not restart checks for new pair %s.",pair->remote->stream->pctx->label, pair->codeword, pair->as_string);
         ABORT(R_INTERNAL);
       }
     }
 
     _status=0;
   abort:
--- a/media/mtransport/third_party/nICEr/src/ice/ice_ctx.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_ctx.c
@@ -450,34 +450,30 @@ void nr_ice_initialize_finished_cb(NR_SO
 
     assert(cb_arg);
     if (!cb_arg)
       return;
     ctx = cand->ctx;
 
     ctx->uninitialized_candidates--;
 
-    // Avoid the need for yet another initialization function
-    if (cand->state == NR_ICE_CAND_STATE_INITIALIZING && cand->type == HOST)
-      cand->state = NR_ICE_CAND_STATE_INITIALIZED;
-
     if (cand->state == NR_ICE_CAND_STATE_INITIALIZED) {
       int was_pruned = 0;
 
       if (r=nr_ice_component_maybe_prune_candidate(ctx, cand->component,
                                                    cand, &was_pruned)) {
           r_log(LOG_ICE, LOG_NOTICE, "ICE(%s): Problem pruning candidates",ctx->label);
       }
 
       /* If we are initialized, the candidate wasn't pruned,
          and we have a trickle ICE callback fire the callback */
       if (ctx->trickle_cb && !was_pruned) {
         ctx->trickle_cb(ctx->trickle_cb_arg, ctx, cand->stream, cand->component_id, cand);
 
-        if (nr_ice_ctx_pair_new_trickle_candidates(ctx, cand)) {
+        if (r=nr_ice_ctx_pair_new_trickle_candidates(ctx, cand)) {
           r_log(LOG_ICE,LOG_ERR, "ICE(%s): All could not pair new trickle candidate",ctx->label);
           /* But continue */
         }
       }
     }
 
     if(ctx->uninitialized_candidates==0){
       r_log(LOG_ICE,LOG_DEBUG,"ICE(%s): All candidates initialized",ctx->label);
--- a/media/mtransport/third_party/nICEr/src/ice/ice_parser.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_parser.c
@@ -132,20 +132,16 @@ nr_ice_peer_candidate_from_attribute(nr_
         ABORT(R_NO_MEMORY);
 
     cand->ctx=ctx;
     cand->isock=0;
     cand->state=NR_ICE_CAND_PEER_CANDIDATE_UNPAIRED;
     cand->stream=stream;
     skip_whitespace(&str);
 
-    /* Skip a= if present */
-    if (!strncmp(str, "a=", 2))
-        str += 2;
-
     /* Candidate attr */
     if (strncasecmp(str, "candidate:", 10))
         ABORT(R_BAD_DATA);
 
     fast_forward(&str, 10);
     if (*str == '\0')
         ABORT(R_BAD_DATA);
 
--- a/media/mtransport/third_party/nICEr/src/ice/ice_peer_ctx.c
+++ b/media/mtransport/third_party/nICEr/src/ice/ice_peer_ctx.c
@@ -166,17 +166,17 @@ static int nr_ice_peer_ctx_parse_stream_
       }
       else if (!strncmp(attrs[i],"candidate",9)){
         if(r=nr_ice_ctx_parse_candidate(pctx,pstream,attrs[i])) {
           r_log(LOG_ICE,LOG_WARNING,"ICE(%s): peer (%s) specified bogus candidate",pctx->ctx->label,pctx->label);
           continue;
         }
       }
       else {
-        r_log(LOG_ICE,LOG_WARNING,"ICE(%s): peer (%s) specified bogus attribute: %s",pctx->ctx->label,pctx->label,attrs[i]);
+        r_log(LOG_ICE,LOG_WARNING,"ICE(%s): peer (%s) specified bogus attribute",pctx->ctx->label,pctx->label);
       }
     }
 
     /* Doesn't fail because we just skip errors */
     return(0);
   }
 
 static int nr_ice_ctx_parse_candidate(nr_ice_peer_ctx *pctx, nr_ice_media_stream *pstream, char *candidate)
@@ -215,19 +215,16 @@ static int nr_ice_ctx_parse_candidate(nr
       r_log(LOG_ICE,LOG_WARNING,"Peer offered candidates for disabled local component");
       ABORT(R_BAD_DATA);
     }
 
     cand->component=comp;
 
     TAILQ_INSERT_TAIL(&comp->candidates,cand,entry_comp);
 
-    r_log(LOG_ICE,LOG_DEBUG,"ICE-PEER(%s)/CAND(%s): creating peer candidate",
-      pctx->label,cand->label);
-
     _status=0;
  abort:
     if (_status) {
       nr_ice_candidate_destroy(&cand);
     }
     return(_status);
   }
 
@@ -289,35 +286,35 @@ int nr_ice_peer_ctx_parse_trickle_candid
        then we need to pair this new candidate. For now we
        just re-pair the stream which is inefficient but still
        fine because we suppress duplicate pairing */
     if (needs_pairing) {
       if(r=nr_ice_media_stream_pair_candidates(pctx, stream, pstream)) {
         r_log(LOG_ICE,LOG_ERR,"ICE(%s): peer (%s), stream(%s) failed to pair trickle ICE candidates",pctx->ctx->label,pctx->label,stream->label);
         ABORT(r);
       }
+    }
 
-      /* Start checks if this stream is not checking yet or if it has checked
-         all the available candidates but not had a completed check for all
-         components.
+    /* Start checks if this stream is not checking yet or if it has checked
+       all the available candidates but not had a completed check for all
+       components.
 
-         Note that this is not compliant with RFC 5245, but consistent with
-         the libjingle trickle ICE behavior. Note that we will not restart
-         checks if either (a) the stream has failed or (b) all components
-         have a successful pair because the switch statement above jumps
-         will in both states.
+       Note that this is not compliant with RFC 5245, but consistent with
+       the libjingle trickle ICE behavior. Note that we will not restart
+       checks if either (a) the stream has failed or (b) all components
+       have a successful pair because the switch statement above jumps
+       will in both states.
 
-         TODO(ekr@rtfm.com): restart checks.
-         TODO(ekr@rtfm.com): update when the trickle ICE RFC is published
-      */
-      if (!pstream->timer) {
-        if(r=nr_ice_media_stream_start_checks(pctx, pstream)) {
-          r_log(LOG_ICE,LOG_ERR,"ICE(%s): peer (%s), stream(%s) failed to start checks",pctx->ctx->label,pctx->label,stream->label);
-          ABORT(r);
-        }
+       TODO(ekr@rtfm.com): restart checks.
+       TODO(ekr@rtfm.com): update when the trickle ICE RFC is published
+    */
+    if (!pstream->timer) {
+      if(r=nr_ice_media_stream_start_checks(pctx, pstream)) {
+        r_log(LOG_ICE,LOG_ERR,"ICE(%s): peer (%s), stream(%s) failed to start checks",pctx->ctx->label,pctx->label,stream->label);
+        ABORT(r);
       }
     }
 
     _status=0;
  abort:
     return(_status);
 
   }
--- a/media/mtransport/transportlayerice.cpp
+++ b/media/mtransport/transportlayerice.cpp
@@ -79,45 +79,35 @@ extern "C" {
 namespace mozilla {
 
 #ifdef ERROR
 #undef ERROR
 #endif
 
 MOZ_MTLOG_MODULE("mtransport")
 
-TransportLayerIce::TransportLayerIce(const std::string& name)
-    : name_(name), ctx_(nullptr), stream_(nullptr), component_(0) {}
-
-TransportLayerIce::~TransportLayerIce() {
-  // No need to do anything here, since we use smart pointers
-}
-
-void TransportLayerIce::SetParameters(RefPtr<NrIceCtx> ctx,
-                                      RefPtr<NrIceMediaStream> stream,
-                                      int component) {
-  ctx_ = ctx;
-  stream_ = stream;
-  component_ = component;
-
-  PostSetup();
-}
-
-void TransportLayerIce::PostSetup() {
-  target_ = ctx_->thread();
+TransportLayerIce::TransportLayerIce(const std::string& name,
+    RefPtr<NrIceCtx> ctx, RefPtr<NrIceMediaStream> stream,
+                                     int component)
+    : name_(name), ctx_(ctx), stream_(stream), component_(component) {
+  target_ = ctx->thread();
 
   stream_->SignalReady.connect(this, &TransportLayerIce::IceReady);
   stream_->SignalFailed.connect(this, &TransportLayerIce::IceFailed);
   stream_->SignalPacketReceived.connect(this,
                                         &TransportLayerIce::IcePacketReceived);
   if (stream_->state() == NrIceMediaStream::ICE_OPEN) {
     TL_SET_STATE(TS_OPEN);
   }
 }
 
+TransportLayerIce::~TransportLayerIce() {
+  // No need to do anything here, since we use smart pointers
+}
+
 TransportResult TransportLayerIce::SendPacket(const unsigned char *data,
                                               size_t len) {
   CheckThread();
   nsresult res = stream_->SendPacket(component_, data, len);
 
   if (!NS_SUCCEEDED(res)) {
     return (res == NS_BASE_STREAM_WOULD_BLOCK) ?
         TE_WOULDBLOCK : TE_ERROR;
--- a/media/mtransport/transportlayerice.h
+++ b/media/mtransport/transportlayerice.h
@@ -26,39 +26,36 @@
 #include "transportflow.h"
 #include "transportlayer.h"
 
 // An ICE transport layer -- corresponds to a single ICE
 namespace mozilla {
 
 class TransportLayerIce : public TransportLayer {
  public:
-  explicit TransportLayerIce(const std::string& name);
-
+  TransportLayerIce(const std::string& name,
+                    RefPtr<NrIceCtx> ctx,
+                    RefPtr<NrIceMediaStream> stream,
+                    int component);
   virtual ~TransportLayerIce();
 
-  void SetParameters(RefPtr<NrIceCtx> ctx,
-                     RefPtr<NrIceMediaStream> stream,
-                     int component);
-
   // Transport layer overrides.
   virtual TransportResult SendPacket(const unsigned char *data, size_t len);
 
   // Slots for ICE
   void IceCandidate(NrIceMediaStream *stream, const std::string&);
   void IceReady(NrIceMediaStream *stream);
   void IceFailed(NrIceMediaStream *stream);
   void IcePacketReceived(NrIceMediaStream *stream, int component,
                          const unsigned char *data, int len);
 
   TRANSPORT_LAYER_ID("ice")
 
  private:
   DISALLOW_COPY_ASSIGN(TransportLayerIce);
-  void PostSetup();
 
   const std::string name_;
   RefPtr<NrIceCtx> ctx_;
   RefPtr<NrIceMediaStream> stream_;
   int component_;
 };
 
 }  // close namespace
--- a/media/webrtc/moz.build
+++ b/media/webrtc/moz.build
@@ -46,54 +46,75 @@ GYP_DIRS['trunk'].non_unified_sources +=
 if CONFIG['MOZ_WEBRTC_SIGNALING']:
     GYP_DIRS += ['signaling']
     GYP_DIRS['signaling'].input = 'signaling/signaling.gyp'
     GYP_DIRS['signaling'].variables = gyp_vars.copy()
     GYP_DIRS['signaling'].variables.update(
         build_for_test=0
     )
     GYP_DIRS['signaling'].sandbox_vars['FINAL_LIBRARY'] = 'xul'
-    # Excluded for various symbol conflicts
+    # Excluded because of name clash in the logTag variable
     signaling_non_unified_sources = [
-        'signaling/src/common/browser_logging/CSFLog.cpp',
-        'signaling/src/jsep/JsepSessionImpl.cpp',
         'signaling/src/media-conduit/AudioConduit.cpp',
         'signaling/src/media-conduit/CodecStatistics.cpp',
         'signaling/src/media-conduit/VideoConduit.cpp',
-        'signaling/src/mediapipeline/MediaPipeline.cpp',
-        'signaling/src/mediapipeline/MediaPipelineFilter.cpp',
-        'signaling/src/mediapipeline/SrtpFlow.cpp',
-        'signaling/src/peerconnection/MediaPipelineFactory.cpp',
-        'signaling/src/peerconnection/MediaStreamList.cpp',
+        'signaling/src/media/CSFAudioControlWrapper.cpp',
+        'signaling/src/media/CSFVideoControlWrapper.cpp',
+        'signaling/src/media/VcmSIPCCBinding.cpp',
         'signaling/src/peerconnection/PeerConnectionCtx.cpp',
         'signaling/src/peerconnection/PeerConnectionImpl.cpp',
         'signaling/src/peerconnection/PeerConnectionMedia.cpp',
         'signaling/src/peerconnection/WebrtcGlobalInformation.cpp',
-        'signaling/src/sdp/sipcc/ccsdp.c',
-        'signaling/src/sdp/sipcc/cpr_string.c',
-        'signaling/src/sdp/sipcc/sdp_access.c',
-        'signaling/src/sdp/sipcc/sdp_attr.c',
-        'signaling/src/sdp/sipcc/sdp_attr_access.c',
-        'signaling/src/sdp/sipcc/sdp_base64.c',
-        'signaling/src/sdp/sipcc/sdp_config.c',
-        'signaling/src/sdp/sipcc/sdp_main.c',
-        'signaling/src/sdp/sipcc/sdp_services_unix.c',
-        'signaling/src/sdp/sipcc/sdp_token.c',
-        'signaling/src/sdp/sipcc/sdp_utils.c',
+        'signaling/src/sipcc/core/ccapp/ccapi_device_info.c',
+        'signaling/src/sipcc/core/gsm/fim.c',
+        'signaling/src/sipcc/core/gsm/gsm_sdp.c',
+        'signaling/src/sipcc/core/gsm/lsm.c',
+        'signaling/src/sipcc/core/sdp/sdp_access.c',
+        'signaling/src/sipcc/core/sdp/sdp_attr.c',
+        'signaling/src/sipcc/core/sdp/sdp_attr_access.c',
+        'signaling/src/sipcc/core/sdp/sdp_config.c',
+        'signaling/src/sipcc/core/sdp/sdp_main.c',
+        'signaling/src/sipcc/core/sdp/sdp_token.c',
+        'signaling/src/sipcc/core/sdp/sdp_utils.c',
+        'signaling/src/softphonewrapper/CC_SIPCCCall.cpp',
+        'signaling/src/softphonewrapper/CC_SIPCCCallInfo.cpp',
+        'signaling/src/softphonewrapper/CC_SIPCCService.cpp',
+        'signaling/src/softphonewrapper/ccapi_plat_api_impl.cpp',
+    ]
+
+    # Excluded for various symbol conflicts
+    signaling_non_unified_sources_2 = [
+        'signaling/src/mediapipeline/MediaPipelineFilter.cpp',
+        'signaling/src/mediapipeline/SrtpFlow.cpp',
+        'signaling/src/sipcc/core/ccapp/ccapi_call_info.c',
+        'signaling/src/sipcc/core/ccapp/ccprovider.c',
+        'signaling/src/sipcc/core/common/platform_api.c',
+        'signaling/src/sipcc/core/common/ui.c',
+        'signaling/src/sipcc/core/gsm/ccapi_strings.c',
+        'signaling/src/sipcc/core/gsm/fsm.c',
+        'signaling/src/sipcc/core/gsm/fsmcac.c',
+        'signaling/src/sipcc/core/gsm/fsmdef.c',
+        'signaling/src/sipcc/core/sdp/sdp_base64.c',      # Because of name clash with the macro PADDING
+        'signaling/src/sipcc/core/sipstack/ccsip_cc.c',
+        'signaling/src/sipcc/core/sipstack/sip_common_transport.c',
+        'signaling/src/sipcc/core/sipstack/sip_platform_task.c',
+        'signaling/src/sipcc/core/src-common/string_lib.c',
     ]
 
     GYP_DIRS['signaling'].non_unified_sources += signaling_non_unified_sources
+    GYP_DIRS['signaling'].non_unified_sources += signaling_non_unified_sources_2
 
 if CONFIG['MOZ_WIDGET_TOOLKIT'] != 'gonk':
     GYP_DIRS += ['trunk/testing']
     GYP_DIRS['trunk/testing'].input = 'trunk/testing/gtest.gyp'
     GYP_DIRS['trunk/testing'].variables = gyp_vars
     GYP_DIRS['trunk/testing'].non_unified_sources += webrtc_non_unified_sources
 
     if CONFIG['MOZ_WEBRTC_SIGNALING']:
         GYP_DIRS += ['signalingtest']
         GYP_DIRS['signalingtest'].input = 'signaling/signaling.gyp'
         GYP_DIRS['signalingtest'].variables = gyp_vars.copy()
         GYP_DIRS['signalingtest'].variables.update(
             build_for_test=1
         )
         GYP_DIRS['signalingtest'].non_unified_sources += signaling_non_unified_sources
+        GYP_DIRS['signalingtest'].non_unified_sources += signaling_non_unified_sources_2
 
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_Call.h
@@ -0,0 +1,314 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+#include "ECC_Types.h"
+#include "mozilla/RefPtr.h"
+
+extern "C"
+{
+#include "ccapi_types.h"
+#include "fsmdef_states.h"
+}
+
+#if defined(__cplusplus) && __cplusplus >= 201103L
+typedef struct Timecard Timecard;
+#else
+#include "timecard.h"
+#endif
+
+namespace CSF
+{
+    class ECC_API CC_Call
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_Call)
+
+    protected:
+        CC_Call () { }
+
+        virtual ~CC_Call () {}
+
+    public:
+		virtual void setRemoteWindow (VideoWindowHandle window) = 0;
+
+		virtual int setExternalRenderer(VideoFormat videoFormat, ExternalRendererHandle renderer) = 0;
+
+		virtual void sendIFrame	() = 0;
+
+        virtual void getLocalSdp(std::string *sdp) const = 0;
+        virtual void getRemoteSdp(std::string *sdp) const = 0;
+        virtual fsmdef_states_t getFsmState () const = 0;
+        virtual std::string fsmStateToString (fsmdef_states_t state) const = 0;
+
+        virtual void getErrorString(std::string *error) const = 0;
+        virtual pc_error getError() const = 0;
+
+        virtual CC_CallInfoPtr getCallInfo () = 0;
+
+        virtual std::string toString() = 0;
+
+        /**
+           Originate call - API to go offhook and dial specified digits on a given call
+
+           @param [in] video_pref - video direction desired on call
+           @param [in] digits - digits to be dialed. can be empty then this API simply goes offhook
+
+           @return true or false.
+         */
+        virtual bool originateCall (cc_sdp_direction_t video_pref, const std::string & digits) = 0;
+
+        /**
+           Use this function to answer an incoming call.
+
+           @param[in] video_pref - video direction desired on call
+
+           @return true or false.
+         */
+        virtual bool answerCall (cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           Use this function to put an active call on hold.
+
+           @param[in] reason - If the user chooses to put the call on hold then
+                               CC_HOLD_REASON_NONE should be the value passed in here.
+
+           @return true or false. If it's not appropriate to put this call on
+                   hold at the moment then this function will return false.
+         */
+        virtual bool hold (cc_hold_reason_t reason) = 0;
+
+        /**
+           Use this function to resume a call that is currently on hold.
+
+           @param [in] video_pref - video direction desired on call
+
+           @return true or false
+         */
+        virtual bool resume (cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           Use this function to end an active call.
+
+           @return true or false
+         */
+        virtual bool endCall() = 0;
+
+        /**
+           Send digits on the call - can be invoked either to dial additional digits or send DTMF
+
+           @param [in] digit - digit to be dialed
+
+           @return true or false
+         */
+        virtual bool sendDigit (cc_digit_t digit) = 0;
+
+        /**
+           Send Backspace - Delete last digit dialed.
+
+           @return true or false
+         */
+        virtual bool backspace() = 0;
+
+        /**
+           Redial
+
+           @param [in] video_pref - video direction desired on call
+           @return true or false
+         */
+        virtual bool redial (cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           Initiate Call Forward All
+
+           @return true or false
+         */
+        virtual bool initiateCallForwardAll() = 0;
+
+        /**
+           end Consult leg - used to end consult leg when the user picks active calls list for xfer/conf
+
+           @return true or false
+         */
+        virtual bool endConsultativeCall() = 0;
+
+        /**
+           Initiate a conference
+
+           @param [in] video_pref - video direction desired on consult call
+
+           @return true or false
+         */
+        virtual bool conferenceStart (cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           complete conference
+
+           @param [in] otherCall - CC_CallPtr of the other leg
+           @param [in] video_pref - video direction desired on consult call
+
+           @return true or false
+         */
+        virtual bool conferenceComplete (CC_CallPtr otherLog, cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           start transfer
+
+           @param [in] video_pref - video direction desired on consult call
+
+           @return true or false
+         */
+        virtual bool transferStart (cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           complete transfer
+
+           @param [in] otherLeg - CC_CallPtr of the other leg
+           @param [in] video_pref - video direction desired on consult call
+
+           @return true or false
+         */
+        virtual bool transferComplete (CC_CallPtr otherLeg,
+                                       cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           cancel conference or transfer
+
+           @return true or false
+         */
+        virtual bool cancelTransferOrConferenceFeature() = 0;
+
+        /**
+           direct Transfer
+
+           @param [in] target - call handle for transfer target call
+           @return true or false
+         */
+        virtual bool directTransfer (CC_CallPtr target) = 0;
+
+        /**
+           Join Across line
+
+           @param [in] target - join target
+           @return true or false
+         */
+        virtual bool joinAcrossLine (CC_CallPtr target) = 0;
+
+        /**
+           BLF Call Pickup
+
+           @param [in] video_pref - video direction preference
+           @param [in] speed - speedDial Number
+           @return true or false
+         */
+        virtual bool blfCallPickup (cc_sdp_direction_t video_pref, const std::string & speed) = 0;
+
+        /**
+           Select a call
+
+           @return true or false
+         */
+        virtual bool select() = 0;
+
+        /**
+           Update Video Media Cap for the call
+
+           @param [in] video_pref - video direction desired on call
+           @return true or false
+         */
+        virtual bool updateVideoMediaCap (cc_sdp_direction_t video_pref) = 0;
+
+        /**
+           send INFO method for the call
+           @param [in] handle - call handle
+           @param [in] infopackage - Info-Package header value
+           @param [in] infotype - Content-Type header val
+           @param [in] infobody - Body of the INFO message
+           @return true or false
+         */
+        virtual bool sendInfo (const std::string & infopackage, const std::string & infotype, const std::string & infobody) = 0;
+
+        /**
+           API to mute audio
+
+           @return true if the operation succeeded
+
+           NOTE: The mute state is persisted within the stack and shall be remembered across hold/resume.
+         */
+        virtual bool muteAudio(void) = 0;
+
+
+        /**
+           API to unmute audio
+
+           @return true if the operation succeeded
+
+           NOTE: The mute state is persisted within the stack and shall be remembered across hold/resume.
+         */
+        virtual bool unmuteAudio(void) = 0;
+        /**
+           API to mute video
+
+           @return true if the operation succeeded
+
+           NOTE: The mute state is persisted within the stack and shall be remembered across hold/resume.
+         */
+        virtual bool muteVideo(void) = 0;
+
+
+        /**
+           API to unmute video
+
+           @return true if the operation succeeded
+
+           NOTE: The mute state is persisted within the stack and shall be remembered across hold/resume.
+         */
+        virtual bool unmuteVideo(void) = 0;
+
+
+        /**
+        API to set the call volume, acceptable values are 0 - 100
+        @return true if volume set successfully, false if value out of range or change failed
+        */
+        virtual bool setVolume(int volume) = 0;
+
+
+        /**
+           Originate P2P call - API to go offhook and dial specified digits\user on a given call
+
+           @param [in] video_pref - video direction desired on call
+           @param [in] digits - digits to be dialed. can be empty then this API simply goes offhook
+           @param [in] ip address - the ip address of the peer to call
+
+           @return void
+          */
+        virtual void originateP2PCall (cc_sdp_direction_t video_pref, const std::string & digits, const std::string & ip) = 0;
+
+        virtual pc_error createOffer (cc_media_options_t* options, Timecard *) = 0;
+
+        virtual pc_error createAnswer(Timecard *) = 0;
+
+        virtual pc_error setLocalDescription(cc_jsep_action_t action, const std::string & sdp, Timecard *) = 0;
+
+        virtual pc_error setRemoteDescription(cc_jsep_action_t action, const std::string & sdp, Timecard *) = 0;
+
+        virtual pc_error setPeerConnection(const std::string& handle) = 0;
+
+        virtual pc_error addStream(cc_media_stream_id_t stream_id,
+                               cc_media_track_id_t track_id,
+                               cc_media_type_t media_type) = 0;
+
+        virtual pc_error removeStream(cc_media_stream_id_t stream_id, cc_media_track_id_t track_id, cc_media_type_t media_type) = 0;
+
+        virtual const std::string& getPeerConnection() const = 0;
+
+        virtual pc_error addICECandidate(const std::string & candidate, const std::string & mid, unsigned short level, Timecard *) = 0;
+
+        virtual pc_error foundICECandidate(const std::string & candidate, const std::string & mid, unsigned short level, Timecard *) = 0;
+
+    };
+}
+
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_CallInfo.h
@@ -0,0 +1,339 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include <set>
+
+extern "C"
+{
+#include "ccapi_types.h"
+#include "fsmdef_states.h"
+}
+
+
+#include "CC_Common.h"
+#include "CC_CallTypes.h"
+#include "peer_connection_types.h"
+
+#if defined(__cplusplus) && __cplusplus >= 201103L
+typedef struct Timecard Timecard;
+#else
+#include "timecard.h"
+#endif
+
+namespace CSF
+{
+
+	class ECC_API CC_CallInfo
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_CallInfo)
+    protected:
+        CC_CallInfo() { }
+
+        //Base class needs dtor to be declared as virtual
+        virtual ~CC_CallInfo() {};
+
+    public:
+        /**
+           Get the line object associated with this call.
+
+           @return CC_LinePtr - line ID
+         */
+        virtual CC_LinePtr getline () = 0;
+
+        /**
+           get Call state
+           @param [in] handle - call info handle
+           @return call state
+         */
+        virtual cc_call_state_t getCallState () = 0;
+
+        /**
+           get FSM state
+           @param [in] handle - call info handle
+           @return FSM state
+         */
+        virtual fsmdef_states_t getFsmState () const = 0;
+
+        /**
+           print Call state
+           @param [in] handle - call info handle
+           @return call state as string
+         */
+        virtual std::string callStateToString (cc_call_state_t state) = 0;
+
+        /**
+           print FSM state
+           @param [in] handle - call info handle
+           @return call state as string
+         */
+        virtual std::string fsmStateToString (fsmdef_states_t state) const = 0;
+
+        /**
+           print Call event
+           @param [in] call event
+           @return call event as string
+         */
+        virtual std::string callEventToString (ccapi_call_event_e callEvent) = 0;
+
+        /**
+           Get ringer state.
+
+           @return bool ringer state.
+         */
+        virtual bool getRingerState() = 0;
+
+        /**
+           Get call attributes
+
+           @return cc_call_attr_t.
+         */
+        virtual cc_call_attr_t getCallAttr() = 0;
+
+        /**
+           Get the call type
+
+           @return cc_call_type_t for this call. Supported values inlude:
+                   CC_CALL_TYPE_INCOMING, CC_CALL_TYPE_OUTGOING and CC_CALL_TYPE_FORWARDED.
+         */
+        virtual cc_call_type_t getCallType() = 0;
+
+        /**
+           Get called party name
+
+           @return called party name
+         */
+        virtual std::string getCalledPartyName() = 0;
+
+        /**
+           Get called party number
+
+           @return called party number as a string.
+         */
+        virtual std::string getCalledPartyNumber() = 0;
+
+        /**
+           Get calling party name
+
+           @return calling party name
+         */
+        virtual std::string getCallingPartyName() = 0;
+
+        /**
+           Get calling party number
+           @return calling party number as a string
+                   Note: this is a const reference to a string that's owned by the
+          */
+        virtual std::string getCallingPartyNumber() = 0;
+
+        /**
+           Get alternate number
+
+           @return calling party number as a string.
+         */
+        virtual std::string getAlternateNumber() = 0;
+
+        /**
+           This function is used to check if a given capability is supported
+           based on the information in this CC_CallInfo object.
+
+           @param [in] capability - the capability that is to be checked for availability.
+           @return boolean - returns true if the given capability is available, false otherwise.
+         */
+        virtual bool hasCapability (CC_CallCapabilityEnum::CC_CallCapability capability) = 0;
+
+        /**
+           If you need the complete set of capabilities
+
+           @return cc_return_t - set of Call Capabilities.
+         */
+        virtual std::set<CC_CallCapabilityEnum::CC_CallCapability> getCapabilitySet() = 0;
+
+        /**
+           get Original Called party name
+           @param [in] handle - call info handle
+           @return original called party name
+         */
+        virtual std::string getOriginalCalledPartyName() = 0;
+
+        /**
+           get Original Called party number
+           @param [in] handle - call info handle
+           @return original called party number
+         */
+        virtual std::string getOriginalCalledPartyNumber() = 0;
+
+        /**
+           get last redirecting party name
+           @param [in] handle - call info handle
+           @return last redirecting party name
+         */
+        virtual std::string getLastRedirectingPartyName() = 0;
+
+        /**
+           get past redirecting party number
+           @param [in] handle - call info handle
+           @return last redirecting party number
+         */
+        virtual std::string getLastRedirectingPartyNumber() = 0;
+
+        /**
+           get placed call party name
+           @param [in] handle - call info handle
+           @return placed party name
+         */
+        virtual std::string getPlacedCallPartyName() = 0;
+
+        /**
+           get placed call party number
+           @param [in] handle - call info handle
+           @return placed party number
+         */
+        virtual std::string getPlacedCallPartyNumber() = 0;
+
+        /**
+           get call instance number
+           @param [in] handle - call info handle
+           @return
+         */
+        virtual cc_int32_t getCallInstance() = 0;
+
+        /**
+           get call status prompt
+           @param [in] handle - call info handle
+           @return call status
+         */
+        virtual std::string getStatus() = 0;
+
+        /**
+           get call security   // TODO XLS has callagent security and endtoend security on call?
+           @param [in] handle - call info handle
+           @return call security status
+         */
+        virtual cc_call_security_t getSecurity() = 0;
+
+        /**
+           get Call Selection Status
+           @param [in] handle - call info handle
+           @return bool - TRUE => selected
+         */
+        virtual cc_int32_t getSelectionStatus() = 0;
+
+        /**
+           get GCID
+           @param [in] handle - call info handle
+           @return GCID
+         */
+        virtual std::string getGCID() = 0;
+
+        /**
+           get ringer loop count
+           @param handle - call handle
+           @return once Vs continuous
+         */
+        virtual bool getIsRingOnce() = 0;
+
+        /**
+           get ringer mode
+           @param handle - call handle
+           @return ringer mode
+         */
+        virtual int getRingerMode() = 0;
+
+        /**
+           get onhook reason
+           @param [in] handle - call info handle
+           @return onhook reason
+         */
+        virtual cc_int32_t getOnhookReason() = 0;
+
+        /**
+           is Conference Call?
+           @param [in] handle - call info handle
+           @return boolean - is Conference
+         */
+        virtual bool getIsConference() = 0;
+
+        /**
+           getStream Statistics
+           @param [in] handle - call info handle
+           @param [in,out] stats - Array to get the stats
+           @param [in,out] count - in len of stats arraysize of stats / out stats copied
+           @return cc_return_t - CC_SUCCESS or CC_FAILURE
+         */
+        virtual std::set<cc_int32_t> getStreamStatistics() = 0;
+
+        /**
+           Call selection status
+           @param [in] handle - call info handle
+           @return bool - selection status
+         */
+        virtual bool isCallSelected() = 0;
+
+        /**
+           INFO Package for RECEIVED_INFO event
+           @param [in] handle - call info handle
+           @return string - Info package header
+         */
+        virtual std::string getINFOPack() = 0;
+
+        /**
+           INFO type for RECEIVED_INFO event
+
+           @return string - content-type  header
+         */
+        virtual std::string getINFOType() = 0;
+
+        /**
+           INFO body for RECEIVED_INFO event
+
+           @return string - INFO body
+         */
+        virtual std::string getINFOBody() = 0;
+
+        /**
+           Get the call log reference
+
+           //TODO NEED TO DO SOMETHING WRAP CALL LOG REF.
+           @return string - INFO body
+           NOTE: Memory associated with the call log is tied to the
+           this would be freed when the callinfo ref is freed.
+         */
+        virtual cc_calllog_ref_t  getCallLogRef() = 0;
+
+        /**
+           returns the negotiated video direction for this call
+
+           @return cc_sdp_direction_t - video direction
+         */
+        virtual cc_sdp_direction_t getVideoDirection() = 0;
+
+         /**
+           Find out if this call is capable of querying the media state, which includes mute state and video direction
+           @return  bool
+          */
+        virtual bool isMediaStateAvailable() = 0;
+
+        /**
+           Get the audio mute state if available (check availability with isMediaStateAvailable())
+           @return  bool  - the current audio state of the call
+          */
+        virtual bool isAudioMuted(void) = 0;
+
+         /**
+           Get the video mute state if available (check availability with isMediaStateAvailable())
+           @return  bool  - the current video state of the call
+          */
+        virtual bool isVideoMuted(void) = 0;
+
+        /**
+          Get the current call volume level
+          @return int - the current call volume level, or -1 if it cannot be determined
+        */
+        virtual int getVolume() = 0;
+
+    };
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_CallServerInfo.h
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+#include <vector>
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+    class ECC_API CC_CallServerInfo
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_CallServerInfo)
+
+    protected:
+        //Base class needs dtor to be declared as virtual
+        virtual ~CC_CallServerInfo() { }
+        CC_CallServerInfo() { }
+
+    public:
+        /**
+           gets call server name
+
+           @returns name of the call server
+         */
+        virtual std::string getCallServerName() = 0;
+
+        /**
+           gets call server mode
+
+           @returns - mode of the call server
+         */
+        virtual cc_cucm_mode_t getCallServerMode() = 0;
+
+        /**
+           gets calls erver name
+
+           @returns status of the call server
+         */
+        virtual cc_ccm_status_t getCallServerStatus() = 0;
+    };
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_CallTypes.h
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+#include <string>
+#include <set>
+
+namespace CSF
+{
+	namespace CC_CallCapabilityEnum
+	{
+		typedef enum
+		{
+			canSetRemoteWindow,
+			canSetLocalWindow,
+			canSendIFrame,
+			canOriginateCall,
+			canAnswerCall,
+			canHold,
+			canResume,
+			canEndCall,
+			canSendDigit,
+			canBackspace,
+			canRedial,
+			canInitiateCallForwardAll,
+			canEndConsultativeCall,
+			canConferenceStart,
+			canConferenceComplete,
+			canTransferStart,
+			canTransferComplete,
+			canCancelTransferOrConferenceFeature,
+			canDirectTransfer,
+			canJoinAcrossLine,
+			canBlfCallPickup,
+			canSelect,
+			canUpdateVideoMediaCap,
+			canSendInfo,
+			canMuteAudio,
+			canUnmuteAudio,
+			canMuteVideo,
+			canUnmuteVideo,
+			canSetVolume
+		} CC_CallCapability;
+		std::string ECC_API toString(CC_CallCapability cap);
+		std::string ECC_API toString(std::set<CC_CallCapability>& caps);
+	};
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_Common.h
@@ -0,0 +1,34 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "SharedPtr.h"
+
+#ifndef ECC_API
+#ifdef ECC_EXPORT
+#define ECC_API _declspec(dllexport)
+#elif ECC_IMPORT
+#define ECC_API _declspec(dllimport)
+#else
+#define ECC_API
+#endif
+#endif
+
+namespace CSF
+{
+    DECLARE_NS_PTR(CallControlManager)
+    DECLARE_NS_PTR_VECTOR(PhoneDetails)
+    DECLARE_NS_PTR(CC_Service)
+    DECLARE_NS_PTR(VideoControl)
+    DECLARE_NS_PTR(AudioControl)
+    DECLARE_NS_PTR_VECTOR(CC_Device)
+    DECLARE_NS_PTR(CC_DeviceInfo)
+    DECLARE_NS_PTR(CC_CallServerInfo)
+    DECLARE_NS_PTR(CC_FeatureInfo)
+    DECLARE_NS_PTR_VECTOR(CC_Line)
+    DECLARE_NS_PTR(CC_LineInfo)
+    DECLARE_NS_PTR_VECTOR(CC_Call)
+    DECLARE_NS_PTR(CC_CallInfo)
+}
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_Device.h
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+
+    class ECC_API CC_Device
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_Device)
+    protected:
+        CC_Device() {}
+
+        virtual ~CC_Device() {}
+
+    public:
+        virtual std::string toString() = 0;
+
+        virtual CC_DeviceInfoPtr getDeviceInfo () = 0;
+
+        /**
+           Create a call on the device. Line selection is on the first available line.
+           Lines that have their MNC reached will be skipped. If you have a specific line
+           you want to make a call on (assuming the device has more than available) then
+           you should use CC_Line::createCall() to do that.
+
+           @return CC_CallPtr - the created call object wrapped in a smart_ptr.
+         */
+        virtual CC_CallPtr createCall() = 0;
+
+        virtual void enableVideo(bool enable) = 0;
+        virtual void enableCamera(bool enable) = 0;
+		virtual void setDigestNamePasswd (char *name, char *pw) = 0;
+
+    private:
+		// Cannot copy - clients should be passing the pointer not the object.
+		CC_Device& operator=(const CC_Device& rhs);
+		CC_Device(const CC_Device&);
+    };
+}
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_DeviceInfo.h
@@ -0,0 +1,136 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+#include <vector>
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+    class ECC_API CC_DeviceInfo
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_DeviceInfo)
+    protected:
+        CC_DeviceInfo() { }
+
+        //Base class needs dtor to be declared as virtual
+        virtual ~CC_DeviceInfo() {};
+
+    public:
+        /**
+           gets the device name
+           @returns - the device name as an std::string
+         */
+        virtual std::string getDeviceName() = 0;
+
+        /**
+           gets the service state
+           @param [in] handle - reference to device info
+           @returns cc_service_state_t - INS/OOS
+         */
+        virtual cc_service_state_t getServiceState() = 0;
+
+        /**
+           gets the service cause
+           @param [in] handle - reference to device info
+           @returns cc_service_cause_t - reason for service state
+         */
+        virtual cc_service_cause_t getServiceCause() = 0;
+
+        /**
+           gets vector of CC_CallPtr from this CC_DeviceInfo
+
+           @returns vector<CC_CallPtr> containing the CC_CallPtrs
+         */
+        virtual std::vector<CC_CallPtr> getCalls () = 0;
+
+        /**
+           gets list of handles to calls on the device by state
+           @param [in] handle - reference to device info
+           @param [in] state - call state for which the calls are requested
+           @param [out] handles - array of call handle to be returned
+           @param [in,out] count number allocated in array/elements returned
+           @returns
+         */
+//        void getCallsByState (cc_call_state_t state,
+//                              cc_call_handle_t handles[], cc_uint16_t *count);
+
+        /**
+           gets vector of CC_LinePtr from this CC_DeviceInfo
+
+           @returns vector<CC_LinePtr> containing the CC_LinePtrs
+         */
+        virtual std::vector<CC_LinePtr> getLines () = 0;
+
+        /**
+           gets vector of features on the device
+
+           @returns
+         */
+        virtual std::vector<CC_FeatureInfoPtr> getFeatures () = 0;
+
+        /**
+           gets handles of call agent servers
+
+           @returns
+         */
+        virtual std::vector<CC_CallServerInfoPtr> getCallServers () = 0;
+
+        /**
+           gets call server name
+           @param [in] handle - handle of call server
+           @returns name of the call server
+           NOTE: The memory for return string doesn't need to be freed it will be freed when the info reference is freed
+         */
+//        cc_string_t getCallServerName (cc_callserver_ref_t handle);
+
+        /**
+           gets call server mode
+           @param [in] handle - handle of call server
+           @returns - mode of the call server
+         */
+//        cc_cucm_mode_t getCallServerMode (cc_callserver_ref_t handle);
+
+        /**
+           gets calls erver name
+           @param [in] handle - handle of call server
+           @returns status of the call server
+         */
+//        cc_ccm_status_t getCallServerStatus (cc_callserver_ref_t handle);
+
+        /**
+           get the NOTIFICATION PROMPT
+           @param [in] handle - reference to device info
+           @returns
+         */
+//        cc_string_t getNotifyPrompt ();
+
+        /**
+           get the NOTIFICATION PROMPT PRIORITY
+           @param [in] handle - reference to device info
+           @returns
+         */
+//        cc_uint32_t getNotifyPromptPriority ();
+
+        /**
+           get the NOTIFICATION PROMPT Progress
+           @param [in] handle - reference to device info
+           @returns
+         */
+//        cc_uint32_t getNotifyPromptProgress ();
+
+    private:
+		// Cannot copy - clients should be passing the pointer not the object.
+		CC_DeviceInfo& operator=(const CC_DeviceInfo& rhs);
+		CC_DeviceInfo(const CC_DeviceInfo&);
+    };
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_FeatureInfo.h
@@ -0,0 +1,76 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+    class ECC_API CC_FeatureInfo
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_FeatureInfo)
+    protected:
+        CC_FeatureInfo() { }
+
+        //Base class needs dtor to be declared as virtual
+        virtual ~CC_FeatureInfo() {};
+
+    public:
+        /**
+           Get the physical button number on which this feature is configured
+
+           @return cc_int32_t - button assgn to the feature
+         */
+        virtual cc_int32_t getButton() = 0;
+
+        /**
+           Get the featureID
+
+           @return cc_int32_t - button assgn to the feature
+         */
+        virtual cc_int32_t getFeatureID() = 0;
+
+        /**
+           Get the feature Name
+
+           @return string - handle of the feature created
+         */
+        virtual std::string getDisplayName() = 0;
+
+        /**
+           Get the speeddial Number
+
+           @return string - handle of the feature created
+         */
+        virtual std::string getSpeedDialNumber() = 0;
+
+        /**
+           Get the contact
+
+           @return string - handle of the feature created
+         */
+        virtual std::string getContact() = 0;
+
+        /**
+           Get the retrieval prefix
+
+           @return string - handle of the feature created
+         */
+        virtual std::string getRetrievalPrefix() = 0;
+
+        /**
+           Get the feature option mask
+
+           @return cc_int32_t - button assgn to the feature
+         */
+        virtual cc_int32_t getFeatureOptionMask() = 0;
+    };
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_Line.h
@@ -0,0 +1,32 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+    class ECC_API CC_Line
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_Line)
+    protected:
+        CC_Line () { }
+
+        virtual ~CC_Line () {};
+
+    public:
+        virtual std::string toString() = 0;
+
+        virtual cc_lineid_t getID() = 0;
+        virtual CC_LineInfoPtr getLineInfo () = 0;
+        virtual CC_CallPtr createCall () = 0;
+    };
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_LineInfo.h
@@ -0,0 +1,152 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+#include <bitset>
+#include <set>
+#include <vector>
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+    class ECC_API CC_LineInfo
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_LineInfo)
+    protected:
+        CC_LineInfo() { }
+
+        //Base class needs dtor to be declared as virtual
+        virtual ~CC_LineInfo() {};
+
+    public:
+        /**
+           Get the line Name
+
+           @return string - line Name
+         */
+        virtual std::string getName() = 0;
+
+        /**
+           Get the line DN Number
+           @return string - line DN
+         */
+        virtual std::string getNumber() = 0;
+
+        /**
+           Get the physical button number on which this line is configured
+
+           @return cc_uint32_t - button number
+         */
+        virtual cc_uint32_t getButton() = 0;
+
+        /**
+           Get the Line Type
+
+           @return cc_line_feature_t - line featureID ( Line )
+         */
+        virtual cc_line_feature_t getLineType() = 0;
+
+        /**
+
+           @return bool - true if phone is currently registered with CM.
+         */
+        virtual bool getRegState() = 0;
+
+        /**
+           Get the CFWDAll status for the line
+
+           @return bool - isForwarded
+         */
+        virtual bool isCFWDActive() = 0;
+
+        /**
+           Get the CFWDAll destination
+
+           @return string - cfwd target
+         */
+        virtual std::string getCFWDName() = 0;
+
+        /**
+           Get calls on line
+
+           @param [in] line - line
+           @return vector<CC_CallPtr>
+         */
+        virtual std::vector<CC_CallPtr> getCalls (CC_LinePtr linePtr) = 0;
+
+        /**
+           Get calls on line by state
+
+           @param [in] line - line
+           @param [in] state - state
+
+           @return vector<CC_CallPtr>
+         */
+        virtual std::vector<CC_CallPtr> getCallsByState (CC_LinePtr linePtr, cc_call_state_t state) = 0;
+
+        /**
+           Get the MWI Status
+
+           @return cc_uint32_t - MWI status (boolean 0 => no MWI)
+         */
+        virtual bool getMWIStatus() = 0;
+
+        /**
+           Get the MWI Type
+
+           @return cc_uint32_t - MWI Type
+         */
+        virtual cc_uint32_t getMWIType() = 0;
+
+        /**
+           Get the MWI new msg count
+
+           @return cc_uint32_t - MWI new msg count
+         */
+        virtual cc_uint32_t getMWINewMsgCount() = 0;
+
+        /**
+           Get the MWI old msg count
+
+           @return cc_uint32_t - MWI old msg count
+         */
+        virtual cc_uint32_t getMWIOldMsgCount() = 0;
+
+        /**
+           Get the MWI high priority new msg count
+
+           @return cc_uint32_t - MWI new msg count
+         */
+        virtual cc_uint32_t getMWIPrioNewMsgCount() = 0;
+
+        /**
+           Get the MWI high priority old msg count
+
+           @return cc_uint32_t - MWI old msg count
+         */
+        virtual cc_uint32_t getMWIPrioOldMsgCount() = 0;
+
+        /**
+           has capability - is the feature allowed
+
+           @param [in] capability - capability being queried to see if it's available
+           @return bool - is Allowed
+         */
+        virtual bool hasCapability(ccapi_call_capability_e capability) = 0;
+
+        /**
+           get Allowed Feature set
+
+           @return cc_return_t - bitset of Line Capabilities.
+         */
+        virtual std::bitset<CCAPI_CALL_CAP_MAX> getCapabilitySet() = 0;
+    };
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_Observer.h
@@ -0,0 +1,28 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+extern "C"
+{
+#include "ccapi_types.h"
+}
+
+namespace CSF
+{
+	/**
+	 * These callbacks relate to the "core" Call Control API objects CC_Device, CC_Line and CC_Call.
+	 */
+    class ECC_API CC_Observer
+    {
+    public:
+        virtual void onDeviceEvent  ( ccapi_device_event_e deviceEvent, CC_DevicePtr device, CC_DeviceInfoPtr info ) = 0;
+        virtual void onFeatureEvent ( ccapi_device_event_e deviceEvent, CC_DevicePtr device, CC_FeatureInfoPtr feature_info) = 0;
+        virtual void onLineEvent    ( ccapi_line_event_e lineEvent,     CC_LinePtr line,     CC_LineInfoPtr info ) = 0;
+        virtual void onCallEvent    ( ccapi_call_event_e callEvent,     CC_CallPtr call,     CC_CallInfoPtr infog ) = 0;
+    };
+
+}
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CC_Service.h
@@ -0,0 +1,87 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+#include "CC_Observer.h"
+
+#include <vector>
+
+extern "C"
+{
+#include "ccapi_types.h"
+#include "ccapi_service.h"
+}
+
+namespace CSF
+{
+    class ECC_API CC_Service
+    {
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CC_Service)
+    protected:
+    	CC_Service() {}
+        virtual ~CC_Service() {};
+
+    public:
+        /**
+         * Clients use CC_Observer to receive CCAPI events (Device, Line, Call) from the service.
+         */
+        virtual void addCCObserver ( CC_Observer * observer ) = 0;
+        virtual void removeCCObserver ( CC_Observer * observer ) = 0;
+
+        /**
+         * Use init() immediately on creating the service, and destroy() when finished with it.
+         * password is required for Asterisk not CUCM.
+         * deviceName is required for CUCM not Asterisk.
+         */
+        virtual bool init(const std::string& user, const std::string& password, const std::string& domain, const std::string& deviceName) = 0;
+        virtual void destroy() = 0;
+
+        /**
+         * TODO: Set config parameters prior to starting the service.
+         *		 Need to design a nice abstraction for this accommodating SIPCC and CTI.
+         */
+
+        /**
+         * Use start() to attempt to register for a device and stop() to cancel a current
+         * registration (or registration attempt).
+         */
+        virtual bool startService() = 0;
+        virtual void stop() = 0;
+
+
+        /**
+         * Check on the current status/health of the service.
+         */
+        virtual bool isStarted() = 0;
+
+        /**
+         * Obtain the currently selected Device.
+         * If multiple devices are discoverable (i.e. in CTI), all known devices will appear
+         *   in getDevices(), but only the ActiveDevice will be controllable at any given time.
+         */
+        virtual CC_DevicePtr getActiveDevice() = 0;
+        virtual std::vector<CC_DevicePtr> getDevices() = 0;
+
+        /**
+         * Global settings for audio and video control.  Return nullptr if Media control is not
+         * available in this implementation.  Return nullptr in any case if media is not yet
+         * initialized.
+         * TODO: Assuming for now that media init aligns with init/destroy.
+         */
+        virtual AudioControlPtr getAudioControl() = 0;
+        virtual VideoControlPtr getVideoControl() = 0;
+
+        virtual bool setLocalVoipPort(int port) = 0;
+        virtual bool setRemoteVoipPort(int port) = 0;
+        virtual bool setP2PMode(bool mode) = 0;
+        virtual bool setSDPMode(bool mode) = 0;
+
+    private:
+        CC_Service(const CC_Service& rhs);
+        CC_Service& operator=(const CC_Service& rhs);
+    };
+}
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CSFAudioControl.h
@@ -0,0 +1,36 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+namespace CSF
+{
+        DECLARE_NS_PTR(AudioControl)
+	class ECC_API AudioControl
+	{
+	public:
+                NS_INLINE_DECL_THREADSAFE_REFCOUNTING(AudioControl)
+		// device names are in UTF-8 encoding
+
+		virtual std::vector<std::string> getRecordingDevices() = 0;
+		virtual std::vector<std::string> getPlayoutDevices() = 0;
+
+		virtual std::string getRecordingDevice() = 0;
+		virtual std::string getPlayoutDevice() = 0;
+
+		virtual bool setRecordingDevice( const std::string& name ) = 0;
+		virtual bool setPlayoutDevice( const std::string& name ) = 0;
+
+        virtual bool setDefaultVolume( int ) = 0;
+        virtual int getDefaultVolume() = 0;
+
+        virtual bool setRingerVolume( int ) = 0;
+        virtual int getRingerVolume() = 0;
+
+        protected:
+                virtual ~AudioControl(){};
+	};
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/CSFVideoControl.h
@@ -0,0 +1,36 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+#include "ECC_Types.h"
+
+#include <string>
+#include <vector>
+
+namespace CSF
+{
+	DECLARE_NS_PTR(VideoControl)
+	class ECC_API VideoControl
+	{
+	public:
+                NS_INLINE_DECL_THREADSAFE_REFCOUNTING(VideoControl)
+
+		virtual void setVideoMode( bool enable ) = 0;
+
+		// window type is platform-specific
+		virtual void setPreviewWindow( VideoWindowHandle window, int top, int left, int bottom, int right, RenderScaling style ) = 0;
+		virtual void showPreviewWindow( bool show ) = 0;
+
+		// device names are in UTF-8 encoding
+		virtual std::vector<std::string> getCaptureDevices() = 0;
+
+		virtual std::string getCaptureDevice() = 0;
+		virtual bool setCaptureDevice( const std::string& name ) = 0;
+	protected:
+		virtual ~VideoControl() {};
+	};
+
+}; // namespace
new file mode 100755
--- /dev/null
+++ b/media/webrtc/signaling/include/CallControlManager.h
@@ -0,0 +1,130 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+#include "CC_Observer.h"
+#include "ECC_Observer.h"
+#include "ECC_Types.h"
+
+#include <string>
+#include <vector>
+
+/**
+ *  @mainpage Enhanced Call Control
+ *
+ *  @section intro_sec Introduction
+ *  This wraps and aggregates the SIPCC and CTI call control stacks, media stacks, and various additional
+ *  components and glue necessary to start, configure and run them, and presents a high-level C++ API
+ *  for connection, device selection and status, and call control.
+ *
+ *  @section main_outline Outline
+ *  @li The main entry point is CSF::CallControlManager, which is used to configure and start a
+ *  	call control stack.
+ *  @li Configuration and events are raised to the CSF::ECC_Observer interface.
+ *  @li Call Control is performed via CSF::CC_Device, CSF::CC_Line and CSF::CC_Call.
+ *  @li Call Control events are raised to the CSF::CC_Observer interface.
+ *  @li Audio/Video device selection and global media configuration is performed via CSF::AudioControl
+ *      and CSF::VideoControl.  Per-call media operations (mute, volume, etc) are integrated onto
+ *      the CSF::CC_Call and CSF::CC_CallInfo interfaces.
+ */
+
+namespace CSF
+{
+	DECLARE_NS_PTR(CallControlManager)
+	/**
+	 * CallControlManager
+	 *
+	 * The class is partitioned into several blocks of functionality:
+	 * - Create/Destroy - Initialisation and clean shutdown.
+	 * 					  Destroy is optional if the destructor is used properly.
+	 * - Observer - Register for events when any state changes.  Optional but strongly advised.
+	 *
+	 * Methods are generally synchronous (at present).
+	 */
+    class ECC_API CallControlManager
+    {
+    protected:
+        virtual ~CallControlManager();
+
+    public:
+        NS_INLINE_DECL_THREADSAFE_REFCOUNTING(CallControlManager)
+		/**
+		 *  Use create() to create a CallControlManager instance.
+		 *
+		 *  CallControlManager cleans up its resources in its destructor, implicitly disconnect()in if required.
+		 *  Use the destroy() method if you need to force a cleanup earlier.  It is a bad idea to continue using
+		 *  CallControlManager or any of its related objects after destroy().
+		 */
+        static CallControlManagerPtr create();
+        virtual bool destroy() = 0;
+
+        /**
+           CC_Observer is for core call control events (on CC_Device, CC_Line and CC_Call).
+           ECC_Observer is for "value add" features of CallControlManager.
+
+           Client can add multiple observers if they have different Observer objects that handle
+           different event scenarios, but generally it's probably sufficient to only register one observer.
+
+           @param[in] observer - This is a pointer to a CC_Observer-derived class that the client
+                                 must instantiate to receive notifications on this client object.
+         */
+        virtual void addCCObserver ( CC_Observer * observer ) = 0;
+        virtual void removeCCObserver ( CC_Observer * observer ) = 0;
+
+        virtual void addECCObserver ( ECC_Observer * observer ) = 0;
+        virtual void removeECCObserver ( ECC_Observer * observer ) = 0;
+
+        virtual void setMultiClusterMode(bool allowMultipleClusters) = 0;
+        virtual void setSIPCCLoggingMask(const cc_int32_t mask) = 0;
+        virtual void setAuthenticationString(const std::string &authString) = 0;
+        virtual void setSecureCachePath(const std::string &secureCachePath) = 0;
+
+        // Add local codecs
+        virtual void setAudioCodecs(int codecMask) = 0;
+        virtual void setVideoCodecs(int codecMask) = 0;
+
+        virtual bool registerUser(const std::string& deviceName, const std::string& user, const std::string& password, const std::string& domain) = 0;
+        virtual bool disconnect() = 0;
+        virtual std::string getPreferredDeviceName() = 0;
+        virtual std::string getPreferredLineDN() = 0;
+        virtual ConnectionStatusEnum::ConnectionStatus getConnectionStatus() = 0;
+        virtual std::string getCurrentServer() = 0;
+
+        /* P2P MODE */
+        virtual bool startP2PMode(const std::string& user) = 0;
+
+        /* SDP MODE */
+        virtual bool startSDPMode() = 0;
+
+        /**
+         * Obtain the device object, from which call control can be done.
+         * getAvailablePhoneDetails lists all known devices which the user is likely to be able to control.
+         */
+        virtual CC_DevicePtr getActiveDevice() = 0;
+        virtual PhoneDetailsVtrPtr getAvailablePhoneDetails() = 0;
+        virtual PhoneDetailsPtr getAvailablePhoneDetails(const std::string& deviceName) = 0;
+
+        /**
+         * Obtain the audio/video object, from which video setup can be done.
+         * This relates to global tuning, device selection, preview window positioning, etc, not to
+         * per-call settings or control.
+         *
+         * These objects are unavailable except while in softphone mode.
+         */
+        virtual VideoControlPtr getVideoControl() = 0;
+        virtual AudioControlPtr getAudioControl() = 0;
+
+        virtual bool setProperty(ConfigPropertyKeysEnum::ConfigPropertyKeys key, std::string& value) = 0;
+        virtual std::string getProperty(ConfigPropertyKeysEnum::ConfigPropertyKeys key) = 0;
+
+    protected:
+        CallControlManager() {}
+    private:
+        CallControlManager(const CallControlManager&);
+        CallControlManager& operator=(const CallControlManager&);
+    };
+} //end namespace CSF
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/ECC_Observer.h
@@ -0,0 +1,27 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+#include "ECC_Types.h"
+
+namespace CSF
+{
+	/**
+	 * These callbacks relate to CallControlManager's "value add" features relating to authentication,
+	 * configuration, setup, service health and management of SIP.
+	 *
+	 * They do not relate to call control - see also CC_Observer.
+	 */
+	class ECC_API ECC_Observer
+	{
+	public:
+		virtual void onAvailablePhoneEvent (AvailablePhoneEventType::AvailablePhoneEvent event,
+											const PhoneDetailsPtr availablePhoneDetails) = 0;
+
+		virtual void onAuthenticationStatusChange (AuthenticationStatusEnum::AuthenticationStatus) = 0;
+		virtual void onConnectionStatusChange(ConnectionStatusEnum::ConnectionStatus status) = 0;
+	};
+}
new file mode 100755
--- /dev/null
+++ b/media/webrtc/signaling/include/ECC_Types.h
@@ -0,0 +1,152 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include "CC_Common.h"
+
+/*
+  These #defines are for use with CallControlManager::createSoftphone(..., const cc_int32_t mask) parameter as follows:
+
+  CallControlManager::createSoftphone(..., GSM_DEBUG_BIT | FIM_DEBUG_BIT | LSM_DEBUG_BIT );
+
+  This turns on debugging for the three areas (and disables logging in all other areas) of pSIPCC logging specified.
+
+*/
+
+#define SIP_DEBUG_MSG_BIT         (1 <<  0) // Bit 0
+#define SIP_DEBUG_STATE_BIT       (1 <<  1) // Bit 1
+#define SIP_DEBUG_TASK_BIT        (1 <<  2) // Bit 2
+#define SIP_DEBUG_REG_STATE_BIT   (1 <<  3) // Bit 3
+#define GSM_DEBUG_BIT             (1 <<  4) // Bit 4
+#define FIM_DEBUG_BIT             (1 <<  5) // Bit 5
+#define LSM_DEBUG_BIT             (1 <<  6) // Bit 6
+#define FSM_DEBUG_SM_BIT          (1 <<  7) // Bit 7
+#define CSM_DEBUG_SM_BIT          (1 <<  8) // Bit 8
+#define CC_DEBUG_BIT              (1 <<  9) // Bit 9
+#define CC_DEBUG_MSG_BIT          (1 << 10) // Bit 10
+#define AUTH_DEBUG_BIT            (1 << 11) // Bit 11
+#define CONFIG_DEBUG_BIT          (1 << 12) // Bit 12
+#define DPINT_DEBUG_BIT           (1 << 13) // Bit 13
+#define KPML_DEBUG_BIT            (1 << 15) // Bit 15
+#define VCM_DEBUG_BIT             (1 << 17) // Bit 17
+#define CC_APP_DEBUG_BIT          (1 << 18) // Bit 18
+#define CC_LOG_DEBUG_BIT          (1 << 19) // Bit 19
+#define TNP_DEBUG_BIT             (1 << 20) // Bit 20
+
+namespace CSFUnified
+{
+    DECLARE_PTR(DeviceInfo)
+}
+
+namespace CSF
+{
+	namespace AuthenticationFailureCodeType
+	{
+		typedef enum {
+			eNoError,
+			eNoServersConfigured,
+			eNoCredentialsConfigured,
+			eCouldNotConnect,
+			eServerCertificateRejected,
+			eCredentialsRejected,
+			eResponseEmpty,
+			eResponseInvalid
+		} AuthenticationFailureCode;
+		std::string ECC_API toString(AuthenticationFailureCode value);
+	}
+
+	namespace AuthenticationStatusEnum
+	{
+		typedef enum {
+			eNotAuthenticated,
+			eInProgress,
+			eAuthenticated,
+			eFailed
+		} AuthenticationStatus;
+		std::string ECC_API toString(AuthenticationStatus value);
+	}
+
+	namespace DeviceRetrievalFailureCodeType
+	{
+		typedef enum {
+			eNoError,
+			eNoServersConfigured,
+			eNoDeviceNameConfigured,
+			eCouldNotConnect,
+			eFileNotFound,
+			eFileEmpty,
+			eFileInvalid
+		} DeviceRetrievalFailureCode;
+		std::string ECC_API toString(DeviceRetrievalFailureCode value);
+	}
+
+    namespace ConnectionStatusEnum
+    {
+    	typedef enum {
+    		eIdle,
+    		eNone,
+    		eFetchingDeviceConfig,
+    		eRegistering,
+    		eReady,
+    		eConnectedButNoDeviceReady,
+    		eRetrying,
+    		eFailed
+    	} ConnectionStatus;
+		std::string ECC_API toString(ConnectionStatus value);
+    }
+
+	namespace ServiceStateType {
+		typedef enum
+		{
+			eUnknown,
+			eInService,
+			eOutOfService
+		} ServiceState;
+		std::string ECC_API toString(ServiceState value);
+	}
+
+	namespace AvailablePhoneEventType
+	{
+		typedef enum {
+			eFound,		// New Phone device discovered and added to the Available list.
+			eUpdated,	// Change to an existing Phone details record in the Available list.
+			eLost		// Phone device removed from the Available list.
+		} AvailablePhoneEvent;
+		std::string ECC_API toString(AvailablePhoneEvent value);
+	}
+
+	namespace ConfigPropertyKeysEnum
+	{
+		typedef enum {
+			eLocalVoipPort,
+			eRemoteVoipPort,
+			eVersion,
+			eTransport
+		} ConfigPropertyKeys;
+	}
+
+	typedef enum
+	{
+		VideoEnableMode_DISABLED,
+		VideoEnableMode_SENDONLY,
+		VideoEnableMode_RECVONLY,
+		VideoEnableMode_SENDRECV
+
+	} VideoEnableMode;
+
+	typedef enum				// scaling from codec size to render window size
+	{
+		RenderScaling_NONE,		// 1:1 actual pixels, crop and/or fill
+		RenderScaling_TO_FIT,	// scale to fit, without preserving aspect ratio
+		RenderScaling_BORDER,	// scale to fit, fill without cropping
+		RenderScaling_CROP		// scale to fit, crop without filling
+
+	} RenderScaling;
+
+    typedef void *VideoWindowHandle;
+	typedef void* ExternalRendererHandle;
+	typedef unsigned int VideoFormat;
+}
+
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/PhoneDetails.h
@@ -0,0 +1,60 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include <string>
+
+#include "CC_Common.h"
+#include "ECC_Types.h"
+
+namespace CSF
+{
+	DECLARE_NS_PTR_VECTOR(PhoneDetails);
+	class ECC_API PhoneDetails
+	{
+        protected:
+                virtual ~PhoneDetails() {}
+	public:
+                NS_INLINE_DECL_THREADSAFE_REFCOUNTING(PhoneDetails)
+		/**
+		 * Get the device name (the CUCM device name) and the free text description.
+		 */
+		virtual std::string getName() const = 0;
+		virtual std::string getDescription() const = 0;
+
+		/**
+		 * Get the model number (the internal CUCM number, not the number printed on the phone)
+		 * and the corresponding description (which normally does include the number printed on the phone).
+		 * Returns -1, "" if unknown
+		 */
+		virtual int getModel() const = 0;
+		virtual std::string getModelDescription() const = 0;
+
+		virtual bool isSoftPhone() = 0;
+
+		/**
+		 * List the known directory numbers of lines associated with the device.
+		 * Empty list if unknown.
+		 */
+		virtual std::vector<std::string> getLineDNs() const = 0;
+
+		/**
+		 * Current status of the device, if known.
+		 */
+		virtual ServiceStateType::ServiceState getServiceState() const = 0;
+
+		/**
+		 * TFTP config of device, and freshness of the config.
+		 */
+		virtual std::string getConfig() const = 0;
+
+	protected:
+		PhoneDetails() {}
+
+	private:
+		PhoneDetails(const PhoneDetails&);
+		PhoneDetails& operator=(const PhoneDetails&);
+	};
+};
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/SharedPtr.h
@@ -0,0 +1,44 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#pragma once
+
+#include <vector>
+#include "base/linked_ptr.h"
+#include "nsAutoPtr.h"
+
+#ifndef DECLARE_PTR
+#define DECLARE_PTR(className)\
+    class className;\
+    typedef linked_ptr<className> className##Ptr;
+#endif
+
+
+#ifndef DECLARE_PTR_VECTOR
+#define DECLARE_PTR_VECTOR(className)\
+    DECLARE_PTR(className)\
+    typedef std::vector<className##Ptr> className##Vtr;\
+    typedef linked_ptr<className##Vtr> className##Vtr##Ptr;
+#endif
+
+
+#ifndef NULL_PTR
+#define NULL_PTR(className) linked_ptr<className>()
+#endif
+
+// NSPR Variations of the above, to help with migration
+// from linked_ptr to nsRefPtr
+#ifndef DECLARE_NS_PTR
+#define DECLARE_NS_PTR(className)\
+    class className;\
+    typedef nsRefPtr<className> className##Ptr;
+#endif
+
+
+#ifndef DECLARE_NS_PTR_VECTOR
+#define DECLARE_NS_PTR_VECTOR(className)\
+    DECLARE_NS_PTR(className)\
+    typedef std::vector<className##Ptr> className##Vtr;\
+    typedef linked_ptr<className##Vtr> className##Vtr##Ptr;
+#endif
new file mode 100644
--- /dev/null
+++ b/media/webrtc/signaling/include/debug-psipcc-types.h
@@ -0,0 +1,53 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef T1_DEBUG_H
+#define T1_DEBUG_H
+
+#include "CC_Common.h"
+
+extern "C"
+{
+#include <ccapi_service.h>
+#include "ccapi_types.h"
+
+ECC_API cc_string_t device_event_getname(ccapi_device_event_e);
+ECC_API cc_string_t call_event_getname(ccapi_call_event_e);
+ECC_API cc_string_t line_event_getname(ccapi_line_event_e);
+
+ECC_API cc_string_t digit_getname(cc_digit_t);
+ECC_API cc_string_t cucm_mode_getname(cc_cucm_mode_t);
+ECC_API cc_string_t line_feature_getname(cc_line_feature_t);
+ECC_API cc_string_t feature_option_mask_getname(cc_feature_option_mask_t);
+ECC_API cc_string_t service_cause_getname(cc_service_cause_t);
+ECC_API cc_string_t service_state_getname(cc_service_state_t);
+ECC_API cc_string_t ccm_status_getname(cc_ccm_status_t);
+ECC_API cc_string_t line_reg_state_getname(cc_line_reg_state_t);
+ECC_API cc_string_t shutdown_reason_getname(cc_shutdown_reason_t);
+ECC_API cc_string_t kpml_config_getname(cc_kpml_config_t);
+ECC_API cc_string_t upgrade_getname(cc_upgrade_t);
+ECC_API cc_string_t sdp_direction_getname(cc_sdp_direction_t);
+ECC_API cc_string_t blf_state_getname(cc_blf_state_t);
+ECC_API cc_string_t blf_feature_mask_getname(cc_blf_feature_mask_t);
+ECC_API cc_string_t call_state_getname(cc_call_state_t);
+ECC_API cc_string_t call_attr_getname(cc_call_attr_t);
+ECC_API cc_string_t hold_reason_getname(cc_hold_reason_t);
+ECC_API cc_string_t call_type_getname(cc_call_type_t);
+ECC_API cc_string_t call_security_getname(cc_call_security_t);
+ECC_API cc_string_t call_policy_getname(cc_call_policy_t);
+ECC_API cc_string_t log_disposition_getname(cc_log_disposition_t);
+ECC_API cc_string_t call_priority_getname(cc_call_priority_t);
+ECC_API cc_string_t call_selection_getname(cc_call_selection_t);
+ECC_API cc_string_t call_capability_getname(ccapi_call_capability_e);
+ECC_API cc_string_t srv_ctrl_req_getname(cc_srv_ctrl_req_t);
+ECC_API cc_string_t srv_ctrl_cmd_getname(cc_srv_ctrl_cmd_t);
+ECC_API cc_string_t message_type_getname(cc_message_type_t);
+ECC_API cc_string_t lamp_state_getname(cc_lamp_state_t);
+ECC_API cc_string_t cause_getname(cc_cause_t);
+ECC_API cc_string_t subscriptions_ext_getname(cc_subscriptions_ext_t);
+ECC_API cc_string_t apply_config_result_getname(cc_apply_config_result_t);
+
+}
+
+#endif /* T1_DEBUG_H */
--- a/media/webrtc/signaling/signaling.gyp
+++ b/media/webrtc/signaling/signaling.gyp
@@ -33,24 +33,33 @@
       'type': 'static_library',
 
       #
       # INCLUDES
       #
       'include_dirs': [
         '..',
         './src',
+        './src/callcontrol',
         './src/common',
         './src/common/browser_logging',
         './src/common/time_profiling',
         './src/media',
         './src/media-conduit',
         './src/mediapipeline',
+        './src/softphonewrapper',
         './src/peerconnection',
-        './src/sdp/sipcc',
+        './include',
+        './src/sipcc/include',
+        './src/sipcc/cpr/include',
+        './src/sipcc/core/includes',
+        './src/sipcc/core/gsm/h',
+        './src/sipcc/core/common',
+        './src/sipcc/core/sipstack/h',
+        './src/sipcc/core/sdp',
         '../../../xpcom/base',
         '../../../dom/base',
         '../../../dom/media',
         '../../../media/mtransport',
         '../trunk',
         '../trunk/webrtc',
         '../trunk/webrtc/video_engine/include',
         '../trunk/webrtc/voice_engine/include',
@@ -93,102 +102,103 @@
         # Browser Logging
         './src/common/browser_logging/CSFLog.cpp',
         './src/common/browser_logging/CSFLog.h',
         './src/common/browser_logging/WebRtcLog.cpp',
         './src/common/browser_logging/WebRtcLog.h',
         # Browser Logging
         './src/common/time_profiling/timecard.c',
         './src/common/time_profiling/timecard.h',
+        # Call Control
+        './src/callcontrol/CC_CallTypes.cpp',
+        './src/callcontrol/CallControlManager.cpp',
+        './src/callcontrol/CallControlManagerImpl.cpp',
+        './src/callcontrol/ECC_Types.cpp',
+        './src/callcontrol/PhoneDetailsImpl.cpp',
+        './src/callcontrol/debug-psipcc-types.cpp',
+        './src/callcontrol/CallControlManagerImpl.h',
+        './src/callcontrol/PhoneDetailsImpl.h',
+        # Media
+        './src/media/CSFAudioControlWrapper.cpp',
+        './src/media/CSFVideoControlWrapper.cpp',
+        './src/media/VcmSIPCCBinding.cpp',
+        './src/media/cip_mmgr_mediadefinitions.h',
+        './src/media/cip_Sipcc_CodecMask.h',
+        './src/media/CSFAudioControlWrapper.h',
+        './src/media/CSFAudioTermination.h',
+        './src/media/CSFMediaProvider.h',
+        './src/media/CSFMediaTermination.h',
+        './src/media/CSFToneDefinitions.h',
+        './src/media/CSFVideoCallMediaControl.h',
+        './src/media/CSFVideoControlWrapper.h',
+        './src/media/CSFVideoTermination.h',
+        './src/media/VcmSIPCCBinding.h',
+        # SoftPhoneWrapper
+        './src/softphonewrapper/CC_SIPCCCall.cpp',
+        './src/softphonewrapper/CC_SIPCCCallInfo.cpp',
+        './src/softphonewrapper/CC_SIPCCCallServerInfo.cpp',
+        './src/softphonewrapper/CC_SIPCCDevice.cpp',
+        './src/softphonewrapper/CC_SIPCCDeviceInfo.cpp',
+        './src/softphonewrapper/CC_SIPCCFeatureInfo.cpp',
+        './src/softphonewrapper/CC_SIPCCLine.cpp',
+        './src/softphonewrapper/CC_SIPCCLineInfo.cpp',
+        './src/softphonewrapper/CC_SIPCCService.cpp',
+        './src/softphonewrapper/ccapi_plat_api_impl.cpp',
+        './src/softphonewrapper/CC_SIPCCCall.h',
+        './src/softphonewrapper/CC_SIPCCCallInfo.h',
+        './src/softphonewrapper/CC_SIPCCCallServerInfo.h',
+        './src/softphonewrapper/CC_SIPCCDevice.h',
+        './src/softphonewrapper/CC_SIPCCDeviceInfo.h',
+        './src/softphonewrapper/CC_SIPCCFeatureInfo.h',
+        './src/softphonewrapper/CC_SIPCCLine.h',
+        './src/softphonewrapper/CC_SIPCCLineInfo.h',
+        './src/softphonewrapper/CC_SIPCCService.h',
         # PeerConnection
-        './src/peerconnection/MediaPipelineFactory.cpp',
-        './src/peerconnection/MediaPipelineFactory.h',
         './src/peerconnection/MediaStreamList.cpp',
         './src/peerconnection/MediaStreamList.h',
         './src/peerconnection/PeerConnectionCtx.cpp',
         './src/peerconnection/PeerConnectionCtx.h',
         './src/peerconnection/PeerConnectionImpl.cpp',
         './src/peerconnection/PeerConnectionImpl.h',
         './src/peerconnection/PeerConnectionMedia.cpp',
         './src/peerconnection/PeerConnectionMedia.h',
+
         # Media pipeline
         './src/mediapipeline/MediaPipeline.h',
         './src/mediapipeline/MediaPipeline.cpp',
         './src/mediapipeline/MediaPipelineFilter.h',
         './src/mediapipeline/MediaPipelineFilter.cpp',
-         # SDP
-         './src/sdp/sipcc/ccsdp.h',
-         './src/sdp/sipcc/cpr_string.c',
-         './src/sdp/sipcc/sdp_access.c',
-         './src/sdp/sipcc/sdp_attr.c',
-         './src/sdp/sipcc/sdp_attr_access.c',
-         './src/sdp/sipcc/sdp_base64.c',
-         './src/sdp/sipcc/sdp_config.c',
-         './src/sdp/sipcc/sdp_main.c',
-         './src/sdp/sipcc/sdp_token.c',
-         './src/sdp/sipcc/sdp.h',
-         './src/sdp/sipcc/sdp_base64.h',
-         './src/sdp/sipcc/sdp_os_defs.h',
-         './src/sdp/sipcc/sdp_private.h',
-         './src/sdp/sipcc/sdp_utils.c',
-         './src/sdp/sipcc/sdp_services_unix.c',
-
-         # SDP Wrapper
-         './src/sdp/Sdp.h',
-         './src/sdp/SdpAttribute.h',
-         './src/sdp/SdpAttribute.cpp',
-         './src/sdp/SdpAttributeList.h',
-         './src/sdp/SdpErrorHolder.h',
-         './src/sdp/SdpMediaSection.h',
-         './src/sdp/SipccSdp.h',
-         './src/sdp/SipccSdpAttributeList.h',
-         './src/sdp/SipccSdpAttributeList.cpp',
-         './src/sdp/SipccSdpMediaSection.h',
-         './src/sdp/SipccSdpParser.h',
-         './src/sdp/SipccSdp.cpp',
-         './src/sdp/SipccSdpMediaSection.cpp',
-         './src/sdp/SipccSdpParser.cpp',
-
-         # JSEP
-         './src/jsep/JsepCodecDescription.h',
-         './src/jsep/JsepSession.h',
-         './src/jsep/JsepSessionImpl.cpp',
-         './src/jsep/JsepSessionImpl.h',
-         './src/jsep/JsepTrack.h',
-         './src/jsep/JsepTransport.h'
       ],
 
       #
       # DEFINES
       #
 
       'defines' : [
         'LOG4CXX_STATIC',
         '_NO_LOG4CXX',
         'USE_SSLEAY',
         '_CPR_USE_EXTERNAL_LOGGER',
         'WEBRTC_RELATIVE_PATH',
-        'HAVE_WEBRTC_VIDEO',
+      	'HAVE_WEBRTC_VIDEO',
         'HAVE_WEBRTC_VOICE',
         'HAVE_STDINT_H=1',
         'HAVE_STDLIB_H=1',
         'HAVE_UINT8_T=1',
         'HAVE_UINT16_T=1',
         'HAVE_UINT32_T=1',
         'HAVE_UINT64_T=1',
       ],
 
       'cflags_mozilla': [
         '$(NSPR_CFLAGS)',
         '$(NSS_CFLAGS)',
         '$(MOZ_PIXMAN_CFLAGS)',
-        '$(WARNINGS_AS_ERRORS)',
       ],
 
-
       #
       # Conditionals
       #
       'conditions': [
         # hack so I can change the include flow for SrtpFlow
         ['build_with_mozilla==1', {
           'sources': [
             './src/mediapipeline/SrtpFlow.h',
@@ -297,16 +307,598 @@
             '_FORTIFY_SOURCE=2',
           ],
 
           'cflags_mozilla': [
           ],
         }],
       ],
     },
+
+    #
+    # SIPCC
+    #
+    {
+      'target_name': 'sipcc',
+      'type': 'static_library',
+
+      #
+      # INCLUDES
+      #
+      'include_dirs': [
+        './src/common/browser_logging',
+        './src/common/time_profiling',
+        './src/sipcc/include',
+        './src/sipcc/core/includes',
+        './src/sipcc/cpr/include',
+        './src/sipcc/core/common',
+        './src/sipcc/core/sipstack/h',
+        './src/sipcc/core/ccapp',
+        './src/sipcc/core/sdp',
+        './src/sipcc/core/gsm/h',
+        './src/sipcc/plat/common',
+        '../../../media/mtransport',
+        '../../../dom/base',
+        '../../../netwerk/sctp/datachannel',
+      ],
+
+      #
+      # DEPENDENCIES
+      #
+      'dependencies': [
+      ],
+
+
+      'export_dependent_settings': [
+      ],
+
+
+      #
+      # SOURCES
+      #
+      'sources': [
+        # CCAPP
+        './src/sipcc/core/ccapp/call_logger.c',
+        './src/sipcc/core/ccapp/call_logger.h',
+        './src/sipcc/core/ccapp/capability_set.c',
+        './src/sipcc/core/ccapp/capability_set.h',
+        './src/sipcc/core/ccapp/cc_blf.c',
+        './src/sipcc/core/ccapp/cc_call_feature.c',
+        './src/sipcc/core/ccapp/cc_config.c',
+        './src/sipcc/core/ccapp/cc_device_feature.c',
+        './src/sipcc/core/ccapp/cc_device_manager.c',
+        './src/sipcc/core/ccapp/cc_device_manager.h',
+        './src/sipcc/core/ccapp/cc_info.c',
+        './src/sipcc/core/ccapp/cc_service.c',
+        './src/sipcc/core/ccapp/ccapi_call.c',
+        './src/sipcc/core/ccapp/ccapi_call_info.c',
+        './src/sipcc/core/ccapp/ccapi_config.c',
+        './src/sipcc/core/ccapp/ccapi_device.c',
+        './src/sipcc/core/ccapp/ccapi_device_info.c',
+        './src/sipcc/core/ccapp/ccapi_feature_info.c',
+        './src/sipcc/core/ccapp/ccapi_line.c',
+        './src/sipcc/core/ccapp/ccapi_line_info.c',
+        './src/sipcc/core/ccapp/ccapi_service.c',
+        './src/sipcc/core/ccapp/ccapi_snapshot.c',
+        './src/sipcc/core/ccapp/ccapi_snapshot.h',
+        './src/sipcc/core/ccapp/ccapp_task.c',
+        './src/sipcc/core/ccapp/ccapp_task.h',
+        './src/sipcc/core/ccapp/ccprovider.c',
+        './src/sipcc/core/ccapp/CCProvider.h',
+        './src/sipcc/core/ccapp/conf_roster.c',
+        './src/sipcc/core/ccapp/conf_roster.h',
+        './src/sipcc/core/ccapp/sessionHash.c',
+        './src/sipcc/core/ccapp/sessionHash.h',
+        # COMMON
+        './src/sipcc/core/common/cfgfile_utils.c',
+        './src/sipcc/core/common/cfgfile_utils.h',
+        './src/sipcc/core/common/config_api.c',
+        './src/sipcc/core/common/config_parser.c',
+        './src/sipcc/core/common/config_parser.h',
+        './src/sipcc/core/common/init.c',
+        './src/sipcc/core/common/logger.c',
+        './src/sipcc/core/common/logger.h',
+        './src/sipcc/core/common/logmsg.h',
+        './src/sipcc/core/common/misc.c',
+        './src/sipcc/core/common/plat.c',
+        './src/sipcc/core/common/platform_api.c',
+        './src/sipcc/core/common/prot_cfgmgr_private.h',
+        './src/sipcc/core/common/prot_configmgr.c',
+        './src/sipcc/core/common/prot_configmgr.h',
+        './src/sipcc/core/common/resource_manager.c',
+        './src/sipcc/core/common/resource_manager.h',
+        './src/sipcc/core/common/sip_socket_api.c',
+        './src/sipcc/core/common/subscription_handler.c',
+        './src/sipcc/core/common/subscription_handler.h',
+        './src/sipcc/core/common/text_strings.c',
+        './src/sipcc/core/common/text_strings.h',
+        './src/sipcc/core/common/ui.c',
+        # GSM
+        './src/sipcc/core/gsm/ccapi.c',
+        './src/sipcc/core/gsm/ccapi_strings.c',
+        './src/sipcc/core/gsm/dcsm.c',
+        './src/sipcc/core/gsm/fim.c',
+        './src/sipcc/core/gsm/fsm.c',
+        './src/sipcc/core/gsm/fsmb2bcnf.c',
+        './src/sipcc/core/gsm/fsmcac.c',
+        './src/sipcc/core/gsm/fsmcnf.c',
+        './src/sipcc/core/gsm/fsmdef.c',
+        './src/sipcc/core/gsm/fsmxfr.c',
+        './src/sipcc/core/gsm/gsm.c',
+        './src/sipcc/core/gsm/gsm_sdp.c',
+        './src/sipcc/core/gsm/gsm_sdp_crypto.c',
+        './src/sipcc/core/gsm/lsm.c',
+        './src/sipcc/core/gsm/media_cap_tbl.c',
+        './src/sipcc/core/gsm/sm.c',
+        './src/sipcc/core/gsm/subapi.c',
+        './src/sipcc/core/gsm/h/fim.h',
+        './src/sipcc/core/gsm/h/fsm.h',
+        './src/sipcc/core/gsm/h/gsm.h',
+        './src/sipcc/core/gsm/h/gsm_sdp.h',
+        './src/sipcc/core/gsm/h/lsm.h',
+        './src/sipcc/core/gsm/h/lsm_private.h',
+        './src/sipcc/core/gsm/h/sm.h',
+        # CORE INCLUDES
+        './src/sipcc/core/includes/ccSesion.h',
+        './src/sipcc/core/includes/ccapi.h',
+        './src/sipcc/core/includes/check_sync.h',
+        './src/sipcc/core/includes/ci.h',
+        './src/sipcc/core/includes/codec_mask.h',
+        './src/sipcc/core/includes/config.h',
+        './src/sipcc/core/includes/configapp.h',
+        './src/sipcc/core/includes/configmgr.h',
+        './src/sipcc/core/includes/debug.h',
+        './src/sipcc/core/includes/dialplan.h',
+        './src/sipcc/core/includes/dialplanint.h',
+        './src/sipcc/core/includes/digcalc.h',
+        './src/sipcc/core/includes/dns_utils.h',
+        './src/sipcc/core/includes/dtmf.h',
+        './src/sipcc/core/includes/embedded.h',
+        './src/sipcc/core/includes/fsmdef_states.h',
+        './src/sipcc/core/includes/intelpentiumtypes.h',
+        './src/sipcc/core/includes/kpml_common_util.h',
+        './src/sipcc/core/includes/kpmlmap.h',
+        './src/sipcc/core/includes/md5.h',
+        './src/sipcc/core/includes/memory.h',
+        './src/sipcc/core/includes/misc_apps_task.h',
+        './src/sipcc/core/includes/misc_util.h',
+        './src/sipcc/core/includes/phntask.h',
+        './src/sipcc/core/includes/phone.h',
+        './src/sipcc/core/includes/phone_debug.h',
+        './src/sipcc/core/includes/phone_platform_constants.h',
+        './src/sipcc/core/includes/phone_types.h',
+        './src/sipcc/core/includes/platform_api.h',
+        './src/sipcc/core/includes/pres_sub_not_handler.h',
+        './src/sipcc/core/includes/publish_int.h',
+        './src/sipcc/core/includes/regexp.h',
+        './src/sipcc/core/includes/ringlist.h',
+        './src/sipcc/core/includes/rtp_defs.h',
+        './src/sipcc/core/includes/session.h',
+        './src/sipcc/core/includes/sessionConstants.h',
+        './src/sipcc/core/includes/sessionTypes.h',
+        './src/sipcc/core/includes/sessuri.h',
+        './src/sipcc/core/includes/singly_link_list.h',
+        './src/sipcc/core/includes/sip_socket_api.h',
+        './src/sipcc/core/includes/sntp.h',
+        './src/sipcc/core/includes/string_lib.h',
+        './src/sipcc/core/includes/subapi.h',
+        './src/sipcc/core/includes/task.h',
+        './src/sipcc/core/includes/time2.h',
+        './src/sipcc/core/includes/timer.h',
+        './src/sipcc/core/includes/tnpphone.h',
+        './src/sipcc/core/includes/uart.h',
+        './src/sipcc/core/includes/uiapi.h',
+        './src/sipcc/core/includes/upgrade.h',
+        './src/sipcc/core/includes/util_ios_queue.h',
+        './src/sipcc/core/includes/util_parse.h',
+        './src/sipcc/core/includes/util_string.h',
+        './src/sipcc/core/includes/www.h',
+        './src/sipcc/core/includes/xml_defs.h',
+        # SDP
+        './src/sipcc/core/sdp/ccsdp.c',
+        './src/sipcc/core/sdp/sdp_access.c',
+        './src/sipcc/core/sdp/sdp_attr.c',
+        './src/sipcc/core/sdp/sdp_attr_access.c',
+        './src/sipcc/core/sdp/sdp_base64.c',
+        './src/sipcc/core/sdp/sdp_config.c',
+        './src/sipcc/core/sdp/sdp_main.c',
+        './src/sipcc/core/sdp/sdp_token.c',
+        './src/sipcc/core/sdp/sdp.h',
+        './src/sipcc/core/sdp/sdp_base64.h',
+        './src/sipcc/core/sdp/sdp_os_defs.h',
+        './src/sipcc/core/sdp/sdp_private.h',
+        './src/sipcc/core/sdp/sdp_utils.c',
+        './src/sipcc/core/sdp/sdp_services_unix.c',
+        # SIPSTACK
+        './src/sipcc/core/sipstack/ccsip_callinfo.c',
+        './src/sipcc/core/sipstack/ccsip_cc.c',
+        './src/sipcc/core/sipstack/ccsip_common_util.c',
+        './src/sipcc/core/sipstack/ccsip_core.c',
+        './src/sipcc/core/sipstack/ccsip_debug.c',
+        './src/sipcc/core/sipstack/ccsip_info.c',
+        './src/sipcc/core/sipstack/ccsip_messaging.c',
+        './src/sipcc/core/sipstack/ccsip_platform.c',
+        './src/sipcc/core/sipstack/ccsip_platform_tcp.c',
+        './src/sipcc/core/sipstack/ccsip_platform_timers.c',
+        './src/sipcc/core/sipstack/ccsip_platform_tls.c',
+        './src/sipcc/core/sipstack/ccsip_platform_udp.c',
+        './src/sipcc/core/sipstack/ccsip_pmh.c',
+        './src/sipcc/core/sipstack/ccsip_publish.c',
+        './src/sipcc/core/sipstack/ccsip_register.c',
+        './src/sipcc/core/sipstack/ccsip_reldev.c',
+        './src/sipcc/core/sipstack/ccsip_sdp.c',
+        './src/sipcc/core/sipstack/ccsip_spi_utils.c',
+        './src/sipcc/core/sipstack/ccsip_subsmanager.c',
+        './src/sipcc/core/sipstack/ccsip_task.c',
+        './src/sipcc/core/sipstack/httpish.c',
+        './src/sipcc/core/sipstack/pmhutils.c',
+        './src/sipcc/core/sipstack/sip_common_regmgr.c',
+        './src/sipcc/core/sipstack/sip_common_transport.c',
+        './src/sipcc/core/sipstack/sip_csps_transport.c',
+        './src/sipcc/core/sipstack/sip_interface_regmgr.c',
+        './src/sipcc/core/sipstack/h/ccsip_callinfo.h',
+        './src/sipcc/core/sipstack/h/ccsip_cc.h',
+        './src/sipcc/core/sipstack/h/ccsip_common_cb.h',
+        './src/sipcc/core/sipstack/h/ccsip_core.h',
+        './src/sipcc/core/sipstack/h/ccsip_credentials.h',
+        './src/sipcc/core/sipstack/h/ccsip_macros.h',
+        './src/sipcc/core/sipstack/h/ccsip_messaging.h',
+        './src/sipcc/core/sipstack/h/ccsip_platform.h',
+        './src/sipcc/core/sipstack/h/ccsip_platform_tcp.h',
+        './src/sipcc/core/sipstack/h/ccsip_platform_timers.h',
+        './src/sipcc/core/sipstack/h/ccsip_platform_tls.h',
+        './src/sipcc/core/sipstack/h/ccsip_platform_udp.h',
+        './src/sipcc/core/sipstack/h/ccsip_pmh.h',
+        './src/sipcc/core/sipstack/h/ccsip_protocol.h',
+        './src/sipcc/core/sipstack/h/ccsip_publish.h',
+        './src/sipcc/core/sipstack/h/ccsip_register.h',
+        './src/sipcc/core/sipstack/h/ccsip_reldev.h',
+        './src/sipcc/core/sipstack/h/ccsip_sdp.h',
+        './src/sipcc/core/sipstack/h/ccsip_sim.h',
+        './src/sipcc/core/sipstack/h/ccsip_spi_utils.h',
+        './src/sipcc/core/sipstack/h/ccsip_subsmanager.h',
+        './src/sipcc/core/sipstack/h/ccsip_task.h',
+        './src/sipcc/core/sipstack/h/httpish.h',
+        './src/sipcc/core/sipstack/h/httpish_protocol.h',
+        './src/sipcc/core/sipstack/h/pmhdefs.h',
+        './src/sipcc/core/sipstack/h/pmhutils.h',
+        './src/sipcc/core/sipstack/h/regmgrapi.h',
+        './src/sipcc/core/sipstack/h/sip_ccm_transport.h',
+        './src/sipcc/core/sipstack/h/sip_common_regmgr.h',
+        './src/sipcc/core/sipstack/h/sip_common_transport.h',
+        './src/sipcc/core/sipstack/h/sip_csps_transport.h',
+        './src/sipcc/core/sipstack/h/sip_interface_regmgr.h',
+        './src/sipcc/core/sipstack/h/sip_platform_task.h',
+        # SRC-COMMON
+        './src/sipcc/core/src-common/configapp.c',
+        './src/sipcc/core/src-common/dialplan.c',
+        './src/sipcc/core/src-common/dialplanint.c',
+        './src/sipcc/core/src-common/digcalc.c',
+        './src/sipcc/core/src-common/kpml_common_util.c',
+        './src/sipcc/core/src-common/kpmlmap.c',
+        './src/sipcc/core/src-common/md5.c',
+        './src/sipcc/core/src-common/misc_apps_task.c',
+        './src/sipcc/core/src-common/pres_sub_not_handler.c',
+        './src/sipcc/core/src-common/publish_int.c',
+        './src/sipcc/core/src-common/singly_link_list.c',
+        './src/sipcc/core/src-common/sll_lite.c',
+        './src/sipcc/core/src-common/string_lib.c',
+        './src/sipcc/core/src-common/util_ios_queue.c',
+        './src/sipcc/core/src-common/util_parse.c',
+        './src/sipcc/core/src-common/util_string.c',
+        # CPR
+        './src/sipcc/cpr/include/cpr.h',
+        './src/sipcc/cpr/include/cpr_assert.h',
+        './src/sipcc/cpr/include/cpr_debug.h',
+        './src/sipcc/cpr/include/cpr_errno.h',
+        './src/sipcc/cpr/include/cpr_in.h',
+        './src/sipcc/cpr/include/cpr_ipc.h',
+        './src/sipcc/cpr/include/cpr_locks.h',
+        './src/sipcc/cpr/include/cpr_memory.h',
+        './src/sipcc/cpr/include/cpr_rand.h',
+        './src/sipcc/cpr/include/cpr_socket.h',
+        './src/sipcc/cpr/include/cpr_stddef.h',
+        './src/sipcc/cpr/include/cpr_stdio.h',
+        './src/sipcc/cpr/include/cpr_stdlib.h',
+        './src/sipcc/cpr/include/cpr_string.h',
+        './src/sipcc/cpr/include/cpr_strings.h',
+        './src/sipcc/cpr/include/cpr_threads.h',
+        './src/sipcc/cpr/include/cpr_time.h',
+        './src/sipcc/cpr/include/cpr_timers.h',
+        './src/sipcc/cpr/include/cpr_types.h',
+        './src/sipcc/cpr/common/cpr_ipc.c',
+        './src/sipcc/cpr/common/cpr_string.c',
+        # INCLUDE
+        './src/sipcc/include/cc_blf.h',
+        './src/sipcc/include/cc_blf_listener.h',
+        './src/sipcc/include/cc_call_feature.h',
+        './src/sipcc/include/cc_call_listener.h',
+        './src/sipcc/include/cc_config.h',
+        './src/sipcc/include/cc_constants.h',
+        './src/sipcc/include/cc_debug.h',
+        './src/sipcc/include/cc_device_feature.h',
+        './src/sipcc/include/cc_device_listener.h',
+        './src/sipcc/include/cc_info.h',
+        './src/sipcc/include/cc_info_listener.h',
+        './src/sipcc/include/cc_service.h',
+        './src/sipcc/include/cc_service_listener.h',
+        './src/sipcc/include/cc_types.h',
+        './src/sipcc/include/ccapi_call.h',
+        './src/sipcc/include/ccapi_call_info.h',
+        './src/sipcc/include/ccapi_call_listener.h',
+        './src/sipcc/include/ccapi_calllog.h',
+        './src/sipcc/include/ccapi_conf_roster.h',
+        './src/sipcc/include/ccapi_device.h',
+        './src/sipcc/include/ccapi_device_info.h',
+        './src/sipcc/include/ccapi_device_listener.h',
+        './src/sipcc/include/ccapi_feature_info.h',
+        './src/sipcc/include/ccapi_line.h',
+        './src/sipcc/include/ccapi_line_info.h',
+        './src/sipcc/include/ccapi_line_listener.h',
+        './src/sipcc/include/ccapi_service.h',
+        './src/sipcc/include/ccapi_types.h',
+        './src/sipcc/include/ccsdp.h',
+        './src/sipcc/include/ccsdp_rtcp_fb.h',
+        './src/sipcc/include/config_api.h',
+        './src/sipcc/include/dns_util.h',
+        './src/sipcc/include/plat_api.h',
+        './src/sipcc/include/reset_api.h',
+        './src/sipcc/include/sll_lite.h',
+        './src/sipcc/include/vcm.h',
+        './src/sipcc/include/xml_parser_defines.h',
+
+        # PLAT
+        './src/sipcc/plat/csf2g/model.c',
+        './src/sipcc/plat/csf2g/reset_api.c',
+        #
+        # './src/sipcc/plat/common/plat_debug.h',
+        # './src/sipcc/plat/common/tnp_blf.h',
+
+        # STUB
+        #'./src/sipcc/stub/cc_blf_stub.c',
+        #'./src/sipcc/stub/vcm_stub.c',
+
+      ],
+
+      #
+      # DEFINES
+      #
+
+      'defines' : [
+      # CPR timers are needed by SIP, but are disabled for now
+      # to avoid the extra timer thread and stale cleanup code
+      #    'CPR_TIMERS_ENABLED',
+      ],
+
+      'cflags_mozilla': [
+        '$(NSPR_CFLAGS)',
+      ],
+
+      #
+      # OS SPECIFIC
+      #
+      'conditions': [
+        ['(OS=="android") or (OS=="linux")', {
+          'include_dirs': [
+          ],
+
+          'defines' : [
+            'SIP_OS_LINUX',
+            '_GNU_SOURCE',
+            'CPR_MEMORY_LITTLE_ENDIAN',
+            'NO_SOCKET_POLLING',
+            'USE_TIMER_SELECT_BASED',
+            'FULL_BUILD',
+            'STUBBED_OUT',
+            'USE_PRINTF'
+            'LINUX',
+          ],
+
+          'cflags_mozilla': [
+          ],
+        }],
+        ['OS=="android"', {
+          'sources': [
+            # SIPSTACK
+            './src/sipcc/core/sipstack/sip_platform_task.c',
+
+            # PLAT
+            './src/sipcc/plat/common/dns_utils.c',
+
+            # CPR
+            './src/sipcc/cpr/android/cpr_android_errno.c',
+            './src/sipcc/cpr/android/cpr_android_init.c',
+            './src/sipcc/cpr/android/cpr_android_socket.c',
+            './src/sipcc/cpr/android/cpr_android_stdio.c',
+            './src/sipcc/cpr/android/cpr_android_string.c',
+            './src/sipcc/cpr/android/cpr_android_threads.c',
+            './src/sipcc/cpr/android/cpr_android_timers_using_select.c',
+
+            './src/sipcc/cpr/android/cpr_assert.h',
+            './src/sipcc/cpr/android/cpr_android_align.h',
+            './src/sipcc/cpr/android/cpr_android_assert.h',
+            './src/sipcc/cpr/android/cpr_android_errno.h',
+            './src/sipcc/cpr/android/cpr_android_in.h',
+            './src/sipcc/cpr/android/cpr_android_private.h',
+            './src/sipcc/cpr/android/cpr_android_rand.h',
+            './src/sipcc/cpr/android/cpr_android_socket.h',
+            './src/sipcc/cpr/android/cpr_android_stdio.h',
+            './src/sipcc/cpr/android/cpr_android_string.h',
+            './src/sipcc/cpr/android/cpr_android_strings.h',
+            './src/sipcc/cpr/android/cpr_android_time.h',
+            './src/sipcc/cpr/android/cpr_android_timers.h',
+            './src/sipcc/cpr/android/cpr_android_tst.h',
+            './src/sipcc/cpr/android/cpr_android_types.h',
+          ],
+        }],
+        ['OS=="linux"', {
+          'sources': [
+            # SIPSTACK
+            './src/sipcc/core/sipstack/sip_platform_task.c',
+
+            # PLAT
+            './src/sipcc/plat/common/dns_utils.c',
+
+            # CPR
+            './src/sipcc/cpr/linux/cpr_linux_errno.c',
+            './src/sipcc/cpr/linux/cpr_linux_init.c',
+            './src/sipcc/cpr/linux/cpr_linux_socket.c',
+            './src/sipcc/cpr/linux/cpr_linux_stdio.c',
+            './src/sipcc/cpr/linux/cpr_linux_string.c',
+            './src/sipcc/cpr/linux/cpr_linux_threads.c',
+            './src/sipcc/cpr/linux/cpr_linux_timers_using_select.c',
+
+            './src/sipcc/cpr/linux/cpr_assert.h',
+            './src/sipcc/cpr/linux/cpr_linux_align.h',
+            './src/sipcc/cpr/linux/cpr_linux_assert.h',
+            './src/sipcc/cpr/linux/cpr_linux_errno.h',
+            './src/sipcc/cpr/linux/cpr_linux_in.h',
+            './src/sipcc/cpr/linux/cpr_linux_private.h',
+            './src/sipcc/cpr/linux/cpr_linux_rand.h',
+            './src/sipcc/cpr/linux/cpr_linux_socket.h',
+            './src/sipcc/cpr/linux/cpr_linux_stdio.h',
+            './src/sipcc/cpr/linux/cpr_linux_string.h',
+            './src/sipcc/cpr/linux/cpr_linux_strings.h',
+            './src/sipcc/cpr/linux/cpr_linux_time.h',
+            './src/sipcc/cpr/linux/cpr_linux_timers.h',
+            './src/sipcc/cpr/linux/cpr_linux_tst.h',
+            './src/sipcc/cpr/linux/cpr_linux_types.h',
+
+          ],
+        }],
+        ['OS=="win"', {
+          'include_dirs': [
+          ],
+
+          'sources': [
+            # SIPSTACK
+            './src/sipcc/core/sipstack/sip_platform_win32_task.c',
+
+            # PLAT
+            './src/sipcc/plat/win32/dns_utils.c',
+            './src/sipcc/plat/win32/mystub.c',
+            './src/sipcc/plat/win32/plat_api_stub.c',
+            './src/sipcc/plat/win32/plat_api_win.c',
+            './src/sipcc/plat/win32/StdAfx.h',
+
+            # CPR
+            './src/sipcc/cpr/win32/cpr_win_assert.h',