Index: engine/unit/unit.cpp
===================================================================
--- engine/unit/unit.cpp	(Revision 9610)
+++ engine/unit/unit.cpp	(Arbeitskopie)
@@ -199,6 +200,10 @@
 	//
 	Type = type;
 
+	if (!type->CanAttack) {
+		Intelligent = true;
+	}
+
 	Seen.Frame = UnitNotSeen; // Unit isn't yet seen
 
 	Frame = type->StillFrame;
@@ -621,6 +626,23 @@
 	UnitCountSeen(this);
 	// Vision
 	MapMarkUnitSight(this);
+
+	//Add blockers on map
+	if (Type->Building && Type->CanAttack) {
+		//This is dangerous, we have to mark this way as worse now on map
+		int myx;
+		int myy;
+		int attackrange = Type->Variable[ATTACKRANGE_INDEX].Max;
+		for (myx = X - attackrange; myx < X + attackrange + Type->Width; myx++) {
+
+			for (myy = Y - attackrange; myy < Y + attackrange + Type->Height; myy++) {
+				if (MapDistanceToUnit(myx, myy, this) <= attackrange) {
+					Map.Field(myx, myy)->Blocks[Player->Index]--;
+				}
+			}
+
+		}
+	}
 }
 
 /**
@@ -1945,6 +1967,23 @@
 
 	PlayUnitSound(unit, VoiceDying);
 
+	//Remove blockers on map
+	if (unit->Type->Building && unit->Type->CanAttack) {
+		//This was dangerous, we have to mark this way as better now on map
+		int myx;
+		int myy;
+		int attackrange = unit->Type->Variable[ATTACKRANGE_INDEX].Max;
+		for (myx = unit->X - attackrange; myx < unit->X + attackrange + unit->Type->Width; myx++) {
+
+			for (myy = unit->Y - attackrange; myy < unit->Y + attackrange + unit->Type->Height; myy++) {
+				if (MapDistanceToUnit(myx, myy, unit) <= attackrange) {
+					Map.Field(myx, myy)->Blocks[unit->Player->Index]--;
+				}
+			}
+
+		}
+	}
+
 	//
 	// Catapults,... explodes.
 	//
Index: engine/unit/unit_find.cpp
===================================================================
--- engine/unit/unit_find.cpp	(Revision 9610)
+++ engine/unit/unit_find.cpp	(Arbeitskopie)
@@ -702,4 +702,19 @@
 	return AttackUnitsInDistance(unit, range);
 }
 
+bool CanBeAttackedByEnemysNormalAttackBuildings(int x, int y, const CPlayer *player)
+{
+	//Map.Field(myx, myy)->Blocks[unit->Player->Index]
+	CPlayer *p;
+	for (int i = 0; i < NumPlayers; ++i) {
+		p = &Players[i];
+		if (player->IsEnemy(p)) {
+			if (Map.Field(x, y)->Blocks[p->Index] > 0) {
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
 //@}
Index: engine/include/unit.h
===================================================================
--- engine/include/unit.h	(Revision 9610)
+++ engine/include/unit.h	(Arbeitskopie)
@@ -546,8 +546,11 @@
 		AutoRepair = 0;
 		memset(&Data, 0, sizeof(Data));
 		Goal = NULL;
+		Intelligent = false;
 	}
 
+	bool Intelligent;
+
 	// @note int is faster than shorts
 	unsigned long Refs;   /// Reference counter
 	int Slot;             /// Assigned slot number
@@ -943,6 +948,8 @@
 extern CUnit *AttackUnitsInRange(const CUnit *unit);
 	/// Find best enemy in reaction range to attack
 extern CUnit *AttackUnitsInReactRange(const CUnit *unit);
+	/// locate gun turrets, etc.
+extern bool CanBeAttackedByEnemysNormalAttackBuildings(int x, int y, const CPlayer *player);
 
 // in groups.cpp
 	/// Initialize data structures for groups
Index: engine/include/map.h
===================================================================
--- engine/include/map.h	(Revision 9610)
+++ engine/include/map.h	(Arbeitskopie)
@@ -161,6 +161,7 @@
 	unsigned short Visible[PlayerMax];    /// Seen counter 0 unexplored
 	unsigned char Radar[PlayerMax];       /// Visiblity for radar.
 	unsigned char RadarJammer[PlayerMax]; /// Jamming capabilities.
+	unsigned short Blocks[PlayerMax];     /// Blocking buildings counter
 };
 
 #define MapFieldSpeedMask    0x0007  /// Move faster on this tile
Index: engine/pathfinder/pathfinder.cpp
===================================================================
--- engine/pathfinder/pathfinder.cpp	(Revision 9610)
+++ engine/pathfinder/pathfinder.cpp	(Arbeitskopie)
@@ -228,6 +228,10 @@
 	// verify each tile of the unit.
 	for (i = x; i < x + unit->Type->TileWidth; ++i) {
 		for (j = y; j < y + unit->Type->TileHeight; ++j) {
+			//Avoid gun turrets, ...
+			if (unit->Intelligent && CanBeAttackedByEnemysNormalAttackBuildings(x, y, unit->Player)) {
+				return -1;
+			}
 			flag = Map.Field(i, j)->Flags & mask;
 			if (flag && (AStarKnowUnseenTerrain || Map.IsFieldExplored(unit->Player, i, j))) {
 				if (flag & ~(MapFieldLandUnit | MapFieldAirUnit | MapFieldSeaUnit)) {
