 pgadmin/frm/frmQuery.cpp           | 47 +++++++++++++++++++++++++++++++++++---
 pgadmin/include/frm/frmQuery.h     |  1 +
 pgadmin/include/frm/menu.h         |  1 +
 pgadmin/include/utils/favourites.h |  1 +
 pgadmin/utils/favourites.cpp       | 18 +++++++++++++++
 5 files changed, 65 insertions(+), 3 deletions(-)

diff --git a/pgadmin/frm/frmQuery.cpp b/pgadmin/frm/frmQuery.cpp
index 31e6b66..bf7bfbf 100644
--- a/pgadmin/frm/frmQuery.cpp
+++ b/pgadmin/frm/frmQuery.cpp
@@ -134,6 +134,7 @@ BEGIN_EVENT_TABLE(frmQuery, pgFrame)
 	EVT_MENU(MNU_SHOWLINEENDS,      frmQuery::OnShowLineEnds)
 	EVT_MENU(MNU_SHOWLINENUMBER,    frmQuery::OnShowLineNumber)
 	EVT_MENU(MNU_FAVOURITES_ADD,    frmQuery::OnAddFavourite)
+	EVT_MENU(MNU_FAVOURITES_INJECT, frmQuery::OnInjectFavourite)
 	EVT_MENU(MNU_FAVOURITES_MANAGE, frmQuery::OnManageFavourites)
 	EVT_MENU(MNU_MACROS_MANAGE,     frmQuery::OnMacroManage)
 	EVT_MENU(MNU_DATABASEBAR,       frmQuery::OnToggleDatabaseBar)
@@ -321,6 +322,7 @@ frmQuery::frmQuery(frmMain *form, const wxString &_title, pgConn *_conn, const w
 
 	favouritesMenu = new wxMenu();
 	favouritesMenu->Append(MNU_FAVOURITES_ADD, _("Add favourite..."), _("Add current query to favourites"));
+	favouritesMenu->Append(MNU_FAVOURITES_INJECT, _("Inject\tF2"), _("Replace a word under cursor with a favourite with same name"));
 	favouritesMenu->Append(MNU_FAVOURITES_MANAGE, _("Manage favourites..."), _("Edit and delete favourites"));
 	favouritesMenu->AppendSeparator();
 	favourites = 0L;
@@ -619,6 +621,9 @@ frmQuery::frmQuery(frmMain *form, const wxString &_title, pgConn *_conn, const w
 		wxSafeYield();                            // needed to process sqlQuery modify event
 		changed = false;
 		origin = ORIGIN_INITIAL;
+		/* _title if not empty should contain displayName of base object for the query.
+		   It's pretty good for a proposed filename if the user chooses to Save As. */
+		lastFilename = _title;
 		setExtendedTitle();
 	}
 
@@ -1485,6 +1490,7 @@ void frmQuery::updateMenu(bool allowUpdateModelSize)
 	editMenu->Enable(MNU_FIND, canFind);
 
 	favouritesMenu->Enable(MNU_FAVOURITES_ADD, canAddFavourite);
+	favouritesMenu->Enable(MNU_FAVOURITES_INJECT, canAddFavourite); // these two use the same criteria
 	favouritesMenu->Enable(MNU_FAVOURITES_MANAGE, canManageFavourite);
 }
 
@@ -1496,9 +1502,9 @@ void frmQuery::UpdateFavouritesList()
 
 	favourites = queryFavouriteFileProvider::LoadFavourites(true);
 
-	while (favouritesMenu->GetMenuItemCount() > 3)
+	while (favouritesMenu->GetMenuItemCount() > 4) // there are 3 static items + separator above
 	{
-		favouritesMenu->Destroy(favouritesMenu->GetMenuItems()[3]);
+		favouritesMenu->Destroy(favouritesMenu->GetMenuItems()[4]);
 	}
 
 	favourites->AppendAllToMenu(favouritesMenu, MNU_FAVOURITES_MANAGE + 1);
@@ -1539,6 +1545,41 @@ void frmQuery::OnAddFavourite(wxCommandEvent &event)
 }
 
 
+void frmQuery::OnInjectFavourite(wxCommandEvent &event)
+{
+	queryFavouriteItem *fav;
+	bool selected = true;
+	int startPos, endPos;
+	wxString name = sqlQuery->GetSelectedText();
+
+	if (name.IsEmpty())
+	{
+		// get the word under cursor:
+		int curPos = sqlQuery->GetCurrentPos();
+		startPos = sqlQuery->WordStartPosition(curPos, true);
+		endPos = sqlQuery->WordEndPosition(curPos, true);
+		name = sqlQuery->GetTextRange(startPos, endPos);
+		selected = false;
+	}
+	name.Trim(false).Trim(true);
+	if (name.IsEmpty())
+		return;
+
+	// search for favourite with this name
+	fav = favourites->FindFavourite(name);
+	if (!fav)
+		return;
+
+	// replace selection (or current word) with it's contents
+	//wxLogInfo(wxT("frmQuery::OnReplaceFavourite(): name=[%s] contents=[%s]"), name, fav->GetContents());
+	sqlQuery->BeginUndoAction();
+	if (!selected)
+		sqlQuery->SetSelection(startPos, endPos);
+	sqlQuery->ReplaceSelection(fav->GetContents());
+	sqlQuery->EndUndoAction();
+}
+
+
 void frmQuery::OnManageFavourites(wxCommandEvent &event)
 {
 	int r = dlgManageFavourites(this, favourites).ManageFavourites();
@@ -3165,7 +3206,7 @@ wxWindow *queryToolBaseFactory::StartDialogSql(frmMain *form, pgObject *obj, con
 	pgConn *conn = db->CreateConn(applicationname);
 	if (conn)
 	{
-		frmQuery *fq = new frmQuery(form, wxEmptyString, conn, sql);
+		frmQuery *fq = new frmQuery(form, obj->GetDisplayName(), conn, sql);
 		fq->Go();
 		return fq;
 	}
diff --git a/pgadmin/include/frm/frmQuery.h b/pgadmin/include/frm/frmQuery.h
index 4d4c607..663f47b 100644
--- a/pgadmin/include/frm/frmQuery.h
+++ b/pgadmin/include/frm/frmQuery.h
@@ -205,6 +205,7 @@ private:
 	void OnFocus(wxFocusEvent &event);
 	void OnSelectAll(wxCommandEvent &event);
 	void OnAddFavourite(wxCommandEvent &event);
+	void OnInjectFavourite(wxCommandEvent &event);
 	void OnManageFavourites(wxCommandEvent &event);
 	void OnSelectFavourite(wxCommandEvent &event);
 	void OnQuickReport(wxCommandEvent &event);
diff --git a/pgadmin/include/frm/menu.h b/pgadmin/include/frm/menu.h
index 21fdea6..17a00a5 100644
--- a/pgadmin/include/frm/menu.h
+++ b/pgadmin/include/frm/menu.h
@@ -129,6 +129,7 @@ enum
     MNU_ACTION = MNU_NEW + 1000, // leave space for objects
 
     MNU_FAVOURITES_ADD = MNU_ACTION + 1000, // leave space for actions
+    MNU_FAVOURITES_INJECT,
     MNU_FAVOURITES_MANAGE,
 
     MNU_MACROS_MANAGE = MNU_FAVOURITES_MANAGE + 1000, //leave space for favourites
diff --git a/pgadmin/include/utils/favourites.h b/pgadmin/include/utils/favourites.h
index 30df7d3..667b3fb 100644
--- a/pgadmin/include/utils/favourites.h
+++ b/pgadmin/include/utils/favourites.h
@@ -70,6 +70,7 @@ public:
 	bool DeleteTreeItem(const wxTreeItemId &treeitem);
 
 	queryFavouriteItem *FindFavourite(int id);
+	queryFavouriteItem *FindFavourite(const wxString &title);
 	queryFavouriteItem *FindTreeItem(const wxTreeItemId &treeitem);
 
 	void AddNewFavourite(const wxString &title, const wxString &contents);
diff --git a/pgadmin/utils/favourites.cpp b/pgadmin/utils/favourites.cpp
index ea25f1f..89c3b50 100644
--- a/pgadmin/utils/favourites.cpp
+++ b/pgadmin/utils/favourites.cpp
@@ -215,6 +215,24 @@ queryFavouriteItem *queryFavouriteFolder::FindFavourite(int id)
 	return NULL;
 }
 
+queryFavouriteItem *queryFavouriteFolder::FindFavourite(const wxString &title)
+{
+	size_t i;
+	for (i = 0; i < favourites.GetCount(); i++)
+	{
+		if (favourites.Item(i)->GetId() == -2)
+		{
+			queryFavouriteFolder *subfolder = (queryFavouriteFolder *)favourites.Item(i);
+			queryFavouriteItem *match = subfolder->FindFavourite(title);
+			if (match != NULL)
+				return match;
+		}
+		else if (favourites.Item(i)->GetTitle() == title)
+			return favourites.Item(i);
+	}
+	return NULL;
+}
+
 queryFavouriteItem *queryFavouriteFolder::FindTreeItem(const wxTreeItemId &treeitem)
 {
 	if (treeid == treeitem)
