diff --git a/indra/llui/llemojidictionary.cpp b/indra/llui/llemojidictionary.cpp
index c31638b0bf2e1fb98e3a9d18c1c6341187c56ad5..b70a9b2e7a4d76dfb87d15585e5b683b4e53eb99 100644
--- a/indra/llui/llemojidictionary.cpp
+++ b/indra/llui/llemojidictionary.cpp
@@ -178,22 +178,22 @@ LLWString LLEmojiDictionary::findMatchingEmojis(const std::string& needle) const
 const LLEmojiDescriptor* LLEmojiDictionary::getDescriptorFromShortCode(const std::string& short_code) const
 {
 	const auto it = mShortCode2Descr.find(short_code);
-	return (mShortCode2Descr.end() != it) ? &it->second : nullptr;
+	return (mShortCode2Descr.end() != it) ? it->second : nullptr;
 }
 
 std::string LLEmojiDictionary::getNameFromEmoji(llwchar ch) const
 {
 	const auto it = mEmoji2Descr.find(ch);
-	return (mEmoji2Descr.end() != it) ? it->second.Name : LLStringUtil::null;
+	return (mEmoji2Descr.end() != it) ? it->second->Name : LLStringUtil::null;
 }
 
 void LLEmojiDictionary::addEmoji(LLEmojiDescriptor&& descr)
 {
 	mEmojis.push_back(descr);
-	mEmoji2Descr.insert(std::make_pair(descr.Character, mEmojis.back()));
+	mEmoji2Descr.insert(std::make_pair(descr.Character, &mEmojis.back()));
 	for (const std::string& shortCode : descr.ShortCodes)
 	{
-		mShortCode2Descr.insert(std::make_pair(shortCode, mEmojis.back()));
+		mShortCode2Descr.insert(std::make_pair(shortCode, &mEmojis.back()));
 	}
 }
 
diff --git a/indra/llui/llemojidictionary.h b/indra/llui/llemojidictionary.h
index 0cde66371963cb988984cb2dce1baa55544f4433..46a61f1cd715f0bf17c7c90fed4a193552b6e802 100644
--- a/indra/llui/llemojidictionary.h
+++ b/indra/llui/llemojidictionary.h
@@ -66,8 +66,8 @@ class LLEmojiDictionary : public LLParamSingleton<LLEmojiDictionary>, public LLI
 
 private:
 	std::list<LLEmojiDescriptor> mEmojis;
-	std::map<llwchar, const LLEmojiDescriptor&> mEmoji2Descr;
-	std::map<std::string, const LLEmojiDescriptor&> mShortCode2Descr;
+	std::map<llwchar, const LLEmojiDescriptor*> mEmoji2Descr;
+	std::map<std::string, const LLEmojiDescriptor*> mShortCode2Descr;
 };
 
 // ============================================================================
diff --git a/indra/llui/llemojihelper.cpp b/indra/llui/llemojihelper.cpp
index 32471e59a843704db7110cbd41b93f8aa39d6381..1e4c19a183f4fb5c66211a461d3168080b47b363 100644
--- a/indra/llui/llemojihelper.cpp
+++ b/indra/llui/llemojihelper.cpp
@@ -57,7 +57,8 @@ bool LLEmojiHelper::isActive(const LLUICtrl* ctrl_p) const
 // static
 bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S32* pShortCodePos)
 {
-	S32 shortCodePos = cursorPos;
+	// If the cursor is currently on a colon start the check one character further back
+	S32 shortCodePos = (cursorPos == 0 || L':' != wtext[cursorPos - 1]) ? cursorPos : cursorPos - 1;
 
 	auto isPartOfShortcode = [](llwchar ch) {
 		switch (ch)
diff --git a/indra/newview/llpanelemojicomplete.cpp b/indra/newview/llpanelemojicomplete.cpp
index a7058a672489242e06bc1b4fa2f25a745d259166..f890a14e8eddb261c5618ac8b6e6cf512c617af2 100644
--- a/indra/newview/llpanelemojicomplete.cpp
+++ b/indra/newview/llpanelemojicomplete.cpp
@@ -146,9 +146,9 @@ void LLPanelEmojiComplete::reshape(S32 width, S32 height, BOOL called_from_paren
 void LLPanelEmojiComplete::setEmojiHint(const std::string& hint)
 {
 	llwchar curEmoji = (mCurSelected < mEmojis.size()) ? mEmojis.at(mCurSelected) : 0;
-	size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos;
 
 	mEmojis = LLEmojiDictionary::instance().findMatchingEmojis(hint);
+	size_t curEmojiIdx = (curEmoji) ? mEmojis.find(curEmoji) : std::string::npos;
 	mCurSelected = (std::string::npos != curEmojiIdx) ? curEmojiIdx : 0;
 
 	if (mAutoSize)
@@ -168,7 +168,7 @@ size_t LLPanelEmojiComplete::posToIndex(S32 x, S32 y) const
 {
 	if (mRenderRect.pointInRect(x, y))
 	{
-		return llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1);
+		return mScrollPos + llmin((size_t)x / mEmojiWidth, mEmojis.size() - 1);
 	}
 	return npos;
 }
diff --git a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml
index f35105ff7e1a1f1d0694289d2279dcb8b8f80fd3..370f1d174e29f38e3ea7dabc8870f82390f69338 100644
--- a/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml
+++ b/indra/newview/skins/default/xui/en/widgets/emoji_complete.xml
@@ -1,7 +1,10 @@
 <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
 <emoji_complete
+  autosize="false"
   font="EmojiHuge"
   hover_image="ListItem_Over"
+  max_emoji="7"
+  padding="8"
   selected_image="ListItem_Select"
   >
 </emoji_complete>