private async void ParseTimerTick(object sender, object e)
        {
            List <DisplayPrime> notDetectedPrimePartsList = new List <DisplayPrime>();
            List <Task>         fetchTasks = new List <Task>();
            string text = string.Empty;

            parseTimer.Stop();

            WarframeNotDetected = false;
            WarframeNotFocus    = false;

            if (!Warframe.WarframeIsRunning())
            {
                WarframeNotDetected = true;
                WarframeProcess     = null;
                parseTimer.Start();
                return;
            }
            if (SkipNotFocus && !IsOnFocus())
            {
                WarframeNotFocus = true;
                parseTimer.Start();
                return;
            }

            try
            {
                text = await ScreenCapture.ParseTextAsync();

                text = text.ToLower(new System.Globalization.CultureInfo("en-US"));

                //Only use spellcheck if using English
                if (LocalizationManager.Language.ToLower(new System.Globalization.CultureInfo("en-US")) == "english")
                {
                    text = await Task.Run(() => SpellCheckOCR(text));
                }

                detectedPrimePartsList.Clear();

                foreach (var part in AllPrimePartsList)
                {
                    if (text.IndexOf(LocalizationManager.Localize(part.Prime.Name), StringComparison.InvariantCultureIgnoreCase) != -1)
                    {
                        part.Visible = true;
                        detectedPrimePartsList.Add(part);
                        fetchTasks.Add(FetchPlatTask(part));
                        fetchTasks.Add(FetchDucatTask(part));
                    }
                    else
                    {
                        notDetectedPrimePartsList.Add(part);
                    }
                }

                if (!ShowAllPrimes)
                {
                    if (notDetectedPrimePartsList.Count < AllPrimePartsList.Count)
                    {
                        //Only hide if we see at least one prime (let the old list persist until we need to refresh)
                        foreach (var part in notDetectedPrimePartsList)
                        {
                            part.Visible = false;
                        }
                    }
                }

                if (text.Contains(LocalizationManager.MissionSuccess.ToLower(new System.Globalization.CultureInfo("en-US"))) &&
                    lastMissionCompleteTime + TimeSpan.FromMinutes(1.0) > DateTime.Now &&
                    notDetectedPrimePartsList.Count < AllPrimePartsList.Count)
                {
#if DEBUG
                    Console.WriteLine("Mission Success");
#endif
                    OnMissionComplete();
                }

                if (text.Contains(LocalizationManager.SelectAReward.ToLower(new System.Globalization.CultureInfo("en-US"))) &&
                    notDetectedPrimePartsList.Count < AllPrimePartsList.Count)
                {
#if DEBUG
                    Console.WriteLine("Select a Reward");
#endif

                    if (RenderOverlay && !backgroundWorker.IsBusy)
                    {
                        StartRenderOverlayPrimes();
                        backgroundWorker.RunWorkerAsync();
                    }
                }
                else if (backgroundWorker.IsBusy)
                {
                    backgroundWorker.CancelAsync();
                }

                await Task.WhenAll(fetchTasks).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
#if DEBUG
                Console.Error.WriteLine("Error: " + ex.Message);
#endif
            }
            finally
            {
                parseTimer.Start();
            }
        }