@Override
	public void run() {
		log(Level.INFO, TransportationActions.STARTING_TRANSPORTATION);
		
		log(Level.INFO, "Another thread?");
		lastStorey = getStorey();
		
		while (elevationTask.getPassengersTransported() < totalPassengers) {
			
			/* Open doors */
			/* Release elevators passengers */
			
			synchronized (waitingLock) {
				while ((elevator.getPassengers() > 0) && atDistination()) {
					synchronized (containerLock) {	
						containerLock.notifyAll();
						waitingLock.notifyAll();
					}
				}
			}
			
			/* Invite passenger */
			Object storeyLock = elevationTask.getStorey(elevator.getStorey()).getLock();
			
			synchronized (waitingLock) {
					synchronized (storeyLock) {
						storeyLock.notifyAll();
						if (elevator.isFull()) {
							
						}
						//FIXME While-loop
						//FIXME Difficult to explain, because...
						//пассажиры телепортируются в лифт независимо от его положения
				}
			}
			
			/* Close doors */
			
			if (interactive || elevationTask.getAnimationBoost() != 0) {
				try {
					synchronized (lock) {
						lock.wait();
					}

				} catch (InterruptedException e) {
					log(Level.ERROR, TransportationActions.ABORTING_TRANSPORTATION);
					break;
				}
			}
			
			/* Move to next storey */
			elevator.gotoNextStorey();
			log(Level.INFO, TransportationActions.MOVING_ELEVATOR +
					" " + lastStorey + " " + getStorey());
			lastStorey = getStorey();
		}
		
		log(Level.INFO, TransportationActions.COMPLETION_TRANSPORTATION);
		elevationTask.setState(TransportationState.COMPLETED);
		elevationTask.validate();
	}