diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp
index 8c6792bd717b4d77a59d4b9d45dad6c6812bbb16..217aec38e278c5cb05a7e1913782a1c56988d5d2 100644
--- a/indra/llui/lltexteditor.cpp
+++ b/indra/llui/lltexteditor.cpp
@@ -1784,6 +1784,18 @@ BOOL LLTextEditor::handleSpecialKey(const KEY key, const MASK mask)
 				autoIndent();
 			}
 		}
+		else if (mask == MASK_SHIFT)
+		{
+			if( mCursorPos > 0 )
+			{
+				const LLWString& text = getWText();
+				if( '\n' != text[ mCursorPos - 1 ] )
+				{
+					addLineBreakChar();
+					handled = TRUE;
+				}
+			}
+		}
 		else
 		{
 			handled = FALSE;
diff --git a/indra/llui/lltexteditor.h b/indra/llui/lltexteditor.h
index 7d77c1bacd8f3003401450ed9cf430928480f1a6..c7c024cdb47a4c185b91197c70db0969893e3ff1 100644
--- a/indra/llui/lltexteditor.h
+++ b/indra/llui/lltexteditor.h
@@ -213,7 +213,6 @@ class LLTextEditor :
 	bool			getShowContextMenu() const { return mShowContextMenu; }
 
 	void			setPassDelete(BOOL b) { mPassDelete = b; }
-	void			handleNewLine() { addLineBreakChar(FALSE); }
 
 protected:
 	void			showContextMenu(S32 x, S32 y);
diff --git a/indra/newview/llfloaterimnearbychat.cpp b/indra/newview/llfloaterimnearbychat.cpp
index fb2557b80cd8c88dcf5f43db8fe63cd831713226..49937cedefaae65a25be151bcb9161477e72f7bf 100644
--- a/indra/newview/llfloaterimnearbychat.cpp
+++ b/indra/newview/llfloaterimnearbychat.cpp
@@ -426,20 +426,6 @@ BOOL LLFloaterIMNearbyChat::handleKeyHere( KEY key, MASK mask )
 		sendChat(CHAT_TYPE_SHOUT);
 		handled = TRUE;
 	}
-	else if (KEY_RETURN == key && mask == MASK_SHIFT)
-	{
-		// newline
-		if (mInputEditor)
-		{
-			// but don't allow multiple new lines
-			LLWString raw_text = mInputEditor->getWText();
-			if (raw_text[raw_text.length() - 1] != '\n')
-			{
-				mInputEditor->handleNewLine();
-			}
-		}
-		handled = TRUE;
-	}
 
 	if((mask == MASK_ALT) && isTornOff())
 	{