public static void OrderStatusChanged(OrderInfo orderInfo, AfterOrderStatusChangedEventArgs e)
		{
			Log.Instance.LogDebug("AfterOrderStatusChanged Start");

			if (orderInfo == null || orderInfo.OrderLines.Count == 0)
				return;

			Log.Instance.LogDebug("AfterOrderStatusChanged e.OrderStatus: " + e.OrderStatus);

			Log.Instance.LogDebug("AfterOrderStatusChanged e.SendEmails: " + e.SendEmails);

			switch (e.OrderStatus)
			{
				case OrderStatus.Incomplete:
					break;
				case OrderStatus.Confirmed:
					// copy customerdata to shipping data if there is no shippingdata on the order
					OrderHelper.CopyCustomerToShipping(orderInfo);

					if (orderInfo.OrderNodeId == 0)
					{
						if (orderInfo.CustomerInfo.CustomerInformation != null)
						{
							string customerEmail = null, customerFirstName = null, customerLastName = null;
							foreach (var customerProperty in IO.Container.Resolve<ICMSDocumentTypeService>().GetByAlias(Order.NodeAlias).Properties.Where(x => x.Alias.StartsWith("customer")))
							{
								var element = orderInfo.CustomerInfo.CustomerInformation.Element(customerProperty.Alias);
								if (element != null)
								{
									if (element.Name == "customerEmail")
									{
										customerEmail = element.Value;
									}
									else if (element.Name == "customerFirstName")
									{
										customerFirstName = element.Value;
									}
									else if (element.Name == "customerLastName")
									{
										customerLastName = element.Value;
									}
								}
							}
							IO.Container.Resolve<IOrderRepository>().SetCustomerInfo(orderInfo.UniqueOrderId, customerEmail, customerFirstName, customerLastName);
						}

						// remove guid from cookie and expire it immediately
						//OrderHelper.RemoveOrderCookie(orderInfo);
						// set completed order id cookie to have access to old order after payment
						OrderHelper.SetCompletedOrderCookie(orderInfo);

						// update stock when no payment provider is chosen
						if (orderInfo.PaymentInfo.Id == 0 || orderInfo.PaymentInfo.PaymentType == PaymentProviderType.OfflinePaymentInStore || orderInfo.PaymentInfo.PaymentType == PaymentProviderType.OfflinePaymentAtCustomer || orderInfo.PaymentInfo.PaymentType == PaymentProviderType.Unknown)
						{
							OrderHelper.UpdateStock(orderInfo);
						}
					}

					#region send emails

					if (e.SendEmails)
					{
						int customerEmailNodeId;

						int.TryParse(orderInfo.StoreInfo.Store.ConfirmationEmailCustomer, out customerEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.ConfirmationEmailStore, out storeEmailNodeId);


						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Confirmed e.SendEmails == false");
					}

					if (orderInfo.PaymentInfo.Id == 0 && orderInfo.Status != OrderStatus.Confirmed)
					{
						orderInfo.Status = OrderStatus.Confirmed;
					}

					if (orderInfo.PaymentInfo.PaymentType == PaymentProviderType.OfflinePaymentAtCustomer || orderInfo.PaymentInfo.PaymentType == PaymentProviderType.OfflinePaymentInStore)
					{
						orderInfo.Status = OrderStatus.OfflinePayment;
					}

					// if online payment set status to waiting for payment
					if (orderInfo.PaymentInfo.PaymentType == PaymentProviderType.OnlinePayment)
					{
						orderInfo.Status = OrderStatus.WaitingForPayment;

						if (orderInfo.PaymentInfo.TransactionMethod == PaymentTransactionMethod.Inline)
						{
							var paymentProvider =
								PaymentProviderHelper.GetAllPaymentProviders()
									.FirstOrDefault(x => x.Id == orderInfo.PaymentInfo.Id);

							orderInfo = new PaymentRequestHandler().HandleuWebshopPaymentResponse(paymentProvider, orderInfo);
						}
					}

					orderInfo.Save();

					#endregion

					break;
				case OrderStatus.Cancelled:

					// return stock
					OrderHelper.ReturnStock(orderInfo);

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.CancelEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.CancelEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Cancelled e.SendEmails == false");
					}

					break;
				case OrderStatus.Closed:

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.ClosedEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.ClosedEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Closed e.SendEmails == false");
					}
					break;
				case OrderStatus.PaymentFailed:

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.PaymentFailedEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.PaymentFailedEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged PaymentFailed e.SendEmails == false");
					}
					break;
				case OrderStatus.OfflinePayment:

					OrderHelper.UpdateStock(orderInfo);

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.OfflinePaymentEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.OfflinePaymentEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged OfflinePayment e.SendEmails == false");
					}
					break;
				case OrderStatus.Pending:

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.PendingEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.PendingEmailStore, out storeEmailNodeId);
						
						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Pending e.SendEmails == false");
					}
					break;
				case OrderStatus.ReadyForDispatch:

					Log.Instance.LogDebug("AfterOrderStatusChanged ReadyForDispatch orderInfo.PaymentInfo.PaymentType: " + orderInfo.PaymentInfo.PaymentType);
					if (orderInfo.PaymentInfo.PaymentType == PaymentProviderType.OnlinePayment)
					{
						OrderHelper.UpdateStock(orderInfo);
						Log.Instance.LogDebug("AfterOrderStatusChanged ReadyForDispatch after update stock");
					}
					
					Log.Instance.LogDebug("AfterOrderStatusChanged ReadyForDispatch before send emails");
					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.OnlinePaymentEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.OnlinePaymentEmailStore, out storeEmailNodeId);
						
						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged ReadyForDispatch e.SendEmails == false");
					}

					Log.Instance.LogDebug("AfterOrderStatusChanged ReadyForDispatch after send emails");
					break;
				case OrderStatus.ReadyForDispatchWhenStockArrives:

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.TemporaryOutOfStockEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.TemporaryOutOfStockEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged ReadyForDispatchWhenStockArrives e.SendEmails == false");
					}
					break;
				case OrderStatus.Dispatched:

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.DispatchEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.DispatchedEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Dispatched e.SendEmails == false");
					}
					break;
				case OrderStatus.Undeliverable:

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.UndeliverableEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.UndeliverableEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}
						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Undeliverable e.SendEmails == false");
					}
					break;
				case OrderStatus.WaitingForPayment:

					
					
					break;
				case OrderStatus.Returned:

					// return stock
					OrderHelper.ReturnStock(orderInfo);

					if (e.SendEmails)
					{
						int customerEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.ReturnedEmailCustomer, out customerEmailNodeId);
						int storeEmailNodeId;
						int.TryParse(orderInfo.StoreInfo.Store.ReturnedEmailStore, out storeEmailNodeId);

						if (customerEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailCustomer(customerEmailNodeId, orderInfo);
						}

						if (storeEmailNodeId != 0)
						{
							EmailHelper.SendOrderEmailStore(storeEmailNodeId, orderInfo);
						}
					}
					else
					{
						Log.Instance.LogDebug("AfterOrderStatusChanged Returned e.SendEmails == false");
					}

					break;
			}
		}