diff --git a/Controllers/InventoryController.cs b/Controllers/InventoryController.cs
index d55430b..8599e15 100644
--- a/Controllers/InventoryController.cs
+++ b/Controllers/InventoryController.cs
@@ -62,12 +62,12 @@ namespace PetCompanion.Controllers
             }
         }
 
-        [HttpPut("{petId}/{equipTarget}/unequip")]
-        public IActionResult UnequipItem(string petId, ItemEquipTarget equipTarget)
+        [HttpPut("{petId}/{itemId}/unequip")]
+        public IActionResult UnequipItem(string petId, int itemId)
         {
             try
             {
-                var updatedPet = inventoryService.UnequipItem(petId, userId.ToString(), equipTarget);
+                var updatedPet = inventoryService.UnequipItem(petId, userId.ToString(), itemId);
                 return Ok(updatedPet);
             }
             catch (Exception ex)
diff --git a/README.md b/README.md
index 947355e..54f8c82 100644
--- a/README.md
+++ b/README.md
@@ -15,15 +15,15 @@
 
 ## Inventory system
 - [ ] Inventory UI
-- [ ] Inventory database
-- [ ] Inventory item database (items, consumables, equipment)
-- [ ] Inventory item interactions (use, equip, unequip, drop)
-- [ ] Inventory item stacking
+- [x] Inventory database
+- [x] Inventory item database (items, consumables, equipment)
+- [x] Inventory item interactions (use, equip, unequip, drop)
+- [/] Inventory item stacking
 - [ ] Inventory item sorting (UI)
 
 ## Skill tree system
 - [ ] Skill tree UI
-- [ ] Skill tree database
-- [ ] Skill tree interactions (learn, unlearn, upgrade)
-- [ ] Skill tree requirements (level, skill points, other skills)
-- [ ] Skill tree effects (TBD)
+- [x] Skill tree database
+- [/] Skill tree interactions (learn, unlearn, upgrade)
+- [/] Skill tree requirements (level, skill points, other skills)
+- [x] Skill tree effects (TBD)
diff --git a/Repositories/PetSkillRepository.cs b/Repositories/PetSkillRepository.cs
index 76af9bd..bbb8cde 100644
--- a/Repositories/PetSkillRepository.cs
+++ b/Repositories/PetSkillRepository.cs
@@ -13,6 +13,13 @@ namespace PetCompanion.Repositories
             _context = context;
         }
 
+        public Skill GetSkill(int id)
+        {
+            return _context.Skills
+                .Include(s => s.Effects)
+                .FirstOrDefault(s => s.Id == id);
+        }
+
         public IEnumerable<PetSkill> GetPetSkills(string petId)
         {
             return _context.PetSkills
diff --git a/Services/PetInventoryService.cs b/Services/PetInventoryService.cs
index 28cf49b..0407f22 100644
--- a/Services/PetInventoryService.cs
+++ b/Services/PetInventoryService.cs
@@ -79,7 +79,8 @@ namespace PetCompanion.Services
             // If there's already an item equipped in that slot, unequip it first
             if (pet.EquippedItems.ContainsKey(gameItem.EquipTarget))
             {
-                UnequipItem(petId, userId, gameItem.EquipTarget);
+                var equippedItemId = pet.EquippedItems[gameItem.EquipTarget];
+                UnequipItem(petId, userId, equippedItemId);
             }
 
             // Apply equipment effects
@@ -96,17 +97,18 @@ namespace PetCompanion.Services
             return petRepository.UpdatePet(pet);
         }
 
-        public Pet UnequipItem(string petId, string userId, ItemEquipTarget equipTarget)
+        public Pet UnequipItem(string petId, string userId, int itemId)
         {
             var pet = petRepository.GetPetById(petId, userId);
             if (pet == null)
                 throw new Exception("Pet not found");
 
-            if (!pet.EquippedItems.ContainsKey(equipTarget))
+            var equipTarget = pet.EquippedItems.FirstOrDefault(kvp => kvp.Value == itemId).Key;
+
+            if (equipTarget == ItemEquipTarget.None)
                 throw new Exception("No item equipped in that slot");
 
-            var equippedItemId = pet.EquippedItems[equipTarget];
-            var equippedItem = gameItemsRepository.GetById(equippedItemId);
+            var equippedItem = gameItemsRepository.GetById(itemId);
 
             if (equippedItem != null)
             {
@@ -114,7 +116,7 @@ namespace PetCompanion.Services
                 gameItemService.RemoveItemEffect(pet, equippedItem);
 
                 // Add item back to inventory
-                pet.Inventory.Items.Add(equippedItemId);
+                pet.Inventory.Items.Add(itemId);
             }
 
             pet.EquippedItems.Remove(equipTarget);
diff --git a/Services/PetSkillService.cs b/Services/PetSkillService.cs
index a01bb15..48c2d78 100644
--- a/Services/PetSkillService.cs
+++ b/Services/PetSkillService.cs
@@ -32,6 +32,7 @@ namespace PetCompanion.Services
             if (pet.SkillPoints <= 0)
                 throw new Exception("No skill points available");
 
+            var skill = _petSkillRepository.GetSkill(skillId);
             var skills = _petSkillRepository.GetPetSkills(petId);
             var existingSkill = skills.FirstOrDefault(s => s.SkillId == skillId);
 
@@ -45,6 +46,11 @@ namespace PetCompanion.Services
             }
             else
             {
+                if (!skill.SkillsIdRequired.TrueForAll(ni => pet.Skills.Any(s => s.SkillId == ni)))
+                {
+                    throw new Exception("Missing required skill");
+                }
+
                 existingSkill = new PetSkill
                 {
                     PetId = petId,