diff --git a/uItem.pas b/uItem.pas
index b5a1de33..83bfa199 100644
--- a/uItem.pas
+++ b/uItem.pas
@@ -2,6 +2,129 @@
 
 interface
 
+uses BearLibItems, uCommon, uMap;
+
+type
+  TItemBase = record
+    Symbol: Char;
+    Name: string;
+    MaxDurability: Byte;
+    Color: Cardinal;
+    Deep: TDeepEnum;
+  end;
+
+const
+  ItemCount = 6;
+  //
+  itGold    = 0;
+
+const
+  ItemBase: array [0..ItemCount - 1] of TItemBase = (
+  // All
+  (Symbol: '$'; Name: 'Gold';               MaxDurability:   0; Color: clYellow; Deep: deDarkWood;     ),
+  // Dark Wood
+  (Symbol: '/'; Name: 'Item';               MaxDurability:   0; Color: clYellow; Deep: deDarkWood;     ),
+  // Gray Cave
+  (Symbol: '/'; Name: 'Item';               MaxDurability:   0; Color: clYellow; Deep: deGrayCave;     ),
+  // Deep Cave
+  (Symbol: '/'; Name: 'Item';               MaxDurability:   0; Color: clYellow; Deep: deDeepCave;     ),
+  // Blood Cave
+  (Symbol: '/'; Name: 'Item';               MaxDurability:   0; Color: clYellow; Deep: deBloodCave;    ),
+  // Dungeon of Doom
+  (Symbol: '/'; Name: 'Item';               MaxDurability:   0; Color: clYellow; Deep: deDungeonOfDoom;)
+  );
+
+type
+  TItems = class(TObject)
+  private
+
+  public
+    constructor Create;
+    destructor Destroy; override;
+    procedure Render(AX, AY: Byte);
+    procedure Add(ADeep: TDeepEnum);
+  end;
+
+var
+  Items: TItems = nil;
+
 implementation
 
+uses Math, uTerminal, uPlayer;
+
+{ TItems }
+
+procedure TItems.Add(ADeep: TDeepEnum);
+var
+  ID, FX, FY: Byte;
+  FItem: Item;
+  D: Integer;
+begin
+  repeat
+    ID := Math.RandomRange(0, ItemCount);
+    FX := Math.RandomRange(0, High(Byte));
+    FY := Math.RandomRange(0, High(Byte));
+  until (Map.GetTileEnum(FX, FY, ADeep) in SpawnTiles)
+    and ((ID <= itGold) or (ItemBase[ID].Deep = ADeep));
+  FItem.MapID := Ord(ADeep);
+  FItem.ItemID := ID;
+  FItem.X := FX;
+  FItem.Y := FY;
+  case FItem.ItemID of
+    itGold: // Gold
+    begin
+      FItem.Stack := 1000;
+      FItem.Amount := Math.RandomRange(0, 25) + 1;
+    end;
+    else
+    begin
+      FItem.Stack := 1;
+      FItem.Amount := 1;
+    end;
+  end;
+  if (FItem.Stack = 1) then
+  begin
+    D := ItemBase[ID].MaxDurability;
+    FItem.Durability := Math.RandomRange(D div 5, D) + 1;
+  end;
+  Items_Dungeon_AppendItem(FItem);
+end;
+
+constructor TItems.Create;
+begin
+  Items_Open;
+end;
+
+destructor TItems.Destroy;
+begin
+  Items_Close;
+  inherited;
+end;
+
+procedure TItems.Render(AX, AY: Byte);
+var
+  I, Count: Integer;
+  FItem: Item;
+  MapID: Byte;
+begin
+  MapID := Ord(Map.Deep);
+  Count := Items_Dungeon_GetMapCount(MapID);
+  for I := Count - 1 downto 0 do
+  begin
+    FItem := Items_Dungeon_GetMapItem(MapID, I);
+    if not Map.InView(FItem.X, FItem.Y)
+      or (not WizardMode and not Map.GetFOV(FItem.X, FItem.Y)) then Continue;
+    Terminal.Print(FItem.X - Player.X + AX + View.Left,
+      FItem.Y - Player.Y + AY + View.Top, ItemBase[FItem.ItemID].Symbol,
+      ItemBase[FItem.ItemID].Color);
+  end;
+end;
+
+initialization
+  Items := TItems.Create;
+
+finalization
+  Items.Free;
+  Items := nil;
+
 end.
diff --git a/uMap.pas b/uMap.pas
index eede750c..3d1fa1fb 100644
--- a/uMap.pas
+++ b/uMap.pas
@@ -133,7 +133,7 @@   TMap = class(TObject)
 
 implementation
 
-uses Math, uPlayer, uMob;
+uses Math, uPlayer, uMob, uItem;
 
 { TMap }
 
@@ -331,7 +331,8 @@ procedure TMap.Gen;
   for FDeep := Low(TDeepEnum) to High(TDeepEnum) do
   begin
     for I := 0 to 255 do Mobs.Add(FDeep);
-  end;    
+    for I := 0 to 255 do Items.Add(FDeep);
+  end;
 end;
 
 function TMap.GetTile(ATileEnum: TTileEnum): TTile;
diff --git a/uMob.pas b/uMob.pas
index c7116857..77382cb1 100644
--- a/uMob.pas
+++ b/uMob.pas
@@ -62,7 +62,7 @@   TMobs = class(TObject)
     function GetIndex(AX, AY: Byte): Integer;
   end;
 
-type
+type  
   TGetXYVal = function(X, Y: Integer): Boolean; stdcall;
 
 var
@@ -148,10 +148,11 @@ procedure TMob.Process;
 
 procedure TMob.Render(AX, AY: Byte);
 begin
-  if not Map.InView(X, Y) or (not WizardMode and not Map.GetFOV(X, Y)) then Exit;
-  Terminal.ForegroundColor(MobBase[ID].Color);
+  if not Map.InView(X, Y) or (not WizardMode
+    and not Map.GetFOV(X, Y)) then Exit;
   Terminal.Print(X - Player.X + AX + View.Left,
-    Y - Player.Y + AY + View.Top, MobBase[ID].Symbol);
+    Y - Player.Y + AY + View.Top, MobBase[ID].Symbol,
+    MobBase[ID].Color);
 end;
 
 { TMobs }
@@ -166,7 +167,7 @@ procedure TMobs.Add(ADeep: TDeepEnum);
       FMob[I].AddRandom(ADeep);
       Exit;
     end;
-  SetLength(FMob, Length(FMob) + 1);
+  SetLength(FMob, Length(FMob) + 1);  
   I := Length(FMob) - 1;
   FMob[I] := TMob.Create;
   FMob[I].AddRandom(ADeep);
diff --git a/uScenes.pas b/uScenes.pas
index d98a8a9c..35ad687f 100644
--- a/uScenes.pas
+++ b/uScenes.pas
@@ -120,7 +120,7 @@ implementation
 
 uses
   SysUtils, Types, Dialogs, Math, uCommon, uTerminal, uPlayer, BearLibTerminal,
-  uMap, uMob, uMsgLog;
+  uMap, uMob, uMsgLog, uItem;
 
 { TScene }
 
@@ -389,10 +389,11 @@ procedure TSceneGame.Render;
       if WizardMode or not Map.GetFog(X, Y) then
         Terminal.Print(DX + View.Left, DY + View.Top, T.Symbol);
     end;
-  // Player, mobs, items
+  // Items, player, mobs
+  Items.Render(PX, PY);
   Player.Render(PX, PY);
   Mobs.Render(PX, PY);
-  // Player info   
+  // Player info
   Terminal.BackgroundColor(0);
   Terminal.ForegroundColor(clYellow);
   Terminal.Print(Status.Left, Status.Top, 'Trollhunter');