diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp
index 06a682c9058bed45e720e474b140ba7a6d560ea9..05261a65dec7f75e9b50227327f66b5eb9cc44fe 100644
--- a/indra/newview/llpanelgroupinvite.cpp
+++ b/indra/newview/llpanelgroupinvite.cpp
@@ -36,6 +36,7 @@
 #include "llagent.h"
 #include "llfloateravatarpicker.h"
 #include "llbutton.h"
+#include "llcallingcard.h"
 #include "llcombobox.h"
 #include "llgroupactions.h"
 #include "llgroupmgr.h"
@@ -405,16 +406,13 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
 	{
 		LLUUID agent_id = agent_ids[i];
 		LLViewerObject* dest = gObjectList.findObject(agent_id);
+		std::string fullname;
 		if(dest && dest->isAvatar())
 		{
-			std::string fullname;
-			LLSD args;
 			LLNameValue* nvfirst = dest->getNVPair("FirstName");
 			LLNameValue* nvlast = dest->getNVPair("LastName");
 			if(nvfirst && nvlast)
 			{
-				args["FIRST"] = std::string(nvfirst->getString());
-				args["LAST"] = std::string(nvlast->getString());
 				fullname = std::string(nvfirst->getString()) + " " + std::string(nvlast->getString());
 			}
 			if (!fullname.empty())
@@ -427,10 +425,44 @@ void LLPanelGroupInvite::addUsers(std::vector<LLUUID>& agent_ids)
 				names.push_back("(Unknown)");
 			}
 		}
+		else
+		{
+			//looks like user try to invite offline friend
+			//for offline avatar_id gObjectList.findObject() will return null
+			//so we need to do this additional search in avatar tracker, see EXT-4732
+			if (LLAvatarTracker::instance().isBuddy(agent_id))
+			{
+				if (!gCacheName->getFullName(agent_id, fullname))
+				{
+					// actually it should happen, just in case
+					gCacheName->get(LLUUID(agent_id), false, boost::bind(
+							&LLPanelGroupInvite::addUserCallback, this, _1, _2,
+							_3));
+					// for this special case!
+					//when there is no cached name we should remove resident from agent_ids list to avoid breaking of sequence
+					// removed id will be added in callback
+					agent_ids.erase(agent_ids.begin() + i);
+				}
+				else
+				{
+					names.push_back(fullname);
+				}
+			}
+		}
 	}
 	mImplementation->addUsers(names, agent_ids);
 }
 
+void LLPanelGroupInvite::addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name)
+{
+	std::vector<std::string> names;
+	std::vector<LLUUID> agent_ids;
+	std::string full_name = first_name + " " + last_name;
+	agent_ids.push_back(id);
+	names.push_back(first_name + " " + last_name);
+
+	mImplementation->addUsers(names, agent_ids);
+}
 void LLPanelGroupInvite::draw()
 {
 	LLPanel::draw();
diff --git a/indra/newview/llpanelgroupinvite.h b/indra/newview/llpanelgroupinvite.h
index 37135b488ada716f6557bd3a53ec3dfc7ac5802c..b095dd23950cba235f7d184de598aed95b39bd6a 100644
--- a/indra/newview/llpanelgroupinvite.h
+++ b/indra/newview/llpanelgroupinvite.h
@@ -43,6 +43,10 @@ class LLPanelGroupInvite
 	~LLPanelGroupInvite();
 	
 	void addUsers(std::vector<LLUUID>& agent_ids);
+	/**
+	 * this callback is being used to add a user whose fullname isn't been loaded before invoking of addUsers().
+	 */  
+	void addUserCallback(const LLUUID& id, const std::string& first_name, const std::string& last_name);
 	void clear();
 	void update();
 
diff --git a/indra/newview/llviewerobjectlist.h b/indra/newview/llviewerobjectlist.h
index ace5c5038e7d39d16d32f0b137eaaf86dd3391f7..2858081dc908cbdaa97dc4de41c1fc2a05a76b24 100644
--- a/indra/newview/llviewerobjectlist.h
+++ b/indra/newview/llviewerobjectlist.h
@@ -233,6 +233,10 @@ class LLDebugBeacon
 extern LLViewerObjectList gObjectList;
 
 // Inlines
+/**
+ * Note:
+ * it will return NULL for offline avatar_id 
+ */
 inline LLViewerObject *LLViewerObjectList::findObject(const LLUUID &id)
 {
 	std::map<LLUUID, LLPointer<LLViewerObject> >::iterator iter = mUUIDObjectMap.find(id);