public CCPAPIResult <SerializableAPICharacterSheet> Invoke(Dictionary <string, string> legacyPostData, string dataSource, string accessToken)
        {
            var characterId = int.Parse(legacyPostData["characterID"]);

            var characterInfo       = _characterApi.GetCharactersCharacterId(characterId, dataSource);
            var characterAttributes = _skillsApi.GetCharactersCharacterIdAttributes(characterId, dataSource, accessToken);
            var characterClones     = _clonesApi.GetCharactersCharacterIdClones(characterId, dataSource, accessToken);
            var characterFatigue    = _characterApi.GetCharactersCharacterIdFatigue(characterId, dataSource, accessToken);
            var characterSkills     = _skillsApi.GetCharactersCharacterIdSkills(characterId, dataSource, accessToken);

            var result = new CCPAPIResult <SerializableAPICharacterSheet>
            {
                Result = new SerializableAPICharacterSheet
                {
                    ID                = characterId,
                    Name              = characterInfo.Name,
                    Gender            = characterInfo.Gender.ToString(),
                    CorporationID     = characterInfo.CorporationId.GetValueOrDefault(),
                    CorporationName   = GetCorpName(characterInfo.CorporationId.GetValueOrDefault(), dataSource),
                    Birthday          = characterInfo.Birthday.GetValueOrDefault(),
                    AllianceID        = characterInfo.AllianceId.GetValueOrDefault(),
                    AllianceName      = GetAllianceName(characterInfo.AllianceId.GetValueOrDefault(), dataSource),
                    FactionID         = characterInfo.FactionId.GetValueOrDefault(),
                    FactionName       = GetFactionName(characterInfo.FactionId.GetValueOrDefault(), dataSource),
                    Ancestry          = GetAncestryName(characterInfo.AncestryId.GetValueOrDefault(), dataSource),
                    BloodLine         = GetBloodLineName(characterInfo.BloodlineId.GetValueOrDefault(), dataSource),
                    Race              = GetRaceName(characterInfo.RaceId.GetValueOrDefault(), dataSource),
                    LastKnownLocation = GetCharacterLocation(characterId, dataSource, accessToken),
                    SecurityStatus    = GetSecurityStatus(characterId, dataSource),
                    ShipName          = GetShipName(characterId, dataSource, accessToken),
                    ShipTypeName      = GetShipTypeName(characterId, dataSource, accessToken),
                    Balance           = GetWalletBalance(characterId, dataSource, accessToken),
                    //This also handles boosters correctly
                    Attributes = new SerializableCharacterAttributes
                    {
                        Charisma     = characterAttributes.Charisma.GetValueOrDefault(),
                        Intelligence = characterAttributes.Intelligence.GetValueOrDefault(),
                        Memory       = characterAttributes.Memory.GetValueOrDefault(),
                        Perception   = characterAttributes.Perception.GetValueOrDefault(),
                        Willpower    = characterAttributes.Willpower.GetValueOrDefault()
                    },
                    FreeRespecs    = (short)characterAttributes.BonusRemaps.GetValueOrDefault(),
                    LastRespecDate = characterAttributes.LastRemapDate.GetValueOrDefault(),
                    //We cant tell the difference here (possibly by checking accrued remap cooldowndate?)
                    LastTimedRespec    = characterAttributes.LastRemapDate.GetValueOrDefault(),
                    HomeStationID      = characterClones.HomeLocation.LocationId.GetValueOrDefault(),
                    RemoteStationDate  = characterClones.LastStationChangeDate.GetValueOrDefault(),
                    CloneJumpDate      = characterClones.LastCloneJumpDate.GetValueOrDefault(),
                    JumpActivationDate = characterFatigue.LastJumpDate.GetValueOrDefault(),
                    JumpFatigueDate    = characterFatigue.JumpFatigueExpireDate.GetValueOrDefault(),
                    JumpLastUpdateDate = characterFatigue.LastUpdateDate.GetValueOrDefault(),
                    FreeSkillPoints    = characterSkills.UnallocatedSp.GetValueOrDefault(),
                }
            };

            //CorpHistory
            result.Result.EmploymentHistory.Clear();
            result.Result.EmploymentHistory.AddRange(GetCorporationHistory(characterId, dataSource));

            //Implants
            result.Result.Implants.Clear();
            result.Result.Implants.AddRange(GetImplants(characterId, dataSource, accessToken));

            //Skills
            result.Result.Skills.Clear();
            result.Result.Skills.AddRange(GetSkills(characterSkills.Skills));

            //JumpClones
            result.Result.JumpClones.Clear();
            result.Result.JumpClones.AddRange(GetJumpClones(characterClones.JumpClones));

            //JumpCloneImplants
            result.Result.JumpCloneImplants.Clear();
            result.Result.JumpCloneImplants.AddRange(GetJumpCloneImplants(characterClones.JumpClones));

            //Not supported
            result.Result.Certificates.Clear();

            return(result);
        }