public boolean connect()
	{
		if (!notificationConnect())
		{
			boolean redirected = notificationConnect();
			if (!redirected) // try again
			{
				log.debug("MSN Connection failed");
				return false;
			} else
			{
				log.debug("MSN connected!!");
			}
		}

		SSLServerConnection sslConn = null;
		String strLoginSvr = null;
		String challengedhash = null;
		String strTicket = null;

		if (isConnected())
		{
			sslConn = new SSLServerConnection(
					SSLServerConnection.PASSPORT_LIST_SERVER_ADDRESS);
		}

		if (isConnected())
		{
			strLoginSvr = sslConn.getPassportLoginServer();
		}

		if (isConnected())
		{
			challengedhash = this.getChallengedHash(stmp);
		}

		if (isConnected())
		{
			strTicket = sslConn.requestAuthorizationTicket(strLoginSvr,
					_username, _password, challengedhash);
		}

		if (isConnected())
		{
			sendTicket(strTicket);
			stmp = getIncoming().getNextLine();
		}

		final Object waitForList = new Object();

		// so we are notified of when the list is received
		// when we received list send a ping, which retrives
		// present status from all our contacts
		_incoming.addListener(new IncommingListener()
		{
			@Override
			public void listReceived()
			{
				if (isConnected())
				{
					setPresence(_clientStatus);
					sendPing();
				}
			}

			@Override
			public void presenceUpdated()
			{
				synchronized (waitForList)
				{
					waitForList.notifyAll();
				}
			}
		});

		_incoming.startAutomaticListening();

		synch(); // requests list

		try
		{
			synchronized (waitForList)
			{
				waitForList.wait();
			}
		} catch (InterruptedException e)
		{
			log.error(e);
		}

		return true;
	}