diff --git a/indra/newview/llfirstuse.cpp b/indra/newview/llfirstuse.cpp
index 1ede2be9783cee1ac0d4a4a619397076dc65de4f..c153f8b787635aa8005b8d2ee3424cbc390398a9 100644
--- a/indra/newview/llfirstuse.cpp
+++ b/indra/newview/llfirstuse.cpp
@@ -90,7 +90,7 @@ void LLFirstUse::sit(bool enable)
 }
 
 // static
-void LLFirstUse::inventoryOffer(bool enable)
+void LLFirstUse::newInventory(bool enable)
 {
 	firstUseNotification("FirstInventoryOffer", enable, "HintInventory", LLSD(), LLSD().with("target", "inventory_btn").with("direction", "left"));
 }
diff --git a/indra/newview/llfirstuse.h b/indra/newview/llfirstuse.h
index 9c4ab140061edd1c8cbab1155d84e5f5dd69c796..174706f1f45382ad434220121ae79c52f0fcb223 100644
--- a/indra/newview/llfirstuse.h
+++ b/indra/newview/llfirstuse.h
@@ -95,7 +95,7 @@ class LLFirstUse
 	static void notUsingDestinationGuide(bool enable = true);
 	static void notUsingSidePanel(bool enable = true);
 	static void notMoving(bool enable = true);
-	static void inventoryOffer(bool enable = true);
+	static void newInventory(bool enable = true);
 	static void receiveLindens(bool enable = true);
 	static void useSandbox();
 	
diff --git a/indra/newview/llfloaterbuycontents.cpp b/indra/newview/llfloaterbuycontents.cpp
index 3cdd7b801bf0049555e4edf090e316644f0a2a96..8e93a6bf0310ee5f4e9f20e36db0d0ad3fa61af4 100644
--- a/indra/newview/llfloaterbuycontents.cpp
+++ b/indra/newview/llfloaterbuycontents.cpp
@@ -47,6 +47,7 @@
 #include "llinventorydefines.h"
 #include "llinventoryfunctions.h"
 #include "llinventorymodel.h"	// for gInventory
+#include "llfirstuse.h"
 #include "llfloaterreg.h"
 #include "llfloaterinventory.h"	// for LLInventoryIcon::getIcon
 #include "llnotificationsutil.h"
@@ -289,6 +290,10 @@ void LLFloaterBuyContents::onClickBuy()
 	// it doesn't match region info then sale is canceled.
 	LLSelectMgr::getInstance()->sendBuy(gAgent.getID(), category_id, mSaleInfo);
 
+	// NOTE: do this here instead of on receipt of object, since contents are transfered
+	// via a generic BulkUpdateInventory message with no way of distinguishing it from
+	// other inventory operations
+	LLFirstUse::newInventory();
 	closeFloater();
 }
 
diff --git a/indra/newview/llsidepanelinventory.cpp b/indra/newview/llsidepanelinventory.cpp
index aa29f6cb268fe25bfaeacbc4aedabbe1061731d6..66a8a520af27c664be35971326b6336bcea87567 100644
--- a/indra/newview/llsidepanelinventory.cpp
+++ b/indra/newview/llsidepanelinventory.cpp
@@ -129,7 +129,7 @@ BOOL LLSidepanelInventory::postBuild()
 
 void LLSidepanelInventory::onOpen(const LLSD& key)
 {
-	LLFirstUse::inventoryOffer(false);
+	LLFirstUse::newInventory(false);
 
 	if(key.size() == 0)
 		return;
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 067c0f3a80debcd84ad570497c628c57400e9011..71dff61f413e1f8da68cc792dff3328106391fa2 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -937,6 +937,15 @@ class LLOpenTaskGroupOffer : public LLInventoryAddedObserver
 //one global instance to bind them
 LLOpenTaskOffer* gNewInventoryObserver=NULL;
 
+class LLNewInventoryHintObserver : public LLInventoryAddedObserver
+{
+protected:
+	/*virtual*/ void done()
+	{
+		LLFirstUse::newInventory();
+	}
+};
+
 void start_new_inventory_observer()
 {
 	if (!gNewInventoryObserver) //task offer observer 
@@ -952,6 +961,8 @@ void start_new_inventory_observer()
 		gInventoryMoveObserver = new LLViewerInventoryMoveFromWorldObserver;
 		gInventory.addObserver(gInventoryMoveObserver);
 	}
+
+	gInventory.addObserver(new LLNewInventoryHintObserver());
 }
 
 class LLDiscardAgentOffer : public LLInventoryFetchItemsObserver
@@ -1080,7 +1091,6 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
  
 void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_name)
 {
-	LLFirstUse::inventoryOffer();
 	for (uuid_vec_t::const_iterator obj_iter = objects.begin();
 		 obj_iter != objects.end();
 		 ++obj_iter)
@@ -1765,8 +1775,6 @@ void inventory_offer_handler(LLOfferInfo* info)
 		return;
 	}
 
-	LLFirstUse::inventoryOffer();
-
 	// Avoid the Accept/Discard dialog if the user so desires. JC
 	if (gSavedSettings.getBOOL("AutoAcceptNewInventory")
 		&& (info->mType == LLAssetType::AT_NOTECARD