diff --git a/indra/newview/llcallfloater.cpp b/indra/newview/llcallfloater.cpp
index c222ced98fe70642a159841156491b9243f84088..29f37a04b408b3af78aad0ec449e4ea704808eb0 100644
--- a/indra/newview/llcallfloater.cpp
+++ b/indra/newview/llcallfloater.cpp
@@ -291,15 +291,6 @@ void LLCallFloater::updateSession()
 		if (show_me) 
 		{
 			setVisible(true);
-			// Workaround(EM): Set current call dialog to front most because
-			// connect/leaving popups should appear on top of VCP.
-			// See bug EXT-3628.
-			LLOutgoingCallDialog* instance =
-				LLFloaterReg::findTypedInstance<LLOutgoingCallDialog>("outgoing_call", LLOutgoingCallDialog::OCD_KEY);
-			if(instance && instance->getVisible())
-			{
-				instance->setFrontmost();
-			}
 		}
 	}
 }
diff --git a/indra/newview/llspeakbutton.cpp b/indra/newview/llspeakbutton.cpp
index 90214a1bd7888122ad8238fb9d52ac35e16ecaf9..8f2c877c7a856662bfa4d2bce64cdc68e07f73c6 100644
--- a/indra/newview/llspeakbutton.cpp
+++ b/indra/newview/llspeakbutton.cpp
@@ -123,7 +123,7 @@ LLSpeakButton::LLSpeakButton(const Params& p)
 	mOutputMonitor->setIsAgentControl(true);
 
 	//*TODO find a better place to do that
-	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1));
+	LLVoiceChannel::setCurrentVoiceChannelChangedCallback(boost::bind(&LLCallFloater::sOnCurrentChannelChanged, _1), true);
 }
 
 LLSpeakButton::~LLSpeakButton()
diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp
index 69d2458217c3db2c1ec058a30fb5112ec6c73685..993853b9a624dbf5e33f469f2d5f4567a01712fd 100644
--- a/indra/newview/llvoicechannel.cpp
+++ b/indra/newview/llvoicechannel.cpp
@@ -446,6 +446,17 @@ void LLVoiceChannel::resume()
 	}
 }
 
+boost::signals2::connection LLVoiceChannel::setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb, bool at_front)
+{
+	if (at_front)
+	{
+		return sCurrentVoiceChannelChangedSignal.connect(cb,  boost::signals2::at_front);
+	}
+	else
+	{
+		return sCurrentVoiceChannelChangedSignal.connect(cb);
+	}
+}
 
 //
 // LLVoiceChannelGroup
diff --git a/indra/newview/llvoicechannel.h b/indra/newview/llvoicechannel.h
index 77801142cbb4989b1be60868910b877914f5550c..cb866713051e9d0f94dbbd6de8dbdfa9535a371d 100644
--- a/indra/newview/llvoicechannel.h
+++ b/indra/newview/llvoicechannel.h
@@ -64,7 +64,7 @@ class LLVoiceChannel : public LLVoiceClientStatusObserver
 	typedef boost::function<void(const LLUUID& session_id)> channel_changed_callback_t;
 	typedef boost::signals2::signal<void(const LLUUID& session_id)> channel_changed_signal_t;
 	static channel_changed_signal_t sCurrentVoiceChannelChangedSignal;
-	static boost::signals2::connection setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb) { return sCurrentVoiceChannelChangedSignal.connect(cb); }
+	static boost::signals2::connection setCurrentVoiceChannelChangedCallback(channel_changed_callback_t cb, bool at_front = false);
 
 
 	LLVoiceChannel(const LLUUID& session_id, const std::string& session_name);