private void ExecuteHandler(ClientSession session, string originalPacket)
        {
            if (session.Character.ExchangeInfo?.ExchangeList.Count > 0 ||
                session.Character.Speed == 0 || session.Character.LastDelay.AddSeconds(5) > DateTime.UtcNow)
            {
                return;
            }

            session.Character.LastDelay = DateTime.UtcNow;
            ItemInstance inventory;

            switch (UpgradeType)
            {
            case 0:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);

                if (inventory == null)
                {
                    break;
                }

                if (inventory.Item.IsHeroic)
                {
                    session.SendPacket(UserInterfaceHelper.GenerateInfo(Language.Instance.GetMessageFromKey("CANT_CONVERT_HEROIC")));
                    session.SendPacket("shop_end 1");
                    break;
                }

                const short donaVnum = 1027;
                var         price    = 2300 + (inventory.Item.LevelMinimum - 1) * 300;

                if (inventory.Item.EquipmentSlot != EquipmentType.Armor && inventory.Item.EquipmentSlot != EquipmentType.MainWeapon)
                {
                    // Not a good item type
                    session.SendPacket("shop_end 1");
                    break;
                }

                if (session.Character.Gold < price)
                {
                    // Not enough gold
                    session.SendPacket("shop_end 1");
                    return;
                }

                if (session.Character.Inventory.CountItem(donaVnum) < inventory.Item.LevelMinimum)
                {
                    // Not enough dona
                    session.SendPacket("shop_end 1");
                    return;
                }

                ItemInstance newItem = inventory.HardItemCopy();
                switch (inventory.Item.EquipmentSlot)
                {
                case EquipmentType.Armor:
                    switch (inventory.Item.Class)
                    {
                    case 4:
                        newItem.ItemVNum = 996;
                        break;

                    case 2:
                        newItem.ItemVNum = 997;
                        break;

                    case 8:
                        newItem.ItemVNum = 995;
                        break;

                    default:
                        session.SendPacket("shop_end 1");
                        return;
                    }

                    break;

                case EquipmentType.MainWeapon:
                    switch (inventory.Item.Class)
                    {
                    case 4:
                        newItem.ItemVNum = 991;
                        break;

                    case 2:
                        newItem.ItemVNum = 990;
                        break;

                    case 8:
                        newItem.ItemVNum = 992;
                        break;

                    default:
                        session.SendPacket("shop_end 1");
                        return;
                    }

                    break;

                default:
                    session.SendPacket("shop_end 1");
                    return;
                }

                session.Character.Inventory.DeleteFromSlotAndType(Slot, InventoryType);
                session.Character.Inventory.AddToInventory(newItem, InventoryType.Equipment);
                session.Character.Inventory.RemoveItemAmount(donaVnum, inventory.Item.LevelMinimum);
                session.Character.Gold -= price;
                session.SendPacket(session.Character.GenerateGold());
                session.SendPacket("shop_end 1");
                break;

            case 1:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (inventory != null && (inventory.Item.EquipmentSlot == EquipmentType.Armor ||
                                          inventory.Item.EquipmentSlot == EquipmentType.MainWeapon ||
                                          inventory.Item.EquipmentSlot == EquipmentType.SecondaryWeapon) &&
                    inventory.Item.ItemType != ItemType.Shell && inventory.Item.Type == InventoryType.Equipment)
                {
                    inventory.UpgradeItem(session, UpgradeMode.Normal, UpgradeProtection.None);
                }
                break;

            case 3:

                // check if that cannot be changed
                //up_gr 3 0 0 7 1 1 20 99
                string[] originalSplit = originalPacket.Split(' ');
                if (originalSplit.Length == 10 &&
                    byte.TryParse(originalSplit[5], out byte firstSlot) &&
                    byte.TryParse(originalSplit[8], out byte secondSlot))
                {
                    inventory = session.Character.Inventory.LoadBySlotAndType(firstSlot, InventoryType.Equipment);
                    if (inventory != null &&
                        (inventory.Item.EquipmentSlot == EquipmentType.Necklace ||
                         inventory.Item.EquipmentSlot == EquipmentType.Bracelet ||
                         inventory.Item.EquipmentSlot == EquipmentType.Ring) &&
                        inventory.Item.ItemType != ItemType.Shell && inventory.Item.Type == InventoryType.Equipment)
                    {
                        ItemInstance cellon =
                            session.Character.Inventory.LoadBySlotAndType <ItemInstance>(secondSlot,
                                                                                         InventoryType.Main);
                        if (cellon?.ItemVNum > 1016 && cellon.ItemVNum < 1027)
                        {
                            inventory.OptionItem(session, cellon.ItemVNum);
                        }
                    }
                }
                break;

            case 7:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (inventory != null)
                {
                    if ((inventory.Item.EquipmentSlot == EquipmentType.Armor ||
                         inventory.Item.EquipmentSlot == EquipmentType.MainWeapon ||
                         inventory.Item.EquipmentSlot == EquipmentType.SecondaryWeapon) &&
                        inventory.Item.ItemType != ItemType.Shell && inventory.Item.Type == InventoryType.Equipment)
                    {
                        inventory.RarifyItem(session, RarifyMode.Normal, RarifyProtection.None);
                    }

                    session.SendPacket("shop_end 1");
                }
                break;

            case 8:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (InventoryType2.HasValue && Slot2.HasValue)
                {
                    ItemInstance inventory2 =
                        session.Character.Inventory.LoadBySlotAndType(Slot2.Value,
                                                                      InventoryType2.Value);

                    if (inventory != null && inventory2 != null && !Equals(inventory, inventory2))
                    {
                        inventory.Sum(session, inventory2);
                    }
                }
                break;

            case 9:
                ItemInstance specialist = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (specialist != null)
                {
                    if (specialist.Rare != -2)
                    {
                        if (specialist.Item.EquipmentSlot == EquipmentType.Sp)
                        {
                            specialist.UpgradeSp(session, UpgradeProtection.None);
                        }
                    }
                    else
                    {
                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("CANT_UPGRADE_DESTROYED_SP"), 0));
                    }
                }
                break;

            case 20:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (inventory != null && (inventory.Item.EquipmentSlot == EquipmentType.Armor ||
                                          inventory.Item.EquipmentSlot == EquipmentType.MainWeapon ||
                                          inventory.Item.EquipmentSlot == EquipmentType.SecondaryWeapon) &&
                    inventory.Item.ItemType != ItemType.Shell && inventory.Item.Type == InventoryType.Equipment)
                {
                    inventory.UpgradeItem(session, UpgradeMode.Normal, UpgradeProtection.Protected);
                }
                break;

            case 21:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (inventory != null && (inventory.Item.EquipmentSlot == EquipmentType.Armor ||
                                          inventory.Item.EquipmentSlot == EquipmentType.MainWeapon ||
                                          inventory.Item.EquipmentSlot == EquipmentType.SecondaryWeapon) &&
                    inventory.Item.ItemType != ItemType.Shell && inventory.Item.Type == InventoryType.Equipment)
                {
                    inventory.RarifyItem(session, RarifyMode.Normal, RarifyProtection.Scroll);
                }
                break;

            case 25:
                specialist = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (specialist != null)
                {
                    if (specialist.Rare != -2)
                    {
                        if (specialist.Item.EquipmentSlot == EquipmentType.Sp)
                        {
                            specialist.UpgradeSp(session, UpgradeProtection.Protected);
                        }
                    }
                    else
                    {
                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("CANT_UPGRADE_DESTROYED_SP"), 0));
                    }
                }
                break;

            case 26:
                specialist = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (specialist != null)
                {
                    if (specialist.Rare != -2)
                    {
                        if (specialist.Item.EquipmentSlot == EquipmentType.Sp)
                        {
                            specialist.UpgradeSp(session, UpgradeProtection.Protected);
                        }
                    }
                    else
                    {
                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("CANT_UPGRADE_DESTROYED_SP"), 0));
                    }
                }
                break;

            case 35:
            case 38:
            case 42:
                specialist = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (specialist != null)
                {
                    if (specialist.Rare != -2)
                    {
                        if (specialist.Item.EquipmentSlot == EquipmentType.Sp)
                        {
                            specialist.UpgradeSp(session, UpgradeProtection.Event);
                        }
                    }
                    else
                    {
                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("CANT_UPGRADE_DESTROYED_SP"), 0));
                    }
                }
                break;

            case 41:
                specialist = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (specialist != null)
                {
                    if (specialist.Rare != -2)
                    {
                        if (specialist.Item.EquipmentSlot == EquipmentType.Sp)
                        {
                            specialist.PerfectSp(session);
                        }
                    }
                    else
                    {
                        session.SendPacket(UserInterfaceHelper.GenerateMsg(
                                               Language.Instance.GetMessageFromKey("CANT_UPGRADE_DESTROYED_SP"), 0));
                    }
                }
                break;

            case 43:
                inventory = session.Character.Inventory.LoadBySlotAndType(Slot, InventoryType);
                if (inventory != null && (inventory.Item.EquipmentSlot == EquipmentType.Armor ||
                                          inventory.Item.EquipmentSlot == EquipmentType.MainWeapon ||
                                          inventory.Item.EquipmentSlot == EquipmentType.SecondaryWeapon) &&
                    inventory.Item.ItemType != ItemType.Shell && inventory.Item.Type == InventoryType.Equipment)
                {
                    inventory.UpgradeItem(session, UpgradeMode.Reduced, UpgradeProtection.Protected);
                }
                break;
            }
        }