diff --git a/MSVC/ring-daemon.vcxproj b/MSVC/ring-daemon.vcxproj
index beffd2867a548150d213c255acb6bf173219ed55..aa789f3f79c0a0ca91babc73d0849288b52a4636 100644
--- a/MSVC/ring-daemon.vcxproj
+++ b/MSVC/ring-daemon.vcxproj
@@ -533,6 +533,116 @@
       <LinkTimeCodeGeneration>true</LinkTimeCodeGeneration>
     </Lib>
   </ItemDefinitionGroup>
+  <ItemGroup>
+    <ClCompile Include="..\src\account.cpp" />
+    <ClCompile Include="..\src\account_factory.cpp" />
+    <ClCompile Include="..\src\archiver.cpp" />
+    <ClCompile Include="..\src\base64.cpp" />
+    <ClCompile Include="..\src\buildinfo.cpp" />
+    <ClCompile Include="..\src\call.cpp" />
+    <ClCompile Include="..\src\call_factory.cpp" />
+    <ClCompile Include="..\src\client\callmanager.cpp" />
+    <ClCompile Include="..\src\client\configurationmanager.cpp" />
+    <ClCompile Include="..\src\client\datatransfer.cpp" />
+    <ClCompile Include="..\src\client\presencemanager.cpp" />
+    <ClCompile Include="..\src\client\ring_signal.cpp" />
+    <ClCompile Include="..\src\client\videomanager.cpp" />
+    <ClCompile Include="..\src\conference.cpp" />
+    <ClCompile Include="..\src\config\yamlparser.cpp" />
+    <ClCompile Include="..\src\data_transfer.cpp" />
+    <ClCompile Include="..\src\dlfcn.c" />
+    <ClCompile Include="..\src\fileutils.cpp" />
+    <ClCompile Include="..\src\ftp_server.cpp" />
+    <ClCompile Include="..\src\hooks\urlhook.cpp" />
+    <ClCompile Include="..\src\ice_transport.cpp" />
+    <ClCompile Include="..\src\im\instant_messaging.cpp" />
+    <ClCompile Include="..\src\im\message_engine.cpp" />
+    <ClCompile Include="..\src\ip_utils.cpp" />
+    <ClCompile Include="..\src\logger.cpp" />
+    <ClCompile Include="..\src\manager.cpp" />
+    <ClCompile Include="..\src\media\audio\audiobuffer.cpp" />
+    <ClCompile Include="..\src\media\audio\audiolayer.cpp" />
+    <ClCompile Include="..\src\media\audio\audioloop.cpp" />
+    <ClCompile Include="..\src\media\audio\audiorecord.cpp" />
+    <ClCompile Include="..\src\media\audio\audiorecorder.cpp" />
+    <ClCompile Include="..\src\media\audio\audio_rtp_session.cpp" />
+    <ClCompile Include="..\src\media\audio\dcblocker.cpp" />
+    <ClCompile Include="..\src\media\audio\dsp.cpp" />
+    <ClCompile Include="..\src\media\audio\portaudio\portaudiolayer.cpp" />
+    <ClCompile Include="..\src\media\audio\resampler.cpp" />
+    <ClCompile Include="..\src\media\audio\ringbuffer.cpp" />
+    <ClCompile Include="..\src\media\audio\ringbufferpool.cpp" />
+    <ClCompile Include="..\src\media\audio\sound\audiofile.cpp" />
+    <ClCompile Include="..\src\media\audio\sound\dtmf.cpp" />
+    <ClCompile Include="..\src\media\audio\sound\dtmfgenerator.cpp" />
+    <ClCompile Include="..\src\media\audio\sound\tone.cpp" />
+    <ClCompile Include="..\src\media\audio\sound\tonelist.cpp" />
+    <ClCompile Include="..\src\media\audio\tonecontrol.cpp" />
+    <ClCompile Include="..\src\media\libav_utils.cpp" />
+    <ClCompile Include="..\src\media\media_buffer.cpp" />
+    <ClCompile Include="..\src\media\media_codec.cpp" />
+    <ClCompile Include="..\src\media\media_decoder.cpp" />
+    <ClCompile Include="..\src\media\media_encoder.cpp" />
+    <ClCompile Include="..\src\media\media_io_handle.cpp" />
+    <ClCompile Include="..\src\media\recordable.cpp" />
+    <ClCompile Include="..\src\media\socket_pair.cpp" />
+    <ClCompile Include="..\src\media\srtp.c" />
+    <ClCompile Include="..\src\media\system_codec_container.cpp" />
+    <ClCompile Include="..\src\media\video\accel.cpp">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">true</ExcludedFromBuild>
+    </ClCompile>
+    <ClCompile Include="..\src\media\video\sinkclient.cpp" />
+    <ClCompile Include="..\src\media\video\uwpvideo\video_device_impl.cpp" />
+    <ClCompile Include="..\src\media\video\uwpvideo\video_device_monitor_impl.cpp" />
+    <ClCompile Include="..\src\media\video\video_base.cpp" />
+    <ClCompile Include="..\src\media\video\video_device_monitor.cpp" />
+    <ClCompile Include="..\src\media\video\video_input.cpp" />
+    <ClCompile Include="..\src\media\video\video_mixer.cpp" />
+    <ClCompile Include="..\src\media\video\video_receive_thread.cpp" />
+    <ClCompile Include="..\src\media\video\video_rtp_session.cpp" />
+    <ClCompile Include="..\src\media\video\video_scaler.cpp" />
+    <ClCompile Include="..\src\media\video\video_sender.cpp" />
+    <ClCompile Include="..\src\peer_connection.cpp" />
+    <ClCompile Include="..\src\preferences.cpp" />
+    <ClCompile Include="..\src\ringdht\accountarchive.cpp" />
+    <ClCompile Include="..\src\ringdht\eth\libdevcore\Common.cpp" />
+    <ClCompile Include="..\src\ringdht\eth\libdevcore\CommonData.cpp" />
+    <ClCompile Include="..\src\ringdht\eth\libdevcore\FixedHash.cpp" />
+    <ClCompile Include="..\src\ringdht\eth\libdevcore\SHA3.cpp" />
+    <ClCompile Include="..\src\ringdht\eth\libdevcrypto\Common.cpp" />
+    <ClCompile Include="..\src\ringdht\namedirectory.cpp" />
+    <ClCompile Include="..\src\ringdht\p2p.cpp" />
+    <ClCompile Include="..\src\ringdht\ringaccount.cpp" />
+    <ClCompile Include="..\src\ringdht\sips_transport_ice.cpp" />
+    <ClCompile Include="..\src\ring_api.cpp" />
+    <ClCompile Include="..\src\security\certstore.cpp" />
+    <ClCompile Include="..\src\security\diffie-hellman.cpp" />
+    <ClCompile Include="..\src\security\memory.cpp" />
+    <ClCompile Include="..\src\security\tlsvalidator.cpp" />
+    <ClCompile Include="..\src\security\tls_session.cpp" />
+    <ClCompile Include="..\src\sip\pattern.cpp" />
+    <ClCompile Include="..\src\sip\pres_sub_client.cpp" />
+    <ClCompile Include="..\src\sip\pres_sub_server.cpp" />
+    <ClCompile Include="..\src\sip\sdes_negotiator.cpp" />
+    <ClCompile Include="..\src\sip\sdp.cpp" />
+    <ClCompile Include="..\src\sip\sipaccount.cpp" />
+    <ClCompile Include="..\src\sip\sipaccountbase.cpp" />
+    <ClCompile Include="..\src\sip\sipcall.cpp" />
+    <ClCompile Include="..\src\sip\sippresence.cpp" />
+    <ClCompile Include="..\src\sip\siptransport.cpp" />
+    <ClCompile Include="..\src\sip\sipvoiplink.cpp" />
+    <ClCompile Include="..\src\sip\sip_utils.cpp" />
+    <ClCompile Include="..\src\smartools.cpp" />
+    <ClCompile Include="..\src\string_utils.cpp" />
+    <ClCompile Include="..\src\threadloop.cpp" />
+    <ClCompile Include="..\src\thread_pool.cpp" />
+    <ClCompile Include="..\src\turn_transport.cpp" />
+    <ClCompile Include="..\src\upnp\upnp_context.cpp" />
+    <ClCompile Include="..\src\upnp\upnp_control.cpp" />
+    <ClCompile Include="..\src\upnp\upnp_igd.cpp" />
+    <ClCompile Include="..\src\utf8_utils.cpp" />
+    <ClCompile Include="..\src\winsyslog.c" />
+  </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\src\account.h" />
     <ClInclude Include="..\src\account_factory.h" />
@@ -542,28 +652,30 @@
     <ClInclude Include="..\src\base64.h" />
     <ClInclude Include="..\src\call.h" />
     <ClInclude Include="..\src\call_factory.h" />
+    <ClInclude Include="..\src\channel.h" />
     <ClInclude Include="..\src\client\ring_signal.h" />
     <ClInclude Include="..\src\client\videomanager.h" />
     <ClInclude Include="..\src\compiler_intrinsics.h" />
     <ClInclude Include="..\src\conference.h" />
     <ClInclude Include="..\src\config\serializable.h" />
     <ClInclude Include="..\src\config\yamlparser.h" />
-    <ClInclude Include="..\src\dirent.h" />
-    <ClInclude Include="..\src\dlfcn.h">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='w32lib|x64'">false</ExcludedFromBuild>
-    </ClInclude>
+    <ClInclude Include="..\src\data_transfer.h" />
+    <ClInclude Include="..\src\dlfcn.h" />
     <ClInclude Include="..\src\dring\account_const.h" />
     <ClInclude Include="..\src\dring\callmanager_interface.h" />
     <ClInclude Include="..\src\dring\call_const.h" />
     <ClInclude Include="..\src\dring\configurationmanager_interface.h" />
+    <ClInclude Include="..\src\dring\datatransfer_interface.h" />
     <ClInclude Include="..\src\dring\dring.h" />
     <ClInclude Include="..\src\dring\media_const.h" />
     <ClInclude Include="..\src\dring\presencemanager_interface.h" />
+    <ClInclude Include="..\src\dring\presence_const.h" />
     <ClInclude Include="..\src\dring\security_const.h" />
     <ClInclude Include="..\src\dring\videomanager_interface.h" />
     <ClInclude Include="..\src\enumclass_utils.h" />
     <ClInclude Include="..\src\fileutils.h" />
+    <ClInclude Include="..\src\ftp_server.h" />
+    <ClInclude Include="..\src\generic_io.h" />
     <ClInclude Include="..\src\hooks\urlhook.h" />
     <ClInclude Include="..\src\ice_socket.h" />
     <ClInclude Include="..\src\ice_transport.h" />
@@ -591,6 +703,7 @@
     <ClInclude Include="..\src\media\audio\sound\tone.h" />
     <ClInclude Include="..\src\media\audio\sound\tonelist.h" />
     <ClInclude Include="..\src\media\audio\tonecontrol.h" />
+    <ClInclude Include="..\src\media\decoder_finder.h" />
     <ClInclude Include="..\src\media\libav_deps.h" />
     <ClInclude Include="..\src\media\libav_utils.h" />
     <ClInclude Include="..\src\media\media_buffer.h" />
@@ -604,6 +717,9 @@
     <ClInclude Include="..\src\media\socket_pair.h" />
     <ClInclude Include="..\src\media\srtp.h" />
     <ClInclude Include="..\src\media\system_codec_container.h" />
+    <ClInclude Include="..\src\media\video\accel.h">
+      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">true</ExcludedFromBuild>
+    </ClInclude>
     <ClInclude Include="..\src\media\video\shm_header.h" />
     <ClInclude Include="..\src\media\video\sinkclient.h" />
     <ClInclude Include="..\src\media\video\video_base.h" />
@@ -616,14 +732,7 @@
     <ClInclude Include="..\src\media\video\video_scaler.h" />
     <ClInclude Include="..\src\media\video\video_sender.h" />
     <ClInclude Include="..\src\noncopyable.h" />
-    <ClInclude Include="..\src\plugin_loader.h">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='w32lib|x64'">false</ExcludedFromBuild>
-    </ClInclude>
-    <ClInclude Include="..\src\plugin_manager.h">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='w32lib|x64'">false</ExcludedFromBuild>
-    </ClInclude>
+    <ClInclude Include="..\src\peer_connection.h" />
     <ClInclude Include="..\src\preferences.h" />
     <ClInclude Include="..\src\rational.h" />
     <ClInclude Include="..\src\registration_states.h" />
@@ -637,10 +746,10 @@
     <ClInclude Include="..\src\ringdht\eth\libdevcore\vector_ref.h" />
     <ClInclude Include="..\src\ringdht\eth\libdevcrypto\Common.h" />
     <ClInclude Include="..\src\ringdht\namedirectory.h" />
+    <ClInclude Include="..\src\ringdht\p2p.h" />
     <ClInclude Include="..\src\ringdht\ringaccount.h" />
     <ClInclude Include="..\src\ringdht\ringcontact.h" />
     <ClInclude Include="..\src\ringdht\sips_transport_ice.h" />
-    <ClInclude Include="..\src\ring_plugin.h" />
     <ClInclude Include="..\src\ring_types.h" />
     <ClInclude Include="..\src\rw_mutex.h" />
     <ClInclude Include="..\src\security\certstore.h" />
@@ -664,126 +773,16 @@
     <ClInclude Include="..\src\string_utils.h" />
     <ClInclude Include="..\src\threadloop.h" />
     <ClInclude Include="..\src\thread_pool.h" />
+    <ClInclude Include="..\src\turn_transport.h" />
     <ClInclude Include="..\src\upnp\upnp_context.h" />
     <ClInclude Include="..\src\upnp\upnp_control.h" />
     <ClInclude Include="..\src\upnp\upnp_igd.h" />
     <ClInclude Include="..\src\utf8_utils.h" />
+    <ClInclude Include="..\src\windirent.h" />
     <ClInclude Include="..\src\winsyslog.h" />
-    <ClInclude Include="config.h" />
-    <ClInclude Include="sys_time.h" />
-    <ClInclude Include="unistd.h" />
   </ItemGroup>
   <ItemGroup>
-    <ClCompile Include="..\src\account.cpp" />
-    <ClCompile Include="..\src\account_factory.cpp" />
-    <ClCompile Include="..\src\archiver.cpp" />
-    <ClCompile Include="..\src\base64.cpp" />
-    <ClCompile Include="..\src\buildinfo.cpp" />
-    <ClCompile Include="..\src\call.cpp" />
-    <ClCompile Include="..\src\call_factory.cpp" />
-    <ClCompile Include="..\src\client\callmanager.cpp" />
-    <ClCompile Include="..\src\client\configurationmanager.cpp" />
-    <ClCompile Include="..\src\client\presencemanager.cpp" />
-    <ClCompile Include="..\src\client\ring_signal.cpp" />
-    <ClCompile Include="..\src\client\videomanager.cpp" />
-    <ClCompile Include="..\src\conference.cpp" />
-    <ClCompile Include="..\src\config\yamlparser.cpp" />
-    <ClCompile Include="..\src\dlfcn.c">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='w32lib|x64'">false</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\src\fileutils.cpp" />
-    <ClCompile Include="..\src\hooks\urlhook.cpp" />
-    <ClCompile Include="..\src\ice_transport.cpp" />
-    <ClCompile Include="..\src\im\instant_messaging.cpp" />
-    <ClCompile Include="..\src\im\message_engine.cpp" />
-    <ClCompile Include="..\src\ip_utils.cpp" />
-    <ClCompile Include="..\src\logger.cpp" />
-    <ClCompile Include="..\src\manager.cpp" />
-    <ClCompile Include="..\src\media\audio\audiobuffer.cpp" />
-    <ClCompile Include="..\src\media\audio\audiolayer.cpp" />
-    <ClCompile Include="..\src\media\audio\audioloop.cpp" />
-    <ClCompile Include="..\src\media\audio\audiorecord.cpp" />
-    <ClCompile Include="..\src\media\audio\audiorecorder.cpp" />
-    <ClCompile Include="..\src\media\audio\audio_rtp_session.cpp" />
-    <ClCompile Include="..\src\media\audio\dcblocker.cpp" />
-    <ClCompile Include="..\src\media\audio\dsp.cpp" />
-    <ClCompile Include="..\src\media\audio\portaudio\portaudiolayer.cpp" />
-    <ClCompile Include="..\src\media\audio\resampler.cpp" />
-    <ClCompile Include="..\src\media\audio\ringbuffer.cpp" />
-    <ClCompile Include="..\src\media\audio\ringbufferpool.cpp" />
-    <ClCompile Include="..\src\media\audio\sound\audiofile.cpp" />
-    <ClCompile Include="..\src\media\audio\sound\dtmf.cpp" />
-    <ClCompile Include="..\src\media\audio\sound\dtmfgenerator.cpp" />
-    <ClCompile Include="..\src\media\audio\sound\tone.cpp" />
-    <ClCompile Include="..\src\media\audio\sound\tonelist.cpp" />
-    <ClCompile Include="..\src\media\audio\tonecontrol.cpp" />
-    <ClCompile Include="..\src\media\libav_utils.cpp" />
-    <ClCompile Include="..\src\media\media_buffer.cpp" />
-    <ClCompile Include="..\src\media\media_codec.cpp" />
-    <ClCompile Include="..\src\media\media_decoder.cpp" />
-    <ClCompile Include="..\src\media\media_encoder.cpp" />
-    <ClCompile Include="..\src\media\media_io_handle.cpp" />
-    <ClCompile Include="..\src\media\recordable.cpp" />
-    <ClCompile Include="..\src\media\socket_pair.cpp" />
-    <ClCompile Include="..\src\media\srtp.c" />
-    <ClCompile Include="..\src\media\system_codec_container.cpp" />
-    <ClCompile Include="..\src\media\video\sinkclient.cpp" />
-    <ClCompile Include="..\src\media\video\uwpvideo\video_device_impl.cpp" />
-    <ClCompile Include="..\src\media\video\uwpvideo\video_device_monitor_impl.cpp" />
-    <ClCompile Include="..\src\media\video\video_base.cpp" />
-    <ClCompile Include="..\src\media\video\video_device_monitor.cpp" />
-    <ClCompile Include="..\src\media\video\video_input.cpp" />
-    <ClCompile Include="..\src\media\video\video_mixer.cpp" />
-    <ClCompile Include="..\src\media\video\video_receive_thread.cpp" />
-    <ClCompile Include="..\src\media\video\video_rtp_session.cpp" />
-    <ClCompile Include="..\src\media\video\video_scaler.cpp" />
-    <ClCompile Include="..\src\media\video\video_sender.cpp" />
-    <ClCompile Include="..\src\plugin_loader_dl.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='w32lib|x64'">false</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\src\plugin_manager.cpp">
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLib|x64'">false</ExcludedFromBuild>
-      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='w32lib|x64'">false</ExcludedFromBuild>
-    </ClCompile>
-    <ClCompile Include="..\src\preferences.cpp" />
-    <ClCompile Include="..\src\ringdht\accountarchive.cpp" />
-    <ClCompile Include="..\src\ringdht\eth\libdevcore\Common.cpp" />
-    <ClCompile Include="..\src\ringdht\eth\libdevcore\CommonData.cpp" />
-    <ClCompile Include="..\src\ringdht\eth\libdevcore\FixedHash.cpp" />
-    <ClCompile Include="..\src\ringdht\eth\libdevcore\SHA3.cpp" />
-    <ClCompile Include="..\src\ringdht\eth\libdevcrypto\Common.cpp" />
-    <ClCompile Include="..\src\ringdht\namedirectory.cpp" />
-    <ClCompile Include="..\src\ringdht\ringaccount.cpp" />
-    <ClCompile Include="..\src\ringdht\sips_transport_ice.cpp" />
-    <ClCompile Include="..\src\ring_api.cpp" />
-    <ClCompile Include="..\src\security\certstore.cpp" />
-    <ClCompile Include="..\src\security\diffie-hellman.cpp" />
-    <ClCompile Include="..\src\security\memory.cpp" />
-    <ClCompile Include="..\src\security\tlsvalidator.cpp" />
-    <ClCompile Include="..\src\security\tls_session.cpp" />
-    <ClCompile Include="..\src\sip\pattern.cpp" />
-    <ClCompile Include="..\src\sip\pres_sub_client.cpp" />
-    <ClCompile Include="..\src\sip\pres_sub_server.cpp" />
-    <ClCompile Include="..\src\sip\sdes_negotiator.cpp" />
-    <ClCompile Include="..\src\sip\sdp.cpp" />
-    <ClCompile Include="..\src\sip\sipaccount.cpp" />
-    <ClCompile Include="..\src\sip\sipaccountbase.cpp" />
-    <ClCompile Include="..\src\sip\sipcall.cpp" />
-    <ClCompile Include="..\src\sip\sippresence.cpp" />
-    <ClCompile Include="..\src\sip\siptransport.cpp" />
-    <ClCompile Include="..\src\sip\sipvoiplink.cpp" />
-    <ClCompile Include="..\src\sip\sip_utils.cpp" />
-    <ClCompile Include="..\src\smartools.cpp" />
-    <ClCompile Include="..\src\string_utils.cpp" />
-    <ClCompile Include="..\src\threadloop.cpp" />
-    <ClCompile Include="..\src\thread_pool.cpp" />
-    <ClCompile Include="..\src\upnp\upnp_context.cpp" />
-    <ClCompile Include="..\src\upnp\upnp_control.cpp" />
-    <ClCompile Include="..\src\upnp\upnp_igd.cpp" />
-    <ClCompile Include="..\src\utf8_utils.cpp" />
-    <ClCompile Include="..\src\winsyslog.c" />
+    <None Include="..\src\ringdht\eth\libdevcore\Makefile.am" />
   </ItemGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
   <ImportGroup Label="ExtensionTargets">
diff --git a/MSVC/ring-daemon.vcxproj.filters b/MSVC/ring-daemon.vcxproj.filters
index f1741d3f357ab3f70af7f64a09e1266eefad4010..dc467b64a8d49cd75b5102efdd31b49c73f54bb2 100644
--- a/MSVC/ring-daemon.vcxproj.filters
+++ b/MSVC/ring-daemon.vcxproj.filters
@@ -1,51 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   <ItemGroup>
-    <Filter Include="Header Files">
-      <UniqueIdentifier>{f736d6c2-8f80-4157-89a4-4d08a50c8d08}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\client">
-      <UniqueIdentifier>{67e7684e-f8ef-4874-abec-f3418e7c1f1f}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\config">
-      <UniqueIdentifier>{13b91865-0ca1-4d2f-a3d3-5b79b0ff31f5}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\dring">
-      <UniqueIdentifier>{98145e0c-2c23-47fc-8f64-4a38feaf3601}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\hooks">
-      <UniqueIdentifier>{b438ed7e-41d8-4b88-a2b3-551fe66915a0}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\im">
-      <UniqueIdentifier>{eaf1e622-510d-4b77-97c5-88cef96ac97d}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\media">
-      <UniqueIdentifier>{303dc61e-fe87-4fe8-99e9-79a11ce3d13b}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\media\audio">
-      <UniqueIdentifier>{6baf2769-c547-4afc-b51b-e853493d688c}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\media\audio\sound">
-      <UniqueIdentifier>{661b0aa7-98ea-4b22-a3c1-5bb4d88472d0}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\media\audio\portaudio">
-      <UniqueIdentifier>{97250dbc-5ee0-4195-8b9a-f0abefea57af}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\media\video">
-      <UniqueIdentifier>{250d421b-dc17-448b-a691-41b1c17e0b43}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\ringdht">
-      <UniqueIdentifier>{6661a3cb-975d-4b0f-b4ea-2e987f122fdb}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\security">
-      <UniqueIdentifier>{cb9596a1-62a9-42c8-9e1a-1e2ff3919fa2}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\sip">
-      <UniqueIdentifier>{0a742ba2-c5f4-4ccf-a32a-fcf4b2fe842e}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\upnp">
-      <UniqueIdentifier>{72c623e2-31b4-4673-9a0a-0fdd84b9cf16}</UniqueIdentifier>
-    </Filter>
     <Filter Include="Source Files">
       <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
       <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
@@ -89,9 +44,6 @@
     <Filter Include="Source Files\upnp">
       <UniqueIdentifier>{4dc7f6c7-24a7-4741-a626-0fa5dbaa4461}</UniqueIdentifier>
     </Filter>
-    <Filter Include="Header Files\media\video\uwpvideo">
-      <UniqueIdentifier>{52e3514f-c7d8-45d9-a75f-a82e34ec8590}</UniqueIdentifier>
-    </Filter>
     <Filter Include="Source Files\media\video\uwpvideo">
       <UniqueIdentifier>{13ad5c25-d522-4562-8bab-f322fdd2a243}</UniqueIdentifier>
     </Filter>
@@ -104,484 +56,11 @@
     <Filter Include="Source Files\ringdht\eth\libdevcrypto">
       <UniqueIdentifier>{c9a4b0a8-0da9-41d6-bb80-3fc1d31a2986}</UniqueIdentifier>
     </Filter>
-    <Filter Include="Header Files\ringdht\eth">
-      <UniqueIdentifier>{db320a5a-b2ac-4504-8c10-9a87548eaf0c}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\ringdht\eth\libdevcore">
-      <UniqueIdentifier>{ddb27107-f5f8-43ad-a7c5-516214932a85}</UniqueIdentifier>
-    </Filter>
-    <Filter Include="Header Files\ringdht\eth\libdevcrypto">
-      <UniqueIdentifier>{255ccb5c-fdc7-48c8-a4f7-df183608e573}</UniqueIdentifier>
+    <Filter Include="Source Files\dring">
+      <UniqueIdentifier>{f137f8a1-8c2a-4e49-b73c-835f95507160}</UniqueIdentifier>
     </Filter>
   </ItemGroup>
   <ItemGroup>
-    <ClInclude Include="..\src\client\ring_signal.h">
-      <Filter>Header Files\client</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\client\videomanager.h">
-      <Filter>Header Files\client</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\config\serializable.h">
-      <Filter>Header Files\config</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\config\yamlparser.h">
-      <Filter>Header Files\config</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\videomanager_interface.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\security_const.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\presencemanager_interface.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\media_const.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\dring.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\configurationmanager_interface.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\callmanager_interface.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\call_const.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dring\account_const.h">
-      <Filter>Header Files\dring</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\hooks\urlhook.h">
-      <Filter>Header Files\hooks</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\im\instant_messaging.h">
-      <Filter>Header Files\im</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\audio_rtp_session.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\audiobuffer.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\audiolayer.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\audioloop.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\audiorecord.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\audiorecorder.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\dcblocker.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\dsp.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\resampler.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\ringbuffer.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\ringbufferpool.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\tonecontrol.h">
-      <Filter>Header Files\media\audio</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\sound\dtmf.h">
-      <Filter>Header Files\media\audio\sound</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\sound\dtmfgenerator.h">
-      <Filter>Header Files\media\audio\sound</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\sound\tone.h">
-      <Filter>Header Files\media\audio\sound</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\sound\tonelist.h">
-      <Filter>Header Files\media\audio\sound</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\shm_header.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\sinkclient.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_base.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_device.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_device_monitor.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_input.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_mixer.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_receive_thread.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_rtp_session.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_scaler.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\video\video_sender.h">
-      <Filter>Header Files\media\video</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\libav_deps.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\libav_utils.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\media_buffer.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\media_codec.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\media_decoder.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\media_device.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\media_encoder.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\media_io_handle.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\recordable.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\rtp_session.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\socket_pair.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\srtp.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\system_codec_container.h">
-      <Filter>Header Files\media</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\account.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\account_factory.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\account_schema.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\array_size.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\call.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\call_factory.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\conference.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="config.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dirent.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\dlfcn.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\enumclass_utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\fileutils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ice_socket.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ice_transport.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ip_utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\logger.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\manager.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\map_utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\noncopyable.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\preferences.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\rational.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\registration_states.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ring_plugin.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ring_types.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\rw_mutex.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\string_utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\threadloop.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\utf8_utils.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\winsyslog.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\ringaccount.h">
-      <Filter>Header Files\ringdht</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\sips_transport_ice.h">
-      <Filter>Header Files\ringdht</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\upnp\upnp_control.h">
-      <Filter>Header Files\upnp</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\upnp\upnp_igd.h">
-      <Filter>Header Files\upnp</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\upnp\upnp_context.h">
-      <Filter>Header Files\upnp</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\pattern.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\pres_sub_client.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\pres_sub_server.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sdes_negotiator.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sdp.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sip_utils.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sipaccount.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sipaccountbase.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sipcall.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sippresence.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\siptransport.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\sip\sipvoiplink.h">
-      <Filter>Header Files\sip</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\security\certstore.h">
-      <Filter>Header Files\security</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\security\tls_session.h">
-      <Filter>Header Files\security</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\security\tlsvalidator.h">
-      <Filter>Header Files\security</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\sound\audiofile.h">
-      <Filter>Header Files\media\audio\sound</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\im\message_engine.h">
-      <Filter>Header Files\im</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\archiver.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\media\audio\portaudio\portaudiolayer.h">
-      <Filter>Header Files\media\audio\portaudio</Filter>
-    </ClInclude>
-    <ClInclude Include="unistd.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcrypto\Common.h">
-      <Filter>Header Files\ringdht\eth\libdevcrypto</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcore\Common.h">
-      <Filter>Header Files\ringdht\eth\libdevcore</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcore\CommonData.h">
-      <Filter>Header Files\ringdht\eth\libdevcore</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcore\FixedHash.h">
-      <Filter>Header Files\ringdht\eth\libdevcore</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcore\SHA3.h">
-      <Filter>Header Files\ringdht\eth\libdevcore</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcore\vector_ref.h">
-      <Filter>Header Files\ringdht\eth\libdevcore</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\thread_pool.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\base64.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\namedirectory.h">
-      <Filter>Header Files\ringdht</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\compiler_intrinsics.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="sys_time.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\plugin_loader.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\plugin_manager.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\smartools.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\security\memory.h">
-      <Filter>Header Files\security</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\accountarchive.h">
-      <Filter>Header Files\ringdht</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\configkeys.h">
-      <Filter>Header Files\ringdht</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\ringcontact.h">
-      <Filter>Header Files\ringdht</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\ringdht\eth\libdevcore\Address.h">
-      <Filter>Header Files\ringdht\eth\libdevcore</Filter>
-    </ClInclude>
-    <ClInclude Include="..\src\security\diffie-hellman.h">
-      <Filter>Header Files</Filter>
-    </ClInclude>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\src\preferences.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\ring_api.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\string_utils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\threadloop.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\utf8_utils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\winsyslog.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\account.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\account_factory.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\buildinfo.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\call.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\call_factory.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\conference.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\dlfcn.c">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\fileutils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\ice_transport.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\ip_utils.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\logger.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\manager.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\plugin_loader_dl.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\plugin_manager.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\client\configurationmanager.cpp">
-      <Filter>Source Files\client</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\client\presencemanager.cpp">
-      <Filter>Source Files\client</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\client\ring_signal.cpp">
-      <Filter>Source Files\client</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\client\videomanager.cpp">
-      <Filter>Source Files\client</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\client\callmanager.cpp">
-      <Filter>Source Files\client</Filter>
-    </ClCompile>
-    <ClCompile Include="..\src\config\yamlparser.cpp">
-      <Filter>Source Files\config</Filter>
-    </ClCompile>
     <ClCompile Include="..\src\hooks\urlhook.cpp">
       <Filter>Source Files\hooks</Filter>
     </ClCompile>
@@ -756,9 +235,6 @@
     <ClCompile Include="..\src\media\audio\sound\audiofile.cpp">
       <Filter>Source Files\media\audio\sound</Filter>
     </ClCompile>
-    <ClCompile Include="..\src\archiver.cpp">
-      <Filter>Source Files</Filter>
-    </ClCompile>
     <ClCompile Include="..\src\im\message_engine.cpp">
       <Filter>Source Files\im</Filter>
     </ClCompile>
@@ -783,29 +259,534 @@
     <ClCompile Include="..\src\ringdht\eth\libdevcrypto\Common.cpp">
       <Filter>Source Files\ringdht\eth\libdevcrypto</Filter>
     </ClCompile>
-    <ClCompile Include="..\src\thread_pool.cpp">
+    <ClCompile Include="..\src\ringdht\namedirectory.cpp">
+      <Filter>Source Files\ringdht</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\security\memory.cpp">
+      <Filter>Source Files\security</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ringdht\accountarchive.cpp">
+      <Filter>Source Files\ringdht</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ringdht\eth\libdevcore\SHA3.cpp">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\account.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\account_factory.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\archiver.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
     <ClCompile Include="..\src\base64.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\src\ringdht\namedirectory.cpp">
-      <Filter>Source Files\ringdht</Filter>
+    <ClCompile Include="..\src\buildinfo.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\call.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\call_factory.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\conference.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\data_transfer.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\dlfcn.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\fileutils.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ftp_server.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ice_transport.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ip_utils.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\logger.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\manager.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\peer_connection.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\preferences.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ring_api.cpp">
+      <Filter>Source Files</Filter>
     </ClCompile>
     <ClCompile Include="..\src\smartools.cpp">
       <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\src\security\memory.cpp">
-      <Filter>Source Files\security</Filter>
+    <ClCompile Include="..\src\string_utils.cpp">
+      <Filter>Source Files</Filter>
     </ClCompile>
-    <ClCompile Include="..\src\ringdht\accountarchive.cpp">
+    <ClCompile Include="..\src\thread_pool.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\threadloop.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\turn_transport.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\utf8_utils.cpp">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\winsyslog.c">
+      <Filter>Source Files</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\client\callmanager.cpp">
+      <Filter>Source Files\client</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\client\configurationmanager.cpp">
+      <Filter>Source Files\client</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\client\datatransfer.cpp">
+      <Filter>Source Files\client</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\client\presencemanager.cpp">
+      <Filter>Source Files\client</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\client\ring_signal.cpp">
+      <Filter>Source Files\client</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\client\videomanager.cpp">
+      <Filter>Source Files\client</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\config\yamlparser.cpp">
+      <Filter>Source Files\config</Filter>
+    </ClCompile>
+    <ClCompile Include="..\src\ringdht\p2p.cpp">
       <Filter>Source Files\ringdht</Filter>
     </ClCompile>
-    <ClCompile Include="..\src\ringdht\eth\libdevcore\SHA3.cpp">
-      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    <ClCompile Include="..\src\media\video\accel.cpp">
+      <Filter>Source Files\media\video</Filter>
     </ClCompile>
     <ClCompile Include="..\src\security\diffie-hellman.cpp">
-      <Filter>Source Files</Filter>
+      <Filter>Source Files\security</Filter>
     </ClCompile>
   </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="..\src\account.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\account_factory.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\account_schema.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\archiver.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\array_size.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\base64.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\call.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\call_factory.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\channel.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\compiler_intrinsics.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\conference.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\data_transfer.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dlfcn.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\enumclass_utils.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\fileutils.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ftp_server.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\generic_io.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ice_socket.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ice_transport.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ip_utils.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\logger.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\manager.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\map_utils.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\noncopyable.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\peer_connection.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\preferences.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\rational.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\registration_states.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ring_types.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\rw_mutex.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\smartools.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\string_utils.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\thread_pool.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\threadloop.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\turn_transport.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\utf8_utils.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\windirent.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\winsyslog.h">
+      <Filter>Source Files</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\client\ring_signal.h">
+      <Filter>Source Files\client</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\client\videomanager.h">
+      <Filter>Source Files\client</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\config\serializable.h">
+      <Filter>Source Files\config</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\config\yamlparser.h">
+      <Filter>Source Files\config</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\hooks\urlhook.h">
+      <Filter>Source Files\hooks</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\account_const.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\call_const.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\callmanager_interface.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\configurationmanager_interface.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\datatransfer_interface.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\dring.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\media_const.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\presence_const.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\presencemanager_interface.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\security_const.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\dring\videomanager_interface.h">
+      <Filter>Source Files\dring</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcore\Address.h">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcore\Common.h">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcore\CommonData.h">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcore\FixedHash.h">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcore\SHA3.h">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcore\vector_ref.h">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\eth\libdevcrypto\Common.h">
+      <Filter>Source Files\ringdht\eth\libdevcrypto</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\accountarchive.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\configkeys.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\namedirectory.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\p2p.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\ringaccount.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\ringcontact.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\ringdht\sips_transport_ice.h">
+      <Filter>Source Files\ringdht</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\im\instant_messaging.h">
+      <Filter>Source Files\im</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\im\message_engine.h">
+      <Filter>Source Files\im</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\decoder_finder.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\libav_deps.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\libav_utils.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\media_buffer.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\media_codec.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\media_decoder.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\media_device.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\media_encoder.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\media_io_handle.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\recordable.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\rtp_session.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\socket_pair.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\srtp.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\system_codec_container.h">
+      <Filter>Source Files\media</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\audio_rtp_session.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\audiobuffer.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\audiolayer.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\audioloop.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\audiorecord.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\audiorecorder.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\dcblocker.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\dsp.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\resampler.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\ringbuffer.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\ringbufferpool.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\tonecontrol.h">
+      <Filter>Source Files\media\audio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\portaudio\portaudiolayer.h">
+      <Filter>Source Files\media\audio\portaudio</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\sound\audiofile.h">
+      <Filter>Source Files\media\audio\sound</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\sound\dtmf.h">
+      <Filter>Source Files\media\audio\sound</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\sound\dtmfgenerator.h">
+      <Filter>Source Files\media\audio\sound</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\sound\tone.h">
+      <Filter>Source Files\media\audio\sound</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\audio\sound\tonelist.h">
+      <Filter>Source Files\media\audio\sound</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\accel.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\shm_header.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\sinkclient.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_base.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_device.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_device_monitor.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_input.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_mixer.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_receive_thread.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_rtp_session.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_scaler.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\media\video\video_sender.h">
+      <Filter>Source Files\media\video</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\security\certstore.h">
+      <Filter>Source Files\security</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\security\diffie-hellman.h">
+      <Filter>Source Files\security</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\security\memory.h">
+      <Filter>Source Files\security</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\security\tls_session.h">
+      <Filter>Source Files\security</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\security\tlsvalidator.h">
+      <Filter>Source Files\security</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\pattern.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\pres_sub_client.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\pres_sub_server.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sdes_negotiator.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sdp.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sip_utils.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sipaccount.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sipaccountbase.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sipcall.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sippresence.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\siptransport.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\sip\sipvoiplink.h">
+      <Filter>Source Files\sip</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\upnp\upnp_context.h">
+      <Filter>Source Files\upnp</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\upnp\upnp_control.h">
+      <Filter>Source Files\upnp</Filter>
+    </ClInclude>
+    <ClInclude Include="..\src\upnp\upnp_igd.h">
+      <Filter>Source Files\upnp</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <None Include="..\src\ringdht\eth\libdevcore\Makefile.am">
+      <Filter>Source Files\ringdht\eth\libdevcore</Filter>
+    </None>
+  </ItemGroup>
 </Project>
\ No newline at end of file
diff --git a/bin/Makefile.am b/bin/Makefile.am
index c833d0746a3a4e787c470b2ec7645da8fc535866..db05bc435d04b610ecd1f3886d9ae3a56cf9496e 100644
--- a/bin/Makefile.am
+++ b/bin/Makefile.am
@@ -31,7 +31,7 @@ dring_CXXFLAGS= -I$(top_srcdir)/src ${DBUSCPP_CFLAGS} \
                 -I$(top_srcdir)/src/dring \
                 -DTOP_BUILDDIR=\"$$(cd "$(top_builddir)"; pwd)\"
 
-dring_LDADD = dbus/libclient_dbus.la ${DBUSCPP_LIBS} $(top_builddir)/src/libring.la
+dring_LDADD = dbus/libclient_dbus.la ${DBUSCPP_LIBS} $(top_builddir)/src/libring.la -ldl
 endif
 
 if RING_NODEJS
diff --git a/contrib/build_all_uwp.bat b/contrib/build_all_uwp.bat
index 80203fe31146c1e7e7e4b999a6f74f07115050f7..e83698f15a30d9965235053c2e3e9afc4a46ebf8 100644
--- a/contrib/build_all_uwp.bat
+++ b/contrib/build_all_uwp.bat
@@ -30,15 +30,6 @@ build\libupnp\build\VS2015\ixml.vcxproj, ^
 build\libupnp\build\VS2015\threadutil.vcxproj, ^
 build\libupnp\build\VS2015\libupnp.vcxproj, ^
 build\pcre\MSVC\pcre.vcxproj, ^
-build\pjproject\third_party\build\baseclasses\libbaseclasses.vcxproj, ^
-build\pjproject\third_party\build\g7221\libg7221codec.vcxproj, ^
-build\pjproject\third_party\build\gsm\libgsmcodec.vcxproj, ^
-build\pjproject\third_party\build\ilbc\libilbccodec.vcxproj, ^
-build\pjproject\third_party\build\milenage\libmilenage.vcxproj, ^
-build\pjproject\third_party\build\resample\libresample.vcxproj, ^
-build\pjproject\third_party\build\speex\libspeex.vcxproj, ^
-build\pjproject\third_party\build\srtp\libsrtp.vcxproj, ^
-build\pjproject\third_party\build\yuv\libyuv.vcxproj, ^
 build\pjproject\pjlib-util\build\pjlib-util.vcxproj, ^
 build\pjproject\pjmedia\build\pjmedia.vcxproj, ^
 build\pjproject\pjmedia\build\pjmedia_audiodev.vcxproj, ^
diff --git a/contrib/src/pjproject/fetch_and_patch.bat b/contrib/src/pjproject/fetch_and_patch.bat
index 946d2c99e04eed28b82745214f6e3ca965ca08b9..cf966c08d73b160653ba21987b7dce10865e7ed9 100644
--- a/contrib/src/pjproject/fetch_and_patch.bat
+++ b/contrib/src/pjproject/fetch_and_patch.bat
@@ -26,5 +26,6 @@ git apply --reject --whitespace=fix %SRC%\pjproject\add_dtls_transport.patch
 git apply --reject --whitespace=fix %SRC%\pjproject\pj_uwp_ice_sess.patch
 git apply --reject --whitespace=fix %SRC%\pjproject\pj_uwp_fix_turn_fallback.patch
 git apply --reject --whitespace=fix %SRC%\pjproject\pj_uwp.patch
+git apply --reject --whitespace=fix %SRC%\pjproject\pj_uwp_rfc6062.patch
 
 cd %SRC%
\ No newline at end of file
diff --git a/contrib/src/pjproject/pj_uwp_rfc6062.patch b/contrib/src/pjproject/pj_uwp_rfc6062.patch
new file mode 100644
index 0000000000000000000000000000000000000000..50812b2dab87f1be2595b29f3e665efc4f2abf9d
--- /dev/null
+++ b/contrib/src/pjproject/pj_uwp_rfc6062.patch
@@ -0,0 +1,907 @@
+--- a/pjnath/include/pjnath/config.h
++++ b/pjnath/include/pjnath/config.h
+@@ -220,6 +220,14 @@
+ #   define PJ_TURN_KEEP_ALIVE_SEC		    15
+ #endif
+ 
++/**
++ * Maximal number of TCP data connection that a client can open/accept with
++ * peers.
++ */
++#ifndef PJ_TURN_MAX_TCP_CNX
++#   define PJ_TURN_MAX_TCP_CNX              32
++#endif
++
+ 
+ /* **************************************************************************
+  * ICE CONFIGURATION
+--- a/pjnath/include/pjnath/stun_msg.h
++++ b/pjnath/include/pjnath/stun_msg.h
+@@ -92,6 +92,21 @@ enum pj_stun_method_e
+      */
+     PJ_STUN_CHANNEL_BIND_METHOD		    = 9,
+ 
++    /*
++     * STUN/TURN Connect as defined by RFC 6062
++     */
++    PJ_STUN_CONNECT_METHOD                 = 10,
++
++    /*
++     * STUN/TURN ConnectionBind as defined by RFC 6062
++     */
++    PJ_STUN_CONNECTION_BIND_METHOD         = 11,
++
++    /*
++     * STUN/TURN ConnectionAttempt as defined by RFC 6062
++     */
++    PJ_STUN_CONNECTION_ATTEMPT_METHOD      = 12,
++
+     /**
+      * All known methods.
+      */
+@@ -261,6 +276,16 @@ typedef enum pj_stun_msg_type
+      */
+     PJ_STUN_DATA_INDICATION		    = 0x0017,
+ 
++	/**
++     * STUN/TURN ConnectBind Request
++     */
++    PJ_STUN_CONNECTION_BIND_REQUEST		    = 0x000b,
++
++    /**
++     * TURN ConnectionAttempt indication
++     */
++    PJ_STUN_CONNECTION_ATTEMPT_INDICATION  = 0x001c,
++
+ 
+     /**
+      * TURN CreatePermission request
+@@ -332,6 +357,7 @@ typedef enum pj_stun_attr_type
+     PJ_STUN_ATTR_XOR_REFLECTED_FROM = 0x0023,/**< XOR-REFLECTED-FROM	    */
+     PJ_STUN_ATTR_PRIORITY	    = 0x0024,/**< PRIORITY		    */
+     PJ_STUN_ATTR_USE_CANDIDATE	    = 0x0025,/**< USE-CANDIDATE		    */
++    PJ_STUN_ATTR_CONNECTION_ID = 0x002a,/**< CONNECTION-ID		    */
+     PJ_STUN_ATTR_ICMP		    = 0x0030,/**< ICMP (TURN)		    */
+ 
+     PJ_STUN_ATTR_END_MANDATORY_ATTR,
+--- a/pjnath/include/pjnath/stun_session.h
++++ b/pjnath/include/pjnath/stun_session.h
+@@ -751,6 +751,13 @@ PJ_DECL(void) pj_stun_msg_destroy_tdata(pj_stun_session *sess,
+ 					pj_stun_tx_data *tdata);
+ 
+ 
++PJ_DEF(void) pj_stun_session_get_server_cred(
++	pj_stun_session *sess,
++	pj_pool_t *pool, pj_str_t *nonce, pj_str_t *realm);
++
++PJ_DEF(void) pj_stun_session_set_server_cred(
++	pj_stun_session *sess, const pj_str_t *nonce, pj_str_t *realm);
++
+ /**
+  * @}
+  */
+--- a/pjnath/include/pjnath/turn_session.h
++++ b/pjnath/include/pjnath/turn_session.h
+@@ -184,6 +184,12 @@ typedef enum pj_turn_state_t
+     PJ_TURN_STATE_ALLOCATING,
+ 
+     /**
++     * TURN session has issued CONNECTION-BIND request and is waiting for response
++     * from the TURN server.
++     */
++    PJ_TURN_STATE_CONNECTION_BINDING,
++
++    /**
+      * TURN session has successfully allocated relay resoruce and now is
+      * ready to be used.
+      */
+@@ -298,6 +304,21 @@ typedef struct pj_turn_session_cb
+ 		     pj_turn_state_t old_state,
+ 		     pj_turn_state_t new_state);
+ 
++    /**
++     * Notification when TURN session get a ConnectionAttempt indication.
++     *
++     * @param sess			The TURN session.
++     * @param conn_id		The connection-id to use for connection binding.
++     * @param peer_addr	Peer address that tried to connect on the TURN server.
++     * @param addr_len		Length of the peer address.
++
++     */
++    void (*on_peer_connection)(pj_turn_session *sess,
++                               pj_uint32_t conn_id,
++                               const pj_sockaddr_t *peer_addr,
++                               unsigned addr_len,
++                               pj_status_t status);
++
+ } pj_turn_session_cb;
+ 
+ 
+@@ -330,6 +351,15 @@ typedef struct pj_turn_alloc_param
+      */
+     int	    ka_interval;
+ 
++    /**
++     * Type of connection to from TURN server to peer.
++     *
++     * Supported values: PJ_TURN_TP_UDP (rfc 5766), PJ_TURN_TP_TLS (rfc 6062)
++     *
++     * Default is PJ_TURN_TP_UDP.
++     */
++    pj_turn_tp_type peer_conn_type;
++
+ } pj_turn_alloc_param;
+ 
+ 
+@@ -731,6 +761,15 @@ PJ_DECL(pj_status_t) pj_turn_session_on_rx_pkt(pj_turn_session *sess,
+ 					       pj_size_t pkt_len,
+ 					       pj_size_t *parsed_len);
+ 
++/**
++ * rfc6062
++ */
++PJ_DEF(void) pj_turn_session_get_server_cred(
++	pj_turn_session *sess,
++	pj_pool_t *pool, pj_str_t *nonce, pj_str_t *realm);
++
++PJ_DEF(void) pj_turn_session_set_server_cred(
++	pj_turn_session *sess, const pj_str_t *nonce, pj_str_t *realm);
+ 
+ /**
+  * @}
+--- a/pjnath/include/pjnath/turn_sock.h
++++ b/pjnath/include/pjnath/turn_sock.h
+@@ -98,6 +98,23 @@ typedef struct pj_turn_sock_cb
+ 		     pj_turn_state_t old_state,
+ 		     pj_turn_state_t new_state);
+ 
++    /**
++     * Notification when TURN session get a ConnectionAttempt indication.
++     *
++     * @param turn_sock	The TURN client transport.
++     * @param conn_id		The connection-id to use for connection binding.
++     * @param peer_addr	Peer address that tried to connect on the TURN server.
++     * @param addr_len		Length of the peer address.
++     * @param status    PJ_SUCCESS when connection is made, or any errors
++     *                  if the connection has failed (or if the peer has
++     *                  disconnected after an established connection).
++     */
++    void (*on_peer_connection)(pj_turn_sock *turn_sock,
++                               pj_uint32_t conn_id,
++                               const pj_sockaddr_t *peer_addr,
++                               unsigned addr_len,
++                               pj_status_t status);
++
+ } pj_turn_sock_cb;
+ 
+ 
+@@ -446,6 +463,13 @@ PJ_DECL(pj_status_t) pj_turn_sock_bind_channel(pj_turn_sock *turn_sock,
+ 					       const pj_sockaddr_t *peer,
+ 					       unsigned addr_len);
+ 
++/**
++ * RFC 6062
++ */
++PJ_DECL(pj_status_t) pj_turn_connect_peer(pj_turn_sock *sock,
++										  pj_uint32_t conn_id,
++										  const pj_sockaddr_t *peer_addr,
++										  unsigned addr_len);
+ 
+ /**
+  * @}
+--- a/pjnath/src/pjnath/stun_msg.c
++++ b/pjnath/src/pjnath/stun_msg.c
+@@ -45,6 +45,9 @@ static const char *stun_method_names[PJ_STUN_METHOD_MAX] =
+     "Data",			/* 7 */
+     "CreatePermission",		/* 8 */
+     "ChannelBind",		/* 9 */
++    "Connect",           /* 10 */
++    "ConnectionBind",    /* 11 */
++    "ConnectionAttempt", /* 12 */
+ };
+ 
+ static struct
+@@ -476,11 +479,11 @@ static struct attr_desc mandatory_attr_desc[] =
+ 	NULL
+     },
+     {
+-	/* ID 0x002a is not assigned */
+-	NULL,
+-	NULL,
+-	NULL,
+-	NULL
++	/* PJ_STUN_ATTR_CONNECTION_ID, */
++	"CONNECTION-ID",
++	&decode_uint_attr,
++	&encode_uint_attr,
++	&clone_uint_attr
+     },
+     {
+ 	/* ID 0x002b is not assigned */
+--- a/pjnath/src/pjnath/stun_session.c
++++ b/pjnath/src/pjnath/stun_session.c
+@@ -1511,3 +1511,14 @@ on_return:
+     return status;
+ }
+ 
++PJ_DEF(void) pj_stun_session_get_server_cred(pj_stun_session *sess, pj_pool_t *pool, pj_str_t *nonce, pj_str_t *realm)
++{
++	pj_strdup(pool, nonce,  &sess->next_nonce);
++	pj_strdup(pool, realm,  &sess->server_realm);
++}
++
++PJ_DEF(void) pj_stun_session_set_server_cred(pj_stun_session *sess, const pj_str_t *nonce, pj_str_t *realm)
++{
++	pj_strdup(sess->pool, &sess->next_nonce, nonce);
++	pj_strdup(sess->pool, &sess->server_realm, realm);
++}
+--- a/pjnath/src/pjnath/turn_session.c
++++ b/pjnath/src/pjnath/turn_session.c
+@@ -42,6 +42,7 @@ static const char *state_names[] =
+     "Resolving",
+     "Resolved",
+     "Allocating",
++	"TcpBinding",
+     "Ready",
+     "Deallocating",
+     "Deallocated",
+@@ -208,6 +209,7 @@ static void on_timer_event(pj_timer_heap_t *th, pj_timer_entry *e);
+ PJ_DEF(void) pj_turn_alloc_param_default(pj_turn_alloc_param *prm)
+ {
+     pj_bzero(prm, sizeof(*prm));
++	prm->peer_conn_type = PJ_TURN_TP_UDP;
+ }
+ 
+ /*
+@@ -407,6 +409,11 @@ static void sess_shutdown(pj_turn_session *sess,
+ 	sess->pending_destroy = PJ_TRUE;
+ 	can_destroy = PJ_FALSE;
+ 	break;
++    case PJ_TURN_STATE_CONNECTION_BINDING:
++	/* We need to wait until connection binding complete */
++	sess->pending_destroy = PJ_TRUE;
++	can_destroy = PJ_FALSE;
++	break;
+     case PJ_TURN_STATE_READY:
+ 	/* Send REFRESH with LIFETIME=0 */
+ 	can_destroy = PJ_FALSE;
+@@ -723,6 +730,10 @@ PJ_DEF(pj_status_t) pj_turn_session_alloc(pj_turn_session *sess,
+     PJ_ASSERT_RETURN(sess->state>PJ_TURN_STATE_NULL && 
+ 		     sess->state<=PJ_TURN_STATE_RESOLVED, 
+ 		     PJ_EINVALIDOP);
++				 
++		PJ_ASSERT_RETURN(param->peer_conn_type == PJ_TURN_TP_UDP ||
++                     param->peer_conn_type == PJ_TURN_TP_TCP,
++                     PJ_EINVAL);
+ 
+     pj_grp_lock_acquire(sess->grp_lock);
+ 
+@@ -754,7 +765,7 @@ PJ_DEF(pj_status_t) pj_turn_session_alloc(pj_turn_session *sess,
+     /* MUST include REQUESTED-TRANSPORT attribute */
+     pj_stun_msg_add_uint_attr(tdata->pool, tdata->msg,
+ 			      PJ_STUN_ATTR_REQ_TRANSPORT, 
+-			      PJ_STUN_SET_RT_PROTO(PJ_TURN_TP_UDP));
++			      PJ_STUN_SET_RT_PROTO(param->peer_conn_type));
+ 
+     /* Include BANDWIDTH if requested */
+     if (sess->alloc_param.bandwidth > 0) {
+@@ -975,6 +986,13 @@ PJ_DEF(pj_status_t) pj_turn_session_sendto( pj_turn_session *sess,
+ 	}
+     }
+ 
++	/* rfc6062: direct send if peer connection is TCP */
++	if (sess->alloc_param.peer_conn_type == PJ_TURN_TP_TCP) {
++		status = sess->cb.on_send_pkt(sess, pkt, pkt_len,
++									  addr, addr_len);
++		goto on_return;
++	}
++
+     /* See if the peer is bound to a channel number */
+     ch = lookup_ch_by_addr(sess, addr, pj_sockaddr_get_len(addr), 
+ 			   PJ_FALSE, PJ_FALSE);
+@@ -1647,6 +1665,33 @@ static pj_status_t stun_on_rx_indication(pj_stun_session *stun,
+ 
+     sess = (pj_turn_session*)pj_stun_session_get_user_data(stun);
+ 
++    if (msg->hdr.type == PJ_STUN_CONNECTION_ATTEMPT_INDICATION) {
++        pj_stun_uint_attr *connection_id_attr;
++        /* Get CONNECTION-ID attribute */
++        connection_id_attr = (pj_stun_uint_attr*)
++            pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_CONNECTION_ID, 0);
++
++        /* Get XOR-PEER-ADDRESS attribute */
++        peer_attr = (pj_stun_xor_peer_addr_attr*)
++            pj_stun_msg_find_attr(msg, PJ_STUN_ATTR_XOR_PEER_ADDR, 0);
++
++        /* Must have both XOR-PEER-ADDRESS and CONNECTION-ID attributes */
++        if (!peer_attr || !connection_id_attr) {
++            PJ_LOG(4,(sess->obj_name,
++                      "Received ConnectionAttempt indication with missing attributes"));
++            return PJ_EINVALIDOP;
++        }
++
++        /* Notify application */
++        if (sess->cb.on_peer_connection) {
++            (*sess->cb.on_peer_connection)(sess, connection_id_attr->value,
++                                           &peer_attr->sockaddr,
++                                           pj_sockaddr_get_len(&peer_attr->sockaddr),
++                                           PJ_SUCCESS);
++        }
++        return PJ_SUCCESS;
++    }
++
+     /* Expecting Data Indication only */
+     if (msg->hdr.type != PJ_STUN_DATA_INDICATION) {
+ 	PJ_LOG(4,(sess->obj_name, "Unexpected STUN %s indication",
+@@ -2066,3 +2111,16 @@ on_return:
+     pj_grp_lock_release(sess->grp_lock);
+ }
+ 
++PJ_DEF(void) pj_turn_session_get_server_cred(pj_turn_session *sess,
++											 pj_pool_t *pool, pj_str_t *nonce,
++											 pj_str_t *realm)
++{
++	pj_stun_session_get_server_cred(sess->stun, pool, nonce, realm);
++}
++
++PJ_DEF(void) pj_turn_session_set_server_cred(pj_turn_session *sess,
++											 const pj_str_t *nonce,
++											 pj_str_t *realm)
++{
++	pj_stun_session_set_server_cred(sess->stun, nonce, realm);
++}
+--- a/pjnath/src/pjnath/turn_sock.c
++++ b/pjnath/src/pjnath/turn_sock.c
+@@ -35,9 +35,29 @@ enum
+ 
+ enum { MAX_BIND_RETRY = 100 };
+ 
++enum { CONNECTION_USED = (1<<0), /* TCP connection slot is used or free */
++	   CONNECTION_READY = (1<<1) /* TCP connection bind and ready to use for data transfer */
++};
+ 
+ #define INIT	0x1FFFFFFF
+ 
++/**
++ * pj_turn_tcp_data_connection contains information on TCP connection open between
++ * the client and the turn server, conveying data from/to a specific peer.
++ * notes: part of RFC 6062 support
++ */
++typedef struct pj_turn_tcp_data_connection
++{
++    pj_uint32_t id;						/* identity of this connection as given by the TURN server */
++    pj_uint32_t flags;					/* 0 or CONNECTION_USED */
++	pj_sockaddr peer_addr;				/* mapped address of connected peer */
++	unsigned peer_addr_len;
++    pj_activesock_t	*active_tcp_sock;	/* socket between client and TURN server */
++	pj_ioqueue_op_key_t send_key;
++	pj_stun_session *stun_sess;			/* STUN session used to send ConnectBind msg */
++	pj_turn_sock *turn_sock;		    /* up link */
++} pj_turn_tcp_data_connection;
++
+ struct pj_turn_sock
+ {
+     pj_pool_t		*pool;
+@@ -59,6 +79,11 @@ struct pj_turn_sock
+     pj_turn_tp_type	 conn_type;
+     pj_activesock_t	*active_sock;
+     pj_ioqueue_op_key_t	 send_key;
++
++    /* RFC 6062 */
++	pj_stun_auth_cred cred; /* saved from control connection */
++    pj_size_t tcp_cnx_count; /* number of elements in tcp_cnx */
++    pj_turn_tcp_data_connection	tcp_cnx[PJ_TURN_MAX_TCP_CNX]; /* peer dedicated data connections throught the TURN server */
+ };
+ 
+ 
+@@ -82,6 +107,12 @@ static void turn_on_rx_data(pj_turn_session *sess,
+ static void turn_on_state(pj_turn_session *sess, 
+ 			  pj_turn_state_t old_state,
+ 			  pj_turn_state_t new_state);
++static void turn_on_peer_connection(pj_turn_session *sess,
++                                    pj_uint32_t conn_id,
++                                    const pj_sockaddr_t *peer_addr,
++                                    unsigned addr_len,
++									 pj_status_t status);
++
+ 
+ static pj_bool_t on_data_read(pj_activesock_t *asock,
+ 			      void *data,
+@@ -97,6 +128,26 @@ static void turn_sock_on_destroy(void *comp);
+ static void destroy(pj_turn_sock *turn_sock);
+ static void timer_cb(pj_timer_heap_t *th, pj_timer_entry *e);
+ 
++static pj_bool_t on_peer_data_read(pj_activesock_t *asock,
++								   void *data,
++								   pj_size_t size,
++								   pj_status_t status,
++								   pj_size_t *remainder);
++static pj_bool_t on_peer_connect_complete(pj_activesock_t *asock,
++										  pj_status_t status);
++static pj_status_t on_tcp_stun_send_msg(pj_stun_session *sess,
++										void *token,
++										const void *pkt,
++										pj_size_t pkt_size,
++										const pj_sockaddr_t *dst_addr,
++										unsigned addr_len);
++static void on_tcp_stun_request_complete(pj_stun_session *sess,
++										 pj_status_t status,
++										 void *token,
++										 pj_stun_tx_data *tdata,
++										 const pj_stun_msg *response,
++										 const pj_sockaddr_t *src_addr,
++										 unsigned src_addr_len);
+ 
+ /* Init config */
+ PJ_DEF(void) pj_turn_sock_cfg_default(pj_turn_sock_cfg *cfg)
+@@ -193,6 +244,7 @@ PJ_DEF(pj_status_t) pj_turn_sock_create(pj_stun_config *cfg,
+     sess_cb.on_channel_bound = &turn_on_channel_bound;
+     sess_cb.on_rx_data = &turn_on_rx_data;
+     sess_cb.on_state = &turn_on_state;
++    sess_cb.on_peer_connection = &turn_on_peer_connection;
+     status = pj_turn_session_create(cfg, pool->obj_name, af, conn_type,
+                                     turn_sock->grp_lock, &sess_cb, 0,
+                                     turn_sock, &turn_sock->sess);
+@@ -240,6 +292,9 @@ static void destroy(pj_turn_sock *turn_sock)
+ 	pj_turn_session_shutdown(turn_sock->sess);
+     if (turn_sock->active_sock)
+ 	pj_activesock_close(turn_sock->active_sock);
++	for (int i=0; i < turn_sock->tcp_cnx_count; ++i) {
++		pj_activesock_close(turn_sock->tcp_cnx[i].active_tcp_sock);
++	}
+     pj_grp_lock_dec_ref(turn_sock->grp_lock);
+     pj_grp_lock_release(turn_sock->grp_lock);
+ }
+@@ -304,6 +359,34 @@ static void sess_fail(pj_turn_sock *turn_sock, const char *title,
+     }
+ }
+ 
++static void peer_cnx_fail(pj_turn_tcp_data_connection *tcp_cnx,
++                          const char *title, pj_status_t status)
++{
++    pj_turn_sock *turn_sock = tcp_cnx->turn_sock;
++
++    show_err(turn_sock, title, status);
++    if (tcp_cnx->stun_sess) {
++        pj_stun_session_destroy(tcp_cnx->stun_sess);
++        tcp_cnx->stun_sess = NULL;
++    }
++    if (tcp_cnx->active_tcp_sock) {
++        for (int i=0; i < turn_sock->tcp_cnx_count; ++i) {
++            if (&turn_sock->tcp_cnx[i] == tcp_cnx) {
++                turn_on_peer_connection(turn_sock->sess, tcp_cnx->id,
++                                        &tcp_cnx->peer_addr,
++                                        tcp_cnx->peer_addr_len,
++                                        PJ_EEOF);
++                pj_activesock_close(tcp_cnx->active_tcp_sock);
++                tcp_cnx->active_tcp_sock = NULL;
++                tcp_cnx->flags = 0;
++                if (i == turn_sock->tcp_cnx_count-1)
++                    --turn_sock->tcp_cnx_count;
++                break;
++            }
++        }
++    }
++}
++
+ /*
+  * Set user data.
+  */
+@@ -413,6 +496,9 @@ PJ_DEF(pj_status_t) pj_turn_sock_alloc(pj_turn_sock *turn_sock,
+ 
+     /* Set credental */
+     if (cred) {
++		// save credentials for peer/TCP connections
++		if (param->peer_conn_type == PJ_TURN_TP_TCP)
++			pj_memcpy(&turn_sock->cred, cred, sizeof(turn_sock->cred));
+ 	status = pj_turn_session_set_credential(turn_sock->sess, cred);
+ 	if (status != PJ_SUCCESS) {
+ 	    sess_fail(turn_sock, "Error setting credential", status);
+@@ -670,11 +756,35 @@ static pj_status_t turn_on_send_pkt(pj_turn_session *sess,
+ 	return PJ_EINVALIDOP;
+     }
+ 
+-    PJ_UNUSED_ARG(dst_addr);
+-    PJ_UNUSED_ARG(dst_addr_len);
++	/* With TCP peer connection filter by address
++	 * if packet is for the server or the peer
++	 */
++	pj_activesock_t *asock = NULL;
++	pj_turn_session_info info;
++	pj_turn_session_get_info(turn_sock->sess, &info);
++	if (pj_sockaddr_cmp(&info.server, dst_addr) &&
++		turn_sock->alloc_param.peer_conn_type == PJ_TURN_TP_TCP) {
++		for (int i=0; i < turn_sock->tcp_cnx_count; ++i) {
++			pj_turn_tcp_data_connection *tcp_cnx = &turn_sock->tcp_cnx[i];
++			if ((tcp_cnx->flags & CONNECTION_READY) ==  0)
++				continue;
++			if (!pj_sockaddr_cmp(&tcp_cnx->peer_addr, dst_addr)) {
++				asock = tcp_cnx->active_tcp_sock;
++				break;
++			}
++		}
++		if (!asock) {
++			status = PJ_ENOTFOUND;
++			show_err(turn_sock, "socket send()", status);
++			return status;
++		}
++	} else {
++		asock = turn_sock->active_sock;
++	}
+ 
+-    status = pj_activesock_send(turn_sock->active_sock, &turn_sock->send_key,
++    status = pj_activesock_send(asock, &turn_sock->send_key,
+ 				pkt, &len, 0);
++
+     if (status != PJ_SUCCESS && status != PJ_EPENDING) {
+ 	show_err(turn_sock, "socket send()", status);
+     }
+@@ -917,4 +1027,365 @@ static void turn_on_state(pj_turn_session *sess,
+     }
+ }
+ 
++static void turn_on_peer_connection(pj_turn_session *sess,
++                                    pj_uint32_t conn_id,
++                                    const pj_sockaddr_t *peer_addr,
++                                    unsigned addr_len,
++                                    pj_status_t status)
++{
++    pj_turn_sock *turn_sock = (pj_turn_sock*) pj_turn_session_get_user_data(sess);
++    if (turn_sock == NULL || turn_sock->is_destroying) {
++        /* We've been destroyed */
++        return;
++    }
++
++    if (turn_sock->cb.on_peer_connection) {
++        (*turn_sock->cb.on_peer_connection)(turn_sock, conn_id,
++                                            peer_addr, addr_len,
++                                            status);
++    }
++}
++
++PJ_DECL(pj_status_t) pj_turn_connect_peer(pj_turn_sock *turn_sock,
++										  pj_uint32_t conn_id,
++										  const pj_sockaddr_t *peer_addr,
++										  unsigned addr_len)
++{
++	pj_status_t status;
++	pj_turn_tcp_data_connection *new_tcp_cnx = NULL;
++
++	for (int i=0; i < turn_sock->tcp_cnx_count; ++i) {
++		pj_turn_tcp_data_connection *tcp_cnx = &turn_sock->tcp_cnx[i];
++		if ((tcp_cnx->flags & CONNECTION_USED) == 0) {
++			new_tcp_cnx = tcp_cnx;
++			continue;
++		}
++		if (tcp_cnx->id == conn_id)
++			// TODO: need log
++			return PJ_EINVAL; // TODO: need better error code
++	}
++
++	if (!new_tcp_cnx) {
++		if (turn_sock->tcp_cnx_count == PJ_TURN_MAX_TCP_CNX) {
++			// TODO: need log
++			return PJ_ETOOMANY;
++		}
++		new_tcp_cnx = &turn_sock->tcp_cnx[turn_sock->tcp_cnx_count++];
++	}
++
++	/* Initialize this TCP connection slot */
++	pj_bzero(new_tcp_cnx, sizeof(*new_tcp_cnx));
++	new_tcp_cnx->id = conn_id;
++	new_tcp_cnx->flags = CONNECTION_USED;
++	new_tcp_cnx->turn_sock = turn_sock;
++	pj_sockaddr_cp(&new_tcp_cnx->peer_addr, peer_addr);
++	new_tcp_cnx->peer_addr_len = addr_len;
++
++	pj_ioqueue_op_key_init(&new_tcp_cnx->send_key,
++						   sizeof(new_tcp_cnx->send_key));
++
++	/* Initiate a new TCP connection on TURN server
++	 * that will become the peer data connection */
++	pj_turn_session_info info;
++	int sock_type;
++	pj_sock_t sock;
++	pj_activesock_cfg asock_cfg;
++	pj_activesock_cb asock_cb;
++	pj_sockaddr bound_addr, *cfg_bind_addr;
++	pj_uint16_t max_bind_retry;
++
++	/* Get server address from session info */
++	pj_turn_session_get_info(turn_sock->sess, &info);
++
++	assert(turn_sock->conn_type == PJ_TURN_TP_TCP);
++	sock_type = pj_SOCK_STREAM();
++
++	/* Init socket */
++	status = pj_sock_socket(turn_sock->af, sock_type, 0, &sock);
++	if (status != PJ_SUCCESS) {
++	    pj_turn_sock_destroy(turn_sock);
++	    return status;
++	}
++
++	/* Bind socket */
++	cfg_bind_addr = &turn_sock->setting.bound_addr;
++	max_bind_retry = MAX_BIND_RETRY;
++	if (turn_sock->setting.port_range &&
++	    turn_sock->setting.port_range < max_bind_retry)
++	{
++	    max_bind_retry = turn_sock->setting.port_range;
++	}
++	pj_sockaddr_init(turn_sock->af, &bound_addr, NULL, 0);
++	if (cfg_bind_addr->addr.sa_family == pj_AF_INET() ||
++	    cfg_bind_addr->addr.sa_family == pj_AF_INET6())
++	{
++	    pj_sockaddr_cp(&bound_addr, cfg_bind_addr);
++	}
++	status = pj_sock_bind_random(sock, &bound_addr,
++								 turn_sock->setting.port_range,
++								 max_bind_retry);
++	if (status != PJ_SUCCESS) {
++	    pj_turn_sock_destroy(turn_sock);
++	    return status;
++	}
++
++	/* Apply socket buffer size */
++	if (turn_sock->setting.so_rcvbuf_size > 0) {
++	    unsigned sobuf_size = turn_sock->setting.so_rcvbuf_size;
++	    status = pj_sock_setsockopt_sobuf(sock, pj_SO_RCVBUF(),
++										  PJ_TRUE, &sobuf_size);
++	    if (status != PJ_SUCCESS) {
++			pj_perror(3, turn_sock->obj_name, status,
++					  "Failed setting SO_RCVBUF");
++	    } else {
++			if (sobuf_size < turn_sock->setting.so_rcvbuf_size) {
++				PJ_LOG(4, (turn_sock->obj_name,
++						   "Warning! Cannot set SO_RCVBUF as configured,"
++						   " now=%d, configured=%d", sobuf_size,
++						   turn_sock->setting.so_rcvbuf_size));
++			} else {
++				PJ_LOG(5, (turn_sock->obj_name, "SO_RCVBUF set to %d",
++						   sobuf_size));
++			}
++	    }
++	}
++	if (turn_sock->setting.so_sndbuf_size > 0) {
++	    unsigned sobuf_size = turn_sock->setting.so_sndbuf_size;
++	    status = pj_sock_setsockopt_sobuf(sock, pj_SO_SNDBUF(),
++										  PJ_TRUE, &sobuf_size);
++	    if (status != PJ_SUCCESS) {
++			pj_perror(3, turn_sock->obj_name, status,
++					  "Failed setting SO_SNDBUF");
++	    } else {
++			if (sobuf_size < turn_sock->setting.so_sndbuf_size) {
++				PJ_LOG(4, (turn_sock->obj_name,
++						   "Warning! Cannot set SO_SNDBUF as configured,"
++						   " now=%d, configured=%d", sobuf_size,
++						   turn_sock->setting.so_sndbuf_size));
++			} else {
++				PJ_LOG(5, (turn_sock->obj_name, "SO_SNDBUF set to %d",
++						   sobuf_size));
++			}
++	    }
++	}
++
++	/* Create active socket */
++	pj_activesock_cfg_default(&asock_cfg);
++	asock_cfg.grp_lock = turn_sock->grp_lock;
++
++	pj_bzero(&asock_cb, sizeof(asock_cb));
++	asock_cb.on_data_read = &on_peer_data_read;
++	asock_cb.on_connect_complete = &on_peer_connect_complete;
++	status = pj_activesock_create(turn_sock->pool, sock,
++								  sock_type, &asock_cfg,
++								  turn_sock->cfg.ioqueue, &asock_cb,
++								  new_tcp_cnx,
++								  &new_tcp_cnx->active_tcp_sock);
++	if (status != PJ_SUCCESS) {
++	    pj_turn_sock_destroy(turn_sock);
++	    return status;
++	}
++
++	char addrtxt[PJ_INET6_ADDRSTRLEN+8];
++	PJ_LOG(5,(turn_sock->pool->obj_name,
++			  "Connecting to %s",
++			  pj_sockaddr_print(&info.server, addrtxt,
++								sizeof(addrtxt), 3)));
++
++	status = pj_activesock_start_connect(new_tcp_cnx->active_tcp_sock,
++										 turn_sock->pool,
++										 &info.server,
++										 pj_sockaddr_get_len(&info.server));
++	if (status == PJ_SUCCESS) {
++	    on_peer_connect_complete(new_tcp_cnx->active_tcp_sock, PJ_SUCCESS);
++	} else if (status != PJ_EPENDING) {
++		pj_perror(3, turn_sock->pool->obj_name, status,
++				  "Failed to connect to %s",
++				  pj_sockaddr_print(&info.server, addrtxt,
++									sizeof(addrtxt), 3));
++	    pj_turn_sock_destroy(turn_sock);
++	    return status;
++	}
++
++	return PJ_SUCCESS;
++}
++
++static pj_bool_t on_peer_data_read(pj_activesock_t *asock,
++								   void *data,
++								   pj_size_t size,
++								   pj_status_t status,
++								   pj_size_t *remainder)
++{
++	pj_turn_tcp_data_connection *tcp_cnx;
++	pj_turn_sock *turn_sock;
++
++	tcp_cnx = (pj_turn_tcp_data_connection*) pj_activesock_get_user_data(asock);
++	pj_assert(tcp_cnx && tcp_cnx->turn_sock);
++	turn_sock = tcp_cnx->turn_sock;
++
++    pj_grp_lock_acquire(turn_sock->grp_lock);
++
++	if (status != PJ_SUCCESS) {
++        peer_cnx_fail(tcp_cnx, "Peer connection closed", status);
++        pj_grp_lock_release(turn_sock->grp_lock);
++		return PJ_FALSE;
++	}
++
++	*remainder = size;
++	pj_uint8_t* pkt = data;
++	while (*remainder > 0) {
++		if ((tcp_cnx->flags & CONNECTION_READY) != 0) {
++			if (turn_sock->cb.on_rx_data)
++				turn_sock->cb.on_rx_data(turn_sock, pkt, *remainder,
++										 &tcp_cnx->peer_addr,
++										 tcp_cnx->peer_addr_len);
++			pj_grp_lock_release(turn_sock->grp_lock);
++			*remainder = 0;
++			return PJ_TRUE;
++		}
++
++		/* STUN session waiting for ConnectBind response */
++		pj_size_t parsed_len;
++		unsigned options = PJ_STUN_CHECK_PACKET | PJ_STUN_NO_FINGERPRINT_CHECK;
++		status = pj_stun_session_on_rx_pkt(tcp_cnx->stun_sess, pkt, size,
++										   options, NULL, &parsed_len,
++										   &tcp_cnx->peer_addr,
++										   tcp_cnx->peer_addr_len);
++
++		if (status != PJ_SUCCESS) {
++            peer_cnx_fail(tcp_cnx, "Peer connection closed", status);
++			pj_grp_lock_release(turn_sock->grp_lock);
++			return PJ_FALSE;
++		}
++
++		PJ_LOG(3, ("rfc6062",
++				   "parsed STUN msg (read %zu byte(s) over %zu), status=%u",
++				   parsed_len, size, status));
++
++		pkt += parsed_len;
++		*remainder -= parsed_len;
++	}
++
++	pj_grp_lock_release(turn_sock->grp_lock);
++
++	return PJ_TRUE;
++}
++
++static pj_bool_t on_peer_connect_complete(pj_activesock_t *asock,
++										  pj_status_t status)
++{
++	pj_turn_tcp_data_connection *tcp_cnx;
++	pj_turn_sock *turn_sock;
++
++    PJ_LOG(1, ("rfc6062", "peer data connection %s", status == PJ_SUCCESS ? "ready" : "failed"));
++
++	tcp_cnx = (pj_turn_tcp_data_connection*) pj_activesock_get_user_data(asock);
++	if (!tcp_cnx)
++		return PJ_FALSE;
++
++	turn_sock = tcp_cnx->turn_sock;
++	pj_assert(turn_sock);
++
++    pj_grp_lock_acquire(turn_sock->grp_lock);
++
++	PJ_LOG(3, ("rfc6062", "peer data connection %s", status == PJ_SUCCESS ? "ready" : "failed"));
++
++	// TODO: handle failures
++	if (status != PJ_SUCCESS) {
++		pj_grp_lock_release(turn_sock->grp_lock);
++		return PJ_FALSE;
++	}
++
++	/* start pending read operation */
++    status = pj_activesock_start_read(asock, turn_sock->pool,
++									  turn_sock->setting.max_pkt_size, 0);
++	if (status != PJ_SUCCESS) {
++		// TODO: error handling
++		pj_grp_lock_release(turn_sock->grp_lock);
++		return PJ_FALSE;
++	}
++
++	/* Create a temporary STUN session to send the ConnectBind request */
++	pj_stun_session_cb stun_cb;
++	pj_bzero(&stun_cb, sizeof(stun_cb));
++	stun_cb.on_send_msg = &on_tcp_stun_send_msg;
++	stun_cb.on_request_complete = &on_tcp_stun_request_complete;
++	status = pj_stun_session_create(&turn_sock->cfg, NULL,
++									&stun_cb, PJ_FALSE, NULL,
++									&tcp_cnx->stun_sess);
++	if (status != PJ_SUCCESS) {
++		pj_grp_lock_release(turn_sock->grp_lock);
++        return PJ_FALSE;
++	}
++
++	pj_stun_session_set_user_data(tcp_cnx->stun_sess, tcp_cnx);
++
++	/* Copy credentials from control connection */
++	pj_stun_session_set_credential(tcp_cnx->stun_sess, PJ_STUN_AUTH_LONG_TERM, &turn_sock->cred);
++	pj_str_t server_nonce, server_realm;
++	pj_turn_session_get_server_cred(turn_sock->sess, turn_sock->pool, &server_nonce, &server_realm);
++	pj_stun_session_set_server_cred(tcp_cnx->stun_sess, &server_nonce, &server_realm);
++
++	/* Send ConnectBind request */
++	pj_stun_tx_data *tdata;
++	status = pj_stun_session_create_req(tcp_cnx->stun_sess, PJ_STUN_CONNECTION_BIND_REQUEST,
++										PJ_STUN_MAGIC, NULL, &tdata);
++    if (status != PJ_SUCCESS) {
++		pj_stun_session_destroy(tcp_cnx->stun_sess);
++		pj_grp_lock_release(turn_sock->grp_lock);
++		return PJ_FALSE;
++    }
++
++    /* MUST include REQUESTED-TRANSPORT attribute */
++    pj_stun_msg_add_uint_attr(tdata->pool, tdata->msg, PJ_STUN_ATTR_CONNECTION_ID, tcp_cnx->id);
++
++	PJ_LOG(3, ("rfc6062", "bind TCP connection id=%x", tcp_cnx->id));
++	status = pj_stun_session_send_msg(tcp_cnx->stun_sess, tcp_cnx, PJ_FALSE, PJ_FALSE,
++									  &tcp_cnx->peer_addr, tcp_cnx->peer_addr_len,
++									  tdata);
++	if (status != PJ_SUCCESS && status != PJ_EPENDING) {
++		pj_stun_session_destroy(tcp_cnx->stun_sess);
++		pj_grp_lock_release(turn_sock->grp_lock);
++		return status;
++	}
++
++	pj_grp_lock_release(turn_sock->grp_lock);
++	return PJ_TRUE;
++}
++
++static pj_status_t on_tcp_stun_send_msg(pj_stun_session *sess,
++										void *token,
++										const void *pkt,
++										pj_size_t pkt_size,
++										const pj_sockaddr_t *dst_addr,
++										unsigned addr_len)
++{
++	pj_status_t status;
++	pj_turn_tcp_data_connection *tcp_cnx = (pj_turn_tcp_data_connection*) token;
++	pj_assert(tcp_cnx != NULL && tcp_cnx->turn_sock != NULL);
++
++	pj_grp_lock_acquire(tcp_cnx->turn_sock->grp_lock);
++	status = pj_activesock_send(tcp_cnx->active_tcp_sock, &tcp_cnx->send_key, pkt, &pkt_size, 0);
++	pj_grp_lock_release(tcp_cnx->turn_sock->grp_lock);
+ 
++	return status;
++}
++
++static void on_tcp_stun_request_complete(pj_stun_session *sess,
++										 pj_status_t status,
++										 void *token,
++										 pj_stun_tx_data *tdata,
++										 const pj_stun_msg *response,
++										 const pj_sockaddr_t *src_addr,
++										 unsigned src_addr_len)
++{
++	pj_turn_tcp_data_connection *tcp_cnx = (pj_turn_tcp_data_connection*) token;
++	pj_assert(tcp_cnx != NULL && tcp_cnx->turn_sock != NULL);
++
++	pj_grp_lock_acquire(tcp_cnx->turn_sock->grp_lock);
++	pj_stun_session_destroy(tcp_cnx->stun_sess);
++	tcp_cnx->stun_sess = NULL;
++	tcp_cnx->flags |= CONNECTION_READY;
++	PJ_LOG(3, ("rfc6062", "peer data connection bind %s", status == PJ_SUCCESS ? "succeed" : "failed"));
++	pj_grp_lock_release(tcp_cnx->turn_sock->grp_lock);
++}
+-- 
+2.10.2.windows.1
+
diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp
index d1c0179a9e1476419f1e602f31c92573ab61bc3a..ab9522e5af01217bdca139aa473f30dbe52221d5 100644
--- a/src/peer_connection.cpp
+++ b/src/peer_connection.cpp
@@ -44,7 +44,9 @@
 #include <sys/select.h>
 #endif
 
+#ifndef RING_UWP
 #include <sys/time.h>
+#endif
 
 namespace ring {
 
@@ -220,7 +222,7 @@ TlsTurnEndpoint::waitForData(unsigned ms_timeout, std::error_code& ec) const
 
 TcpSocketEndpoint::TcpSocketEndpoint(const IpAddr& addr)
     : addr_ {addr}
-    , sock_ {::socket(addr.getFamily(), SOCK_STREAM, 0)}
+    , sock_{ static_cast<int>(::socket(addr.getFamily(), SOCK_STREAM, 0)) }
 {
     if (sock_ < 0)
         std::system_error(errno, std::generic_category());