public BEValue peerAnswerAsBEValue(TrackedPeer peer)
		throws UnsupportedEncodingException {
		Map<String, BEValue> params = new HashMap<String, BEValue>();

		params.put("interval", new BEValue(this.announceInterval));
		params.put("complete", new BEValue(this.seeders()));
		params.put("incomplete", new BEValue(this.leechers()));

		List<BEValue> responsePeers = new ArrayList<BEValue>();

		// Extract answerPeers random peers
		List<TrackedPeer> peers =
			new ArrayList<TrackedPeer>(this.peers.values());

		Collections.shuffle(peers);

		int count = 0;
		for (TrackedPeer candidate : peers) {
			// Collect unfresh peers, and obviously don't serve them as well.
			if (!candidate.isFresh()) {
				logger.debug("Collecting unfresh peer " + candidate + "...");
				this.peers.remove(candidate.getHexPeerId());
				continue;
			}

			if (peer.looksLike(candidate) || candidate.equals(peer)) {
				continue;
			}
			
			/*if (!candidate.isFresh() ||
				(candidate.looksLike(peer) && !candidate.equals(peer))) {
				logger.debug("Collecting stale peer " + candidate + "...");
				this.peers.remove(candidate.getHexPeerId());
				continue;
			}
			// Don't include the requesting peer in the answer.
			if (peer.looksLike(candidate)) {
				continue;
			}

			// Collect unfresh peers, and obviously don't serve them as well.
			if (!candidate.isFresh()) {
				logger.debug("Collecting stale peer " +
						candidate.getHexPeerId() + "...");
				this.peers.remove(candidate.getHexPeerId());
				continue;
			}*/

			// Only serve at most ANSWER_NUM_PEERS peers
			if (count++ > this.answerPeers) {
				break;
			}

			responsePeers.add(candidate.toBEValue());
		}

		params.put("peers", new BEValue(responsePeers));
		return new BEValue(params);
	}