diff --git a/Client/CentrED.lpi b/Client/CentrED.lpi
index 5c1612f..6ff2e7a 100644
--- a/Client/CentrED.lpi
+++ b/Client/CentrED.lpi
@@ -4,6 +4,7 @@
     
     
       
+        
         
       
       
diff --git a/Client/CentrED.lpr b/Client/CentrED.lpr
index ab2b16e..638b39b 100644
--- a/Client/CentrED.lpr
+++ b/Client/CentrED.lpr
@@ -33,17 +33,7 @@ uses
   {$ENDIF}{$ENDIF}
   SysUtils,
   Interfaces, // this includes the LCL widgetset
-  Forms, LResources, lnetvisual, LazOpenGLContext, UdmNetwork, UfrmMain,
-  UfrmLogin, UfrmInitialize, UfrmAccountControl, virtualtreeview_package,
-  multiloglaz, UfrmEditAccount, UfrmDrawSettings, UfrmBoundaries,
-  UfrmElevateSettings, UOverlayUI, UResourceManager, UfrmConfirmation,
-  UfrmMoveSettings, UfrmAbout, UfrmHueSettings, UfrmRadar,
-  UfrmLargeScaleCommand, UfrmVirtualLayer, UfrmFilter,
-  UGUIPlatformUtils, UPlatformTypes, UfrmRegionControl, UPackets,
-  UPacketHandlers, UAdminHandling, UGameResources, ULandscape, UfrmToolWindow,
-  Logging, UTileDataProvider, UMap, UWorldItem, UStatics, UTiledata, UAnimData,
-  UGLFont, UAnimDataProvider, UMulManager, UArtProvider, UTexmapProvider,
-ULightManager, ULight, ULightProvider;
+  Forms, LResources, UdmNetwork;
 
 {$IFDEF WINDOWS}{$R CentrED.rc}{$ENDIF}
 
diff --git a/Client/ULightManager.pas b/Client/ULightManager.pas
index 6add2ec..185519c 100644
--- a/Client/ULightManager.pas
+++ b/Client/ULightManager.pas
@@ -69,12 +69,12 @@ type
   protected
     FX: Integer;
     FY: Integer;
-    FZ: smallint;
+    FZ: SmallInt;
     FMaterial: TLightMaterial;
   public
     property X: Integer read FX;
     property Y: Integer read FY;
-    property Z: smallint read FZ;
+    property Z: SmallInt read FZ;
     property Material: TLightMaterial read FMaterial;
   end;
 
@@ -89,13 +89,15 @@ type
     FLightSources: TLightSources;
     FOverlay: TSingleImage;
     FOverlayTexture: GLuint;
-    FLightLevel: byte;
+    FLightLevel: Byte;
     FValid: Boolean;
     FCalculateOffset: TCalculateOffset;
     FLightCache: TLightCache;
     function GetLight(AID: Integer): TLightMaterial;
+    procedure SetLightLevel(AValue: Byte);
     procedure UpdateOverlay(AScreenRect: TRect);
   public
+    property LightLevel: Byte read FLightLevel write SetLightLevel;
     procedure UpdateLightMap(ALeft, AWidth, ATop, AHeight: Integer;
       AScreenBuffer: TScreenBuffer);
     procedure Draw(AScreenRect: TRect);
@@ -112,7 +114,7 @@ constructor TLightManager.Create(ACalculateOffset: TCalculateOffset);
 begin
   FCalculateOffset := ACalculateOffset;
   FLightSources := TLightSources.Create(True);
-  FLightLevel := 15; //TODO : 0 ...
+  FLightLevel := 0;
   FLightCache := TLightCache.Create(32);
 end;
 
@@ -142,6 +144,12 @@ begin
   end;
 end;
 
+procedure TLightManager.SetLightLevel(AValue: Byte);
+begin
+  FLightLevel := AValue;
+  FValid := False;
+end;
+
 procedure TLightManager.UpdateOverlay(AScreenRect: TRect);
 var
   canvas, lightCanvas: TFastARGB32Canvas;
@@ -153,12 +161,12 @@ begin
   glDeleteTextures(1, @FOverlayTexture);
 
   color.A := $FF;
-  color.R := ((32 - FLightLevel) * 255)  div 32;
+  color.R := ((32 - FLightLevel) * 255) div 32;
   color.G := color.R;
   color.B := color.R;
 
-  FOverlay := TSingleImage.CreateFromParams(AScreenRect.Right, AScreenRect.Bottom,
-    ifA8R8G8B8);
+  FOverlay := TSingleImage.CreateFromParams(AScreenRect.Right,
+    AScreenRect.Bottom, ifA8R8G8B8);
   canvas := TFastARGB32Canvas.CreateForImage(FOverlay);
   try
     canvas.FillColor32 := color.Color;
@@ -223,9 +231,10 @@ begin
       if lightMap[x, y] <> nil then
       begin
         if ((itemMap[x, y] = nil) or (itemMap[x, y].Z < lightMap[x, y].Z + 3)) or
-           ((itemMap[x + 1, y] = nil) or (itemMap[x + 1, y].Z < lightMap[x, y].Z + 3)) or
-           ((itemMap[x + 1, y + 1] = nil) or (itemMap[x + 1, y + 1].Z < lightMap[x, y].Z + 3)) or
-           ((itemMap[x, y + 1] = nil) or (itemMap[x, y + 1].Z < lightMap[x, y].Z + 3)) then
+          ((itemMap[x + 1, y] = nil) or (itemMap[x + 1, y].Z < lightMap[x, y].Z + 3)) or
+          ((itemMap[x + 1, y + 1] = nil) or (itemMap[x + 1, y + 1].Z <
+          lightMap[x, y].Z + 3)) or ((itemMap[x, y + 1] = nil) or
+          (itemMap[x, y + 1].Z < lightMap[x, y].Z + 3)) then
         begin
           FLightSources.Add(TLightSource.Create(Self, lightMap[x, y]));
         end;
@@ -242,14 +251,14 @@ begin
   glBindTexture(GL_TEXTURE_2D, FOverlayTexture);
   glBlendFunc(GL_ZERO, GL_SRC_COLOR);
   glBegin(GL_QUADS);
-    glTexCoord2i(0, 0);
-    glVertex2i(AScreenRect.Left, AScreenRect.Top);
-    glTexCoord2i(0, 1);
-    glVertex2i(AScreenRect.Left, AScreenRect.Bottom);
-    glTexCoord2i(1, 1);
-    glVertex2i(AScreenRect.Right, AScreenRect.Bottom);
-    glTexCoord2i(1, 0);
-    glVertex2i(AScreenRect.Right, AScreenRect.Top);
+  glTexCoord2i(0, 0);
+  glVertex2i(AScreenRect.Left, AScreenRect.Top);
+  glTexCoord2i(0, 1);
+  glVertex2i(AScreenRect.Left, AScreenRect.Bottom);
+  glTexCoord2i(1, 1);
+  glVertex2i(AScreenRect.Right, AScreenRect.Bottom);
+  glTexCoord2i(1, 0);
+  glVertex2i(AScreenRect.Right, AScreenRect.Top);
   glEnd;
 end;
 
diff --git a/Client/UfrmMain.pas b/Client/UfrmMain.pas
index 40cfd5a..08465cd 100644
--- a/Client/UfrmMain.pas
+++ b/Client/UfrmMain.pas
@@ -2389,7 +2389,8 @@ begin
       blockInfo^.Text.Render(blockInfo^.ScreenRect);
   end;
 
-  FLightManager.Draw(oglGameWindow.ClientRect);
+  if (FLightManager.LightLevel > 0) and not acFlat.Checked then
+    FLightManager.Draw(oglGameWindow.ClientRect);
   FOverlayUI.Draw(oglGameWindow);
 end;
 
@@ -2435,7 +2436,7 @@ end;
 procedure TfrmMain.OnMapChanged(AMapCell: TMapCell);
 begin
   PrepareMapCell(AMapCell);
-  ForceUpdateCurrentTile;
+  InvalidateFilter;
 end;
 
 procedure TfrmMain.OnNewBlock(ABlock: TBlock);
@@ -2461,8 +2462,7 @@ begin
   begin
     PrepareScreenBlock(blockInfo);
     Exclude(FScreenBufferState, sbsIndexed);
-
-    ForceUpdateCurrentTile;
+    InvalidateFilter;
   end;
 end;
 
@@ -2477,6 +2477,7 @@ begin
     begin
       PrepareScreenBlock(blockInfo);
       FRepaintNeeded := True;
+      InvalidateFilter;
       Break;
     end;
   end;
@@ -2492,7 +2493,7 @@ begin
     AStaticItem.PrioritySolver := FScreenBuffer.GetSerial;
     PrepareScreenBlock(FScreenBuffer.Insert(AStaticItem));
     FRepaintNeeded := True;
-    ForceUpdateCurrentTile;
+    InvalidateFilter;
   end;
 end;
 
@@ -2591,11 +2592,11 @@ var
   i, tileX, tileY: Integer;
   virtualTile: TVirtualTile;
 begin
-  Logger.EnterMethod([lcClient], 'RebuildScreenBuffer');
+  //Logger.EnterMethod([lcClient], 'RebuildScreenBuffer');
 
   FDrawDistance := Trunc(Sqrt(oglGameWindow.Width * oglGameWindow.Width +
     oglGamewindow.Height * oglGamewindow.Height) / 44);
-  Logger.Send([lcClient], 'DrawDistance', FDrawDistance);
+  //Logger.Send([lcClient], 'DrawDistance', FDrawDistance);
 
   {$HINTS off}{$WARNINGS off}
   if FX - FDrawDistance < 0 then FLowOffsetX := -FX else FLowOffsetX := -FDrawDistance;
@@ -2612,7 +2613,7 @@ begin
 
   if frmVirtualLayer.cbShowLayer.Checked then
   begin
-    Logger.Send([lcClient, lcDebug], 'Preparing Virtual Layer');
+    //Logger.Send([lcClient, lcDebug], 'Preparing Virtual Layer');
 
     if FVLayerMaterial = nil then
       FVLayerMaterial := TSimpleMaterial.Create(FVLayerImage);
@@ -2657,7 +2658,7 @@ begin
         FVirtualTiles.Delete(i);
   end;
 
-  Logger.Send([lcClient, lcDebug], 'VirtualTiles', FVirtualTiles.Count);
+  //Logger.Send([lcClient, lcDebug], 'VirtualTiles', FVirtualTiles.Count);
 
   FLandscape.FillDrawList(FScreenBuffer, FX + FLowOffsetX, FY + FLowOffsetY,
     FRangeX, FRangeY, tbTerrain.Down, tbStatics.Down, acNoDraw.Checked,
@@ -2671,7 +2672,7 @@ begin
   FScreenBuffer.UpdateShortcuts;
   FScreenBufferState := [sbsValid, sbsIndexed];
 
-  Logger.ExitMethod([lcClient], 'RebuildScreenBuffer');
+  //Logger.ExitMethod([lcClient], 'RebuildScreenBuffer');
 end;
 
 procedure TfrmMain.UpdateCurrentTile;
@@ -2689,13 +2690,13 @@ procedure TfrmMain.UpdateCurrentTile(AX, AY: Integer);
 var
   blockInfo: PBlockInfo;
 begin
-  Logger.EnterMethod([lcClient, lcDebug], 'UpdateCurrentTile');
+  //Logger.EnterMethod([lcClient, lcDebug], 'UpdateCurrentTile');
   FOverlayUI.ActiveArrow := FOverlayUI.HitTest(AX, AY);
   if FOverlayUI.ActiveArrow > -1 then
   begin
-    Logger.Send([lcClient, lcDebug], 'Overlay active');
+    //Logger.Send([lcClient, lcDebug], 'Overlay active');
     CurrentTile := nil;
-    Logger.ExitMethod([lcClient, lcDebug], 'UpdateCurrentTile');
+    //Logger.ExitMethod([lcClient, lcDebug], 'UpdateCurrentTile');
     Exit;
   end;
 
@@ -2705,7 +2706,7 @@ begin
   else
     CurrentTile := nil;
 
-  Logger.ExitMethod([lcClient, lcDebug], 'UpdateCurrentTile');
+  //Logger.ExitMethod([lcClient, lcDebug], 'UpdateCurrentTile');
 end;
 
 procedure TfrmMain.UpdateFilter;
@@ -2732,9 +2733,11 @@ begin
   end;
   Include(FScreenBufferState, sbsFiltered);
 
-  //TODO : Check lightlevel first
-  FLightManager.UpdateLightMap(FX + FLowOffsetX, FRangeX + 1, FY + FLowOffsetY,
-    FRangeY + 1, FScreenBuffer);
+  ForceUpdateCurrentTile;
+
+  if (FLightManager.LightLevel > 0) and not acFlat.Checked then
+    FLightManager.UpdateLightMap(FX + FLowOffsetX, FRangeX + 1, FY + FLowOffsetY,
+      FRangeY + 1, FScreenBuffer);
 end;
 
 procedure TfrmMain.UpdateSelection;
@@ -2841,7 +2844,7 @@ var
   cell: TMapCell;
   i, tileX, tileY: Integer;
 begin
-  Logger.EnterMethod([lcClient, lcDebug], 'UpdateSelection');
+  //Logger.EnterMethod([lcClient, lcDebug], 'UpdateSelection');
 
   //If the current tile is nil, but we still have a selected tile, the
   //procedure is pointless - the selection should stay intact.
@@ -2853,7 +2856,7 @@ begin
       selectedRect := GetSelectedRect;
 
     //clean up old ghost tiles
-    Logger.Send([lcClient, lcDebug], 'Cleaning ghost tiles');
+    //Logger.Send([lcClient, lcDebug], 'Cleaning ghost tiles');
     for i := FVirtualTiles.Count - 1 downto 0 do
     begin
       item := FVirtualTiles[i];
@@ -2863,7 +2866,7 @@ begin
         FVirtualTiles.Delete(i);
       end;
     end;
-    Logger.Send([lcClient, lcDebug], 'FSelection', FSelection);
+    //Logger.Send([lcClient, lcDebug], 'FSelection', FSelection);
     for tileX := FSelection.Left to FSelection.Right do
       for tileY := FSelection.Top to FSelection.Bottom do
         if not IsInRect(tileX, tileY, selectedRect) then
@@ -2881,8 +2884,8 @@ begin
       blockInfo := nil;
       if (SelectedTile <> nil) and (CurrentTile <> SelectedTile) then
       begin
-        Logger.Send([lcClient, lcDebug], 'Multiple Targets');
-        Logger.Send([lcClient, lcDebug], 'SelectedRect', selectedRect);
+        {Logger.Send([lcClient, lcDebug], 'Multiple Targets');
+        Logger.Send([lcClient, lcDebug], 'SelectedRect', selectedRect);}
         //set new ghost tiles
         if acDraw.Checked then
           for tileX := selectedRect.Left to selectedRect.Right do
@@ -2895,7 +2898,7 @@ begin
               selectedRect) and not acDraw.Checked);
       end else
       begin
-        Logger.Send([lcClient, lcDebug], 'Single Target');
+        //Logger.Send([lcClient, lcDebug], 'Single Target');
         if acDraw.Checked and not IsInRect(CurrentTile.X, CurrentTile.Y,
           FSelection) then
           AddGhostTile(CurrentTile.X, CurrentTile.Y, CurrentTile);
@@ -2907,8 +2910,8 @@ begin
     end;
     FSelection := selectedRect;
   end;
-  Logger.Send([lcClient, lcDebug], 'Virtual Tiles', FVirtualTiles.Count);
-  Logger.ExitMethod([lcClient, lcDebug], 'UpdateSelection');
+  {Logger.Send([lcClient, lcDebug], 'Virtual Tiles', FVirtualTiles.Count);
+  Logger.ExitMethod([lcClient, lcDebug], 'UpdateSelection');}
 end;
 
 procedure TfrmMain.OnTileRemoved(ATile: TMulBlock);