diff --git a/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java b/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java
index c3d88e2f23680b91dd08cf7093c5d1921da7d5ea..5bee332f1ff943ab071e3a6fc45bc0c1439831b3 100644
--- a/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java
+++ b/src/main/java/eu/simstadt/regionchooser/RegionChooserCLI.java
@@ -1,6 +1,7 @@
 package eu.simstadt.regionchooser;
 
 import java.io.BufferedWriter;
+import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -102,11 +103,21 @@ public Integer call() throws Exception {
 
 		logInfo("WKT Polygon expressed in local coordinates: " + wktPolygon);
 
-		try (BufferedWriter gmlWriter = Files.newBufferedWriter(outputCityGML)) {
-			int count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, localCRS.toString(), gmlWriter, citygmls);
-			logInfo("Found buildings : " + count);
+		int count;
+
+		if (outputCityGML.toString().equals("-")) {
+			logInfo("CityGML written to stdout.");
+			PrintWriter stdOut = spec.commandLine().getOut();
+			count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, localCRS.toString(), stdOut, citygmls);
+		} else {
+			try (BufferedWriter gmlWriter = Files.newBufferedWriter(outputCityGML)) {
+				count = RegionExtractor.selectRegionDirectlyFromCityGML(wktPolygon, localCRS.toString(), gmlWriter,
+						citygmls);
+			}
 		}
 
+		logInfo("Found buildings : " + count);
+
 		return 0;
 	}
 
diff --git a/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java b/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java
index 415eec46b031c1036cb7d575898e65fa85e98023..81722644717bcc3dfa219cb0cc1024019e849f10 100644
--- a/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java
+++ b/src/test/java/eu/simstadt/regionchooser/RegionChooserCLITests.java
@@ -109,6 +109,24 @@ void testExtractRegionWithStandardInput() throws IOException {
 		assertEquals(2, countBuildings(outGML));
 	}
 
+	@Test
+	void testExtractRegionWithStandardInputAndStandardOutput() throws IOException {
+		String wktPolygon = "POLYGON((-73.99325421344473 40.730897087489666, -73.99359753619864 40.7304702545556, -73.99287870418264 40.7300800049056, -73.99244955074026 40.730592207101864, -73.99325421344473 40.730897087489666))";
+		Path citygml = TEST_REPOSITORY.resolve("NewYork.proj/ManhattanSmall.gml");
+		InputStream stdin = new ByteArrayInputStream(wktPolygon.getBytes(StandardCharsets.UTF_8));
+		System.setIn(stdin);
+		Path noOutput = Paths.get("-");
+		Files.deleteIfExists(noOutput);
+		assertFalse(Files.exists(noOutput));
+		new CommandLine(new RegionChooserCLI()).execute("--input=" + citygml, "--output=-", "--wkt=-");
+		String expectedLog = "EPSG:32118";
+		assertTrue(err.toString().contains(expectedLog), err.toString() + " should contain " + expectedLog);
+		String expectedBuilding = "uuid_0547df65-ae80-459e-bb15-c839c1a2e566";
+		assertTrue(out.toString().contains(expectedBuilding), out.toString() + " should contain " + expectedBuilding);
+		//TODO: Check if footer is here too
+		assertFalse(Files.exists(noOutput));
+	}
+
 	@Test
 	void testExtractRegionWithMissingInput() throws IOException {
 		String wktPolygon = "POLYGON((-73.9959209576448 40.73286384885367, -73.996317924579 40.732359794090684, -73.9947515145143 40.7315061442504, -73.99422580154739 40.73214841515045, -73.9959209576448 40.73286384885367))";