diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java
index cf24b4022bad5f2646f4f4d74e9e603875e18d1e..8325b47918241003466ef1f0d12ef8da02ee81b6 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/App.java
@@ -5,12 +5,13 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.stream.Collectors;
 
-import tdt4140.gr1800.app.doc.DocumentStorageImpl;
+import tdt4140.gr1800.app.doc.AbstractDocumentStorageImpl;
 import tdt4140.gr1800.app.doc.IDocumentImporter;
 import tdt4140.gr1800.app.doc.IDocumentLoader;
 import tdt4140.gr1800.app.doc.IDocumentPersistence;
@@ -20,7 +21,7 @@ import tdt4140.gr1800.app.json.GeoLocationsJsonPersistence;
 
 public class App {
 
-	private GeoLocationsPersistence geoLocationsLoader = new GeoLocationsJsonPersistence();
+	private GeoLocationsPersistence geoLocationsPersistence = new GeoLocationsJsonPersistence();
 	
 	private Collection<GeoLocations> geoLocations = null;
 
@@ -79,16 +80,18 @@ public class App {
 		
 		@Override
 		public Collection<GeoLocations> loadDocument(InputStream inputStream) throws Exception {
-			return geoLocationsLoader.loadLocations(inputStream);
+			return geoLocationsPersistence.loadLocations(inputStream);
 		}
 
 		@Override
 		public void saveDocument(Collection<GeoLocations> document, File documentLocation) throws Exception {
-			geoLocationsLoader.saveLocations(document, new FileOutputStream(documentLocation));
+			try (OutputStream output = new FileOutputStream(documentLocation)) {
+				geoLocationsPersistence.saveLocations(document, output);
+			}
 		}
 	};
 
-	private DocumentStorageImpl<Collection<GeoLocations>, File> documentStorage = new DocumentStorageImpl<Collection<GeoLocations>, File>() {
+	private AbstractDocumentStorageImpl<Collection<GeoLocations>, File> documentStorage = new AbstractDocumentStorageImpl<Collection<GeoLocations>, File>() {
 
 		@Override
 		protected Collection<GeoLocations> getDocument() {
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java
index 19e2fd43ad21eab376c81a1e26c97d147125ad14..3e3c1de6f22299c198e8467d75506ad6a2ff3950 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/GeoLocations.java
@@ -1,13 +1,18 @@
 package tdt4140.gr1800.app.core;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
-public class GeoLocations implements Iterable<GeoLocated> {
+import org.junit.Assert;
+
+public class GeoLocations implements Iterable<GeoLocated>, Tagged {
 
 	private String name;
 	
@@ -82,4 +87,26 @@ public class GeoLocations implements Iterable<GeoLocated> {
 	public Iterator<GeoLocated> iterator() {
 		return locations.iterator();
 	}
+	
+	//
+	
+	private Set<String> tags = null;
+
+	@Override
+	public boolean hasTags(String... tags) {
+		return this.tags != null && this.tags.containsAll(Arrays.asList(tags));
+	}
+	
+	public void addTags(String... tags) {
+		if (this.tags == null) {
+			this.tags = new HashSet<>();
+		}
+		this.tags.addAll(Arrays.asList(tags));
+	}
+	
+	public void removeTags(String... tags) {
+		if (this.tags != null) {
+			this.tags.removeAll(Arrays.asList(tags));
+		}
+	}
 }
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java
new file mode 100644
index 0000000000000000000000000000000000000000..8f1ad456b2b2ec7796ef8eab67c5a71434ee3dd4
--- /dev/null
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/core/Tagged.java
@@ -0,0 +1,5 @@
+package tdt4140.gr1800.app.core;
+
+public interface Tagged {
+	public boolean hasTags(String... tags);
+}
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java
index f8aee013f0aa7b15ec16aefc37cac9754fb82f7e..0203ad70ed35a06fddf891bacd543158989b31f6 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/doc/AbstractDocumentStorageImpl.java
@@ -5,7 +5,7 @@ import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Collection;
 
-public abstract class DocumentStorageImpl<D, L> implements IDocumentStorage<L>, IDocumentPersistence<D, L> {
+public abstract class AbstractDocumentStorageImpl<D, L> implements IDocumentStorage<L>, IDocumentPersistence<D, L> {
 
 	private L documentLocation;
 
@@ -66,8 +66,8 @@ public abstract class DocumentStorageImpl<D, L> implements IDocumentStorage<L>,
 
 	@Override
 	public void openDocument(L storage) throws IOException {
-		try {
-			setDocumentAndLocation(loadDocument(toInputStream(storage)), storage);
+		try (InputStream input = toInputStream(storage)){
+			setDocumentAndLocation(loadDocument(input), storage);
 		} catch (Exception e) {
 			throw new IOException(e);
 		}
diff --git a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java
index 7c1f2d915f5f77cbc5a0f77899fc735a432d6bcc..e8c65d0a5edc1fceb409147d4d53b12c83aadde3 100644
--- a/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java
+++ b/tdt4140-gr1800/app.core/src/main/java/tdt4140/gr1800/app/gpx/GpxDocumentConverter.java
@@ -62,6 +62,7 @@ public class GpxDocumentConverter implements IDocumentLoader<Collection<GeoLocat
 				String name = (singleTrack ? trackName : String.format(trackSegmentFormat, trackName, segmentCount));
 				GeoLocations gl = new GeoLocations(name, convert(segment.getPoints()));
 				gl.setPath(true);
+				gl.addTags(Track.class.getName().toLowerCase());
 				geoLocations.add(gl);
 			}
 		}
@@ -70,10 +71,13 @@ public class GpxDocumentConverter implements IDocumentLoader<Collection<GeoLocat
 			String routeName = (route.getName().isPresent() ? String.format(routeNameFormat, route.getName().get()) : String.format(routeCountFormat, routeCount));
 			GeoLocations gl = new GeoLocations(routeName, convert(route.getPoints()));
 			gl.setPath(true);
+			gl.addTags(Route.class.getName().toLowerCase());
 			geoLocations.add(gl);
 		}
 		if (! gpx.getWayPoints().isEmpty()) {
-			geoLocations.add(new GeoLocations("Waypoints", convert(gpx.getWayPoints())));
+			GeoLocations gl = new GeoLocations("Waypoints", convert(gpx.getWayPoints()));
+			gl.addTags(WayPoint.class.getName().toLowerCase());
+			geoLocations.add(gl);
 		}
 		return geoLocations;
 	}
diff --git a/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java b/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java
index 654d377ef4f568ad589920745531c41f6465de6d..1af22c713eb354a464788ff6f6a944504b8edbb6 100644
--- a/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java
+++ b/tdt4140-gr1800/app.core/src/test/java/tdt4140/gr1800/app/core/GeoLocationsTest.java
@@ -38,6 +38,15 @@ public class GeoLocationsTest {
 		}
 	}
 
+	public static void assertGeoLocations(GeoLocations geoLocations, GeoLocations geoLocations2) {
+		Iterator<GeoLocated> it = geoLocations.iterator(), it2 = geoLocations2.iterator();
+		while (it.hasNext()) {
+			Assert.assertTrue(it2.hasNext());
+			checkGeoLocated(it2.next(), it.next());
+		}
+		Assert.assertFalse(it2.hasNext());
+	}
+
 	@Test
 	public void testAddLocation() {
 		Assert.assertEquals(0, geoLocations.size());
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java
index d3e590495be7d4f0330bba1391f8f79242e004a9..77c47e77df449f1684fa55726c46a84837533fe4 100644
--- a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FileMenuController.java
@@ -3,6 +3,7 @@ package tdt4140.gr1800.app.ui;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
 import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
@@ -146,8 +147,8 @@ public class FileMenuController {
 
 	void handleFileImportAction(File selection) {
 		for (IDocumentImporter importer : documentStorage.getDocumentImporters()) {
-			try {
-				importer.importDocument(new FileInputStream(selection));
+			try (InputStream input = new FileInputStream(selection)) {
+				importer.importDocument(input);
 				break;
 			} catch (Exception e) {
 			}
@@ -187,8 +188,8 @@ public class FileMenuController {
 
 	boolean handleURLImportAction(URL url) {
 		for (IDocumentImporter importer : documentStorage.getDocumentImporters()) {
-			try {
-				importer.importDocument(url.openStream());
+			try (InputStream input = url.openStream()) {
+				importer.importDocument(input);
 				return true;
 			} catch (Exception e) {
 				System.err.println(e.getMessage());
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java
index 060a5a45fd0561d8bf17cf8d5a90b1a10a97c8aa..7aca094d9754d8069fbafdcde7fcc112c5ab8f14 100644
--- a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/FxAppController.java
@@ -75,6 +75,8 @@ public class FxAppController implements IDocumentListener<Collection<GeoLocation
 		return null;
 	}
 
+	private IMapMarkerProvider mapMarkerProvider = new TagBasedMapMarkerProvider();
+	
 	private void initMapMarkers() {
 		markersParent.getItems().clear();
 		geoLocationsSelector.getItems().clear();
@@ -82,7 +84,7 @@ public class FxAppController implements IDocumentListener<Collection<GeoLocation
 			GeoLocations geoLocations = app.getGeoLocations(geoLocationName);
 			MapMarker lastMarker = null;
 			for (GeoLocated geoLoc : geoLocations) {
-				MapMarker mapMarker = new MapMarker(geoLoc.getLatLong());
+				MapMarker mapMarker = mapMarkerProvider.getMapMarker(geoLoc, geoLocations);
 				markersParent.getItems().add(mapMarker);
 				if (geoLocations.isPath() && lastMarker != null) {
 					MapPathLine pathLine = new MapPathLine(lastMarker, mapMarker);
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..55ef72e77deb48b6c6b21ab1b40e60e20b379eea
--- /dev/null
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/IMapMarkerProvider.java
@@ -0,0 +1,9 @@
+package tdt4140.gr1800.app.ui;
+
+import tdt4140.gr1800.app.core.GeoLocated;
+import tdt4140.gr1800.app.core.GeoLocations;
+
+public interface IMapMarkerProvider {
+
+	public MapMarker getMapMarker(GeoLocated geoLoc, GeoLocations geoLocations);
+}
diff --git a/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..47bdc08a568d300c1db316f862bfe060a4569825
--- /dev/null
+++ b/tdt4140-gr1800/app.ui/src/main/java/tdt4140/gr1800/app/ui/TagBasedMapMarkerProvider.java
@@ -0,0 +1,13 @@
+package tdt4140.gr1800.app.ui;
+
+import tdt4140.gr1800.app.core.GeoLocated;
+import tdt4140.gr1800.app.core.GeoLocations;
+
+public class TagBasedMapMarkerProvider implements IMapMarkerProvider {
+
+	@Override
+	public MapMarker getMapMarker(GeoLocated geoLoc, GeoLocations geoLocations) {
+		MapMarker mapMarker = new MapMarker(geoLoc.getLatLong());
+		return mapMarker;
+	}
+}