diff --git a/indra/newview/llavatarpropertiesprocessor.cpp b/indra/newview/llavatarpropertiesprocessor.cpp
index 2942e436efc3b0e4f03fb1fc8376aab8c690e63f..7cda2d31e66ec154a91874b993a04e6913b0acaa 100644
--- a/indra/newview/llavatarpropertiesprocessor.cpp
+++ b/indra/newview/llavatarpropertiesprocessor.cpp
@@ -554,6 +554,36 @@ void LLAvatarPropertiesProcessor::sendPickInfoUpdate(const LLPickData* new_pick)
 	LLAgentPicksInfo::getInstance()->requestNumberOfPicks();
 }
 
+void LLAvatarPropertiesProcessor::sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data)
+{
+	if(!c_data)
+	{
+		return;
+	}
+
+	LLMessageSystem* msg = gMessageSystem;
+
+	msg->newMessage(_PREHASH_ClassifiedInfoUpdate);
+
+	msg->nextBlock(_PREHASH_AgentData);
+	msg->addUUID(_PREHASH_AgentID, gAgent.getID());
+	msg->addUUID(_PREHASH_SessionID, gAgent.getSessionID());
+
+	msg->nextBlock(_PREHASH_Data);
+	msg->addUUID(_PREHASH_ClassifiedID, c_data->classified_id);
+	msg->addU32(_PREHASH_Category, c_data->category);
+	msg->addString(_PREHASH_Name, c_data->name);
+	msg->addString(_PREHASH_Desc, c_data->description);
+	msg->addUUID(_PREHASH_ParcelID, c_data->parcel_id);
+	msg->addU32(_PREHASH_ParentEstate, 0);
+	msg->addUUID(_PREHASH_SnapshotID, c_data->snapshot_id);
+	msg->addVector3d(_PREHASH_PosGlobal, c_data->pos_global);
+	msg->addU8(_PREHASH_ClassifiedFlags, c_data->flags);
+	msg->addS32(_PREHASH_PriceForListing, c_data->price_for_listing);
+
+	gAgent.sendReliableMessage();
+}
+
 void LLAvatarPropertiesProcessor::sendPickInfoRequest(const LLUUID& creator_id, const LLUUID& pick_id)
 {
 	// Must ask for a pick based on the creator id because
diff --git a/indra/newview/llavatarpropertiesprocessor.h b/indra/newview/llavatarpropertiesprocessor.h
index 64964b166552542b9d6abfb72fdf33884cc8d4c6..716c1b8065869026c2026d7b54c296df45193b2d 100644
--- a/indra/newview/llavatarpropertiesprocessor.h
+++ b/indra/newview/llavatarpropertiesprocessor.h
@@ -212,6 +212,8 @@ class LLAvatarPropertiesProcessor
 
 	void sendPickInfoUpdate(const LLPickData* new_pick);
 
+	void sendClassifiedInfoUpdate(const LLAvatarClassifiedInfo* c_data);
+
 	void sendFriendRights(const LLUUID& avatar_id, S32 rights);
 
 	void sendNotes(const LLUUID& avatar_id, const std::string notes);
diff --git a/indra/newview/llpanelclassified.cpp b/indra/newview/llpanelclassified.cpp
index a29c9752e6dc6792f219d78ce1916004ef9b2a98..b118c6813cbc051f7d6b1185d89a5e08b581348e 100644
--- a/indra/newview/llpanelclassified.cpp
+++ b/indra/newview/llpanelclassified.cpp
@@ -1142,3 +1142,493 @@ void LLPanelClassified::setDefaultAccessCombo()
 			break;
 	}
 }
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+
+std::string SET_LOCATION_NOTICE1("(will update after save)");
+
+LLPanelClassifiedInfo::LLPanelClassifiedInfo()
+ : LLPanel()
+{
+}
+
+LLPanelClassifiedInfo::~LLPanelClassifiedInfo()
+{
+}
+
+// static
+LLPanelClassifiedInfo* LLPanelClassifiedInfo::create()
+{
+	LLPanelClassifiedInfo* panel = new LLPanelClassifiedInfo();
+	LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_classified_info.xml");
+	return panel;
+}
+
+BOOL LLPanelClassifiedInfo::postBuild()
+{
+	childSetAction("back_btn", boost::bind(&LLPanelClassifiedInfo::onExit, this), NULL);
+
+	return TRUE;
+}
+
+void LLPanelClassifiedInfo::setExitCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("back_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedInfo::onOpen(const LLSD& key)
+{
+	LLUUID avatar_id = key["avatar_id"];
+	if(avatar_id.isNull())
+	{
+		return;
+	}
+
+	if(getAvatarId().notNull())
+	{
+		LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+	}
+
+	setAvatarId(avatar_id);
+
+	resetData();
+	resetControls();
+
+	setClassifiedId(key["classified_id"]);
+	setClassifiedName(key["name"]);
+	setDescription(key["desc"]);
+	setSnapshotId(key["snapshot_id"]);
+
+	LLAvatarPropertiesProcessor::getInstance()->addObserver(getAvatarId(), this);
+	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoRequest(getClassifiedId());
+}
+
+void LLPanelClassifiedInfo::processProperties(void* data, EAvatarProcessorType type)
+{
+	if(APT_CLASSIFIED_INFO == type)
+	{
+		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+		if(data && getClassifiedId() == c_info->classified_id)
+		{
+			setClassifiedName(c_info->name);
+			setDescription(c_info->description);
+			setSnapshotId(c_info->snapshot_id);
+			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
+			childSetValue("category", LLClassifiedInfo::sCategories[c_info->category]);
+
+			bool mature = is_cf_mature(c_info->flags);
+			childSetValue("content_type", mature ? "Mature" : "PG Content");
+			childSetValue("auto_renew", is_cf_auto_renew(c_info->flags));
+
+			childSetTextArg("price_for_listing", "[PRICE]", llformat("%d", c_info->price_for_listing));
+		}
+	}
+}
+
+void LLPanelClassifiedInfo::resetData()
+{
+	setClassifiedName(LLStringUtil::null);
+	setDescription(LLStringUtil::null);
+	setClassifiedLocation(LLStringUtil::null);
+	setClassifiedId(LLUUID::null);
+	setSnapshotId(LLUUID::null);
+	mPosGlobal.clearVec();
+}
+
+void LLPanelClassifiedInfo::resetControls()
+{
+	if(getAvatarId() == gAgent.getID())
+	{
+		childSetEnabled("edit_btn", TRUE);
+		childSetVisible("edit_btn", TRUE);
+	}
+	else
+	{
+		childSetEnabled("edit_btn", FALSE);
+		childSetVisible("edit_btn", FALSE);
+	}
+}
+
+void LLPanelClassifiedInfo::setClassifiedName(const std::string& name)
+{
+	childSetValue("classified_name", name);
+}
+
+std::string LLPanelClassifiedInfo::getClassifiedName()
+{
+	return childGetValue("classified_name").asString();
+}
+
+void LLPanelClassifiedInfo::setDescription(const std::string& desc)
+{
+	childSetValue("classified_desc", desc);
+}
+
+std::string LLPanelClassifiedInfo::getDescription()
+{
+	return childGetValue("classified_desc").asString();
+}
+
+void LLPanelClassifiedInfo::setClassifiedLocation(const std::string& location)
+{
+	childSetValue("classified_location", location);
+}
+
+void LLPanelClassifiedInfo::setSnapshotId(const LLUUID& id)
+{
+	childSetValue("classified_snapshot", id);
+}
+
+LLUUID LLPanelClassifiedInfo::getSnapshotId()
+{
+	return childGetValue("classified_snapshot").asUUID();
+}
+
+// static
+std::string LLPanelClassifiedInfo::createLocationText(
+	const std::string& original_name, 
+	const std::string& sim_name, 
+	const LLVector3d& pos_global)
+{
+	std::string location_text;
+	
+	location_text.append(original_name);
+
+	if (!sim_name.empty())
+	{
+		if (!location_text.empty()) 
+			location_text.append(", ");
+		location_text.append(sim_name);
+	}
+
+	if (!location_text.empty()) 
+		location_text.append(" ");
+
+	if (!pos_global.isNull())
+	{
+		S32 region_x = llround((F32)pos_global.mdV[VX]) % REGION_WIDTH_UNITS;
+		S32 region_y = llround((F32)pos_global.mdV[VY]) % REGION_WIDTH_UNITS;
+		S32 region_z = llround((F32)pos_global.mdV[VZ]);
+		location_text.append(llformat(" (%d, %d, %d)", region_x, region_y, region_z));
+	}
+
+	return location_text;
+}
+
+void LLPanelClassifiedInfo::onExit()
+{
+	LLAvatarPropertiesProcessor::getInstance()->removeObserver(getAvatarId(), this);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////
+
+LLPanelClassifiedEdit::LLPanelClassifiedEdit()
+ : LLPanelClassifiedInfo()
+ , mSnapshotCtrl(NULL)
+ , mNewClassified(false)
+{
+}
+
+LLPanelClassifiedEdit::~LLPanelClassifiedEdit()
+{
+}
+
+//static
+LLPanelClassifiedEdit* LLPanelClassifiedEdit::create()
+{
+	LLPanelClassifiedEdit* panel = new LLPanelClassifiedEdit();
+	LLUICtrlFactory::getInstance()->buildPanel(panel, "panel_edit_classified.xml");
+	return panel;
+}
+
+BOOL LLPanelClassifiedEdit::postBuild()
+{
+	LLPanelClassifiedInfo::postBuild();
+
+	mSnapshotCtrl = getChild<LLTextureCtrl>("classified_snapshot");
+	mSnapshotCtrl->setOnSelectCallback(boost::bind(&LLPanelClassifiedEdit::onSnapshotChanged, this, _1));
+
+	LLLineEditor* line_edit = getChild<LLLineEditor>("classified_name");
+	line_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+
+	LLTextEditor* text_edit = getChild<LLTextEditor>("classified_desc");
+	text_edit->setKeystrokeCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+
+	LLComboBox* combobox = getChild<LLComboBox>( "category");
+	LLClassifiedInfo::cat_map::iterator iter;
+	for (iter = LLClassifiedInfo::sCategories.begin();
+		iter != LLClassifiedInfo::sCategories.end();
+		iter++)
+	{
+		combobox->add(LLTrans::getString(iter->second), (void *)((intptr_t)iter->first), ADD_BOTTOM);
+	}
+	
+	combobox->setCurrentByIndex(0);
+	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+
+	combobox = getChild<LLComboBox>("content_type");
+	combobox->setCommitCallback(boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this));
+
+	childSetCommitCallback("price_for_listing", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+	childSetCommitCallback("auto_renew", boost::bind(&LLPanelClassifiedEdit::onClassifiedChanged, this), NULL);
+
+	childSetAction("save_changes_btn", boost::bind(&LLPanelClassifiedEdit::onClickSave, this));
+	childSetAction("set_to_curr_location_btn", boost::bind(&LLPanelClassifiedEdit::onClickSetLocation, this));
+
+	return TRUE;
+}
+
+void LLPanelClassifiedEdit::onOpen(const LLSD& key)
+{
+	LLUUID classified_id = key["classified_id"];
+
+	if(classified_id.isNull())
+	{
+		mNewClassified = true;
+		setAvatarId(gAgent.getID());
+
+		resetData();
+		resetControls();
+
+		setPosGlobal(gAgent.getPositionGlobal());
+
+		LLUUID snapshot_id = LLUUID::null;
+		std::string desc;
+		LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+
+		if(parcel)
+		{
+			desc = parcel->getDesc();
+			snapshot_id = parcel->getSnapshotID();
+		}
+
+		std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish");
+		LLViewerRegion* region = gAgent.getRegion();
+		if (region)
+		{
+			region_name = region->getName();
+		}
+
+		childSetValue("classified_name", makeClassifiedName());
+		childSetValue("classified_desc", desc);
+		setSnapshotId(snapshot_id);
+		setClassifiedLocation(createLocationText(region_name, LLStringUtil::null, getPosGlobal()));
+		setParcelId(LLUUID::null);
+
+		enableSaveButton(true);
+	}
+	else
+	{
+		mNewClassified = false;
+
+		LLPanelClassifiedInfo::onOpen(key);
+		enableSaveButton(false);
+	}
+
+	resetDirty();
+}
+
+void LLPanelClassifiedEdit::processProperties(void* data, EAvatarProcessorType type)
+{
+	if(APT_CLASSIFIED_INFO == type)
+	{
+		LLAvatarClassifiedInfo* c_info = static_cast<LLAvatarClassifiedInfo*>(data);
+		if(data && getClassifiedId() == c_info->classified_id)
+		{
+			setClassifiedName(c_info->name);
+			setDescription(c_info->description);
+			setSnapshotId(c_info->snapshot_id);
+			setClassifiedLocation(createLocationText(c_info->parcel_name, c_info->sim_name, c_info->pos_global));
+			getChild<LLComboBox>("category")->setCurrentByIndex(c_info->category + 1);
+			getChild<LLComboBox>("category")->resetDirty();
+
+			bool mature = is_cf_mature(c_info->flags);
+			bool auto_renew = is_cf_auto_renew(c_info->flags);
+
+			getChild<LLComboBox>("content_type")->setCurrentByIndex(mature ? 0 : 1);
+			childSetValue("auto_renew", auto_renew);
+			childSetValue("price_for_listing", c_info->price_for_listing);
+
+			resetDirty();
+		}
+	}
+}
+
+BOOL LLPanelClassifiedEdit::isDirty() const
+{
+	if(mNewClassified)
+		return TRUE;
+
+	BOOL dirty = false;
+
+	dirty |= LLPanelClassifiedInfo::isDirty();
+	dirty |= mSnapshotCtrl->isDirty();
+	dirty |= getChild<LLLineEditor>("classified_name")->isDirty();
+	dirty |= getChild<LLTextEditor>("classified_desc")->isDirty();
+	dirty |= getChild<LLComboBox>("category")->isDirty();
+	dirty |= getChild<LLComboBox>("content_type")->isDirty();
+	dirty |= getChild<LLUICtrl>("auto_renew")->isDirty();
+	dirty |= getChild<LLUICtrl>("price_for_listing")->isDirty();
+
+	return dirty;
+}
+
+void LLPanelClassifiedEdit::resetDirty()
+{
+	LLPanelClassifiedInfo::resetDirty();
+	mSnapshotCtrl->resetDirty();
+	getChild<LLUICtrl>("classified_name")->resetDirty();
+	getChild<LLUICtrl>("classified_desc")->resetDirty();
+	getChild<LLUICtrl>("category")->resetDirty();
+	getChild<LLUICtrl>("content_type")->resetDirty();
+	getChild<LLUICtrl>("auto_renew")->resetDirty();
+	getChild<LLUICtrl>("price_for_listing")->resetDirty();
+}
+
+void LLPanelClassifiedEdit::setSaveCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("save_changes_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedEdit::setCancelCallback(const commit_callback_t& cb)
+{
+	getChild<LLButton>("cancel_btn")->setClickedCallback(cb);
+}
+
+void LLPanelClassifiedEdit::resetControls()
+{
+	LLPanelClassifiedInfo::resetControls();
+
+	getChild<LLComboBox>("category")->setCurrentByIndex(0);
+	getChild<LLComboBox>("content_type")->setCurrentByIndex(0);
+	childSetValue("auto_renew", false);
+	childSetValue("price_for_listing", MINIMUM_PRICE_FOR_LISTING);
+}
+
+void LLPanelClassifiedEdit::sendUpdate()
+{
+	LLAvatarClassifiedInfo c_data;
+
+	if(getClassifiedId().isNull())
+	{
+		LLUUID id = getClassifiedId();
+		id.generate();
+		setClassifiedId(id);
+	}
+
+	c_data.agent_id = gAgent.getID();
+	c_data.classified_id = getClassifiedId();
+	c_data.category = getCategory();
+	c_data.name = getClassifiedName();
+	c_data.description = getDescription();
+	c_data.parcel_id = getParcelId();
+	c_data.snapshot_id = getSnapshotId();
+	c_data.pos_global = getPosGlobal();
+	c_data.flags = getClassifiedFlags();
+	c_data.price_for_listing = getPriceForListing();
+
+	LLAvatarPropertiesProcessor::getInstance()->sendClassifiedInfoUpdate(&c_data);
+}
+
+U32 LLPanelClassifiedEdit::getCategory()
+{
+	LLComboBox* cat_cb = getChild<LLComboBox>("category");
+	return cat_cb->getCurrentIndex() + 1;
+}
+
+U8 LLPanelClassifiedEdit::getClassifiedFlags()
+{
+	bool auto_renew = childGetValue("auto_renew").asBoolean();
+
+	LLComboBox* content_cb = getChild<LLComboBox>("content_type");
+	bool mature = content_cb->getCurrentIndex() == 0;
+	
+	return pack_classified_flags_request(auto_renew, false, mature, false);;
+}
+
+void LLPanelClassifiedEdit::enableSaveButton(bool enable)
+{
+	childSetEnabled("save_changes_btn", enable);
+}
+
+std::string LLPanelClassifiedEdit::makeClassifiedName()
+{
+	std::string name;
+
+	LLParcel* parcel = LLViewerParcelMgr::getInstance()->getAgentParcel();
+	if(parcel)
+	{
+		name = parcel->getName();
+	}
+
+	if(!name.empty())
+		return name;
+
+	LLViewerRegion* region = gAgent.getRegion();
+	if(region)
+	{
+		name = region->getName();
+	}
+
+	return name;
+}
+
+S32 LLPanelClassifiedEdit::getPriceForListing()
+{
+	return childGetValue("price_for_listing").asInteger();
+}
+
+void LLPanelClassifiedEdit::onClickSetLocation()
+{
+	setPosGlobal(gAgent.getPositionGlobal());
+	setParcelId(LLUUID::null);
+
+	std::string region_name = LLTrans::getString("ClassifiedUpdateAfterPublish");
+	LLViewerRegion* region = gAgent.getRegion();
+	if (region)
+	{
+		region_name = region->getName();
+	}
+
+	setClassifiedLocation(createLocationText(region_name, LLStringUtil::null, getPosGlobal()));
+
+	// mark classified as dirty
+	setValue(LLSD());
+
+	onClassifiedChanged();
+}
+
+void LLPanelClassifiedEdit::onSnapshotChanged(LLUICtrl* ctrl)
+{
+
+}
+
+void LLPanelClassifiedEdit::onClassifiedChanged()
+{
+	if(isDirty())
+	{
+		enableSaveButton(true);
+	}
+	else
+	{
+		enableSaveButton(false);
+	}
+}
+
+void LLPanelClassifiedEdit::onClickSave()
+{
+	sendUpdate();
+
+//	LLAvatarPropertiesProcessor::getInstance()->sendAvatarClassifiedsRequest(getAvatarId());
+
+	LLSD params;
+	params["action"] = "save_classified";
+	notifyParent(params);
+}
+
+//EOF
diff --git a/indra/newview/llpanelclassified.h b/indra/newview/llpanelclassified.h
index 417eddf460622b331b3cc55af2ce03271df6e150..eccc83cf5398ba0720f4616bf54cb373892b1957 100644
--- a/indra/newview/llpanelclassified.h
+++ b/indra/newview/llpanelclassified.h
@@ -198,5 +198,131 @@ class LLFloaterPriceForListing
 	void* mUserData;
 };
 
+#include "llavatarpropertiesprocessor.h"
+
+class LLPanelClassifiedInfo : public LLPanel, public LLAvatarPropertiesObserver
+{
+public:
+
+	static LLPanelClassifiedInfo* create();
+
+	virtual ~LLPanelClassifiedInfo();
+
+	virtual void setExitCallback(const commit_callback_t& cb);
+
+	/*virtual*/ void onOpen(const LLSD& key);
+
+	/*virtual*/ BOOL postBuild();
+
+	/*virtual*/ void processProperties(void* data, EAvatarProcessorType type);
+
+	virtual void setAvatarId(const LLUUID& avatar_id) { mAvatarId = avatar_id; }
+
+	LLUUID& getAvatarId() { return mAvatarId; }
+
+	virtual void setSnapshotId(const LLUUID& id);
+
+	virtual LLUUID getSnapshotId();
+
+	virtual void setClassifiedId(const LLUUID& id) { mClassifiedId = id; }
+
+	virtual LLUUID& getClassifiedId() { return mClassifiedId; }
+
+	virtual void setClassifiedName(const std::string& name);
+
+	virtual std::string getClassifiedName();
+
+	virtual void setDescription(const std::string& desc);
+
+	virtual std::string getDescription();
+
+	virtual void setClassifiedLocation(const std::string& location);
+
+	virtual void setPosGlobal(const LLVector3d& pos) { mPosGlobal = pos; }
+
+	virtual LLVector3d& getPosGlobal() { return mPosGlobal; }
+
+protected:
+
+	LLPanelClassifiedInfo();
+
+	virtual void resetData();
+
+	virtual void resetControls();
+
+	static std::string createLocationText(
+		const std::string& original_name,
+		const std::string& sim_name, 
+		const LLVector3d& pos_global);
+
+	void onClickMap();
+	void onClickTeleport();
+	void onClickBack();
+	void onExit();
+
+private:
+
+	LLUUID mAvatarId;
+	LLUUID mClassifiedId;
+	LLVector3d mPosGlobal;
+};
+
+class LLPanelClassifiedEdit : public LLPanelClassifiedInfo
+{
+public:
+
+	static LLPanelClassifiedEdit* create();
+
+	virtual ~LLPanelClassifiedEdit();
+
+	BOOL postBuild();
+
+	void onOpen(const LLSD& key);
+
+	void processProperties(void* data, EAvatarProcessorType type);
+
+	BOOL isDirty() const;
+
+	void resetDirty();
+
+	void setSaveCallback(const commit_callback_t& cb);
+
+	void setCancelCallback(const commit_callback_t& cb);
+
+	void resetControls();
+
+	virtual bool isNewClassified() { return mNewClassified; }
+
+protected:
+
+	LLPanelClassifiedEdit();
+
+	void sendUpdate();
+
+	U32 getCategory();
+
+	void enableSaveButton(bool enable);
+
+	std::string makeClassifiedName();
+
+	void setParcelId(const LLUUID& id) { mParcelId = id; }
+
+	LLUUID getParcelId() { return mParcelId; }
+
+	S32 getPriceForListing();
+
+	U8 getClassifiedFlags();
+
+	void onClickSetLocation();
+	void onSnapshotChanged(LLUICtrl* ctrl);
+	void onClassifiedChanged();
+	void onClickSave();
+
+private:
+	LLTextureCtrl* mSnapshotCtrl;
+
+	LLUUID mParcelId;
+	bool mNewClassified;
+};
 
 #endif // LL_LLPANELCLASSIFIED_H
diff --git a/indra/newview/llpanelpicks.cpp b/indra/newview/llpanelpicks.cpp
index 78f8152b1016439c16c89a206d4a99556bba72aa..7b7667c147cd7cccf0a88102c56dd613348037c3 100644
--- a/indra/newview/llpanelpicks.cpp
+++ b/indra/newview/llpanelpicks.cpp
@@ -52,6 +52,7 @@
 #include "llpanelavatar.h"
 #include "llpanelprofile.h"
 #include "llpanelpick.h"
+#include "llpanelclassified.h"
 
 static const std::string XML_BTN_NEW = "new_btn";
 static const std::string XML_BTN_DELETE = "trash_btn";
@@ -70,6 +71,33 @@ static const std::string CLASSIFIED_NAME("classified_name");
 
 static LLRegisterPanelClassWrapper<LLPanelPicks> t_panel_picks("panel_picks");
 
+//////////////////////////////////////////////////////////////////////////
+
+class LLClassifiedClickThrough : public LLDispatchHandler
+{
+public:
+	virtual bool operator()(
+		const LLDispatcher* dispatcher,
+		const std::string& key,
+		const LLUUID& invoice,
+		const sparam_t& strings)
+	{
+		if (strings.size() != 4) 
+			return false;
+
+		// 		LLUUID classified_id(strings[0]);
+		// 		S32 teleport_clicks = atoi(strings[1].c_str());
+		// 		S32 map_clicks = atoi(strings[2].c_str());
+		// 		S32 profile_clicks = atoi(strings[3].c_str());
+		// 		LLPanelClassified::setClickThrough(classified_id, teleport_clicks,
+		// 			map_clicks,
+		// 			profile_clicks,
+		// 			false);
+
+		return true;
+	}
+};
+
 //-----------------------------------------------------------------------------
 // LLPanelPicks
 //-----------------------------------------------------------------------------
@@ -85,8 +113,12 @@ LLPanelPicks::LLPanelPicks()
 	mOverflowMenu(NULL),
 	mPlusMenu(NULL),
 	mPicksAccTab(NULL),
-	mClassifiedsAccTab(NULL)
+	mClassifiedsAccTab(NULL),
+	mPanelClassifiedInfo(NULL),
+	mPanelClassifiedEdit(NULL)
 {
+	gGenericDispatcher.addHandler("classifiedclickthrough", 
+		new LLClassifiedClickThrough());
 }
 
 LLPanelPicks::~LLPanelPicks()
@@ -574,7 +606,9 @@ void LLPanelPicks::createNewPick()
 
 void LLPanelPicks::createNewClassified()
 {
-	LLNotifications::instance().add("ClickUnimplemented");
+	createClassifiedEditPanel();
+
+	getProfilePanel()->openPanel(mPanelClassifiedEdit, LLSD());
 }
 
 void LLPanelPicks::onClickInfo()
@@ -610,7 +644,21 @@ void LLPanelPicks::openPickInfo()
 
 void LLPanelPicks::openClassifiedInfo()
 {
-	LLNotifications::instance().add("ClickUnimplemented");
+	LLSD selected_value = mClassifiedsList->getSelectedValue();
+	if (selected_value.isUndefined()) return;
+
+	LLClassifiedItem* c_item = getSelectedClassifiedItem();
+
+	createClassifiedInfoPanel();
+
+	LLSD params;
+ 	params["classified_id"] = c_item->getClassifiedId();
+ 	params["avatar_id"] = c_item->getAvatarId();
+ 	params["snapshot_id"] = c_item->getSnapshotId();
+ 	params["name"] = c_item->getClassifiedName();
+ 	params["desc"] = c_item->getDescription();
+
+	getProfilePanel()->openPanel(mPanelClassifiedInfo, params);
 }
 
 void LLPanelPicks::showAccordion(const std::string& name, bool show)
@@ -632,6 +680,49 @@ void LLPanelPicks::onPanelPickSave(LLPanel* panel)
 	updateButtons();
 }
 
+void LLPanelPicks::onPanelClassifiedSave(LLPanelClassifiedEdit* panel)
+{
+	if(panel->isNewClassified())
+	{
+		LLClassifiedItem* c_item = new LLClassifiedItem(getAvatarId(), panel->getClassifiedId());
+		
+		c_item->setClassifiedName(panel->getClassifiedName());
+		c_item->setDescription(panel->getDescription());
+		c_item->setSnapshotId(panel->getSnapshotId());
+
+		LLSD c_value;
+		c_value.insert(CLASSIFIED_ID, c_item->getClassifiedId());
+		c_value.insert(CLASSIFIED_NAME, c_item->getClassifiedName());
+		mClassifiedsList->addItem(c_item, c_value);
+
+		c_item->setDoubleClickCallback(boost::bind(&LLPanelPicks::onDoubleClickClassifiedItem, this, _1));
+		c_item->setRightMouseUpCallback(boost::bind(&LLPanelPicks::onRightMouseUpItem, this, _1, _2, _3, _4));
+		c_item->setMouseUpCallback(boost::bind(&LLPanelPicks::updateButtons, this));
+		c_item->childSetAction("info_chevron", boost::bind(&LLPanelPicks::onClickInfo, this));
+	}
+	else
+	{
+		std::vector<LLSD> values;
+		mClassifiedsList->getValues(values);
+		for(size_t n = 0; n < values.size(); ++n)
+		{
+			LLUUID c_id = values[n][CLASSIFIED_ID].asUUID();
+			if(panel->getClassifiedId() == c_id)
+			{
+				LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(
+					mClassifiedsList->getItemByValue(values[n]));
+
+				c_item->setClassifiedName(panel->getClassifiedName());
+				c_item->setDescription(panel->getDescription());
+				c_item->setSnapshotId(panel->getSnapshotId());
+			}
+		}
+	}
+
+	onPanelPickClose(panel);
+	updateButtons();
+}
+
 void LLPanelPicks::createPickInfoPanel()
 {
 	if(!mPanelPickInfo)
@@ -643,6 +734,28 @@ void LLPanelPicks::createPickInfoPanel()
 	}
 }
 
+void LLPanelPicks::createClassifiedInfoPanel()
+{
+	if(!mPanelClassifiedInfo)
+	{
+		mPanelClassifiedInfo = LLPanelClassifiedInfo::create();
+		mPanelClassifiedInfo->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedInfo));
+		mPanelClassifiedInfo->setVisible(FALSE);
+	}
+}
+
+void LLPanelPicks::createClassifiedEditPanel()
+{
+	if(!mPanelClassifiedEdit)
+	{
+		mPanelClassifiedEdit = LLPanelClassifiedEdit::create();
+		mPanelClassifiedEdit->setExitCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setSaveCallback(boost::bind(&LLPanelPicks::onPanelClassifiedSave, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setCancelCallback(boost::bind(&LLPanelPicks::onPanelPickClose, this, mPanelClassifiedEdit));
+		mPanelClassifiedEdit->setVisible(FALSE);
+	}
+}
+
 void LLPanelPicks::createPickEditPanel()
 {
 	if(!mPanelPickEdit)
@@ -702,6 +815,28 @@ void LLPanelPicks::onPanelPickEdit()
 	getProfilePanel()->openPanel(mPanelPickEdit, params);
 }
 
+void LLPanelPicks::onPanelClassifiedEdit()
+{
+	LLSD selected_value = mClassifiedsList->getSelectedValue();
+	if (selected_value.isUndefined()) 
+	{
+		return;
+	}
+
+	LLClassifiedItem* c_item = dynamic_cast<LLClassifiedItem*>(mClassifiedsList->getSelectedItem());
+
+	createClassifiedEditPanel();
+
+	LLSD params;
+	params["classified_id"] = c_item->getClassifiedId();
+	params["avatar_id"] = c_item->getAvatarId();
+	params["snapshot_id"] = c_item->getSnapshotId();
+	params["name"] = c_item->getClassifiedName();
+	params["desc"] = c_item->getDescription();
+
+	getProfilePanel()->openPanel(mPanelClassifiedEdit, params);
+}
+
 void LLPanelPicks::onClickMenuEdit()
 {
 	if(getSelectedPickItem())
@@ -710,7 +845,7 @@ void LLPanelPicks::onClickMenuEdit()
 	}
 	else if(getSelectedClassifiedItem())
 	{
-		LLNotifications::instance().add("ClickUnimplemented");
+		onPanelClassifiedEdit();
 	}
 }
 
diff --git a/indra/newview/llpanelpicks.h b/indra/newview/llpanelpicks.h
index daf8059feea18f9eb1b13099f3f974aa0c4aebc5..b30036c6037502054709a1f61da42d360be3d4dc 100644
--- a/indra/newview/llpanelpicks.h
+++ b/indra/newview/llpanelpicks.h
@@ -53,6 +53,8 @@ class LLFlatListView;
 class LLPanelPickInfo;
 class LLPanelPickEdit;
 class LLToggleableMenu;
+class LLPanelClassifiedInfo;
+class LLPanelClassifiedEdit;
 
 class LLPanelPicks 
 	: public LLPanelProfileTab
@@ -98,7 +100,9 @@ class LLPanelPicks
 	void onClickInfo();
 	void onPanelPickClose(LLPanel* panel);
 	void onPanelPickSave(LLPanel* panel);
+	void onPanelClassifiedSave(LLPanelClassifiedEdit* panel);
 	void onPanelPickEdit();
+	void onPanelClassifiedEdit();
 	void onClickMenuEdit();
 
 	void createNewPick();
@@ -125,8 +129,8 @@ class LLPanelPicks
 
 	void createPickInfoPanel();
 	void createPickEditPanel();
-// 	void openPickEditPanel(LLPickItem* pick);
-// 	void openPickInfoPanel(LLPickItem* pick);
+	void createClassifiedInfoPanel();
+	void createClassifiedEditPanel();
 
 	LLMenuGL* mPopupMenu;
 	LLPanelProfile* mProfilePanel;
@@ -134,6 +138,8 @@ class LLPanelPicks
 	LLFlatListView* mPicksList;
 	LLFlatListView* mClassifiedsList;
 	LLPanelPickInfo* mPanelPickInfo;
+	LLPanelClassifiedInfo* mPanelClassifiedInfo;
+	LLPanelClassifiedEdit* mPanelClassifiedEdit;
 	LLPanelPickEdit* mPanelPickEdit;
 	LLToggleableMenu* mOverflowMenu;
 	LLToggleableMenu* mPlusMenu;
diff --git a/indra/newview/llpanelprofile.cpp b/indra/newview/llpanelprofile.cpp
index bec670cdaa7f74b1ff3df25197d5e4c990e192fe..b404c8db4c33208fa016aa8d4ec9dd317079e0e3 100644
--- a/indra/newview/llpanelprofile.cpp
+++ b/indra/newview/llpanelprofile.cpp
@@ -199,5 +199,10 @@ void LLPanelProfile::notifyParent(const LLSD& info)
 		onOpen(info);
 		return;
 	}
+	else if("save_classified" == action)
+	{
+	//	onOpen(info);
+		return;
+	}
 	LLPanel::notifyParent(info);
 }
diff --git a/indra/newview/skins/default/xui/en/panel_classified_info.xml b/indra/newview/skins/default/xui/en/panel_classified_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b7a54a7eeacfd8e1914b78ba54776fa180e4a8d5
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_classified_info.xml
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ follows="all"
+ height="570"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="panel_classified_info"
+ top="0"
+ width="333">
+    <button
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     name="back_btn"
+     picture_style="true"
+     left="10"
+     tab_stop="false"
+     top="2"
+     width="23" />
+    <text
+     follows="top|left|right"
+     font="SansSerifHugeBold"
+     height="26"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="white"
+     top="0"
+     value="Classified Info"
+     use_ellipses="true"
+     width="275" />
+    <scroll_container
+     color="DkGray2"
+     opaque="true"
+     follows="all"
+     height="500"
+     layout="topleft"
+     left="10"
+     top_pad="10"
+     name="profile_scroll"
+     reserve_scroll_corner="false"
+     width="313">
+    <panel
+     name="scroll_content_panel"
+     follows="left|top"
+     min_height="300"
+     layout="topleft"
+     top="0"
+     background_visible="false"
+     height="500"
+     left="0"
+     width="295">
+        <texture_picker
+         enabled="false"
+         follows="left|top"
+         height="197"
+         layout="topleft"
+         left="10"
+         name="classified_snapshot"
+         top="20"
+         width="290" />
+        <text
+         follows="left|top|right"
+         height="35"
+         width="290"
+         layout="topleft"
+         font="SansSerifBig"
+         font.style="BOLD"
+         left="10"
+         top_pad="10"
+         name="classified_name"
+         text_color="white"
+         value="[name]"
+         use_ellipses="true" />
+        <text
+         follows="left|top"
+         height="25"
+         layout="topleft"
+         left="10"
+         name="classified_location"
+         width="290"
+         word_wrap="true"
+         value="[loading...]" />
+        <text
+         follows="left|top|right"
+         height="18"
+         layout="topleft"
+         left="10"
+         name="content_type"
+         width="290"
+         top_pad="5"
+         value="[content type]" />
+        <text
+         follows="left|top|right"
+         height="18"
+         layout="topleft"
+         left="10"
+         name="category"
+         width="290"
+         top_pad="5"
+         value="[category]" />
+        <check_box
+         enabled="false"
+         height="16"
+         label="Auto renew each week"
+         layout="topleft"
+         left="10"
+         name="auto_renew"
+         top_pad="5"
+         width="290" />
+        <text
+         follows="left|top"
+         halign="left"
+         height="16"
+         layout="topleft"
+         left="10"
+         name="price_for_listing"
+         top_pad="5"
+         tool_tip="Price for listing."
+         width="105">
+         L$[PRICE]
+        </text>
+        <text
+         follows="left|top|right"
+         height="200"
+         layout="topleft"
+         left="10"
+         name="classified_desc"
+         width="290"
+         value="[description]"
+         word_wrap="true" />
+    </panel>
+    </scroll_container>
+    <panel
+     follows="left|right|bottom"
+     height="20"
+     layout="topleft"
+     top_pad="8"
+     left="10"
+     name="buttons">
+        <button
+         follows="bottom|left"
+         font="SansSerifSmall"
+         height="19"
+         label="Teleport"
+         layout="topleft"
+         left="0"
+         name="teleport_btn"
+         top="0"
+         width="90" />
+        <button
+         follows="bottom|left"
+         font="SansSerifSmall"
+         height="19"
+         label="Map"
+         layout="topleft"
+         left_pad="10"
+         name="show_on_map_btn"
+         top="0"
+         width="90" />
+        <button
+         follows="bottom|left"
+         font="SansSerifSmall"
+         height="19"
+         label="Edit"
+         layout="topleft"
+         right="-1"
+         name="edit_btn"
+         top="0"
+         width="90" />
+    </panel>
+</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_edit_classified.xml b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4741243addf7dfc1b69f8c0052aa7c255de95c18
--- /dev/null
+++ b/indra/newview/skins/default/xui/en/panel_edit_classified.xml
@@ -0,0 +1,251 @@
+<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
+<panel
+ background_visible="true"
+ bevel_style="in"
+ follows="left|top|right|bottom"
+ height="570"
+ label="Edit Classified"
+ layout="topleft"
+ left="0"
+ min_height="350"
+ name="panel_edit_classified"
+ top="0"
+ width="333">
+  <button
+     follows="top|right"
+     height="23"
+     image_overlay="BackArrow_Off"
+     layout="topleft"
+     name="back_btn"
+     picture_style="true"
+     left="10"
+     tab_stop="false"
+     top="2"
+     width="23" />
+   <text
+     type="string"
+     length="1"
+     follows="top"
+     font="SansSerifHuge"
+     height="15"
+     layout="topleft"
+     left_pad="10"
+     name="title"
+     text_color="white"
+     top="5"
+     width="250">
+        Edit Classified
+    </text>
+   <scroll_container
+     color="DkGray2"
+     follows="all"
+     height="510"
+     layout="topleft"
+     left="10"
+     top_pad="10"
+     name="profile_scroll"
+     reserve_scroll_corner="false"
+     opaque="true"
+     width="313">
+    <panel
+     name="scroll_content_panel"
+     follows="left|top"
+     min_height="300"
+     layout="topleft"
+     top="0"
+     background_visible="false"
+     height="600"
+     left="0"
+     width="295">
+    <texture_picker
+     follows="left|top|right"
+     height="197"
+     width="290"
+     layout="topleft"
+     top="20"
+     left="10"
+     name="classified_snapshot" />
+          <button
+           height="18"
+           image_overlay="AddItem_Off"
+           layout="topleft"
+           right="-5"
+           name="edit_icon"
+           label=""
+           tool_tip="Click to select an image"
+           top="27"
+           width="18" />
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="15"
+         font="SansSerifSmall"
+         font.style="BOLD"
+         layout="topleft"
+         left="10"
+         top="215"
+         name="Name:"
+         text_color="white"
+         width="290">
+            Title:
+        </text>
+        <line_editor
+         follows="left|top|right"
+         font="SansSerif"
+         height="20"
+         layout="topleft"
+         left="10"
+         top_pad="2"
+         max_length="63"
+         name="classified_name"
+         text_color="black"
+         width="290" />
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="15"
+         font="SansSerifSmall"
+         font.style="BOLD"
+         layout="topleft"
+         left="10"
+         top_pad="20"
+         name="description_label"
+         text_color="white"
+         width="290">
+            Description:
+        </text>
+        <text_editor
+         follows="left|top|right"
+         height="100"
+         width="290"
+         hide_scrollbar="false"
+         layout="topleft"
+         left="10"
+         top_pad="2"
+         max_length="1023"
+         name="classified_desc"
+         text_color="black"
+         word_wrap="true" />
+        <text
+         type="string"
+         length="1"
+         font="SansSerifSmall"
+         font.style="BOLD"
+         follows="left|top"
+         height="15"
+         layout="topleft"
+         left="10"
+         name="location_label"
+         text_color="white"
+         top_pad="20"
+         width="290">
+            Location:
+        </text>
+        <text
+         type="string"
+         length="1"
+         follows="left|top"
+         height="50"
+         layout="topleft"
+         left="10"
+         name="classified_location"
+         right="-10"
+         top_pad="2"
+         width="290"
+         word_wrap="true">
+            loading...
+        </text>
+        <button
+         follows="left|top"
+         height="20"
+         label="Set to Current Location"
+         layout="topleft"
+         left="8"
+         top_pad="5"
+         name="set_to_curr_location_btn"
+         width="200" />
+        <combo_box
+         follows="left|top" 
+         height="18" 
+         label=""
+	     left="10" 
+         name="category" 
+         top_pad="5"
+         width="200" />
+        <combo_box 
+         allow_text_entry="false" 
+         follows="left|top" 
+         height="18" 
+         left="10"
+         name="content_type" 
+         top_pad="5"
+         width="200">
+         <combo_item 
+          name="mature_ci" 
+          value="Mature">
+           Mature Content
+         </combo_item>
+         <combo_item 
+          name="pg_ci" 
+          value="PG">
+           PG Content
+         </combo_item>
+        </combo_box>
+        <spinner
+         decimal_digits="0"
+         follows="left|top"
+         halign="left"
+         height="16"
+         increment="1"
+         label_width="20"
+         label="L$"
+         layout="topleft"
+         left="10"
+         value="50"
+         min_val="50"
+         max_val="99999"
+         name="price_for_listing"
+         top_pad="5"
+         tool_tip="Price for listing."
+         width="105" />
+        <check_box
+         height="16"
+         label="Auto renew each week"
+         layout="topleft"
+         left="10"
+         name="auto_renew"
+         top_pad="5"
+         width="250" />
+    </panel>
+    </scroll_container>
+    <panel
+     follows="left|right|bottom"
+     height="20"
+     label="bottom_panel"
+     layout="topleft"
+     left="10"
+     name="bottom_panel"
+     top_pad="5"
+     width="303">
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Save"
+         layout="topleft"
+         name="save_changes_btn"
+         left="0"
+         top="0"
+         width="130" />
+        <button
+         follows="bottom|left"
+         height="19"
+         label="Cancel"
+         layout="topleft"
+         name="cancel_btn"
+         left_pad="5"
+         right="-1"
+         width="130" />
+    </panel>
+</panel>