private void repositionFaceDown(Player p) {
		PlayerCardsRange curCardRanges = playerIndices[p.getPlayerId()];
		List<Card> faceDown = p.getFaceDown();
		List<CardEntity> moved = new ArrayList<CardEntity>(faceDown.size());
		int delta;
		cardsWriteLock.lock();
		try {
			CardRange[] sublists = { drawDeckEntitiesRange };
			for (int i = 0; i < sublists.length && moved.size() < faceDown.size(); i++) {
				CardRange bounds = sublists[i];
				ListIterator<CardEntity> iter = cards.listIterator(bounds.getStart() + bounds.getLength());
				for (int j = bounds.getLength() - 1; j >= 0 && moved.size() < faceDown.size(); j--) {
					CardEntity ent = iter.previous();
					if (faceDown.contains(ent.getValue())) {
						iter.remove();
						moved.add(ent);
						bounds.lengthen(-1);
					}
				}
			}
			assert moved.size() == faceDown.size();
			delta = moved.size() - curCardRanges.getFaceDownRange().getLength();

			curCardRanges.getFaceDownRange().lengthen(delta);
			cards.addAll(curCardRanges.getFaceDownRange().getStart(), moved);
		} finally {
			cardsWriteLock.unlock();
		}

		double rot = getRotation(p);
		int i = 0;
		int left = -((FACE_DOWN_SEQUENCE_MARGIN - 1) + cardImages.getCardWidth()) * 3 / 2;
		cardsReadLock.lock();
		try {
			for (i = 0; i < curCardRanges.getFaceDownRange().getLength(); i++) {
				CardEntity c = cards.get(curCardRanges.getFaceDownRange().getStart() + i);
				c.mark(transform(rot, new Point(i * (cardImages.getCardWidth() + FACE_DOWN_SEQUENCE_MARGIN) + left, DISTANCE_FROM_CENTER)), rot, 1);
				c.reset();
				c.setShow(false);
			}
		} finally {
			cardsReadLock.unlock();
		}
	}