private void fetchCluster(Direction direction) {
		BoundingBox boundingBox;
		if (direction == Direction.CENTER) {
			// only called once at initialization!
			if (initialized) {
				throw new RuntimeException("fetchCluster for " + direction
						+ " called twice. this should never happen!");
			}
			initialized = true;

			boundingBox = toBoundingBox(mapManager.getViewport());
		} else {
			// there is always a cluster in the center after initialization!
			Cluster centerCluster = getCluster(Direction.CENTER);

			boundingBox = calculateBoundingBox(centerCluster, direction);
		}

		Cluster cluster = new Cluster(boundingBox);
		setCluster(direction, cluster);

		try {
			List<MapPath> streets = fetcher
					.getBoundingBox(boundingBox, cluster);
			for (MapPath street : streets) {
				cache.addStreet(street);
			}
		} catch (IOException e) {
			if (Direction.CENTER == direction) {
				throw new RuntimeException(
						"could not initialize NodeManager: loading "
								+ direction + " failed", e);
			} else {
				// TODO: retry?
				e.printStackTrace();
			}
		}

		if (MapsRacer.DEBUG) {
			System.out.println("finished loading " + direction);
		}
	}