common::Stats &GetStats() { return stats; }
        const common::Stats &GetStats() const { return stats; }
 
-       common::Item *Weapon() { return master->Equipment(common::Hero::EQUIP_WEAPON); }
-       common::Item *Armor() { return master->Equipment(common::Hero::EQUIP_ARMOR); }
-       common::Item *Shield() { return master->Equipment(common::Hero::EQUIP_SHIELD); }
-       common::Item *Helmet() { return master->Equipment(common::Hero::EQUIP_HELMET); }
-       common::Item *Ring() { return master->Equipment(common::Hero::EQUIP_RING); }
-       common::Item *Jewel() { return master->Equipment(common::Hero::EQUIP_JEWEL); }
-
        const common::Item *Weapon() const { return master->Equipment(common::Hero::EQUIP_WEAPON); }
        const common::Item *Armor() const { return master->Equipment(common::Hero::EQUIP_ARMOR); }
        const common::Item *Shield() const { return master->Equipment(common::Hero::EQUIP_SHIELD); }
 
        bool CanEquip(const Item &) const;
        bool CanInvoke(const Spell &) const;
 
-       Item *Equipment(EquipSlot i) { return equipment[i]; }
        const Item *Equipment(EquipSlot i) const { return equipment[i]; }
        bool Equipped(EquipSlot i) const { return equipment[i]; }
        void RemoveEquipment(EquipSlot i) { equipment[i] = 0; }
-       void SetEquipment(EquipSlot i, Item *item) { equipment[i] = item; }
+       void SetEquipment(EquipSlot i, const Item *item) { equipment[i] = item; }
 
        std::vector<const Spell *> &Spells() { return spells; }
        const std::vector<const Spell *> &Spells() const { return spells; }
 
        int useMask;
 
-       Item *equipment[EQUIP_COUNT];
+       const Item *equipment[EQUIP_COUNT];
 
        // TODO: vector does not seem to be a good choice
        std::vector<const Spell *> spells;
 
                        inventoryMenu.NextRow();
                }
                if (input.JustPressed(Input::ACTION_A)) {
-                       // TODO: equip selected item
+                       EquipSelected();
+                       inventoryMenu.SetInactive();
+                       equipmentMenu.SetActive();
                } else if (input.JustPressed(Input::ACTION_B)) {
                        inventoryMenu.SetInactive();
                        equipmentMenu.SetActive();
        }
 }
 
+void EquipMenu::EquipSelected() {
+       Inventory &inv = parent->Game().state->inventory;
+       Hero &hero = GetHero();
+       const Hero::EquipSlot slot = Hero::EquipSlot(equipmentMenu.SelectedIndex());
+
+       const Item *selected = inventoryMenu.Selected();
+       const Item *equipped = equipmentMenu.Selected();
+
+       if (!hero.CanEquip(*selected)) {
+               // TODO: error noise and blur
+               return;
+       }
+
+       inv.Remove(selected, 1);
+       if (!inv.Add(equipped, 1)) {
+               // roll back
+               inv.Add(selected, 1);
+               // TODO: error noise, blur, message?
+               return;
+       }
+
+       hero.SetEquipment(slot, selected);
+       LoadEquipment();
+       LoadInventory();
+}
+
 }
 
 
        bool InventoryVisible() const;
        void LoadInventory();
+       void EquipSelected();
 
        void RenderStatus(SDL_Surface *screen, const geometry::Vector<int> &offset) const;
        void RenderStats(SDL_Surface *screen, const geometry::Vector<int> &offset) const;