private void ProcessSnapshots( Breadcrumb breadcrumb )
		{
			if( _navigationSnapshots.Count > 0 )
			{
				var snapshots = _navigationSnapshots.Where( snapshot => snapshot.Breadcrumb.Equals( breadcrumb ) ).ToList();

				foreach( var snapshot in snapshots )
				{
					if( snapshot.Guard != null )
					{
						snapshot.Guard( snapshot.Tag );
					}

					_navigationSnapshots.Remove( snapshot );
				}
			}
		}
		private bool RestoreBreadcrumbs( bool clearOnSuccess = true )
		{
			if( !ApplicationData.Current.RoamingSettings.Values.ContainsKey( "Breadcrumbs" ) )
			{
				return false;
			}

			var unwind = new Stack<Breadcrumb>();
			string state;

			try
			{
				var history = (string) ApplicationData.Current.RoamingSettings.Values["Breadcrumbs"];

				using( var stream = new MemoryStream( Convert.FromBase64String( history ) ) )
				{
					var reader = new BinaryReader( stream );

					state = reader.ReadString();
					var count = reader.ReadInt32();

					while( count-- > 0 )
					{
						var pageTypeName = reader.ReadString();
						var hasParameters = reader.ReadBoolean();
						var pageType = Type.GetType( pageTypeName );
						XParameters parameters = null;

						if( hasParameters )
						{
							parameters = XParametersSerializer.Deserialize( reader );
						}

						var breadcrumb = new Breadcrumb( pageType, parameters );

						unwind.Push( breadcrumb );
					}
				}

				if( unwind.Count == 0 )
				{
					return false;
				}
			}
			catch( IOException )
			{
				return false;
			}

			foreach( var bc in unwind )
			{
				_breadcrumbs.Push( bc );
			}

			IsUnwinding = true;

			((WindowsRTApplication) Application.Current).RootFrame.SetNavigationState( state );

			IsUnwinding = false;

			if( clearOnSuccess )
			{
				ApplicationData.Current.RoamingSettings.Values["Breadcrumbs"] = null;
			}

			return true;
		}
		private void RootFrame_Navigated( object sender, NavigationEventArgs e )
		{
			if( !_initialized )
			{
				CompleteInitialization( e );
			}

			if( e.NavigationMode == NavigationMode.Back )
			{
				var breadcrumb = _breadcrumbs.Pop();

				ProcessSnapshots( breadcrumb );
			}
			else if( e.NavigationMode == NavigationMode.New )
			{
			    var breadcrumb = new Breadcrumb(e.SourcePageType, XParameters.Empty);
                _breadcrumbs.Push(breadcrumb);
                //_breadcrumbs.Push(new Breadcrumb(e.SourcePageType, e.Parameter as XParameters));
                //  _breadcrumbs.Push(new Breadcrumb(e.SourcePageType, XParameters.Empty));
            }
		}