public boolean quitAndWait()
	throws IOException
	{
		try {
			if( !isBooting() && !isRunning() ) return true;
		
			final OSCMessage msg = quitMsg();
		
			for( int i = 0; i < 16; i++ ) {
				if( sendMsgSync( msg, 0.5f )) {
					cleanUpAfterQuit();
					return true;
				}
			}
			// ok, now last chance : if local, kill the process
			if( isLocal ) {
				try {
					synchronized( syncBootThread ) {
						if( bootThread != null ) {
							bootThread.keepScRunning = false;
							syncBootThread.wait( 4000 );
						}
					}
				}
				catch( InterruptedException e1 ) { /* ignored */ }
			}

			if( !isBooting() && !isRunning() ) return true;
			
			printOn( printStream );
			printStream.println( " : failed to quit!" );
			return false;
		}
		finally {
			cleanUpAfterQuit();
		}
	}