public static new StatusResults RefreshStatus(SubmissionInfo submissionData, StatusResults previousStatus)
        {
            string additionalLogDetails = "";

            try
            {
                if (!string.IsNullOrWhiteSpace(previousStatus.State))
                {
                    var stateData = JsonConvert.DeserializeObject <UpdStatusState>(previousStatus.State);

                    additionalLogDetails += "Submitted Fax with etherFAX ID: " + stateData.jobId + "\r\n";
                    additionalLogDetails += "etherFAX Tag: " + stateData.tagValue + "\r\n";

                    string decryptedPassword = Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(stateData.password), _encryptionEntropy, DataProtectionScope.LocalMachine));

                    var       client    = new SampleEtherFaxApi(stateData.account, stateData.username, decryptedPassword);
                    FaxStatus faxStatus = client.GetFaxStatus(stateData.jobId);

                    if (faxStatus.FaxResult == FaxResult.Success) // Success
                    {
                        return(new StatusResults()
                        {
                            Result = true,
                            StatusCode = 100,
                            Message = "Your fax was delivered successfully.",
                            NotifyUser = true,
                            LogDetails = "Your fax was delivered successfully!\r\n" + additionalLogDetails
                        });
                    }
                    else if (faxStatus.FaxResult == FaxResult.InProgress) // Incomplete - check status again
                    {
                        return(new StatusResults()
                        {
                            Result = false,
                            StatusCode = 200 + (int)faxStatus.State,
                            SeverityLevel = StatusResults.SeverityLevels.Low,
                            Message = "Fax in progress. " + faxStatus.State.ToString().Replace("_", " ") + "... " + faxStatus.PagesDelivered + " pages delivered.",
                            NextStatusRefresh = DateTime.Now.AddSeconds(30),
                            State = previousStatus.State,
                            LogDetails = "Fax in progress. " + faxStatus.State.ToString().Replace("_", " ") + "... " + faxStatus.PagesDelivered + " pages delivered.\r\n" + additionalLogDetails
                        });
                    }
                    else if (faxStatus.FaxResult == FaxResult.Cancelled) // Cancelled
                    {
                        return(new StatusResults()
                        {
                            Result = false,
                            StatusCode = 300,
                            SeverityLevel = StatusResults.SeverityLevels.Low,
                            Message = "Your fax was cancelled.",
                            LogDetails = "Fax cancelled: " + faxStatus.ToString().Replace("_", " ") + "\r\n" + additionalLogDetails,
                            NotifyUser = true
                        });
                    }
                    else // All errors
                    {
                        return(new StatusResults()
                        {
                            Result = false,
                            StatusCode = 400 + (int)faxStatus.FaxResult,
                            SeverityLevel = StatusResults.SeverityLevels.High,
                            Message = "Your fax was not delivered. Reason: " + faxStatus.ToString().Replace("_", " "),
                            LogDetails = "Fax failed: " + faxStatus.ToString().Replace("_", " ") + "\r\n" + additionalLogDetails,
                            NotifyUser = true
                        });
                    }
                }
                else
                {
                    return(new StatusResults()
                    {
                        Result = false,
                        StatusCode = 900,
                        SeverityLevel = StatusResults.SeverityLevels.Critical,
                        Message = "Cannot refresh the status. Reason: Missing state data.",
                        LogDetails = "Fax failed: Missing state data." + "\r\n" + additionalLogDetails,
                        NotifyUser = true
                    });
                }
            }
            catch (WebException httpEx)
            {
                string webExDetails = "";

                using (var httpResponse = httpEx.Response as HttpWebResponse)
                {
                    if (httpResponse != null)
                    {
                        HttpStatusCode statusCode        = httpResponse.StatusCode;
                        string         statusDescription = httpResponse.StatusDescription;

                        string responseHeaders = httpResponse.Headers != null?httpResponse.Headers.ToString() : null;

                        using (Stream stream = httpResponse.GetResponseStream())
                        {
                            using (var sr = new StreamReader(stream))
                            {
                                string content = sr.ReadToEnd();
                                webExDetails = "Status: " + statusCode.ToString() + @"/" + statusDescription + "\r\n\r\n" + "Response: " + content;
                            }
                        }
                    }
                }

                return(new StatusResults()
                {
                    Result = false,
                    StatusCode = 901,
                    SeverityLevel = StatusResults.SeverityLevels.Critical,
                    Message = "An error has occurred checking the status.",
                    NextStatusRefresh = DateTime.Now.AddSeconds(30),
                    LogDetails = httpEx.Message + "\r\n\r\n" + webExDetails + "\r\n" + additionalLogDetails,
                    NotifyUser = true,
                    State = previousStatus.State
                });
            }
            catch (Exception ex)
            {
                UpdStatusState stateData = null;
                try
                {
                    stateData = JsonConvert.DeserializeObject <UpdStatusState>(previousStatus.State);
                    stateData.statusRetryCount++;
                }
                catch (Exception stateEx)
                {
                    ex = new AggregateException(new List <Exception>()
                    {
                        ex, stateEx
                    });
                }

                var result = new StatusResults()
                {
                    Result            = false,
                    StatusCode        = 902,
                    SeverityLevel     = StatusResults.SeverityLevels.Critical,
                    Message           = "An error has occurred checking the status.",
                    NextStatusRefresh = DateTime.Now.AddSeconds(30),
                    LogDetails        = ex.Message + "\r\n" + additionalLogDetails,
                    NotifyUser        = true,
                    State             = previousStatus.State
                };
                if (stateData != null && stateData.statusRetryCount < MAX_REFRESH_ERRORS)
                {
                    result.NextStatusRefresh = DateTime.Now.AddSeconds(30);
                }
                return(result);
            }
        }