diff --git a/src/main/webapp/index_new.html b/src/main/webapp/index_new.html
index d21942ff45a85162144db54e0f5e4d3bb1e3fe80..2c5b6d143ea1dd028d2407aa3c7655aea0767d55 100644
--- a/src/main/webapp/index_new.html
+++ b/src/main/webapp/index_new.html
@@ -4,16 +4,23 @@
 <head>
 	<title>ISOGA New: Using Isochrones for Geospatial Analysis</title>
 	<link type="text/css" rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.1/leaflet.css" />
+	<link type="text/css" rel="stylesheet" href="http://domoritz.de/leaflet-locatecontrol/src/L.Control.Locate.css" />
 	<link type="text/css" rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css">
 	<link type="text/css" rel="stylesheet" href="css_new/jquery-ui-timepicker-addon.css" />
 	<link type="text/css" rel="stylesheet" href="css_new/geosearch.css" />
 	<link type="text/css" rel="stylesheet" href="css_new/isoga.css" />
+	<!--[if lt IE 9]>
+    <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.7.1/leaflet.ie.css" />
+    <link type="text/css" rel="stylesheet" href="http://domoritz.de/leaflet-locatecontrol/src/L.Control.Locate.ie.css" />
+    <![endif]-->
 
 	<script type="text/javascript" src="http://maps.google.com/maps/api/js?v=3&amp;sensor=false"></script>
 	<script type="text/javascript" src="http://code.jquery.com/jquery-2.0.3.min.js"></script>
 	<script type="text/javascript" src="http://code.jquery.com/ui/1.10.3/jquery-ui.js"></script>
 	<script type="text/javascript" src="http://cdn.leafletjs.com/leaflet-0.7.1/leaflet.js"></script>
 	<script type="text/javascript" src="http://maps.stamen.com/js/tile.stamen.js"></script>
+	<script type="text/javascript" src="http://domoritz.de/leaflet-locatecontrol/src/L.Control.Locate.js"></script>
+	<script type="text/javascript" src="js_new/locatebyip.js"></script>
 	<script type="text/javascript" src="js_new/jquery-ui-timepicker-addon.js"></script>
 	<script type="text/javascript" src="js_new/console.js"></script>
 	<script type="text/javascript" src="js_new/geosearch.js"></script>
@@ -21,7 +28,6 @@
 	<script type="text/javascript" src="js_new/controls.js"></script>
 	<script type="text/javascript" src="js_new/bing.js"></script>
 	<script type="text/javascript" src="js_new/google.js"></script>
-	<script type="text/javascript" src="js_new/geolocator.js"></script>
 	<script type="text/javascript" src="js_new/map.js"></script>
 	<script type="text/javascript">
 		$(function() {
diff --git a/src/main/webapp/js_new/geolocator.js b/src/main/webapp/js_new/geolocator.js
deleted file mode 100644
index 7e200b0002ce1edb6a26a7e182c7e6ac8dc5e75c..0000000000000000000000000000000000000000
--- a/src/main/webapp/js_new/geolocator.js
+++ /dev/null
@@ -1,352 +0,0 @@
-/*jslint browser:true, nomen:true */
-//for jsLint implied variable warnings:
-/*global google:false */
-
-/*
- *  Geolocator Javascript Lib
- *  version:        1.1
- *  author:         Onur YILDIRIM
- *  contact:        onur@cutepilot.com
- *  project page:   https://github.com/onury/geolocator
- *  copyright:      © 2012. MIT License.
- */
-var geolocator = (function () {
-
-    'use strict';
-
-    /*-------- PRIVATE PROPERTIES & FIELDS --------*/
-
-        /* Storage for the callback function to be executed when the location is successfully fetched. */
-    var onSuccess,
-        /* Storage for the callback function to be executed when the location could not be fetched due to an error. */
-        onError,
-        /* HTML element ID for the Google Maps. */
-        mCanvasId,
-        /* Google Maps URL. */
-        googleLoaderURL = 'https://www.google.com/jsapi',
-        /* Array of source services that provide location-by-IP information. */
-        ipGeoSources = [
-            {url: 'http://freegeoip.net/json/', cbParam: 'callback'}, // 0
-            {url: 'http://www.geoplugin.net/json.gp', cbParam: 'jsoncallback'}, // 1
-            {url: 'http://geoiplookup.wikimedia.org/', cbParam: ''} // 2
-            //,{url: 'http://j.maxmind.com/app/geoip.js', cbParam: ''} // Not implemented. Requires attribution. See http://dev.maxmind.com/geoip/javascript
-        ],
-        /* The index of the current IP source service. */
-        ipGeoSourceIndex = 0; // default (freegeoip)
-
-    /*-------- PRIVATE METHODS --------*/
-
-    /*  Non-blocking method for loading scripts dynamically.
-     */
-    function loadScript(url, callback, type) {
-        var script = document.createElement('script');
-        script.type = (type === undefined) ? 'text/javascript' : type;
-
-        if (typeof callback === 'function') {
-            if (script.readyState) {
-                script.onreadystatechange = function () {
-                    if (script.readyState === 'loaded' || script.readyState === 'complete') {
-                        script.onreadystatechange = null;
-                        callback();
-                    }
-                };
-            } else {
-                script.onload = function () { callback(); };
-            }
-        }
-
-        script.src = url;
-        //document.body.appendChild(script);
-        document.getElementsByTagName('head')[0].appendChild(script);
-    }
-
-    /*  Loads Google Maps API and executes the callback function when done.
-     */
-    function loadGoogleMaps(callback) {
-        function loadMaps() {
-            if (geolocator.__glcb) { delete geolocator.__glcb; }
-            google.load('maps', '3', {other_params: 'sensor=false', callback: callback});
-        }
-        if (window.google !== undefined && google.maps !== undefined) {
-            if (callback) { callback(); }
-        } else {
-            if (window.google !== undefined && google.loader !== undefined) {
-                loadMaps();
-            } else {
-                geolocator.__glcb = loadMaps;
-                loadScript(googleLoaderURL + '?callback=geolocator.__glcb');
-            }
-        }
-    }
-
-    /*  Draws the map from the fetched geo information.
-     */
-    function drawMap(elemId, mapOptions, infoContent) {
-        var map, marker, infowindow,
-            elem = document.getElementById(elemId);
-        if (elem) {
-            map = new google.maps.Map(elem, mapOptions);
-            marker = new google.maps.Marker({
-                position: mapOptions.center,
-                map: map
-            });
-            infowindow = new google.maps.InfoWindow();
-            infowindow.setContent(infoContent);
-            //infowindow.open(map, marker);
-            google.maps.event.addListener(marker, 'click', function () {
-                infowindow.open(map, marker);
-            });
-            geolocator.location.map = {
-                canvas: elem,
-                map: map,
-                options: mapOptions,
-                marker: marker,
-                infoWindow: infowindow
-            };
-        } else {
-            geolocator.location.map = null;
-        }
-    }
-
-    /*  Runs a reverse-geo lookup for the specified lat-lon coords.
-     */
-    function reverseGeoLookup(latlng, callback) {
-        var geocoder = new google.maps.Geocoder();
-        function onReverseGeo(results, status) {
-            if (status === google.maps.GeocoderStatus.OK) {
-                if (callback) { callback(results); }
-            }
-        }
-        geocoder.geocode({'latLng': latlng}, onReverseGeo);
-    }
-
-    /*  Fetches additional details (from the reverse-geo result) for the address property of the location object.
-     */
-    function fetchDetailsFromLookup(data) {
-        if (data.length > 0) {
-            var i, comp, comps = data[0].address_components;
-            geolocator.location.formattedAddress = data[0].formatted_address;
-
-            for (i = 0; i < comps.length; i += 1) {
-                comp = comps[i];
-                if (comp.types.indexOf('route') >= 0) {
-                    geolocator.location.address.street = comp.long_name;
-                } else if (comp.types.indexOf('neighborhood') >= 0) {
-                    geolocator.location.address.neighborhood = comp.long_name;
-                } else if (comp.types.indexOf('sublocality') >= 0) {
-                    geolocator.location.address.town = comp.long_name;
-                } else if (comp.types.indexOf('locality') >= 0) {
-                    geolocator.location.address.city = comp.long_name;
-                } else if (comp.types.indexOf('administrative_area_level_1') >= 0) {
-                    geolocator.location.address.region = comp.long_name;
-                } else if (comp.types.indexOf('country') >= 0) {
-                    geolocator.location.address.country = comp.long_name;
-                    geolocator.location.address.countryCode = comp.short_name;
-                } else if (comp.types.indexOf('postal_code') >= 0) {
-                    geolocator.location.address.postalCode = comp.long_name;
-                } else if (comp.types.indexOf('street_number') >= 0) {
-                    geolocator.location.address.streetNumber = comp.long_name;
-                }
-            }
-        }
-    }
-
-    /*  Finalizes the location object via reverse-geocoding and draws the map (if required).
-     */
-    function finalize(coords) {
-        var latlng = new google.maps.LatLng(coords.latitude, coords.longitude);
-        function onGeoLookup(data) {
-            if (data.length > 0) {
-                fetchDetailsFromLookup(data);
-            }
-
-            var zoom = geolocator.location.ipGeoSource === null ? 14 : 7, //zoom out if we got the lcoation from IP.
-                mapOptions = {
-                    zoom: zoom,
-                    center: latlng,
-                    mapTypeId: 'roadmap'
-                };
-            drawMap(mCanvasId, mapOptions, data[0].formatted_address);
-            if (onSuccess) { onSuccess.call(null, geolocator.location); }
-        }
-        reverseGeoLookup(latlng, onGeoLookup);
-    }
-
-    /*  Gets the geo-position via HTML5 geolocation (if supported).
-     */
-    function getPosition(fallbackToIP, html5Options) {
-        geolocator.location = null;
-
-        function fallback(errMsg) {
-            var ipsIndex = fallbackToIP === true ? 0 : (typeof fallbackToIP === 'number' ? fallbackToIP : -1);
-            if (ipsIndex >= 0) {
-                geolocator.locateByIP(onSuccess, onError, ipsIndex, mCanvasId);
-            } else {
-                if (onError) { onError.call(null, errMsg); }
-            }
-        }
-
-        function geoSuccess(position) {
-            geolocator.location = {
-                ipGeoSource: null,
-                coords: position.coords,
-                timestamp: (new Date()).getTime(), //overwrite timestamp (Safari-Mac and iOS devices use different epoch; so better use this).
-                address: {}
-            };
-            finalize(geolocator.location.coords);
-        }
-
-        function geoError(error) {
-            // switch (error.code) {
-            // case error.PERMISSION_DENIED:
-            //     break;
-            // case error.POSITION_UNAVAILABLE:
-            //     break;
-            // case error.TIMEOUT:
-            //     break;
-            // case error.UNKNOWN_ERROR:
-            //     break;
-            // }
-            fallback(error.message);
-        }
-
-        if (navigator.geolocation) {
-            navigator.geolocation.getCurrentPosition(geoSuccess, geoError, html5Options);
-        } else { // not supported
-            fallback('geolocation is not supported.');
-        }
-    }
-
-    /*  Builds the location object from the source data.
-     */
-    function buildLocation(sourceIndex, data) {
-        switch (sourceIndex) {
-        case 0: // freegeoip
-            geolocator.location = {
-                coords: {
-                    latitude: data.latitude,
-                    longitude: data.longitude
-                },
-                address: {
-                    city: data.city,
-                    country: data.country_name,
-                    countryCode: data.country_code,
-                    region: data.region_name
-                }
-            };
-            break;
-        case 1: // geoplugin
-            geolocator.location = {
-                coords: {
-                    latitude: data.geoplugin_latitude,
-                    longitude: data.geoplugin_longitude
-                },
-                address: {
-                    city: data.geoplugin_city,
-                    country: data.geoplugin_countryName,
-                    countryCode: data.geoplugin_countryCode,
-                    region: data.geoplugin_regionName
-                }
-            };
-            break;
-        case 2: // Wikimedia
-            geolocator.location = {
-                coords: {
-                    latitude: data.lat,
-                    longitude: data.lon
-                },
-                address: {
-                    city: data.city,
-                    country: '',
-                    countryCode: data.country,
-                    region: ''
-                }
-            };
-            break;
-        }
-        if (geolocator.location) {
-            geolocator.location.coords.accuracy = null;
-            geolocator.location.coords.altitude = null;
-            geolocator.location.coords.altitudeAccuracy = null;
-            geolocator.location.coords.heading = null;
-            geolocator.location.coords.speed = null;
-            geolocator.location.timestamp = new Date().getTime();
-            geolocator.location.ipGeoSource = ipGeoSources[sourceIndex];
-            geolocator.location.ipGeoSource.data = data;
-        }
-    }
-
-    /*  The callback that is executed when the location data is fetched from the source.
-     */
-    function onGeoSourceCallback(data) {
-        var initialized = false;
-        geolocator.location = null;
-        delete geolocator.__ipscb;
-
-        function gLoadCallback() {
-            if (ipGeoSourceIndex === 2) { // Wikimedia
-                if (window.Geo !== undefined) {
-                    buildLocation(ipGeoSourceIndex, window.Geo);
-                    delete window.Geo;
-                    initialized = true;
-                }
-            } else {
-                if (data !== undefined) {
-                    buildLocation(ipGeoSourceIndex, data);
-                    initialized = true;
-                }
-            }
-
-            if (initialized === true) {
-                finalize(geolocator.location.coords);
-            } else {
-                if (onError) { onError('Could not get location.'); }
-            }
-        }
-
-        loadGoogleMaps(gLoadCallback);
-    }
-
-    /*  Loads the (jsonp) source. If the source does not support json-callbacks;
-     *  the callback is executed dynamically when the source is loaded completely.
-     */
-    function loadIpGeoSource(source) {
-        if (source.cbParam === undefined || source.cbParam === null || source.cbParam === '') {
-            loadScript(source.url, onGeoSourceCallback);
-        } else {
-            loadScript(source.url + '?' + source.cbParam + '=geolocator.__ipscb'); //ip source callback
-        }
-    }
-
-    return {
-
-        /*-------- PUBLIC PROPERTIES --------*/
-
-        /* The recent location information fetched as an object.
-         */
-        location: null,
-
-        /*-------- PUBLIC METHODS --------*/
-
-        /* Gets the geo-location by requesting user's permission.
-         */
-        locate: function (successCallback, errorCallback, fallbackToIP, html5Options, mapCanvasId) {
-            onSuccess = successCallback;
-            onError = errorCallback;
-            mCanvasId = mapCanvasId;
-            function gLoadCallback() { getPosition(fallbackToIP, html5Options); }
-            loadGoogleMaps(gLoadCallback);
-        },
-        /* Gets the geo-location from the user's IP.
-         */
-        locateByIP: function (successCallback, errorCallback, sourceIndex, mapCanvasId) {
-            ipGeoSourceIndex = (sourceIndex === undefined ||
-                (sourceIndex < 0 || sourceIndex >= ipGeoSources.length)) ? 0 : sourceIndex;
-            onSuccess = successCallback;
-            onError = errorCallback;
-            mCanvasId = mapCanvasId;
-            geolocator.__ipscb = onGeoSourceCallback;
-            loadIpGeoSource(ipGeoSources[ipGeoSourceIndex]);
-        }
-    };
-}());
diff --git a/src/main/webapp/js_new/locatebyip.js b/src/main/webapp/js_new/locatebyip.js
new file mode 100644
index 0000000000000000000000000000000000000000..1dc278e7d311809b450c0f19b1f0f9d30f2edb47
--- /dev/null
+++ b/src/main/webapp/js_new/locatebyip.js
@@ -0,0 +1,161 @@
+/*
+ * Provides L.Map with convenient shortcuts for using ip based geolocation features.
+ */
+L.IpProvider = {};
+L.IpProvider.None = null;
+L.IpProvider.FreeGeoIp = {
+	url: 'http://freegeoip.net/json/',
+	cbParam: 'callback',
+	buildLocationObject: function (data) {
+		if (!data) {
+			return null;
+		}
+
+		return {
+			coords: {
+				accuracy: 10000,
+				latitude: parseFloat(data.latitude),
+				longitude: parseFloat(data.longitude)
+			},
+			timestamp: new Date().getTime()
+		};
+	}
+};
+L.IpProvider.GeoPlugin = {
+	url: 'http://www.geoplugin.net/json.gp',
+	cbParam: 'jsoncallback',
+	buildLocationObject: function (data) {
+		if (!data) {
+			return null;
+		}
+
+		return {
+			coords: {
+				accuracy: 10000,
+				/* jshint ignore:start */
+				latitude: parseFloat(data.geoplugin_latitude),
+				longitude: parseFloat(data.geoplugin_longitude)
+				/* jshint ignore:end */
+			},
+			timestamp: new Date().getTime()
+		};
+	}
+};
+L.IpProvider.Wikimedia = {
+	url: 'http://geoiplookup.wikimedia.org/',
+	cbParam: '',
+	buildLocationObject: function () {
+		var data = window.Geo,
+			result = {
+				coords: {
+					accuracy: 10000,
+					latitude: parseFloat(data.lat),
+					longitude: parseFloat(data.lon)
+				},
+				timestamp: new Date().getTime()
+			};
+
+		delete window.Geo;
+		return result;
+	}
+};
+
+L.IpLocator = L.Class.extend({
+
+	locateByIp: function (source, responseCallback, errorCallback) {
+		var handlerFn = L.bind(function (data) {
+			this._handleIpResponse(source, data, responseCallback, errorCallback);
+		}, this);
+
+		if (source.cbParam === undefined || source.cbParam === null || source.cbParam === '') {
+			this._loadScript(source.url, handlerFn);
+			return;
+		}
+
+		window.cbObject = {};
+		window.cbObject.fn = handlerFn;
+		this._loadScript(source.url + '?' + source.cbParam + '= window.cbObject.fn');
+	},
+
+	_handleIpResponse: function (source, data, responseCallback, errorCallback) {
+		window.cbObject = null;
+		delete window.cbObject;
+
+		var pos = source.buildLocationObject(data);
+		if (pos === null) {
+			if (errorCallback) { errorCallback('Could not get location.'); }
+		} else if (responseCallback) {
+			responseCallback(pos);
+		}
+	},
+
+	_loadScript: function (url, callback, type) {
+		var script = document.createElement('script');
+		script.type = (type === undefined) ? 'text/javascript' : type;
+
+		if (typeof callback === 'function') {
+			if (script.readyState) {
+				script.onreadystatechange = function () {
+					if (script.readyState === 'loaded' || script.readyState === 'complete') {
+						script.onreadystatechange = null;
+						callback();
+					}
+				};
+			} else {
+				script.onload = function () { callback(); };
+			}
+		}
+
+		script.src = url;
+		document.getElementsByTagName('head')[0].appendChild(script);
+	}
+});
+
+L.Map.include({
+	_defaultLocateOptions: {
+		ipProvider: L.IpProvider.Wikimedia,
+		timeout: 10000,
+		watch: false
+		// setView: false
+		// maxZoom: <Number>
+		// maximumAge: 0
+		// enableHighAccuracy: false
+	},
+
+	locate: function (/*Object*/ options) {
+		options = this._locateOptions = L.extend(this._defaultLocateOptions, options);
+
+		if (!navigator.geolocation && !options.ipProvider) {
+			this._handleGeolocationError({
+				code: 0,
+				message: 'Geolocation not supported.'
+			});
+			return this;
+		}
+
+		var onResponse = L.bind(this._handleGeolocationResponse, this),
+			onError = L.bind((options.ipProvider) ? this._fallbackToIp : this._handleGeolocationError, this);
+
+		if (options.watch) {
+			this._locationWatchId =
+					navigator.geolocation.watchPosition(onResponse, onError, options);
+		} else {
+			navigator.geolocation.getCurrentPosition(onResponse, onError, options);
+		}
+
+		return this;
+	},
+
+	_fallbackToIp: function (errMsg) {
+		if (!this._locateOptions.ipProvider) {
+			this._handleGeolocationError(errMsg);
+			return;
+		}
+
+		var onResponse = L.bind(this._handleGeolocationResponse, this),
+			onError = L.bind(this._handleGeolocationError, this);
+
+		(new L.IpLocator()).locateByIp(this._locateOptions.ipProvider, onResponse, onError);
+	}
+
+});
diff --git a/src/main/webapp/js_new/map.js b/src/main/webapp/js_new/map.js
index f72be2d9cda94fb45031f97dfc631b6538e5467d..037faf868c5e4bee5e4b4f8eb4200149772345f1 100644
--- a/src/main/webapp/js_new/map.js
+++ b/src/main/webapp/js_new/map.js
@@ -1,6 +1,8 @@
+var INNSBRUCK = [47.265718, 11.391342],
+	VIENNA = [48.186312, 16.317615];
+
 function createMap() {
-	var defaultCenter = [47.265718, 11.391342], // set center to innsbruck, tyrol, austria
-//	var defaultCenter = [48.186312, 16.317615], // set center to vienna, austria
+	var defaultCenter = INNSBRUCK,
 		mapOptions,
 		zoom = 12;
 
@@ -12,6 +14,7 @@ function createMap() {
 	mapOptions = {
 		attributionControl: false,
 		center: defaultCenter,
+		ipProvider: L.IpProvider.Wikimedia,
 		zoomControl: false, // hide default zoom control, so we can create a bottomright one
 		zoom: zoom
 	};
@@ -22,7 +25,7 @@ function createMap() {
 }
 
 function drawMap(mapOptions) {
-	var layerControl = L.control.layers(),
+	var layerControl = L.control.layers({position: 'topright'}),
 		map = null,
 		zoomControl = L.control.zoom({position: 'bottomright'});
 
@@ -42,11 +45,12 @@ function drawMap(mapOptions) {
 
 	// Map creation and control assignment
 	map = L.map('map', mapOptions);
-	map.addControl(new SettingsControl());
-	map.addControl(new HelpControl());
+	map.addControl(new SettingsControl({position: 'bottomright'}));
+	map.addControl(new HelpControl({position: 'bottomright'}));
 	map.addControl(layerControl);
 	map.addControl(zoomControl);
-	map.addControl(L.control.scale());
+	map.addControl(L.control.locate({position: 'bottomright'}));
+	map.addControl(L.control.scale({position: 'bottomleft'}));
 	map.addControl(new L.Control.GeoSearch({
 		doReverseLookup: true,
 		position: 'topleft',
@@ -179,9 +183,9 @@ function addBingLayers(c) {
 function locateAndDraw(mapOptions) {
     var fnSuccess = function(location) { onLocationSuccess(mapOptions, location); },
     	fnError = function(message) { onLocationError(mapOptions, message); },
-    	html5Options = { enableHighAccuracy: true, timeout: 3000, maximumAge: 0 };
+    	locator = new L.IpLocator();
 
-    geolocator.locate(fnSuccess, fnError, true, html5Options);
+    locator.locateByIp(mapOptions.ipProvider, fnSuccess, fnError);
 }
 
 function onLocationSuccess(mapOptions, location) {