diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp
index f8fd2f08862d90f59f2912003a14ee6565be2683..754b8bbe96fd7a63dc66219061984e4db13fdcc2 100644
--- a/indra/llui/lllineeditor.cpp
+++ b/indra/llui/lllineeditor.cpp
@@ -1262,7 +1262,7 @@ void LLLineEditor::cut()
         deleteSelection();
 
         // Validate new string and rollback the if needed.
-        BOOL need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getWString());
+        BOOL need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getString());
         if (need_to_rollback)
         {
             rollback.doRollback( this );
@@ -1396,7 +1396,7 @@ void LLLineEditor::pasteHelper(bool is_primary)
             deselect();
 
             // Validate new string and rollback the if needed.
-            BOOL need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getWString());
+            BOOL need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getString());
             if (need_to_rollback)
             {
                 rollback.doRollback( this );
@@ -1663,7 +1663,7 @@ BOOL LLLineEditor::handleKeyHere(KEY key, MASK mask )
             // Validate new string and rollback the keystroke if needed.
             if (!need_to_rollback && mPrevalidator)
             {
-                prevalidator_failed = !mPrevalidator.validate(mText.getWString());
+                prevalidator_failed = !mPrevalidator.validate(mText.getString());
                 need_to_rollback |= prevalidator_failed;
             }
 
@@ -1723,7 +1723,7 @@ BOOL LLLineEditor::handleUnicodeCharHere(llwchar uni_char)
         deselect();
 
         // Validate new string and rollback the keystroke if needed.
-        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getWString());
+        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getString());
         if (need_to_rollback)
         {
             rollback.doRollback( this );
@@ -1776,7 +1776,7 @@ void LLLineEditor::doDelete()
         }
 
         // Validate new string and rollback the if needed.
-        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getWString());
+        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getString());
         if (need_to_rollback)
         {
             rollback.doRollback(this);
@@ -2313,7 +2313,7 @@ void LLLineEditor::setFocus( BOOL new_state )
         // fine on 1.15.0.2, since all prevalidate func reject any
         // non-ASCII characters.  I'm not sure on future versions,
         // however.
-        getWindow()->allowLanguageTextInput(this, !mPrevalidator);
+        getWindow()->allowLanguageTextInput(this, TRUE);
     }
 }
 
@@ -2482,7 +2482,7 @@ void LLLineEditor::updateAllowingLanguageInput()
         // test app, no window available
         return;
     }
-    if (hasFocus() && !mReadOnly && !mDrawAsterixes && !mPrevalidator)
+    if (hasFocus() && !mReadOnly && !mDrawAsterixes)
     {
         window->allowLanguageTextInput(this, TRUE);
     }
diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 284252a48d4f4f24b97ab480f5a5c493ac53daf0..f7e2474fde225fa1aea70539cfe7a74a4715a858 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -1051,7 +1051,7 @@ S32 LLTextEditor::execute( TextCmd* cmd )
         mUndoStack.push_front(cmd);
         mLastCmd = cmd;
 
-        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(getViewModel()->getDisplay());
+        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(getViewModel()->getStringValue());
         if (need_to_rollback)
         {
             LLUI::getInstance()->reportBadKeystroke();
diff --git a/indra/llui/lltextvalidate.cpp b/indra/llui/lltextvalidate.cpp
index 9e27ed6232fabe03bf9d10a0f071fdb977fe4bfa..3345e7e26316bb09783cf415788a299c174a2f34 100644
--- a/indra/llui/lltextvalidate.cpp
+++ b/indra/llui/lltextvalidate.cpp
@@ -102,7 +102,7 @@ class ValidatorFloat : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorFloatImpl;
 Validator validateFloat(validatorFloatImpl);
 
@@ -144,7 +144,7 @@ class ValidatorInt : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorIntImpl;
 Validator validateInt(validatorIntImpl);
 
@@ -188,7 +188,7 @@ class ValidatorPositiveS32 : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorPositiveS32Impl;
 Validator validatePositiveS32(validatorPositiveS32Impl);
 
@@ -232,7 +232,7 @@ class ValidatorNonNegativeS32 : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorNonNegativeS32Impl;
 Validator validateNonNegativeS32(validatorNonNegativeS32Impl);
 
@@ -275,7 +275,7 @@ class ValidatorNonNegativeS32NoSpace : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorNonNegativeS32NoSpaceImpl;
 Validator validateNonNegativeS32NoSpace(validatorNonNegativeS32NoSpaceImpl);
 
@@ -302,7 +302,7 @@ class ValidatorAlphaNum : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorAlphaNumImpl;
 Validator validateAlphaNum(validatorAlphaNumImpl);
 
@@ -329,7 +329,7 @@ class ValidatorAlphaNumSpace : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorAlphaNumSpaceImpl;
 Validator validateAlphaNumSpace(validatorAlphaNumSpaceImpl);
 
@@ -358,7 +358,7 @@ class ValidatorASCIIPrintableNoPipe : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorASCIIPrintableNoPipeImpl;
 Validator validateASCIIPrintableNoPipe(validatorASCIIPrintableNoPipeImpl);
 
@@ -385,7 +385,7 @@ class ValidatorASCIIPrintableNoSpace : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorASCIIPrintableNoSpaceImpl;
 Validator validateASCIIPrintableNoSpace(validatorASCIIPrintableNoSpaceImpl);
 
@@ -411,7 +411,7 @@ class ValidatorASCII : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorASCIIImpl;
 Validator validateASCII(validatorASCIIImpl);
 
@@ -430,7 +430,7 @@ class ValidatorASCIINoLeadingSpace : public ValidatorASCII
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorASCIINoLeadingSpaceImpl;
 Validator validateASCIINoLeadingSpace(validatorASCIINoLeadingSpaceImpl);
 
@@ -457,7 +457,7 @@ class ValidatorASCIIWithNewLine : public ValidatorImpl
 
 public:
     /*virtual*/ bool validate(const std::string& str) override { return validate<char>(str); }
-    /*virtual*/ bool validate(const LLWString& str) override { return validate<llwchar>(str); }
+    /*virtual*/ bool validate(const LLWString& str) override { return validate<char>(wstring_to_utf8str(str)); }
 } validatorASCIIWithNewLineImpl;
 Validator validateASCIIWithNewLine(validatorASCIIWithNewLineImpl);
 
diff --git a/indra/llwindow/llwindowsdl.cpp b/indra/llwindow/llwindowsdl.cpp
index adb223f543e2be8fc627f6ea485a1e51e8a1cf3d..a4079b9529cad973223c7093ad0d8e0d265a2802 100644
--- a/indra/llwindow/llwindowsdl.cpp
+++ b/indra/llwindow/llwindowsdl.cpp
@@ -1762,8 +1762,6 @@ void LLWindowSDL::gatherInput()
             gKeyboard->handleKeyDown(mKeyVirtualKey, mKeyModifiers);
             if (mKeyVirtualKey == SDLK_RETURN || mKeyVirtualKey == SDLK_KP_ENTER)
                 handleUnicodeUTF16(SDLK_RETURN, gKeyboard->currentMask(FALSE));
-            if (!mLanguageTextInputAllowed && isascii(mKeyVirtualKey))
-                mCallbacks->handleUnicodeChar(utf8str_to_wchar(std::string(1, (char)mKeyVirtualKey)), mKeyModifiers);
             // part of the fix for SL-13243
             if (SDLCheckGrabbyKeys(event.key.keysym.sym, TRUE) != 0)
                 SDLReallyCaptureInput(TRUE);
diff --git a/indra/newview/llurllineeditorctrl.cpp b/indra/newview/llurllineeditorctrl.cpp
index 058b6e6862015a9b36dbe5b797ea5d54fc277854..ca6ff69d1bb9e9c83e1b2a07b50ac0c5463eb2de 100644
--- a/indra/newview/llurllineeditorctrl.cpp
+++ b/indra/newview/llurllineeditorctrl.cpp
@@ -62,7 +62,7 @@ void LLURLLineEditor::cut()
         deleteSelection();
 
         // Validate new string and rollback the if needed.
-        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getWString());
+        bool need_to_rollback = mPrevalidator && !mPrevalidator.validate(mText.getString());
         if( need_to_rollback )
         {
             rollback.doRollback( this );