private async void Generate_Clicked(object sender, EventArgs e)
        {
            Analytics.TrackEvent("Character Generator");
            Character character = null;
            var       config    = new Character.Configuration()
            {
                Ruleset          = GenerationConfiguration.Ruleset,
                Campaign         = GenerationConfiguration.Campaign,
                Culture          = selectedCulture.Id,
                Sex              = GenerationConfiguration.Sex,
                Style            = generationStyle,
                CharacterSpecies = species
            };

            character = Character.CreateCharacter(config);
            if (character is Cepheus.Character)
            {
                var cc = character as Cepheus.Character;
                cc.SkillOffered += SkillOffered;
            }

            character.Generate();

            // Let the user see theie stats so they can make a more informed choice about
            // which career to select
            await DisplayAlert("Profile", string.Format("Your UPP is {0}", character.Profile.Display), Properties.Resources.Button_OK);

            var keepgoing = false;

            do
            {
                var clist = selectedCulture.Careers(character);
                // You can't do the same career twice execpt for outcast and drifter - unless forced via the draft
                var careerList = clist.Keys.Except(character.Careers
                                                   .Where(c => !(c.Name.Equals("Outcast") || c.Name.Equals("Drifter")))
                                                   .Select(c => c.Name));
                var selected = string.Empty;
                if (careerList.Count() == 1)
                {
                    selected = careerList.ToArray()[0];
                }
                else if (careerList.Count() > 1)
                {
                    selected = await DisplayActionSheet(Properties.Resources.Prompt_Select_Career, null, null, careerList.ToArray());
                }
                else
                {
                    // No careers left to to do - exit
                    keepgoing = false;
                }
                if (!string.IsNullOrEmpty(selected))
                {
                    var career = selectedCulture.GetBasicCareer(clist[selected]);
                    career.SkillOffered += SkillOffered;
                    if (career is Classic.Zhodani.Career)
                    {
                        var zc = career as Classic.Zhodani.Career;
                        zc.PsionicGamesOffered    += DoPsionicGames;
                        zc.PsionicTrainingOffered += DoPsionicTraining;
                    }
                    career.Owner = character;
                    if (career.Enlist())
                    {
                        character.Careers.Add(career);
                        await ResolveBasicCareer(character, career);
                    }
                    else if (selectedCulture.Id == Constants.CultureType.Aslan)
                    {
                        // Aslan don't do draft - go straight to outcast
                        career       = selectedCulture.GetBasicCareer(Career.CareerType.Aslan_Outcast);
                        career.Owner = character;
                        character.Careers.Add(career);
                        await ResolveBasicCareer(character, career);
                    }
                    else
                    {
                        // Unable to enlist, submit to draft?
                        var res = await DisplayAlert(Properties.Resources.Title_App,
                                                     Properties.Resources.Prompt_Draft,
                                                     Properties.Resources.Button_Yes,
                                                     Properties.Resources.Button_No);

                        if (res)
                        {
                            do
                            {
                                career = selectedCulture.Drafted(character);
                            } while (character.Careers.Contains(career));
                            career.Owner   = character;
                            career.Drafted = true;
                            character.Journal.Add(string.Format(Properties.Resources.Jrn_Drafted, career.Name));
                            await DisplayAlert(Properties.Resources.Title_App, string.Format(Properties.Resources.Msg_Drafted, career.Name), Properties.Resources.Button_OK);

                            character.Careers.Add(career);
                            await ResolveBasicCareer(character, career);
                        }
                        else if (selectedCulture.Id == Constants.CultureType.Cepheus_Generic)
                        {
                            // In Cepheus if you don't submit to draft you end up as a drifter
                            career       = selectedCulture.GetBasicCareer(Career.CareerType.Cepheus_Drifter);
                            career.Owner = character;
                            character.Careers.Add(career);
                            await ResolveBasicCareer(character, career);
                        }
                    }
                }
                if (selectedCulture.MultipleCareers &&
                    !character.Died &&
                    !(character.Careers.Sum(c => c.TermsServed) > 6) &&
                    keepgoing)
                {
                    var doagain = await DisplayAlert(Properties.Resources.Title_App,
                                                     Properties.Resources.Prompt_Another_Career,
                                                     Properties.Resources.Button_Yes,
                                                     Properties.Resources.Button_No);

                    if (doagain)
                    {
                        keepgoing = true;
                    }
                    else
                    {
                        keepgoing = false;
                    }
                }
                else
                {
                    keepgoing = false;
                }
            } while (keepgoing);
            // check to see if the total of skill levels in non-psionic skills is greater than the sum of
            // int and edu, if it is they have to be reduced
            var total = character.Skills.Values.Where(a => a.Class != Skill.SkillClass.Psionic).Sum(a => a.Level);

            if (total > character.Profile.Int.Value + character.Profile.Edu.Value)
            {
                // Need to reduce skills count
                await DisplayAlert(Properties.Resources.Title_App, Properties.Resources.Msg_Skill_Total, Properties.Resources.Button_OK);

                var skillView = new SkillView(character);
                await Navigation.PushModalAsync(skillView);
            }
            var characterView = new CharacterViewer(character);
            await Navigation.PushAsync(characterView);
        }