diff --git a/src/eu/simstadt/regionchooser/RegionChooserFX.java b/src/eu/simstadt/regionchooser/RegionChooserFX.java
index 385c0604e3f8c4f87c1a8721e47cd331a0b04964..d359fd01b9ca8fc7c504360d5b89b327dcf13cb1 100644
--- a/src/eu/simstadt/regionchooser/RegionChooserFX.java
+++ b/src/eu/simstadt/regionchooser/RegionChooserFX.java
@@ -3,15 +3,20 @@
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.util.Enumeration;
 import java.util.logging.Logger;
 import java.util.prefs.Preferences;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
 import javafx.application.Application;
 import javafx.beans.value.ObservableValue;
 import javafx.concurrent.Task;
@@ -89,16 +94,36 @@ protected Integer call() throws Exception {
 			new Thread(task).start();
 		}
 
-		public void doSomethingWithThisZIP(String zipFilename) {
-			System.out.println("Extract zipFile " + zipFilename + " to " + "unkownlocation");
-
+		public void doSomethingWithThisZIP(String zipFilename) throws IOException {
+			ZipFile zipFile = new ZipFile(zipFilename);
+			Enumeration<? extends ZipEntry> entries = zipFile.entries();
+			while (entries.hasMoreElements()) {
+				ZipEntry ze = entries.nextElement();
+				if (ze.getName().toLowerCase().contains("gml")) {
+					File extractedCityGML = selectSaveFileWithDialog(null, ze.getName(), "");
+					if (extractedCityGML != null) {
+						InputStream cityGMLInputStream = zipFile.getInputStream(ze);
+						System.out.println("Extract zipFile " + zipFilename + " to " + extractedCityGML);
+						FileOutputStream fos = new FileOutputStream(extractedCityGML);
+						byte[] bytes = new byte[1024];
+						int length;
+						while ((length = cityGMLInputStream.read(bytes)) >= 0) {
+							fos.write(bytes, 0, length);
+						}
+						cityGMLInputStream.close();
+						fos.close();
+						System.out.println("Extracted");
+					}
+				}
+			}
+			zipFile.close();
 		}
 
 		public void downloadRegionFromCityGML(String wktPolygon, String project, String citygml) throws IOException,
 				ParseException {
 			StringBuffer sb = selectRegionDirectlyFromCityGML(citygmlPath(project, citygml), wktPolygon);
 
-			File buildingIdsFile = selectSaveFileWithDialog(project, citygml);
+			File buildingIdsFile = selectSaveFileWithDialog(project, citygml, "selected_region");
 			if (buildingIdsFile != null) {
 				BufferedWriter writer = Files.newBufferedWriter(buildingIdsFile.toPath());
 				writer.write(sb.toString());
@@ -149,12 +174,20 @@ public StringBuffer selectRegionDirectlyFromCityGML(Path citygmlPath, String wkt
 
 		}
 
-		private File selectSaveFileWithDialog(String project, String citygml) {
+		private File selectSaveFileWithDialog(String project, String citygml, String suffix) {
 			Stage mainStage = (Stage) Browser.this.getScene().getWindow();
 			FileChooser fileChooser = new FileChooser();
 			fileChooser.setTitle("Save CITYGML ids");
-			fileChooser.setInitialDirectory(repo.resolve(project + ".simstadt").toFile());
-			fileChooser.setInitialFileName(citygml.replace(".", "_selected_region."));
+			if (project != null) {
+				fileChooser.setInitialDirectory(repo.resolve(project + ".simstadt").toFile());
+			} else {
+				fileChooser.setInitialDirectory(repo.toFile());
+			}
+			if (suffix.isEmpty()) {
+				fileChooser.setInitialFileName(citygml);
+			} else {
+				fileChooser.setInitialFileName(citygml.replace(".", "_" + suffix + "."));
+			}
 			FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("GML files (*.gml)", "*.gml");
 			fileChooser.getExtensionFilters().add(extFilter);
 			return fileChooser.showSaveDialog(mainStage);