diff --git a/CMakeLists.txt b/CMakeLists.txt
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,6 +34,7 @@
 
 find_package(KF5Contacts ${KCONTACTS_LIB_VERSION} CONFIG REQUIRED)
 find_package(KF5IdentityManagement ${KCONTACTS_LIB_VERSION} CONFIG REQUIRED)
+find_package(Threads)
 
 include(KDEInstallDirs)
 include(KDECompilerSettings NO_POLICY_SCOPE)
diff --git a/cmake/modules/FindLiboRTP.cmake b/cmake/modules/FindLiboRTP.cmake
--- a/cmake/modules/FindLiboRTP.cmake
+++ b/cmake/modules/FindLiboRTP.cmake
@@ -11,7 +11,7 @@
 
 SET( LIBORTP_FOUND FALSE )
 
-pkg_check_modules(ortp ortp)
+pkg_check_modules(ORTP ortp)
 
 FIND_PATH( LIBORTP_INCLUDE_DIR
            ortp/ortp.h
@@ -40,7 +40,13 @@
     if ( run_result EQUAL 0 )
 #     Version OK
       SET( LIBORTP_FOUND TRUE )
-      MESSAGE( STATUS "Found libortp: ${LIBORTP_LIBRARY}" )
+      MESSAGE( STATUS "Found libortp: ${LIBORTP_LIBRARY} ${ORTP_VERSION}" )
+      IF (ORTP_VERSION VERSION_LESS 1.0.1)
+          SET(ORTP_LESS_1_0_1 TRUE)
+      ELSE (ORTP_VERSION VERSION_LESS 1.0.1)
+          SET(ORTP_LESS_1_0_1 FALSE)
+      ENDIF (ORTP_VERSION VERSION_LESS 1.0.1)
+
     endif ( run_result EQUAL 0 )
   endif( compile_result )
 ENDIF( LIBORTP_INCLUDE_DIR AND LIBORTP_LIBRARY )
diff --git a/cmake/modules/FindMediastreamer.cmake b/cmake/modules/FindMediastreamer.cmake
--- a/cmake/modules/FindMediastreamer.cmake
+++ b/cmake/modules/FindMediastreamer.cmake
@@ -20,17 +20,25 @@
 
 IF (MEDIASTREAMER_FOUND)
   IF (NOT MEDIASTREAMER_FIND_QUIETLY)
+
       MESSAGE(STATUS "Found Mediastreamer: ${MEDIASTREAMER_LIBRARIES} (version: ${MEDIASTREAMER_VERSION})")
+
+      SET(MEDIASTREAMER_LESS_2_9 FALSE)
+      SET(MEDIASTREAMER_LESS_2_11 FALSE)
+      SET(MEDIASTREAMER_LESS_2_14 FALSE)
+
       IF (MEDIASTREAMER_VERSION VERSION_LESS 2.9)
           SET(MEDIASTREAMER_LESS_2_9 TRUE)
-          SET(MEDIASTREAMER_LESS_2_11 TRUE)
-      ELSEIF (MEDIASTREAMER_VERSION VERSION_LESS 2.11)
-          SET(MEDIASTREAMER_LESS_2_9 FALSE)
-          SET(MEDIASTREAMER_LESS_2_11 TRUE)
-      ELSE (MEDIASTREAMER_VERSION VERSION_LESS 2.9)
-          SET(MEDIASTREAMER_LESS_2_9 FALSE)
-          SET(MEDIASTREAMER_LESS_2_11 FALSE)
       ENDIF (MEDIASTREAMER_VERSION VERSION_LESS 2.9)
+
+      IF (MEDIASTREAMER_VERSION VERSION_LESS 2.11)
+          SET(MEDIASTREAMER_LESS_2_11 TRUE)
+      ENDIF (MEDIASTREAMER_VERSION VERSION_LESS 2.11)
+
+      IF (MEDIASTREAMER_VERSION VERSION_LESS 2.14)
+          SET(MEDIASTREAMER_LESS_2_14 TRUE)
+      ENDIF (MEDIASTREAMER_VERSION VERSION_LESS 2.14)
+
   ENDIF (NOT MEDIASTREAMER_FIND_QUIETLY)
 ELSE (MEDIASTREAMER_FOUND)
   IF (MEDIASTREAMER_FIND_REQUIRED)
diff --git a/protocols/jabber/libjingle/CMakeLists.txt b/protocols/jabber/libjingle/CMakeLists.txt
--- a/protocols/jabber/libjingle/CMakeLists.txt
+++ b/protocols/jabber/libjingle/CMakeLists.txt
@@ -51,6 +51,10 @@
 	add_definitions ( -DMEDIASTREAMER_LESS_2_11 )
 endif ( MEDIASTREAMER_LESS_2_11 )
 
+if ( MEDIASTREAMER_LESS_2_14 )
+	add_definitions ( -DMEDIASTREAMER_LESS_2_14 )
+endif ( MEDIASTREAMER_LESS_2_14 )
+
 if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
 	add_definitions ( -D_DEBUG )
 endif ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
@@ -284,6 +288,7 @@
 	${EXPAT_LIBRARY}
 	${MEDIASTREAMER_LIBRARIES}
 	${LIBORTP_LIBRARY}
+	${CMAKE_THREAD_LIBS_INIT}
 	${CMAKE_DL_LIBS}
 )
 
diff --git a/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.h b/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.h
--- a/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.h
+++ b/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.h
@@ -53,7 +53,11 @@
 class LinphoneMediaEngine : public MediaEngineInterface {
  public:
   LinphoneMediaEngine(const std::string& ringWav,  const std::string& callWav);
+#ifdef MEDIASTREAMER_LESS_2_14
   virtual ~LinphoneMediaEngine() {}
+#else
+  ~LinphoneMediaEngine();
+#endif
 
   // Implement pure virtual methods of MediaEngine.
   virtual bool Init() { return true; }
@@ -97,6 +101,10 @@
   bool have_speex;
   bool have_gsm;
 
+#ifndef MEDIASTREAMER_LESS_2_14
+  MSFactory *factory;
+#endif
+
  private:
   std::vector<AudioCodec> voice_codecs_;
   std::vector<VideoCodec> video_codecs_;
@@ -110,7 +118,11 @@
 class LinphoneVoiceChannel : public VoiceMediaChannel {
  public:
   LinphoneVoiceChannel(LinphoneMediaEngine *eng);
+#ifdef MEDIASTREAMER_LESS_2_14
   virtual ~LinphoneVoiceChannel();
+#else
+  ~LinphoneVoiceChannel();
+#endif
 
   // Implement pure virtual methods of VoiceMediaChannel.
   virtual bool SetRecvCodecs(const std::vector<AudioCodec>& codecs);
diff --git a/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.cc b/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.cc
--- a/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.cc
+++ b/protocols/jabber/libjingle/talk/session/phone/linphonemediaengine.cc
@@ -60,18 +60,34 @@
 ///////////////////////////////////////////////////////////////////////////
 LinphoneMediaEngine::LinphoneMediaEngine(const std::string& ringWav,  const std::string& callWav) : ring_wav_(ringWav), call_wav_(callWav) {
   ortp_init();
+#ifdef MEDIASTREAMER_LESS_2_14
   ms_init();
+#else
+  factory = ms_factory_new();
+  ms_factory_init_voip(factory);
+  ms_factory_init_plugins(factory);
+#endif
 
 #ifndef WIN32
   char * path = strdup(MSILBC_LIBRARY);
   char * dirc = dirname(path);
+#ifdef MEDIASTREAMER_LESS_2_14
   ms_load_plugins(dirc);
+#else
+  ms_factory_load_plugins(factory, dirc);
+#endif
   free(path);
 #endif
 
+#ifdef MEDIASTREAMER_LESS_2_14
   have_ilbc = ms_filter_codec_supported("iLBC");
   have_speex = ms_filter_codec_supported("speex");
   have_gsm = ms_filter_codec_supported("gsm");
+#else
+  have_ilbc = ms_factory_codec_supported(factory, "iLBC");
+  have_speex = ms_factory_codec_supported(factory, "speex");
+  have_gsm = ms_factory_codec_supported(factory, "gsm");
+#endif
 
   if (have_speex) {
     voice_codecs_.push_back(AudioCodec(110, payload_type_speex_wb.mime_type, payload_type_speex_wb.clock_rate, 0, 1, 8));
@@ -88,6 +104,14 @@
   voice_codecs_.push_back(AudioCodec(101, payload_type_telephone_event.mime_type, payload_type_telephone_event.clock_rate, 0, 1, 1));
 }
 
+#ifndef MEDIASTREAMER_LESS_2_14
+LinphoneMediaEngine::~LinphoneMediaEngine() {
+  ms_factory_uninit_plugins(factory);
+  ms_factory_uninit_voip(factory);
+  ms_factory_destroy(factory);
+}
+#endif
+
 void LinphoneMediaEngine::Terminate() {
   fflush(stdout);
 }
@@ -149,15 +173,25 @@
   playport2 = PORT_UNUSED;
 
 #ifdef _DEBUG
+#ifdef MEDIASTREAMER_LESS_2_14
   ortp_set_log_level_mask(ORTP_DEBUG|ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
 #else
+  ortp_set_log_level_mask(ORTP_LOG_DOMAIN, ORTP_DEBUG|ORTP_MESSAGE|ORTP_WARNING|ORTP_ERROR|ORTP_FATAL);
+#endif
+#else
+#ifdef MEDIASTREAMER_LESS_2_14
   ortp_set_log_level_mask(ORTP_FATAL);
+#else
+  ortp_set_log_level_mask(ORTP_LOG_DOMAIN, ORTP_FATAL);
+#endif
 #endif
 
 #ifdef MEDIASTREAMER_LESS_2_9
   audio_stream_ = audio_stream_new(-1, 0); /* -1 means that function will choose some free port */
-#else
+#elif MEDIASTREAMER_LESS_2_14
   audio_stream_ = audio_stream_new(-1, -1, 0); /* -1 means that function will choose some free port */
+#else
+  audio_stream_ = audio_stream_new(engine_->factory, -1, -1, 0); /* -1 means that function will choose some free port */
 #endif
 
 }
@@ -272,11 +306,22 @@
 {
   StopRing();
 
+#ifdef MEDIASTREAMER_LESS_2_14
+  MSSndCardManager *snd_manager = ms_snd_card_manager_get();
   MSSndCard *playcard = ms_snd_card_manager_get_default_playback_card(ms_snd_card_manager_get());
+#else
+  MSSndCardManager *snd_manager = ms_factory_get_snd_card_manager(engine_->factory);
+  MSSndCard *playcard = ms_snd_card_manager_get_default_playback_card(snd_manager);
+#endif
+
   if (!playcard)
     return false;
 
+#ifdef MEDIASTREAMER_LESS_2_14
   MSSndCard *captcard = ms_snd_card_manager_get_default_capture_card(ms_snd_card_manager_get());
+#else
+  MSSndCard *captcard = ms_snd_card_manager_get_default_capture_card(snd_manager);
+#endif
   if (!captcard)
     return false;
 
@@ -333,8 +378,18 @@
 
 void LinphoneVoiceChannel::StartRing(bool bIncomingCall)
 {
+#ifdef MEDIASTREAMER_LESS_2_14
+  MSSndCardManager *snd_manager = ms_snd_card_manager_get();
+#else
+  MSSndCardManager *snd_manager = ms_factory_get_snd_card_manager(engine_->factory);
+#endif
+
   MSSndCard *sndcard = NULL;
+#ifdef MEDIASTREAMER_LESS_2_14
   sndcard=ms_snd_card_manager_get_default_card(ms_snd_card_manager_get());
+#else
+  sndcard=ms_snd_card_manager_get_default_card(snd_manager);
+#endif
   if (sndcard)
   {
     if (bIncomingCall)
@@ -342,7 +397,11 @@
       if (engine_->GetRingWav().size() > 0)
       {
         LOG(LS_VERBOSE) << "incoming ring. sound file: " << engine_->GetRingWav().c_str() << "\n";
+#ifdef MEDIASTREAMER_LESS_2_14
         ring_stream_ = ring_start (engine_->GetRingWav().c_str(), 1, sndcard);
+#else
+        ring_stream_ = ring_start (engine_->factory, engine_->GetRingWav().c_str(), 1, sndcard);
+#endif
       }
     }
     else
@@ -350,7 +409,11 @@
       if (engine_->GetCallWav().size() > 0)
       {
         LOG(LS_VERBOSE) << "outgoing ring. sound file: " << engine_->GetCallWav().c_str() << "\n";
+#ifdef MEDIASTREAMER_LESS_2_14
         ring_stream_ = ring_start (engine_->GetCallWav().c_str(), 1, sndcard);
+#else
+        ring_stream_ = ring_start (engine_->factory, engine_->GetCallWav().c_str(), 1, sndcard);
+#endif
       }
     }
   }

