public Collection<Comune> donwloadAndParse() {
		try {
			List<Comune> comuni= new ArrayList<>();
			HttpClient httpclient = new DefaultHttpClient();
			HttpGet httpget = new HttpGet(ZIP_URL);
			HttpResponse response = httpclient.execute(httpget);
			HttpEntity entity = response.getEntity();
			if (entity != null) {
				try ( InputStream instream = entity.getContent(); ) {
				    ZipInputStream zipInputStream= new ZipInputStream(instream);
				    ZipEntry entry = zipInputStream.getNextEntry();
				    
				    if(entry != null) {
				    	ByteArrayOutputStream outputStream= new ByteArrayOutputStream();
			            byte data[] = new byte[BUFFER];
			            int count=0;
			            while ((count = zipInputStream.read(data, 0, BUFFER)) != -1) {	
			            	outputStream.write(data, 0, count);
			            }
			            StringReader reader= new StringReader(new String(outputStream.toByteArray(),HTML_ENCODING));
			            LineNumberReader lineReader= new LineNumberReader(reader);
			            String line;
			            int lineNumber=0;
			            while ((line=lineReader.readLine())!=null) {
			            	logger.trace("line " + (lineNumber+1) + " from zip file=" + line);
			            	if (lineNumber>0) {
			            		String[] values=line.split(";");
			            		if (values.length>=9) {
			            			Comune comune= new Comune(values[CODICE_ISTAT_POS], values[CODICE_CATASTALE_POS],
			            					values[NOME_POS],values[PROVINCIA_POS]);
			            			comuni.add(comune);
			            			String capStr=values[CAP_POS];
			            			Collection<String> capList;
			            			if (capStr.endsWith("x")) {
			            				capList=getListaCAPFromHTMLPage(values[URL_COMUNE_POS]);
			            			} else {
			            				capList= new HashSet<>();
			            				capList.add(capStr);
			            			}
			            			comune.setCodiciCap(capList);
			            		}
			            	}
			            	lineNumber++;
			            }
				    }
				}
			}
			return comuni;
		} catch (IOException e) {
			logger.error(e.getMessage(), e);
			throw new RuntimeException(e.getMessage(), e); 			
		}
	}