private void performRun() {
		print(RUN, debuggee);

		// supervise entered methods
		MethodEntryRequest req = reqManager.createMethodEntryRequest();
		if (debuggee != null)
			req.addClassFilter(debuggee);
		req.addThreadFilter(curThread);
		req.enable();

		// supervise exited methods
		MethodExitRequest meReq = reqManager.createMethodExitRequest();
		if (debuggee != null)
			meReq.addClassFilter(debuggee);
		meReq.addThreadFilter(curThread);
		meReq.enable();

		vm.resume();
		boolean exit = false;

		while (!exit) {
			try {
				final EventSet events = vm.eventQueue().remove();
				final EventIterator iter = events.eventIterator();
				while (iter.hasNext()) {
					Event e = iter.nextEvent();
					if (e instanceof MethodEntryEvent) {
						// push entered method to method stack
						methodStack.push(((MethodEntryEvent) e).method());
						// tell everyone that we are running
						status = RUNNING;
						// initialization done, tell loop to exit
						exit = true;
						break;
					} else {
						assert e instanceof VMStartEvent;
					}
					vm.resume();
				}
			} catch (InterruptedException e) {
				break;
			}
		}

		// perform pending operations
		while (pendingBreakpoints.size() > 0) {
			performStop(pendingBreakpoints.remove());
		}
		if (curThread.isAtBreakpoint()) {
			try {
				final Location bp = curThread.frame(0).location();
				print(HIT_BREAKPOINT, curThread.name(), bp.method(),
						bp.lineNumber(), bp.codeIndex());
			} catch (IncompatibleThreadStateException e) {
				e.printStackTrace();
			}
		} else {
			performCont();
		}
	}