diff -r -u pgadmin3-original/pgadmin/frm/frmMain.cpp pgadmin3/pgadmin/frm/frmMain.cpp
--- pgadmin3-original/pgadmin/frm/frmMain.cpp	2011-03-16 16:43:41.000000000 +0100
+++ pgadmin3/pgadmin/frm/frmMain.cpp	2011-03-22 14:39:34.000000000 +0100
@@ -77,6 +77,7 @@
 #include "slony/slCluster.h"
 #include "slony/slSet.h"
 #include "schema/pgForeignKey.h"
+#include "frm/frmPasteObject.h"
 
 
 #if wxDIALOG_UNIT_COMPATIBILITY
@@ -357,6 +358,10 @@
 	new reassignDropOwnedFactory(menuFactories, editMenu, 0);
 	editMenu->AppendSeparator();
 
+	new copyObjectFactory(menuFactories, editMenu, 0);
+	new pasteObjectFactory(menuFactories, editMenu, 0);
+	editMenu->AppendSeparator();
+
 	new separatorFactory(menuFactories);
 
 	toolBar->AddSeparator();
@@ -1369,3 +1374,62 @@
 	DisplayHelp(wxT("bugreport"), HELP_PGADMIN);
 	return 0;
 }
+
+copyObjectFactory::copyObjectFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar) : contextActionFactory(list)
+{
+	mnu->Append(id, _("&Copy object..."), _("Store object reference for later paste"));
+}
+
+
+wxWindow *copyObjectFactory::StartDialog(frmMain *form, pgObject *obj)
+{
+	form->SetCopytObject(obj);
+	return 0;
+}
+
+
+bool copyObjectFactory::CheckEnable(pgObject *obj)
+{
+	if (!obj)
+		return false;
+
+	if (obj->GetConnection()) {
+		pgTable *table = dynamic_cast<pgTable *>(obj);
+		if (table)
+			return true;
+		pgSchema *schema = dynamic_cast<pgSchema *>(obj);
+		if (schema)
+			return true;
+	}
+	return false;
+}
+
+pasteObjectFactory::pasteObjectFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar) : contextActionFactory(list)
+{
+	mnu->Append(id, _("&Paste object..."), _("Paste object"));
+}
+
+
+wxWindow *pasteObjectFactory::StartDialog(frmMain *form, pgObject *obj)
+{
+	pgObject *copyobj = form->GetCopytObject();
+	if (copyobj) {
+		frmPasteObject *frm = new frmPasteObject(form, copyobj, obj);
+		frm->process();
+	}
+	return 0;
+}
+
+
+bool pasteObjectFactory::CheckEnable(pgObject *obj)
+{
+	if (!obj)
+		return false;
+
+	if (obj->GetConnection()) {
+		pgSchema *schema = dynamic_cast<pgSchema *>(obj);
+		if (schema)
+			return true;
+	}
+	return false;
+}
diff -r -u pgadmin3-original/pgadmin/frm/module.mk pgadmin3/pgadmin/frm/module.mk
--- pgadmin3-original/pgadmin/frm/module.mk	2011-03-12 15:54:17.000000000 +0100
+++ pgadmin3/pgadmin/frm/module.mk	2011-03-22 14:48:51.000000000 +0100
@@ -32,7 +32,8 @@
 	$(srcdir)/frm/frmRestore.cpp \
 	$(srcdir)/frm/frmSplash.cpp \
 	$(srcdir)/frm/frmStatus.cpp \
-	$(srcdir)/frm/plugins.cpp
+	$(srcdir)/frm/plugins.cpp \
+ $(srcdir)/frm/frmPasteObject.cpp
 
 EXTRA_DIST += \
     $(srcdir)/frm/module.mk
diff -r -u pgadmin3-original/pgadmin/include/frm/frmMain.h pgadmin3/pgadmin/include/frm/frmMain.h
--- pgadmin3-original/pgadmin/include/frm/frmMain.h	2011-03-12 15:54:18.000000000 +0100
+++ pgadmin3/pgadmin/include/frm/frmMain.h	2011-03-22 09:56:50.000000000 +0100
@@ -146,6 +146,14 @@
 		return pluginsMenu;
 	}
 
+	pgObject *GetCopytObject() {
+		return copytObject;
+	}
+
+	void SetCopytObject(pgObject *obj) {
+		copytObject = obj;
+	}
+
 	wxString GetCurrentNodePath();
 	bool SetCurrentNode(wxTreeItemId node, const wxString &path);
 
@@ -185,6 +193,8 @@
 	pgObject *currentObject;
 	wxControl *currentControl;
 
+	pgObject *copytObject;
+
 	void OnChildFocus(wxChildFocusEvent &event);
 	void OnEraseBackground(wxEraseEvent &event);
 	void OnSize(wxSizeEvent &event);
@@ -335,4 +345,20 @@
 	bool enableButton;
 };
 
+class copyObjectFactory : public contextActionFactory
+{
+public:
+	copyObjectFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
+	wxWindow *StartDialog(frmMain *form, pgObject *obj);
+	bool CheckEnable(pgObject *obj);
+};
+
+class pasteObjectFactory : public contextActionFactory
+{
+public:
+	pasteObjectFactory(menuFactoryList *list, wxMenu *mnu, ctlMenuToolbar *toolbar);
+	wxWindow *StartDialog(frmMain *form, pgObject *obj);
+	bool CheckEnable(pgObject *obj);
+};
+
 #endif