public static boolean equipItem(Hero owner, Item item) {
		if (owner != null && item != null && !isItemEquipped(owner, item)) {
			// item is not equipped yet
			ItemCategory itemCategory = item.getCategory();
			if (item.getLevel() <= owner.getLevel() && !ItemCategory.QUEST.equals(itemCategory) && !ItemCategory.CONSUMABLE.equals(itemCategory)) {
				// item is a bearable item that can be carried by the owner
				Set<Item> equipment = owner.getEquipment();

				int max = getMaxItemBearable(itemCategory);
				if (equipment.stream().filter(i -> i.getCategory().equals(itemCategory)).count() < max) {
					// owner does not have an item of this category equipped yet OR
					// owner can still bear another item of this category
					equipment.add(item);

					// set correct owner for item abilities
					// to allow a unit to use it
					Set<Ability> abilities = item.getAbilities();
					if (abilities != null) {
						for (Ability ability : abilities) {
							ability.setOwner(owner);
							// create event for gameEventController
							Map<GameEventParameter, Object> eventParams = new HashMap<GameEventParameter, Object>();
							eventParams.put(GameEventParameter.TRIGGERING_UNIT, owner);
							eventParams.put(GameEventParameter.TRIGGERING_ABILITY, ability);
							GameEventHandler.INSTANCE.createAndDispatchEvent(GameEventType.UNIT_ADD_ABILITY, owner, eventParams);
							if (LOGGER.isDebugEnabled())
								LOGGER.debug("Successfully added itemability '" + ability + "' to hero '" + owner + "'");
						}
					}

					if (LOGGER.isDebugEnabled())
						LOGGER.debug("Successfully added equipment item '" + item + "' to hero " + owner);

					return true;
				}
			}
		}

		return false;
	}