Index: source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp
===================================================================
--- source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp	(revision 15503)
+++ source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.cpp	(working copy)
@@ -20,6 +20,7 @@
 #include "ScenarioEditor.h"
 
 #include "wx/busyinfo.h"
+#include "wx/clipbrd.h"
 #include "wx/config.h"
 #include "wx/dir.h"
 #include "wx/evtloop.h"
@@ -49,6 +50,7 @@
 static HighResTimer g_Timer;
 
 using namespace AtlasMessage;
+using std::vector;
 
 //////////////////////////////////////////////////////////////////////////
 
@@ -310,6 +312,9 @@ enum
 	ID_SaveAs,
 	ID_ImportHeightmap,
 
+    ID_Copy,
+    ID_Paste,
+
 	ID_Wireframe,
 	ID_MessageTrace,
 	ID_Screenshot,
@@ -338,6 +343,8 @@ BEGIN_EVENT_TABLE(ScenarioEditor, wxFrame)
 	EVT_MENU(ID_Quit, ScenarioEditor::OnQuit)
 	EVT_MENU(wxID_UNDO, ScenarioEditor::OnUndo)
 	EVT_MENU(wxID_REDO, ScenarioEditor::OnRedo)
+    EVT_MENU(ID_Copy, ScenarioEditor::OnCopy)
+    EVT_MENU(ID_Paste, ScenarioEditor::OnPaste)
 
 	EVT_MENU(ID_Wireframe, ScenarioEditor::OnWireframe)
 	EVT_MENU(ID_MessageTrace, ScenarioEditor::OnMessageTrace)
@@ -350,6 +357,8 @@ BEGIN_EVENT_TABLE(ScenarioEditor, wxFrame)
 	EVT_MENU(ID_RenderPathFixed, ScenarioEditor::OnRenderPath)
 	EVT_MENU(ID_RenderPathShader, ScenarioEditor::OnRenderPath)
 
+    EVT_MENU_OPEN(ScenarioEditor::OnMenuOpen)
+
 	EVT_IDLE(ScenarioEditor::OnIdle)
 END_EVENT_TABLE()
 
@@ -434,8 +443,14 @@ ScenarioEditor::ScenarioEditor(wxWindow* parent)
 	{
 		menuEdit->Append(wxID_UNDO, _("&Undo"));
 		menuEdit->Append(wxID_REDO, _("&Redo"));
+        menuEdit->AppendSeparator();
+        menuEdit->Append(ID_Copy, _("&Copy"));
+        menuEdit->Enable(ID_Copy, false);
+        menuEdit->Append(ID_Paste, _("&Paste"));
 	}
 
+    g_SelectedObjects.RegisterObserver(0, &ScenarioEditor::OnSelectedObjectsChange, this);
+
 	GetCommandProc().SetEditMenu(menuEdit);
 	GetCommandProc().Initialize();
 
@@ -620,6 +635,24 @@ void ScenarioEditor::OnRedo(wxCommandEvent&)
 	GetCommandProc().Redo();
 }
 
+void ScenarioEditor::OnCopy(wxCommandEvent&)
+{
+    if (0 == GetToolManager().GetCurrentToolName().Cmp(_T("TransformObject")))
+    {
+        GetToolManager().GetCurrentTool()->OnCommand(_T("copy"), NULL);
+    }
+}
+
+void ScenarioEditor::OnPaste(wxCommandEvent&)
+{
+    if (0 != GetToolManager().GetCurrentToolName().Cmp(_T("TransformObject")))
+    {
+        GetToolManager().SetCurrentTool(_T("TransformObject"), NULL);
+    }
+
+    GetToolManager().GetCurrentTool()->OnCommand(_T("paste"), NULL);
+}
+
 //////////////////////////////////////////////////////////////////////////
 
 void ScenarioEditor::OnNew(wxCommandEvent& WXUNUSED(event))
@@ -865,6 +898,36 @@ void ScenarioEditor::OnDumpState(wxCommandEvent& event)
 	}
 }
 
+void ScenarioEditor::OnSelectedObjectsChange(vector<ObjectID> const& selectedObjects)
+{
+    GetMenuBar()->Enable(ID_Copy, !selectedObjects.empty());
+}
+
+void ScenarioEditor::OnMenuOpen(wxMenuEvent& event)
+{
+    // This could be done far more elegantly if wxMenuItem had changeable id.
+    wxMenu* pasteMenuItem = NULL;
+    event.GetMenu()->FindItem(ID_Paste, &pasteMenuItem);
+
+    if (pasteMenuItem)
+    {
+        bool hasContentToPaste = false;
+        if (wxTheClipboard->Open())
+        {
+            if (wxTheClipboard->IsSupported(wxDF_TEXT))
+            {
+                wxTextDataObject data;
+                wxTheClipboard->GetData(data);
+                hasContentToPaste = !data.GetText().empty();
+            }
+
+            wxTheClipboard->Close();
+        }
+
+        GetMenuBar()->Enable(ID_Paste, hasContentToPaste);
+    }
+}
+
 
 //////////////////////////////////////////////////////////////////////////
 
Index: source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.h
===================================================================
--- source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.h	(revision 15503)
+++ source/tools/atlas/AtlasUI/ScenarioEditor/ScenarioEditor.h	(working copy)
@@ -46,6 +46,8 @@ public:
 	void OnQuit(wxCommandEvent& event);
 	void OnUndo(wxCommandEvent& event);
 	void OnRedo(wxCommandEvent& event);
+    void OnCopy(wxCommandEvent& event);
+    void OnPaste(wxCommandEvent& event);
 
 	void OnWireframe(wxCommandEvent& event);
 	void OnMessageTrace(wxCommandEvent& event);
@@ -55,6 +57,9 @@ public:
 	void OnCameraReset(wxCommandEvent& event);
 	void OnRenderPath(wxCommandEvent& event);
 	void OnDumpState(wxCommandEvent& event);
+    void OnSelectedObjectsChange(std::vector<AtlasMessage::ObjectID> const& selectedObjects);
+
+    void OnMenuOpen(wxMenuEvent& event);
 
 	bool OpenFile(const wxString& name, const wxString& filename);
 
Index: source/tools/atlas/AtlasUI/ScenarioEditor/Tools/Common/Tools.cpp
===================================================================
--- source/tools/atlas/AtlasUI/ScenarioEditor/Tools/Common/Tools.cpp	(revision 15503)
+++ source/tools/atlas/AtlasUI/ScenarioEditor/Tools/Common/Tools.cpp	(working copy)
@@ -28,6 +28,7 @@ class DummyTool : public ITool
 	bool OnMouse(wxMouseEvent& WXUNUSED(evt)) { return false; }
 	bool OnKey(wxKeyEvent& WXUNUSED(evt), KeyEventType) { return false; }
 	void OnTick(float) {}
+    void OnCommand(wxString const&, void*) {}
 } dummy;
 
 struct ToolManagerImpl
Index: source/tools/atlas/AtlasUI/ScenarioEditor/Tools/Common/Tools.h
===================================================================
--- source/tools/atlas/AtlasUI/ScenarioEditor/Tools/Common/Tools.h	(revision 15503)
+++ source/tools/atlas/AtlasUI/ScenarioEditor/Tools/Common/Tools.h	(working copy)
@@ -35,6 +35,7 @@ public:
 	virtual bool OnMouse(wxMouseEvent& evt) = 0; // return true if handled
 	virtual bool OnKey(wxKeyEvent& evt, KeyEventType dir) = 0; // return true if handled
 	virtual void OnTick(float dt) = 0; // dt in seconds
+    virtual void OnCommand(wxString const& command, void * userData) = 0;
 
 	virtual ~ITool() {};
 };
@@ -166,6 +167,10 @@ private:
 	{
 		m_CurrentState->OnTick(static_cast<T*>(this), dt);
 	}
+
+    virtual void OnCommand(wxString const&, void*)
+    {
+    }
 };
 
 
Index: source/tools/atlas/AtlasUI/ScenarioEditor/Tools/TransformObject.cpp
===================================================================
--- source/tools/atlas/AtlasUI/ScenarioEditor/Tools/TransformObject.cpp	(revision 15503)
+++ source/tools/atlas/AtlasUI/ScenarioEditor/Tools/TransformObject.cpp	(working copy)
@@ -50,6 +50,18 @@ public:
 		SetState(&Waiting);
 	}
 
+    virtual void OnCommand(wxString const& command, void*)
+    {
+        if (0 == command.Cmp(_T("copy")))
+        {
+            OnCopy();
+        }
+        else if (0 == command.Cmp(_T("paste")))
+        {
+            OnPasteStart();
+        }
+    }
+
 	void OnDisable()
 	{
 		g_SelectedObjects.clear();
@@ -57,6 +69,33 @@ public:
 		POST_MESSAGE(SetSelectionPreview, (g_SelectedObjects));
 	}
 
+    bool OnCopy() const
+    {
+        if (!g_SelectedObjects.empty())
+        {
+            // COPY current selections
+            AtlasMessage::qGetObjectMapSettings info(g_SelectedObjects);
+            info.Post();
+
+            // In xmldata is the configuration
+            // now send to clipboard
+            if (wxTheClipboard->Open())
+            {
+                wxString text(info.xmldata.c_str());
+                wxTheClipboard->SetData(new wxTextDataObject(text));
+                wxTheClipboard->Close();
+            }
+            else
+            {
+                // TODO: Say something about couldnt open clipboard
+            }
+
+            return true;
+        }
+
+        return false;
+    }
+
 	void OnPasteStart()
 	{
 		//PASTE
@@ -321,26 +360,7 @@ public:
 			{
 				if (evt.GetKeyCode() == 'C')
 				{
-					if (!g_SelectedObjects.empty())
-					{
-						//COPY current selections
-						AtlasMessage::qGetObjectMapSettings info(g_SelectedObjects);
-						info.Post();
-
-						//In xmldata is the configuration
-						//now send to clipboard
-						if (wxTheClipboard->Open())
-						{
-							wxString text(info.xmldata.c_str());
-							wxTheClipboard->SetData(new wxTextDataObject(text));
-							wxTheClipboard->Close();
-						}
-						else
-						{
-							//TODO: Say something about couldnt open clipboard
-						}
-						return true;
-					}
+                    return obj->OnCopy();
 				}
 				else if (evt.GetKeyCode() == 'V')
 				{
