diff --git a/indra/newview/llclassifiedstatsresponder.cpp b/indra/newview/llclassifiedstatsresponder.cpp
index ecd187909043b79c6f41f61af642cdc54dd05ba6..95f17aa7bafb7aa3e7383813abe795a44e416d39 100644
--- a/indra/newview/llclassifiedstatsresponder.cpp
+++ b/indra/newview/llclassifiedstatsresponder.cpp
@@ -43,11 +43,12 @@
 #include "llview.h"
 #include "message.h"
 
-LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLHandle<LLView> classified_panel_handle, LLUUID classified_id)
-: mClassifiedPanelHandle(classified_panel_handle),
+LLClassifiedStatsResponder::LLClassifiedStatsResponder(LLUUID classified_id)
+:
 mClassifiedID(classified_id)
 {
 }
+
 /*virtual*/
 void LLClassifiedStatsResponder::result(const LLSD& content)
 {
@@ -58,17 +59,12 @@ void LLClassifiedStatsResponder::result(const LLSD& content)
 	S32 search_map = content["search_map_clicks"].asInteger();
 	S32 search_profile = content["search_profile_clicks"].asInteger();
 
-	LLPanelClassified* classified_panelp = (LLPanelClassified*)mClassifiedPanelHandle.get();
-
-	if(classified_panelp)
-	{
-		classified_panelp->setClickThrough(mClassifiedID, 
-											teleport + search_teleport, 
-											map + search_map,
-											profile + search_profile,
-											true);
-	}
-
+	LLPanelClassifiedInfo::setClickThrough(
+		mClassifiedID, 
+		teleport + search_teleport, 
+		map + search_map,
+		profile + search_profile,
+		true);
 }
 
 /*virtual*/
@@ -77,5 +73,3 @@ void LLClassifiedStatsResponder::error(U32 status, const std::string& reason)
 	llinfos << "LLClassifiedStatsResponder::error("
 		<< status << ": " << reason << ")" << llendl;
 }
-
-
diff --git a/indra/newview/llclassifiedstatsresponder.h b/indra/newview/llclassifiedstatsresponder.h
index 9c52ed5ae16f3b3c752f61e282d598c909dca7b8..4a74f7b1298b30040d3ce576609aa1da99976dbc 100644
--- a/indra/newview/llclassifiedstatsresponder.h
+++ b/indra/newview/llclassifiedstatsresponder.h
@@ -40,7 +40,7 @@
 class LLClassifiedStatsResponder : public LLHTTPClient::Responder
 {
 public:
-	LLClassifiedStatsResponder(LLHandle<LLView> classified_panel_handle, LLUUID classified_id);
+	LLClassifiedStatsResponder(LLUUID classified_id);
 	//If we get back a normal response, handle it here
 	virtual void result(const LLSD& content);
 	//If we get back an error (not found, etc...), handle it here
@@ -48,7 +48,6 @@ class LLClassifiedStatsResponder : public LLHTTPClient::Responder
 	virtual void error(U32 status, const std::string& reason);
 
 protected:
-	LLHandle<LLView> mClassifiedPanelHandle;
 	LLUUID mClassifiedID;
 };
 
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index a6b72c051001616609f14181da603afee83c983f..6f0b7df9350c63696e466f4a3985c3fdaacdeb84 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -41,6 +41,7 @@
 #include "lldir.h"
 #include "lldispatcher.h"
 #include "llfloaterreg.h"
+#include "llhttpclient.h"
 #include "llnotifications.h"
 #include "llnotificationsutil.h"
 #include "llparcel.h"
@@ -74,7 +75,6 @@
 #include "lltrans.h"
 #include "llscrollcontainer.h"
 #include "llstatusbar.h"
-#include "llsidetray.h"
 
 const S32 MINIMUM_PRICE_FOR_LISTING = 50;	// L$
 const S32 MATURE_UNDEFINED = -1;
@@ -84,6 +84,7 @@ const S32 DECLINE_TO_STATE = 0;
 
 //static
 std::list<LLPanelClassified*> LLPanelClassified::sAllPanels;
+std::list<LLPanelClassifiedInfo*> LLPanelClassifiedInfo::sAllPanels;
 
 // "classifiedclickthrough"
 // strings[0] = classified_id
@@ -105,11 +106,8 @@ class LLDispatchClassifiedClickThrough : public LLDispatchHandler
 		S32 map_clicks = atoi(strings[2].c_str());
 		S32 profile_clicks = atoi(strings[3].c_str());
 
-		static LLPanelClassifiedInfo* info_panel =
-			dynamic_cast<LLPanelClassifiedInfo*>(LLSideTray::getInstance()->getPanel("panel_classified_info"));
-
-		if (info_panel)
-			info_panel->setClickThrough(classified_id, teleport_clicks, map_clicks, profile_clicks);
+		LLPanelClassifiedInfo::setClickThrough(
+			classified_id, teleport_clicks, map_clicks, profile_clicks, false);
 
 		return true;
 	}
@@ -501,7 +499,7 @@ void LLPanelClassified::sendClassifiedInfoRequest()
 		if (!url.empty())
 		{
 			llinfos << "Classified stat request via capability" << llendl;
-			LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(((LLView*)this)->getHandle(), mClassifiedID));
+			LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(mClassifiedID));
 		}
 	}
 }
@@ -1162,11 +1160,19 @@ LLPanelClassifiedInfo::LLPanelClassifiedInfo()
  , mScrollingPanelMinHeight(0)
  , mScrollingPanelWidth(0)
  , mSnapshotStreched(false)
+ , mTeleportClicksOld(0)
+ , mMapClicksOld(0)
+ , mProfileClicksOld(0)
+ , mTeleportClicksNew(0)
+ , mMapClicksNew(0)
+ , mProfileClicksNew(0)
 {
+	sAllPanels.push_back(this);
 }
 
 LLPanelClassifiedInfo::~LLPanelClassifiedInfo()
 {
+	sAllPanels.remove(this);
 }
 
 // static
@@ -1252,6 +1258,18 @@ void LLPanelClassifiedInfo::onOpen(const LLSD& key)
 	LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
 	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
 	gGenericDispatcher.addHandler("classifiedclickthrough", &sClassifiedClickThrough);
+
+	// While we're at it let's get the stats from the new table if that
+	// capability exists.
+	std::string url = gAgent.getRegion()->getCapability("SearchStatRequest");
+	if (!url.empty())
+	{
+		llinfos << "Classified stat request via capability" << llendl;
+		LLSD body;
+		body["classified_id"] = getClassifiedId();
+		LLHTTPClient::post(url, body, new LLClassifiedStatsResponder(getClassifiedId()));
+	}
+
 	setInfoLoaded(false);
 }
 
@@ -1301,6 +1319,7 @@ void LLPanelClassifiedInfo::resetData()
 	mPosGlobal.clearVec();
 	childSetValue("category", LLStringUtil::null);
 	childSetValue("content_type", LLStringUtil::null);
+	childSetText("click_through_text", LLStringUtil::null);
 }
 
 void LLPanelClassifiedInfo::resetControls()
@@ -1363,19 +1382,60 @@ LLUUID LLPanelClassifiedInfo::getSnapshotId()
 	return childGetValue("classified_snapshot").asUUID();
 }
 
+// static
 void LLPanelClassifiedInfo::setClickThrough(
 	const LLUUID& classified_id,
 	S32 teleport,
 	S32 map,
-	S32 profile)
+	S32 profile,
+	bool from_new_table)
 {
-	static LLUIString ct_str = getString("click_through_text_fmt");
+	llinfos << "Click-through data for classified " << classified_id << " arrived: ["
+			<< teleport << ", " << map << ", " << profile << "] ("
+			<< (from_new_table ? "new" : "old") << ")" << llendl;
 
-	ct_str.setArg("[TELEPORT]",	llformat("%d", teleport));
-	ct_str.setArg("[MAP]",		llformat("%d", map));
-	ct_str.setArg("[PROFILE]",	llformat("%d", profile));
+	for (panel_list_t::iterator iter = sAllPanels.begin(); iter != sAllPanels.end(); ++iter)
+	{
+		LLPanelClassifiedInfo* self = *iter;
+		if (self->getClassifiedId() != classified_id)
+		{
+			continue;
+		}
 
-	childSetText("click_through_text", ct_str.getString());
+		// *HACK: Skip LLPanelClassifiedEdit instances: they don't display clicks data.
+		// Those instances should not be in the list at all.
+		if (typeid(*self) != typeid(LLPanelClassifiedInfo))
+		{
+			continue;
+		}
+
+		llinfos << "Updating classified info panel" << llendl;
+
+		// We need to check to see if the data came from the new stat_table 
+		// or the old classified table. We also need to cache the data from 
+		// the two separate sources so as to display the aggregate totals.
+
+		if (from_new_table)
+		{
+			self->mTeleportClicksNew = teleport;
+			self->mMapClicksNew = map;
+			self->mProfileClicksNew = profile;
+		}
+		else
+		{
+			self->mTeleportClicksOld = teleport;
+			self->mMapClicksOld = map;
+			self->mProfileClicksOld = profile;
+		}
+
+		static LLUIString ct_str = self->getString("click_through_text_fmt");
+
+		ct_str.setArg("[TELEPORT]",	llformat("%d", self->mTeleportClicksNew + self->mTeleportClicksOld));
+		ct_str.setArg("[MAP]",		llformat("%d", self->mMapClicksNew + self->mMapClicksOld));
+		ct_str.setArg("[PROFILE]",	llformat("%d", self->mProfileClicksNew + self->mProfileClicksOld));
+
+		self->childSetText("click_through_text", ct_str.getString());
+	}
 }
 
 // static
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 0922150b74f464263ee4469c43b3506a71d40351..43b47d4e3e59c5fafbdf7ff309ca82742ee0ae5f 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -250,11 +250,12 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	void setInfoLoaded(bool loaded) { mInfoLoaded = loaded; }
 
-	void setClickThrough(
+	static void setClickThrough(
 		const LLUUID& classified_id,
 		S32 teleport,
 		S32 map,
-		S32 profile);
+		S32 profile,
+		bool from_new_table);
 
 	void setExitCallback(const commit_callback_t& cb);
 
@@ -299,6 +300,17 @@ class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
 
 	S32 mScrollingPanelMinHeight;
 	S32 mScrollingPanelWidth;
+
+	// Needed for stat tracking
+	S32 mTeleportClicksOld;
+	S32 mMapClicksOld;
+	S32 mProfileClicksOld;
+	S32 mTeleportClicksNew;
+	S32 mMapClicksNew;
+	S32 mProfileClicksNew;
+
+	typedef std::list<LLPanelClassifiedInfo*> panel_list_t;
+	static panel_list_t sAllPanels;
 };
 
 class LLPanelClassifiedEdit : public LLPanelClassifiedInfo