Index: source/tools/atlas/AtlasUI/ScenarioEditor/Tools/TransformObject.cpp
===================================================================
--- source/tools/atlas/AtlasUI/ScenarioEditor/Tools/TransformObject.cpp	(revision 16146)
+++ source/tools/atlas/AtlasUI/ScenarioEditor/Tools/TransformObject.cpp	(working copy)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Wildfire Games.
+/* Copyright (C) 2015 Wildfire Games.
  * This file is part of 0 A.D.
  *
  * 0 A.D. is free software: you can redistribute it and/or modify
@@ -366,6 +359,7 @@
 		{
 			if (evt.LeftUp())
 			{
+				POST_MESSAGE(ResetSelectionColor, ());
 				SET_STATE(Waiting);
 				return true;
 			}
Index: source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp
===================================================================
--- source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp	(revision 16146)
+++ source/tools/atlas/GameInterface/Handlers/ObjectHandlers.cpp	(working copy)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Wildfire Games.
+/* Copyright (C) 2015 Wildfire Games.
  * This file is part of 0 A.D.
  *
  * 0 A.D. is free software: you can redistribute it and/or modify
@@ -41,6 +41,7 @@
 #include "renderer/Renderer.h"
 #include "renderer/WaterManager.h"
 #include "simulation2/Simulation2.h"
+#include "simulation2/components/ICmpObstruction.h"
 #include "simulation2/components/ICmpOwnership.h"
 #include "simulation2/components/ICmpPosition.h"
 #include "simulation2/components/ICmpPlayer.h"
@@ -61,6 +62,31 @@
 	}
 }
 
+// Helpers for object constraints
+bool CanPlaceObjectEntityHelper(entity_id_t ent)
+{
+	CmpPtr<ICmpObstruction> cmpObstruction(*g_Game->GetSimulation2(), ent);
+	if (cmpObstruction)
+	{
+		ICmpObstruction::EFoundationCheck result = cmpObstruction->CheckFoundation("default");
+		if (result != ICmpObstruction::FOUNDATION_CHECK_SUCCESS)
+			return false;
+	}
+	return true;
+}
+
+void CheckObstructionAndUpdateVisual(entity_id_t id)
+{
+	CmpPtr<ICmpVisual> cmpVisual(*g_Game->GetSimulation2(), id);
+	if (cmpVisual)
+	{
+		if (!CanPlaceObjectEntityHelper(id))
+			cmpVisual->SetShadingColour(fixed::FromDouble(1.4), fixed::FromDouble(0.4), fixed::FromDouble(0.4), fixed::FromDouble(1));
+		else
+			cmpVisual->SetShadingColour(fixed::FromDouble(1), fixed::FromDouble(1), fixed::FromDouble(1), fixed::FromDouble(1));
+	}
+}
+
 QUERYHANDLER(GetObjectsList)
 {
 	std::vector<sObjectsListItem> objects;
@@ -473,6 +499,8 @@
 			posFinal = posFixed + dir;
 		}
 		cmpPosition->JumpTo(posFinal.X, posFinal.Z);
+
+		CheckObstructionAndUpdateVisual(id);
 	}
 }
 
@@ -543,6 +571,8 @@
 		CmpPtr<ICmpOwnership> cmpOwnership(*g_Game->GetSimulation2(), g_PreviewEntityID);
 		if (cmpOwnership)
 			cmpOwnership->SetOwner((player_id_t)msg->settings->player);
+
+		CheckObstructionAndUpdateVisual(g_PreviewEntityID);
 	}
 }
 
@@ -680,7 +710,20 @@
 	msg->ids = EntitySelection::PickSimilarEntities(*g_Game->GetSimulation2(), *g_Game->GetView()->GetCamera(), templateName, owner, false, true, true, false);
 }
 
+MESSAGEHANDLER(ResetSelectionColor)
+{
+	UNUSED(msg);
+	if (g_Selection.empty())
+		return;
 
+	for (size_t i = 0; i < g_Selection.size(); ++i)
+	{
+		CmpPtr<ICmpVisual> cmpVisual(*g_Game->GetSimulation2(), g_Selection[i]);
+		if (cmpVisual)
+			cmpVisual->SetShadingColour(fixed::FromDouble(1), fixed::FromDouble(1), fixed::FromDouble(1), fixed::FromDouble(1));
+	}
+}
+
 BEGIN_COMMAND(MoveObjects)
 {
 	// Mapping from object to position
@@ -736,7 +779,8 @@
 		ObjectPositionMap::iterator it;
 		for (it = map.begin(); it != map.end(); ++it)
 		{
-			CmpPtr<ICmpPosition> cmpPosition(*g_Game->GetSimulation2(), (entity_id_t)it->first);
+			entity_id_t id = (entity_id_t)it->first;
+			CmpPtr<ICmpPosition> cmpPosition(*g_Game->GetSimulation2(), id);
 			if (!cmpPosition)
 				return;
 
@@ -743,6 +787,8 @@
 			// Set 2D position, ignoring height
 			CVector3D pos = it->second;
 			cmpPosition->JumpTo(entity_pos_t::FromFloat(pos.X), entity_pos_t::FromFloat(pos.Z));
+
+			CheckObstructionAndUpdateVisual(id);
 		}
 	}
 
Index: source/tools/atlas/GameInterface/Messages.h
===================================================================
--- source/tools/atlas/GameInterface/Messages.h	(revision 16146)
+++ source/tools/atlas/GameInterface/Messages.h	(working copy)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2014 Wildfire Games.
+/* Copyright (C) 2015 Wildfire Games.
  * This file is part of 0 A.D.
  *
  * 0 A.D. is free software: you can redistribute it and/or modify
@@ -573,6 +577,8 @@
 		((std::vector<ObjectID>, ids))
 		);
 
+MESSAGE(ResetSelectionColor, );
+
 COMMAND(MoveObjects, MERGE,
 		((std::vector<ObjectID>, ids))
 		((ObjectID, pivot))