private void synchronizeEntities(final List<DTO> serverEntities) {
		long delta = TimeUtil.getSynchroTimestamp() - lastSynchronize;
		if (delta > Constants.SERVER_UPDATE_DELTA * 2)
			logger.debug("last synchronize: " + delta + " ms");

		lastSynchronize = TimeUtil.getSynchroTimestamp();

		for (DTO d : serverEntities) {
			if (d instanceof ServerInfoDTO) {
				serverWorkLoad = ((ServerInfoDTO) d).getCpuWorkLoad();
			}

			if (d instanceof EntityDTO == false)
				continue;

			EntityDTO dto = (EntityDTO) d;
			long id = dto.getEntityID();
			long clientId = dto.getClientId();
			long timeDelay = TimeUtil.getSynchroTimestamp() - dto.getTimestamp();

			if (timeDelay > 40)
				logger.debug("Delay: " + timeDelay);

			logger.trace("Entity's last tick() was " + timeDelay + " ms ago.");


			if (entityMap.containsKey(id)) {
				// ignore own entities
				if (entityMap.get(id).isOwner())
					continue;

				entityMap.get(id).updateFromDTO(dto);
			} else {
				Entity entity = null;
				if (dto instanceof AsteroidDTO) {
					entity = entityFactory.createAsteroid(dto.getPos(), dto.getDir(), ((AsteroidDTO) dto).getSize(),
							clientId);
				}
				if (dto instanceof PlayerDTO) {
					entity = entityFactory.createPlayer(dto.getPos(), clientId);
				}
				if (dto instanceof BulletDTO) {
					entity = entityFactory.createBullet(dto.getPos(), dto.getDir(), clientId);
				}

				entity.setEntityID(id);
				entityMap.put(id, entity);
				logger.debug("adding new Entity from server #" + dto.getEntityID());
			}


			// the entities from the server is not perfectly up to date, so this
			// updates them (like an extra tick() method)
			if (TimeUtil.isSynchronized())
				for (int i = 1; i < timeDelay / Constants.DELTA_TARGET; i++) {
					entityMap.get(id).tick(this);
				}
		}
	}