diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
index 1936e2476102ffc1b496b4cd6e200e66eb135686..e424983cf81668cfffa00a4b2a3af050969a511a 100644
--- a/indra/newview/lltranslate.cpp
+++ b/indra/newview/lltranslate.cpp
@@ -38,8 +38,12 @@
 #include "llcoros.h"
 #include "reader.h"
 #include "llcorehttputil.h"
+#include "llurlregistry.h"
 
 
+static const std::string BING_NOTRANSLATE_OPENING_TAG("<div class=\"notranslate\">");
+static const std::string BING_NOTRANSLATE_CLOSING_TAG("</div>");
+
 /**
 * Handler of an HTTP machine translation service.
 *
@@ -99,6 +103,8 @@ class LLTranslationAPIHandler
     */
     virtual bool isConfigured() const = 0;
 
+    virtual LLTranslate::EService getCurrentService() = 0;
+
     virtual void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc) = 0;
     virtual void translateMessage(LanguagePair_t fromTo, std::string msg, LLTranslate::TranslationSuccess_fn success, LLTranslate::TranslationFailure_fn failure);
 
@@ -248,6 +254,8 @@ class LLGoogleTranslationHandler : public LLTranslationAPIHandler
         std::string& err_msg) const;
     /*virtual*/ bool isConfigured() const;
 
+    /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_GOOGLE; }
+
     /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc);
 
 private:
@@ -409,6 +417,8 @@ class LLBingTranslationHandler : public LLTranslationAPIHandler
         std::string& err_msg) const;
     /*virtual*/ bool isConfigured() const;
 
+    /*virtual*/ LLTranslate::EService getCurrentService() { return LLTranslate::EService::SERVICE_BING; }
+
     /*virtual*/ void verifyKey(const std::string &key, LLTranslate::KeyVerificationResult_fn fnc);
 private:
     static std::string getAPIKey();
@@ -520,7 +530,59 @@ void LLTranslate::translateMessage(const std::string &from_lang, const std::stri
 {
     LLTranslationAPIHandler& handler = getPreferredHandler();
 
-    handler.translateMessage(LLTranslationAPIHandler::LanguagePair_t(from_lang, to_lang), mesg, success, failure);
+    handler.translateMessage(LLTranslationAPIHandler::LanguagePair_t(from_lang, to_lang), addNoTranslateTags(mesg), success, failure);
+}
+
+std::string LLTranslate::addNoTranslateTags(std::string mesg)
+{
+    if (getPreferredHandler().getCurrentService() != SERVICE_BING)
+    {
+        return mesg;
+    }
+
+    std::string upd_msg(mesg);
+    LLUrlMatch match;
+    S32 dif = 0;
+    //surround all links (including SLURLs) with 'no-translate' tags to prevent unnecessary translation
+    while (LLUrlRegistry::instance().findUrl(mesg, match))
+    {
+        upd_msg.insert(dif + match.getStart(), BING_NOTRANSLATE_OPENING_TAG);
+        upd_msg.insert(dif + BING_NOTRANSLATE_OPENING_TAG.size() + match.getEnd() + 1, BING_NOTRANSLATE_CLOSING_TAG);
+        mesg.erase(match.getStart(), match.getEnd() - match.getStart());
+        dif += match.getEnd() - match.getStart() + BING_NOTRANSLATE_OPENING_TAG.size() + BING_NOTRANSLATE_CLOSING_TAG.size();
+    }
+    return upd_msg;
+}
+
+std::string LLTranslate::removeNoTranslateTags(std::string mesg)
+{
+    if (getPreferredHandler().getCurrentService() != SERVICE_BING)
+    {
+        return mesg;
+    }
+    std::string upd_msg(mesg);
+    LLUrlMatch match;
+    S32 opening_tag_size = BING_NOTRANSLATE_OPENING_TAG.size();
+    S32 closing_tag_size = BING_NOTRANSLATE_CLOSING_TAG.size();
+    S32 dif = 0;
+    //remove 'no-translate' tags we added to the links before
+    while (LLUrlRegistry::instance().findUrl(mesg, match))
+    {
+        if (upd_msg.substr(dif + match.getStart() - opening_tag_size, opening_tag_size) == BING_NOTRANSLATE_OPENING_TAG)
+        {
+            upd_msg.erase(dif + match.getStart() - opening_tag_size, opening_tag_size);
+            dif -= opening_tag_size;
+
+            if (upd_msg.substr(dif + match.getEnd() + 1, closing_tag_size) == BING_NOTRANSLATE_CLOSING_TAG)
+            {
+                upd_msg.replace(dif + match.getEnd() + 1, closing_tag_size, " ");
+                dif -= closing_tag_size - 1;
+            }
+        }
+        mesg.erase(match.getStart(), match.getUrl().size());
+        dif += match.getUrl().size();
+    }
+    return upd_msg;
 }
 
 /*static*/
diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h
index bf431cdfbb23ca2d983cdb1bc779f2ee4f6c9e9e..e0722fbd83f92dce9b41c58012e19875893d6621 100644
--- a/indra/newview/lltranslate.h
+++ b/indra/newview/lltranslate.h
@@ -91,6 +91,9 @@ public :
 	 */
 	static bool isTranslationConfigured();
 
+    static std::string addNoTranslateTags(std::string mesg);
+    static std::string removeNoTranslateTags(std::string mesg);
+
 private:
 	static LLTranslationAPIHandler& getPreferredHandler();
 	static LLTranslationAPIHandler& getHandler(EService service);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index e50c8ee9f068d1561cdf5cf4096541108375df8d..c8f75c79c4cd3784e788d13035812cf6a616e026 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -2415,7 +2415,7 @@ void translateSuccess(LLChat chat, LLSD toastArgs, std::string originalMsg, std:
         && ((detected_language.empty()) || (expectLang != detected_language))
         && (LLStringUtil::compareInsensitive(translation, originalMsg) != 0))
     {
-        chat.mText += " (" + translation + ")";
+        chat.mText += " (" + LLTranslate::removeNoTranslateTags(translation) + ")";
     }
 
     LLNotificationsUI::LLNotificationManager::instance().onChat(chat, toastArgs);