diff --git a/src/include/map.h b/src/include/map.h
index 5f21e77bf..f3ef2adab 100644
--- a/src/include/map.h
+++ b/src/include/map.h
@@ -557,21 +557,21 @@ extern void MapSetWall(unsigned x,unsigned y,int humanwall);
 #ifdef NEW_FOW
 
     /// Check if a field for the user is explored
-#define IsMapFieldExplored(x,y) \
-    (IsTileVisible(ThisPlayer,x,y))
+#define IsMapFieldExplored(player,x,y) \
+    (IsTileVisible(player,x,y))
 
     /// Check if a field for the user is visibile
-#define IsMapFieldVisible(x,y) \
-    (IsTileVisible(ThisPlayer,x,y)>1)
+#define IsMapFieldVisible(player,x,y) \
+    (IsTileVisible(player,x,y)>1)
 
 #else
 
     /// Check if a field for the user is explored
-#define IsMapFieldExplored(x,y) \
+#define IsMapFieldExplored(player,x,y) \
     (TheMap.Fields[(y)*TheMap.Width+(x)].Flags&MapFieldExplored)
 
     /// Check if a field for the user is visibile
-#define IsMapFieldVisible(x,y) \
+#define IsMapFieldVisible(player,x,y) \
     (TheMap.Visible[0][((y)*TheMap.Width+(x))/32] \
 	&(1<<(((y)*TheMap.Width+(x))%32)))
 
diff --git a/src/map/map_fog.cpp b/src/map/map_fog.cpp
index 2c8134a1b..e2be97aef 100644
--- a/src/map/map_fog.cpp
+++ b/src/map/map_fog.cpp
@@ -450,7 +450,7 @@ global void MapMarkSight(int tx,int ty,int range)
 	for( i=x; i<=x+width; ++i ) {
 	    if( PythagTree[abs(i-tx)][abs(y-ty)]<=range ) {
 		// FIXME: can combine more bits
-		if( !IsMapFieldVisible(i,y) ) {
+		if( !IsMapFieldVisible(ThisPlayer,i,y) ) {
 		    TheMap.Fields[i+y*TheMap.Width].Flags |= MapFieldExplored;
 		    TheMap.Visible[0][(i+y*TheMap.Width)/32]
 			    |= 1<<((i+y*TheMap.Width)%32);
@@ -588,7 +588,7 @@ global void UpdateFogOfWarChange(void)
 	w=TheMap.Width;
 	for( y=0; y<TheMap.Height; y++ ) {
 	    for( x=0; x<TheMap.Width; ++x ) {
-		if( IsMapFieldExplored(x,y) ) {
+		if( IsMapFieldExplored(ThisPlayer,x,y) ) {
 #ifndef NEW_FOW
 		    TheMap.Visible[0][(x+y*w)/32] |= 1<<((x+y*w)%32);
 #endif
@@ -1784,66 +1784,66 @@ local void DrawFogOfWarTile(int sx,int sy,int dx,int dy)
     //
     if( sy ) {
 	if( sx!=sy ) {
-	    if( !IsMapFieldExplored(x-1,y-1) ) {
+	    if( !IsMapFieldExplored(ThisPlayer,x-1,y-1) ) {
 		tile2|=2;
 		tile|=2;
-	    } else if( !IsMapFieldVisible(x-1,y-1) ) {
+	    } else if( !IsMapFieldVisible(ThisPlayer,x-1,y-1) ) {
 		tile|=2;
 	    }
 	}
-	if( !IsMapFieldExplored(x,y-1) ) {
+	if( !IsMapFieldExplored(ThisPlayer,x,y-1) ) {
 	    tile2|=3;
 	    tile|=3;
-	} else if( !IsMapFieldVisible(x,y-1) ) {
+	} else if( !IsMapFieldVisible(ThisPlayer,x,y-1) ) {
 	    tile|=3;
 	}
 	if( sx!=sy+w-1 ) {
-	    if( !IsMapFieldExplored(x+1,y-1) ) {
+	    if( !IsMapFieldExplored(ThisPlayer,x+1,y-1) ) {
 		tile2|=1;
 		tile|=1;
-	    } else if( !IsMapFieldVisible(x+1,y-1) ) {
+	    } else if( !IsMapFieldVisible(ThisPlayer,x+1,y-1) ) {
 		tile|=1;
 	    }
 	}
     }
 
     if( sx!=sy ) {
-	if( !IsMapFieldExplored(x-1,y) ) {
+	if( !IsMapFieldExplored(ThisPlayer,x-1,y) ) {
 	    tile2|=10;
 	    tile|=10;
-	} else if( !IsMapFieldVisible(x-1,y) ) {
+	} else if( !IsMapFieldVisible(ThisPlayer,x-1,y) ) {
 	    tile|=10;
 	}
     }
     if( sx!=sy+w-1 ) {
-	if( !IsMapFieldExplored(x+1,y) ) {
+	if( !IsMapFieldExplored(ThisPlayer,x+1,y) ) {
 	    tile2|=5;
 	    tile|=5;
-	} else if( !IsMapFieldVisible(x+1,y) ) {
+	} else if( !IsMapFieldVisible(ThisPlayer,x+1,y) ) {
 	    tile|=5;
 	}
     }
 
     if( sy+w<TheMap.Height*w ) {
 	if( sx!=sy ) {
-	    if( !IsMapFieldExplored(x-1,y+1) ) {
+	    if( !IsMapFieldExplored(ThisPlayer,x-1,y+1) ) {
 		tile2|=8;
 		tile|=8;
-	    } else if( !IsMapFieldVisible(x-1,y+1) ) {
+	    } else if( !IsMapFieldVisible(ThisPlayer,x-1,y+1) ) {
 		tile|=8;
 	    }
 	}
-	if( !IsMapFieldExplored(x,y+1) ) {
+	if( !IsMapFieldExplored(ThisPlayer,x,y+1) ) {
 	    tile2|=12;
 	    tile|=12;
-	} else if( !IsMapFieldVisible(x,y+1) ) {
+	} else if( !IsMapFieldVisible(ThisPlayer,x,y+1) ) {
 	    tile|=12;
 	}
 	if( sx!=sy+w-1 ) {
-	    if( !IsMapFieldExplored(x+1,y+1) ) {
+	    if( !IsMapFieldExplored(ThisPlayer,x+1,y+1) ) {
 		tile2|=4;
 		tile|=4;
-	    } else if( !IsMapFieldVisible(x+1,y+1) ) {
+	    } else if( !IsMapFieldVisible(ThisPlayer,x+1,y+1) ) {
 		tile|=4;
 	    }
 	}
@@ -1861,7 +1861,7 @@ local void DrawFogOfWarTile(int sx,int sy,int dx,int dy)
 	    tile=0;
 	}
     }
-    if( IsMapFieldVisible(x,y) ) {
+    if( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	if( tile ) {
 	    VideoDrawFog(TheMap.Tiles[tile],dx,dy);
 //	    TheMap.Fields[sx].VisibleLastFrame|=MapFieldPartiallyVisible;
diff --git a/src/map/map_rock.cpp b/src/map/map_rock.cpp
index 746bd6784..006197e5d 100644
--- a/src/map/map_rock.cpp
+++ b/src/map/map_rock.cpp
@@ -168,7 +168,7 @@ global void MapFixSeenRockTile(int x, int y)
     }
 
     // FIXME: can this only happen if seen?
-    if ( IsMapFieldVisible(x,y) ) {
+    if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	UpdateMinimapSeenXY(x, y);
 	MarkDrawPosMap(x, y);
 	MustRedraw |= RedrawMinimap;
@@ -307,7 +307,7 @@ global void MapFixRockTile(int x, int y)
 	mf->Tile = tile;
 	UpdateMinimapXY(x, y);
 
-	if ( IsMapFieldVisible(x,y) ) {
+	if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	    UpdateMinimapSeenXY(x, y);
 	    MapMarkSeenTile(x, y);
 	    MarkDrawPosMap(x, y);
@@ -335,7 +335,7 @@ global void MapRemoveRock(unsigned x, unsigned y)
     UpdateMinimapXY(x, y);
     MapFixRockNeighbors(x, y);
 
-    if ( IsMapFieldVisible(x,y) ) {
+    if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	UpdateMinimapSeenXY(x, y);
 	MapMarkSeenTile(x, y);
 	MarkDrawPosMap(x, y);
diff --git a/src/map/map_save.cpp b/src/map/map_save.cpp
index 37f7c74bf..0e8f5f291 100644
--- a/src/map/map_save.cpp
+++ b/src/map/map_save.cpp
@@ -100,7 +100,7 @@ global void SaveMap(FILE* file)
 		}
 	    }
 #else
-	    if( IsMapFieldVisible(w,h) ) {
+	    if( IsMapFieldVisible(ThisPlayer,w,h) ) {
 		fprintf(file," visible");
 	    }
 	    if( mf->Flags&MapFieldExplored ) {
diff --git a/src/map/map_wall.cpp b/src/map/map_wall.cpp
index b9e3c2747..18d788a7a 100644
--- a/src/map/map_wall.cpp
+++ b/src/map/map_wall.cpp
@@ -158,7 +158,7 @@ global void MapFixSeenWallTile(int x, int y)
 	mf->SeenTile = tile;
 
 	// FIXME: can this only happen if seen?
-	if (IsMapFieldVisible(x, y)) {
+	if (IsMapFieldVisible(ThisPlayer, x, y)) {
 	    UpdateMinimapSeenXY(x, y);
 	    MarkDrawPosMap(x, y);
 	    MustRedraw |= RedrawMinimap;
@@ -258,7 +258,7 @@ global void MapFixWallTile(int x, int y)
 	mf->Tile = tile;
 	UpdateMinimapXY(x, y);
 
-	if (IsMapFieldVisible(x, y)) {
+	if (IsMapFieldVisible(ThisPlayer, x, y)) {
 	    UpdateMinimapSeenXY(x, y);
 	    MapMarkSeenTile(x, y);
 	    MarkDrawPosMap(x, y);
@@ -299,7 +299,7 @@ global void MapRemoveWall(unsigned x, unsigned y)
     MapFixWallTile(x, y);
     MapFixWallNeighbors(x, y);
 
-    if (IsMapFieldVisible(x,y)) {
+    if (IsMapFieldVisible(ThisPlayer, x, y)) {
 	UpdateMinimapSeenXY(x, y);
 	MapMarkSeenTile(x, y);
         MarkDrawPosMap(x, y);
@@ -339,7 +339,7 @@ global void MapSetWall(unsigned x, unsigned y, int humanwall)
     MapFixWallTile(x, y);
     MapFixWallNeighbors(x, y);
 
-    if (IsMapFieldVisible(x, y)) {
+    if (IsMapFieldVisible(ThisPlayer, x, y)) {
 	UpdateMinimapSeenXY(x, y);
 	MapMarkSeenTile(x, y);
         MarkDrawPosMap(x, y);
diff --git a/src/map/map_wood.cpp b/src/map/map_wood.cpp
index 1d4ec35a1..e2f0d06af 100644
--- a/src/map/map_wood.cpp
+++ b/src/map/map_wood.cpp
@@ -169,7 +169,7 @@ global void MapFixSeenWoodTile(int x, int y)
     }
 
     // FIXME: can this only happen if seen?
-    if ( IsMapFieldVisible(x,y) ) {
+    if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	UpdateMinimapSeenXY(x, y);
 	MarkDrawPosMap(x, y);
 	MustRedraw |= RedrawMinimap;
@@ -306,7 +306,7 @@ global void MapFixWoodTile(int x, int y)
 	UpdateMinimapXY(x, y);
 	//MapFixWoodNeighbors(x, y);
 
-	if ( IsMapFieldVisible(x,y) ) {
+	if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	    UpdateMinimapSeenXY(x, y);
 	    MapMarkSeenTile(x, y);
 	    MarkDrawPosMap(x, y);
@@ -334,7 +334,7 @@ global void MapRemoveWood(unsigned x, unsigned y)
     UpdateMinimapXY(x, y);
     MapFixWoodNeighbors(x, y);
 
-    if ( IsMapFieldVisible(x,y) ) {
+    if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 	UpdateMinimapSeenXY(x, y);
 	MapMarkSeenTile(x, y);
 	MarkDrawPosMap(x, y);
@@ -389,10 +389,10 @@ global void RegenerateForest(void)
 			    mf->Tile = TheMap.Tileset->BotOneTree;
 			    mf->Value = 0;
 			    mf->Flags |= MapFieldForest | MapFieldUnpassable;
-			    if ( IsMapFieldVisible(x,y) ) {
+			    if ( IsMapFieldVisible(ThisPlayer,x,y) ) {
 				MapMarkSeenTile(x, y);
 			    }
-			    if ( IsMapFieldVisible(x,y-1) ) {
+			    if ( IsMapFieldVisible(ThisPlayer,x,y-1) ) {
 				MapMarkSeenTile(x, y-1);
 			    }
 			}
diff --git a/src/map/minimap.cpp b/src/map/minimap.cpp
index f1d8f3646..d4d843679 100644
--- a/src/map/minimap.cpp
+++ b/src/map/minimap.cpp
@@ -258,8 +258,8 @@ global void DrawMinimap(int vx __attribute__((unused)),
 	for( my=0; my<MINIMAP_H; ++my ) {
 	    for( mx=0; mx<MINIMAP_W; ++mx ) {
 #ifdef NEW_FOW
-		if( IsMapFieldVisible(Minimap2MapX[mx],(Minimap2MapY[my]/TheMap.Width))
-			|| (IsMapFieldExplored(Minimap2MapX[mx],
+		if( IsMapFieldVisible(ThisPlayer,Minimap2MapX[mx],(Minimap2MapY[my]/TheMap.Width))
+			|| (IsMapFieldExplored(ThisPlayer,Minimap2MapX[mx],
 					(Minimap2MapY[my]/TheMap.Width)) &&
 					((mx&1)==(my&1)))) {
 		    VideoDrawPixel(((unsigned char*)MinimapGraphic->Frames)
diff --git a/src/stratagus/missile.cpp b/src/stratagus/missile.cpp
index 6fc677b44..4f5f7bd5b 100644
--- a/src/stratagus/missile.cpp
+++ b/src/stratagus/missile.cpp
@@ -721,8 +721,8 @@ local int MissileVisibleInViewport(const Viewport* vp, const Missile* missile)
     DebugLevel3Fn("Missile bounding box %d %d %d %d\n" _C_ min_x _C_ max_x _C_
 	min_y _C_ max_y);
 
-    if( !IsMapFieldVisible((missile->X-TileSizeX/2)/TileSizeX,
-			   (missile->Y-TileSizeY/2)/TileSizeY)) {
+    if( !IsMapFieldVisible(ThisPlayer,(missile->X-TileSizeX/2)/TileSizeX,
+		(missile->Y-TileSizeY/2)/TileSizeY)) {
 	return 0;
     }
 
diff --git a/src/ui/mouse.cpp b/src/ui/mouse.cpp
index 192d85501..02b609149 100644
--- a/src/ui/mouse.cpp
+++ b/src/ui/mouse.cpp
@@ -697,14 +697,15 @@ global void UIHandleMouseMove(int x,int y)
 	const Viewport* vp;
 
 	vp = TheUI.MouseViewport;
-	if (IsMapFieldVisible(Viewport2MapX(vp, x), Viewport2MapY(vp, y)) ) {
+	if (IsMapFieldVisible(ThisPlayer, Viewport2MapX(vp, x),
+		    Viewport2MapY(vp, y)) ) {
 	    UnitUnderCursor = UnitOnScreen(NULL ,x-vp->X + vp->MapX*TileSizeX
 		,y-vp->Y + vp->MapY*TileSizeY);
 	}
     } else if( CursorOn==CursorOnMinimap ) {
 	mx=ScreenMinimap2MapX(x);
 	my=ScreenMinimap2MapY(y);
-	if( IsMapFieldVisible(mx,my) ) {
+	if( IsMapFieldVisible(ThisPlayer,mx,my) ) {
 	    UnitUnderCursor=UnitOnMapTile(mx,my);
 	}
     }
@@ -1302,7 +1303,7 @@ global void UIHandleButtonDown(unsigned button)
 		if( CanBuildUnitType(Selected[0],CursorBuilding,x,y)
 			// FIXME: vladi: should check all building footprint
 			// but not just MAPEXPLORED(x,y)
-			&& IsMapFieldExplored(x,y) ) {
+			&& IsMapFieldExplored(ThisPlayer,x,y) ) {
 		    PlayGameSound(GameSounds.PlacementSuccess.Sound
 			    ,MaxSampleVolume);
 		    SendCommandBuildBuilding(Selected[0],x,y,CursorBuilding
@@ -1573,7 +1574,8 @@ global void UIHandleButtonUp(unsigned button)
 	    }
 	    // cade: cannot select unit on invisible space
 	    // FIXME: johns: only complete invisibile units
-	    if( IsMapFieldVisible(Viewport2MapX(TheUI.MouseViewport,CursorX),
+	    if( IsMapFieldVisible(ThisPlayer,
+			Viewport2MapX(TheUI.MouseViewport,CursorX),
 			Viewport2MapY(TheUI.MouseViewport,CursorY)) ) {
 		unit=UnitOnScreen(unit
 		    ,CursorX-TheUI.MouseViewport->X+
diff --git a/src/unit/unit.cpp b/src/unit/unit.cpp
index 8239bf8e8..79ce048b6 100644
--- a/src/unit/unit.cpp
+++ b/src/unit/unit.cpp
@@ -999,7 +999,7 @@ global int UnitVisibleOnMap(const Unit* unit)
     //
     for( ; h-->0; ) {
 	for( w=w0; w-->0; ) {
-	    if( IsMapFieldVisible(x+w,y+h) ) {
+	    if( IsMapFieldVisible(ThisPlayer,x+w,y+h) ) {
 		return 1;
 	    }
 	}
@@ -1052,9 +1052,9 @@ global int UnitKnownOnMap(const Unit* unit)
     //
     for( ; h-->0; ) {
 	for( w=w0; w-->0; ) {
-	    if( IsMapFieldVisible(x+w,y+h)
+	    if( IsMapFieldVisible(ThisPlayer,x+w,y+h)
 		    || (unit->Type->Building && unit->SeenFrame!=UnitNotSeen
-			&& IsMapFieldExplored(x+w,y+h)) ) {
+			&& IsMapFieldExplored(ThisPlayer,x+w,y+h)) ) {
 		return 1;
 	    }
 	}
@@ -1120,9 +1120,9 @@ global int UnitVisibleInViewport(const Viewport* vp, const Unit* unit)
     //
     for( ; h-->0; ) {
 	for( w=w0; w-->0; ) {
-	    if( IsMapFieldVisible(x+w,y+h)
+	    if( IsMapFieldVisible(ThisPlayer,x+w,y+h)
 		    || (unit->Type->Building && unit->SeenFrame!=UnitNotSeen
-			&& IsMapFieldExplored(x+w,y+h)) ) {
+			&& IsMapFieldExplored(ThisPlayer,x+w,y+h)) ) {
 		return 1;
 	    }
 	}
@@ -2723,7 +2723,11 @@ global int FindWoodInSight(const Unit* unit,int* px,int* py)
 		//
 		//	Look if there is wood
 		//
+#ifdef NEW_FOW
+		if ( ForestOnMap(x,y) && IsMapFieldExplored(unit->Player,x,y) ) {
+#else
 		if ( ForestOnMap(x,y) ) {
+#endif
 		    if( destu ) {
 			n=max(abs(destx-x),abs(desty-y));
 			if( n<bestd ) {
diff --git a/src/video/cursor.cpp b/src/video/cursor.cpp
index 271339440..e128008d1 100644
--- a/src/video/cursor.cpp
+++ b/src/video/cursor.cpp
@@ -736,7 +736,7 @@ local void DrawBuildingCursor(void)
 		    ((Selected[0]
 			    && Selected[0]->X==mx+w && Selected[0]->Y==my+h)
 			? ~(MapFieldLandUnit|MapFieldSeaUnit) : -1))
-		  && IsMapFieldExplored(mx+w,my+h) ) {
+		  && IsMapFieldExplored(ThisPlayer,mx+w,my+h) ) {
 		color=ColorGreen;
 	    } else {
 		color=ColorRed;