protected boolean parse(Advert ad) {
		// parse separate items
		Document doc = null;
		try {
			String url = uriBuilder
					.setPath(itemPath)
					.setQuery(
							URLEncodedUtils.format(Arrays
									.asList(new BasicNameValuePair(idParamName,
											String.valueOf(ad.getId()))),
									"UTF-8")).build().toString();

			int status = connection.url(url).execute().statusCode();
			log.trace("{} from {}", status, url);
			switch (status) {
			case 404:
				log.debug("{} removed", ad.getId());
				ad.setRemoved(true);
				return true;

			case 200:
				doc = connection.get();
				break;

			default:
				log.warn("status unhandled");
				break;
			}
		} catch (URISyntaxException e) {
			log.error("failed to build uri of {} {}", host, ad.getUrl());
		} catch (IOException e) {
			log.error("failed connection to {} {}", host, ad.getUrl());
			return false;
		}

		// check 404 page XXX: may be redundant
		if (is404(doc)) {
			log.debug("{} removed", ad.getId());
			ad.setRemoved(true);
			return true;
		}

		ad.setTitle(extractField(doc, titleSelector, ""));
		ad.setDescription(extractField(doc, descriptionSelector, ""));
		ad.setPrice(extractField(doc, priceSelector, ""));
		ad.setDate(extractField(doc, dateSelector, ""));
		// collect images urls
		Elements imgs = doc.select(imagesSelector);
		if (!imgs.isEmpty()) {
			ad.setImgs(new HashSet<String>());
			for (Iterator<Element> i = imgs.iterator(); i.hasNext();) {
				ad.getImgs().add(i.next().attr("href"));
			}
		}
		collectPhones(doc, ad);

		log.debug("parsed id " + ad.getId() + " price " + ad.getPrice()
				+ " phones {} images count {}", ad.getImgs() != null ? ad
				.getImgs().size() : 0, ad.getPhones() != null ? ad.getPhones()
				.size() : 0);
		return true;
	}