diff --git a/plugins/distance-to-portal.user.js b/plugins/distance-to-portal.user.js
new file mode 100644
index 00000000..c37ed6b8
--- /dev/null
+++ b/plugins/distance-to-portal.user.js
@@ -0,0 +1,117 @@
+// ==UserScript==
+// @id iitc-plugin-distance-to-portal@jonatkins
+// @name IITC plugin: Distance to portal
+// @category Info
+// @version 0.1.0.@@DATETIMEVERSION@@
+// @namespace https://github.com/jonatkins/ingress-intel-total-conversion
+// @updateURL @@UPDATEURL@@
+// @downloadURL @@DOWNLOADURL@@
+// @description [@@BUILDNAME@@-@@BUILDDATE@@] Allows your current location to be set manually, then shows the distance to the selected portal. Useful when managing portal keys.
+// @include https://www.ingress.com/intel*
+// @include http://www.ingress.com/intel*
+// @match https://www.ingress.com/intel*
+// @match http://www.ingress.com/intel*
+// @grant none
+// ==/UserScript==
+
+@@PLUGINSTART@@
+
+// PLUGIN START ////////////////////////////////////////////////////////
+
+
+// use own namespace for plugin
+window.plugin.distanceToPortal = function() {};
+
+
+
+window.plugin.distanceToPortal.addDistance = function(info) {
+
+ var ll = info.portal.getLatLng();
+
+ var text;
+
+ if (window.plugin.distanceToPortal.currentLoc) {
+ var dist = window.plugin.distanceToPortal.currentLoc.distanceTo(ll);
+
+ if (dist >= 10000) {
+ dist = Math.round(dist/1000)+'km';
+ } else if (dist >= 1000) {
+ dist = Math.round(dist/100)/10+'km';
+ } else {
+ dist = Math.round(dist)+'m';
+ }
+
+ text = 'Distance: '+dist;
+ } else {
+ text = 'Location not set';
+ }
+
+ var div = $('
').addClass('portal-distance').text(text).attr('title','Double-click to set/change current location').on('dblclick',window.plugin.distanceToPortal.setLocation);
+
+ $('#resodetails').after(div);
+
+};
+
+
+window.plugin.distanceToPortal.setLocation = function() {
+ if (window.plugin.distanceToPortal.currentLocMarker) {
+ map.removeLayer(window.plugin.distanceToPortal.currentLocMarker);
+ window.plugin.distanceToPortal.currentLocMarker = null;
+ return;
+ }
+
+
+ if (!window.plugin.distanceToPortal.currentLoc) {
+ window.plugin.distanceToPortal.currentLoc = map.getCenter();
+ }
+
+
+ var markerTemplate = '@@INCLUDESTRING:images/marker-icon.svg.template@@';
+ window.plugin.distanceToPortal.currentLocMarker = L.marker(window.plugin.distanceToPortal.currentLoc,{
+ icon: L.divIcon({
+ iconSize: new L.Point(25, 41),
+ iconAnchor: new L.Point(12, 41),
+ html: markerTemplate.replace(/%COLOR%/g, '#444'),
+ className: 'leaflet-iitc-distance-to-portal-location'
+ }),
+ draggable: true,
+ });
+
+ window.plugin.distanceToPortal.currentLocMarker.on('dragend', function(e) {
+ window.plugin.distanceToPortal.currentLoc = window.plugin.distanceToPortal.currentLocMarker.getLatLng();
+
+ localStorage['plugin-distance-to-portal'] = JSON.stringify({lat:window.plugin.distanceToPortal.currentLoc.lat, lng:window.plugin.distanceToPortal.currentLoc.lng});
+
+ // bit nasty, but easiest way of refreshing the distance after marker is moved
+ if (selectedPortal) renderPortalDetails(selectedPortal);
+ });
+
+ map.addLayer(window.plugin.distanceToPortal.currentLocMarker);
+};
+
+
+window.plugin.distanceToPortal.setup = function() {
+
+ try {
+ window.plugin.distanceToPortal.currentLoc = L.latLng(JSON.parse(localStorage['plugin-distance-to-portal']));
+ } catch(e) {
+ window.plugin.distanceToPortal.currentLoc = null;
+ }
+
+ window.plugin.distanceToPortal.currentLocMarker = null;
+
+
+ $('head').append(
+ ''
+ );
+
+ addHook('portalDetailsUpdated', window.plugin.distanceToPortal.addDistance);
+};
+
+var setup = window.plugin.distanceToPortal.setup;
+
+// PLUGIN END //////////////////////////////////////////////////////////
+
+@@PLUGINEND@@