public String downloadUrl(String filename, String urlString) {
			BufferedInputStream in = null;
			FileOutputStream fout = null;
			HttpURLConnection connection = null;
			String md5 = "";
			try {
				URL url_ = new URL(urlString);
				byte data[] = new byte[1024];
				connection = (HttpURLConnection) url_.openConnection();
				connection.setAllowUserInteraction(true);
				connection.setConnectTimeout(14000);
				connection.setReadTimeout(20000);
				connection.connect();
				md5 = connection.getHeaderField("Content-MD5");
				in = new BufferedInputStream(connection.getInputStream());
				fout = new FileOutputStream(filename);
				int count, amount = 0, modPackSize = connection.getContentLength(), steps = 0;
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						progressBar.setMaximum(10000);
					}
				});
				while((count = in.read(data, 0, 1024)) != -1) {
					fout.write(data, 0, count);
					downloadedPerc += (count * 1.0 / modPackSize) * 100;
					amount += count;
					steps++;
					if(steps > 100) {
						steps = 0;
						final String txt = (amount / 1024) + "Kb / " + (modPackSize / 1024) + "Kb";
						final int perc =  (int)downloadedPerc * 100;
						SwingUtilities.invokeLater(new Runnable() {
							public void run() {
								progressBar.setValue(perc);
								label.setText(txt);
							}
						});
					}
				}
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if(in != null) {
						in.close();
					}
					if(fout != null) {
						fout.flush();
						fout.close();
					}
					if(connection != null) {
						connection.disconnect();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			return md5;
		}