net.Receive("Skills.UpdateSkillXP", function()
        local sSkillId = net.ReadString()
        local iSkillXP = net.ReadInt( 24 )
        local lp = LocalPlayer()
 
        lp._SkillXP[sSkillId] = iSkillXP
 
        -- Draw the xp notification on their screen. The first time they get exp it won't draw
        if not skillxp_cache[ sSkillId ] then
            skillxp_cache[ sSkillId ] = iSkillXP
        else
            lp._recentSkill = lp._recentSkill or {}
            -- lp._recentSkill.skill_id = sSkillId
            -- lp._recentSkill.exp_gained = iSkillXP - skillxp_cache[ sSkillId ]
            lp._recentSkill.skill_material = Material(M.Skills:GetSkillIconPath( sSkillId ), "smooth")
            lp._recentSkill.time = CurTime()
 
            M.Skills:AddXPNotification( sSkillId )
 
            local skill_level = lp:GetSkillLevel( sSkillId )
 
            if not skilllevel_cache[ sSkillId ] then
                skilllevel_cache[ sSkillId ] = skill_level
            end
 
            if skilllevel_cache[ sSkillId ] < skill_level then
                local sNewMilestone
                for sMilestoneName, tMilestone in pairs( (M.Skills:GetSkill( sSkillId ) or {}).milestones or {} ) do
                    if( tMilestone.level == skill_level ) then
                        sNewMilestone = sMilestoneName
                        break
                    end
                end
 
                lp._recentSkill.leveled_up = true
                lp._recentSkill.new_level_milestone = sNewMilestone
 
                skilllevel_cache[ sSkillId ] = skill_level
 
                surface.PlaySound("ambient/levelup/ambient_chimes_"..math.random(1,22)..".mp3")
 
                timer.Simple(5, function()
                    lp._recentSkill.leveled_up = false
                    lp._recentSkill.new_level_milestone = nil
                end)
            end
        end
    end)