diff --git a/modules/discojuice/lib/Feed.php b/modules/discojuice/lib/Feed.php
index 37d69fb53ceb520103c483652f8b6e2177188463..44430a88ec893acb4f0418160c8b58712b3b8356 100644
--- a/modules/discojuice/lib/Feed.php
+++ b/modules/discojuice/lib/Feed.php
@@ -126,6 +126,8 @@ class sspmod_discojuice_Feed {
 	private function process() {
 		
 		$this->feed = array();
+		$this->merge();
+		
 		foreach($this->metadata AS $m) {
 			if ($this->exclude($m['entityid'])) continue;
 			
@@ -137,6 +139,20 @@ class sspmod_discojuice_Feed {
 				$this->feed[] = $i;
 			}
 		}
+
+	}
+	
+	protected function merge() {
+		$mergeendpoints = $this->djconfig->getValue('mergeEndpoints', NULL);
+		SimpleSAML_Logger::info('Processing merge endpoint: ' . var_export($mergeendpoints, TRUE));
+		
+		if ($mergeendpoints === NULL) return;
+		if (!is_array($mergeendpoints)) return;
+		foreach($mergeendpoints AS $me) {
+			SimpleSAML_Logger::info('Processing merge endpoint: ' . $me);
+			$newlist = json_decode(file_get_contents($me), TRUE);
+			$this->feed = array_merge($this->feed, $newlist);
+		}
 	}
 	
 	
diff --git a/modules/discojuice/www/discojuice/discojuice.control.js b/modules/discojuice/www/discojuice/discojuice.control.js
index 82fcc0e4031bf8538fa94fc3a078cf3cea555bf2..479fa2350ff94a1dc4f0491e5c54f89583f2fb43 100644
--- a/modules/discojuice/www/discojuice/discojuice.control.js
+++ b/modules/discojuice/www/discojuice/discojuice.control.js
@@ -1,13 +1,11 @@
 /*
  * DiscoJuice
- *	Work is based upon mock up made by the Kantara ULX group.
+ *  Work is based upon mock up made by the Kantara ULX group.
  * 
  * Author: Andreas Ă…kre Solberg, UNINETT, andreas.solberg@uninett.no
  * Licence undecided. Awaiting alignment with the licence of the origin Kantara mockup.
  */
-if (typeof DiscoJuice === "undefined") {
-	var DiscoJuice = {};
-}
+if (typeof DiscoJuice == "undefined") var DiscoJuice = {};
 
 
 DiscoJuice.Control = {
@@ -15,7 +13,7 @@ DiscoJuice.Control = {
 	"parent" : DiscoJuice,
 
 	// Reference to the UI object...
-	"ui": null, 
+	"ui": null,	
 	"data": null,
 	
 	// Set filter values to filter the result.
@@ -32,27 +30,23 @@ DiscoJuice.Control = {
 	 */
 	"load": function() {
 		var that = this;		
-		if (this.data) {
-			return;
-		}
+		if (this.data) return;
 		var metadataurl = this.parent.Utils.options.get('metadata');
 		
 		this.parent.Utils.log('metadataurl is ' + metadataurl);
-		if (!metadataurl) {
-			return;
-		}
+		if (!metadataurl) return;
 		
 		$.getJSON(metadataurl, function(data) {
 			that.data = data;
 			that.parent.Utils.log('Successfully loaded metadata (' + data.length + ')');
 			that.postLoad();
 		});
+		
+		
 	},
 	
 	"postLoad": function() {
-		if (!this.data) {
-			return;
-		}
+		if (!this.data) return;
 		
 		// Iterate through entities, and update title from DisplayNames to support Shibboleth integration.
 		for(i = 0; i < this.data.length; i++) {
@@ -67,6 +61,7 @@ DiscoJuice.Control = {
 		this.readCookie();
 		this.prepareData();
 		this.discoReadSetup();
+		this.discoSubReadSetup();
 		this.searchboxSetup();		
 		if (this.parent.Utils.options.get('country', false)) {
 			this.filterCountrySetup();
@@ -78,50 +73,139 @@ DiscoJuice.Control = {
 	
 	"readCookie": function() {
 		if (this.parent.Utils.options.get('cookie', false)) {
-			var selected = this.parent.Utils.readCookie();
-			this.parent.Utils.log('COOKIE read ' + selected);
-			if(selected) this.setWeight(selected, -100);			
+			var selectedRelID = this.parent.Utils.readCookie();
+			
+			var entityID = selectedRelID;
+			var subID = undefined;
+			if (selectedRelID && selectedRelID.match(/^.*#.+?$/)) {
+				var matched = /^(.*)#(.+?)$/.exec(selectedRelID);
+				entityID = matched[1];
+				subID = matched[2];
+			}
+			
+			this.parent.Utils.log('COOKIE read ' + selectedRelID);
+			if(selectedRelID) this.setWeight(-100, entityID, subID);
 		}
 	},
 	
+	"discojuiceextension": function() {
+		
+		console.log('Listener activated...');
+		
+		this.ui.show();
+	
+		var selectedRelID = $("meta#discojuiceextension_id").attr('content');
+		if (!selectedRelID) return;
+		
+		console.log('Value found: ' + selectedRelID);
+		
+		var entityID = selectedRelID;
+		var subID = undefined;
+		if (selectedRelID && selectedRelID.match(/^.*#.+?$/)) {
+			var matched = /^(.*)#(.+?)$/.exec(selectedRelID);
+			entityID = matched[1];
+			subID = matched[2];
+		}
+		
+		this.parent.Utils.log('DiscoJuice Extension read ' + selectedRelID + ' ' + entityID + ' ' + subID);
+		
+		var autologin = $("meta#discojuice_autologin").attr('content');
+		
+		if(autologin == '1') {
+			console.log('DiscoJuice Extension: Select provider');
+			this.selectProvider(entityID, subID);
+		} else {
+			console.log('DiscoJuice Extension: Set weight and refresh');
+			this.setWeight(-100, entityID, subID);
+			this.prepareData();
+		}
+		
+	},
+	
 	
 	
 	/*
 	 * Set weight to a specific data entry.
 	 */
-	"setWeight": function(entityID, weight) {
+	"setWeight": function(weight, entityID, subID) {
 		for(i = 0; i < this.data.length; i++) {
-			if (this.data[i].entityID === entityID) {
-				if (isNaN(this.data[i].weight)) this.data[i].weight = 0;
-				this.data[i].weight += weight;
-				this.parent.Utils.log('COOKIE Setting weight to ' + this.data[i].weight);
-			}
+			if (this.data[i].entityID !== entityID) continue;				
+			if (subID && !this.data[i].subID) continue;
+			if (subID && subID !== this.data[i].subID) continue;
+			if (this.data[i].subID && !subID) continue;
+
+			if (isNaN(this.data[i].weight)) this.data[i].weight = 0;
+			this.data[i].weight += weight;
+			this.parent.Utils.log('COOKIE Setting weight to ' + this.data[i].weight);
 		}
+		this.parent.Utils.log('DiscoJuice setWeight failer (no entries found for) ' + entityID + ' # ' + subID);
 	},
 	
 	"discoResponse": function(sender, entityID, subID) {
-		this.parent.Utils.log('DiscoResponse Received from [' + sender	+ '] : ' + entityID + ' > ' + subID);
-		this.setWeight(entityID, -100);
+		this.parent.Utils.log('DiscoResponse Received from [' + sender  + '] entityID: ' + entityID + ' subID: ' + subID);
+		
+		var settings = this.parent.Utils.options.get('disco');
+		if (settings) {
+			var stores = settings.subIDstores;
+			if (stores) {
+				if (stores[entityID] && !subID) {
+					this.parent.Utils.log('Ignoring discoResponse from entityID: ' + entityID + ' because subID was required and not provided');
+					return;
+				}
+			}
+		}
+		
+		this.setWeight(-100, entityID, subID);
 		this.prepareData();
 	},
 	
 	"calculateDistance": function() {
-		for(i = 0; i < this.data.length; i++) {
+		var targets, distances;
+		for(var i = 0; i < this.data.length; i++) {
 			if (this.data[i].geo) {
-				this.data[i].distance = this.parent.Utils.calculateDistance(
-					this.data[i].geo.lat, this.data[i].geo.lon, this.location[0], this.location[1]
-				);
+				
+				targets = [];
+				distances = [];
+				
+				// Support multiple geo coordinates. Make targets be an array of targets.
+				if (typeof(this.data[i].geo)=='object' && (this.data[i].geo instanceof Array)) {
+					targets = this.data[i].geo;
+				} else {
+					targets.push(this.data[i].geo);
+				}
+
+// 				console.log('targets'); console.log(targets);
+				
+				
+				// Iterate through all targets, and stuff the distances in to 'distances'.
+				for(var j = 0; j < targets.length; j++) {
+			
+// 					console.log(targets[j]);
+					distances.push(
+						this.parent.Utils.calculateDistance(targets[j].lat, targets[j].lon, this.location[0], this.location[1])
+					);
+				}
+				this.data[i].distance = Math.min.apply( Math, distances);
+				
+// 				console.log('distances'); console.log(distances);
+// 				console.log('distance'); console.log(this.data[i].distance);
+			
+// 				this.data[i].distance = this.parent.Utils.calculateDistance(
+// 					this.data[i].geo.lat, this.data[i].geo.lon, this.location[0], this.location[1]
+// 				);
 				
 				this.data[i].distanceweight = (2 * Math.log(this.data[i].distance + 1)) - 10;
+				
+//				console.log('object'); console.log(this.data[i]);
 			}
 		}
-//		for(i = 0; i < this.data.length; i++) {
-//			if (this.data[i].distance) {
-//				console.log('Distance for [' + this.data[i].title + '] ' + this.data[i].distance);
-//			} else {
-//				console.log('Distance for [' + this.data[i].title + '] NA');
-//			}
-//		}
+// 		for(i = 0; i < this.data.length; i++) {
+// 			if (this.data[i].distance) {
+// 				console.log('Distance for [' + this.data[i].title + '] ' + this.data[i].distance);
+// 			} else {
+// 				console.log('Distance for [' + this.data[i].title + '] NA');
+// 			}
+// 		}
 		this.showdistance = true;
 		this.prepareData();
 	},
@@ -182,19 +266,17 @@ DiscoJuice.Control = {
 	
 	"prepareData": function(showall) {
 	
-		showall = (showall ? true : false);
+		var showall = (showall ? true : false);
 	
 		this.parent.Utils.log('DiscoJuice.Control prepareData()');
 		
 		var hits, i, current, search;
 		var someleft = false;
 
-		var term = this.getTerm();
-		var categories = this.getCategories();
+ 		var term = this.getTerm();
+ 		var categories = this.getCategories();
 
-		if (!this.data) {
-			return;
-		}
+		if (!this.data) return;
 		
 		/*
 		 * Sort data by weight...
@@ -227,41 +309,35 @@ DiscoJuice.Control = {
 			
 			if (term) {
 				search = this.parent.Utils.searchMatch(current,term);
-				if (search === false && current.weight > -50) {
-					continue;
-				}
+				if (search === false && current.weight > -50) continue;
 			} else {
 				search = null;
 			}
 			
 			if (categories && categories.country) {
-				if (!current.country) {
-					continue;
-				}
-				if (current.country !== '_all_' && categories.country !== current.country && current.weight > -50) {
-					continue;
-				}
+				if (!current.country) continue;
+				if (current.country !== '_all_' && categories.country !== current.country && current.weight > -50) continue;
 			}
-//			if (categories && categories.type) {
-//				if (!current.ctype && current.weight > -50) {
-//	//				DiscoJuice.log(current);
-//				continue;
-//				}
-//	//			DiscoJuice.log(current.title + ' category ' + current.ctype);
-//				if (categories.type !== current.ctype && current.weight > -50) continue;
-//			}
+// 			if (categories && categories.type) {
+// 				if (!current.ctype && current.weight > -50) {
+// 	//				DiscoJuice.log(current);
+// 				continue;
+// 				}
+// 	//			DiscoJuice.log(current.title + ' category ' + current.ctype);
+// 				if (categories.type !== current.ctype && current.weight > -50) continue;
+// 			}
 
-			if (++hits > this.maxhits) {
+			if (++hits > this.maxhits) { 
 				someleft = true;
 				break;
 			}
 			
-	//		DiscoJuice.log('Accept: ' + current.title);
+	// 		DiscoJuice.log('Accept: ' + current.title);
 	
 			var countrydef = null;
 			if (current.country) {
 				var cname = (this.parent.Constants.Countries[current.country] ? this.parent.Constants.Countries[current.country] : current.country);
-				if (cname !== '_all_')	{
+				if (cname !== '_all_')  {
 					var cflag = (this.parent.Constants.Flags[current.country] ? this.parent.Constants.Flags[current.country] : undefined);
 					countrydef = {'country': cname, 'flag': cflag};
 				}
@@ -270,7 +346,6 @@ DiscoJuice.Control = {
 			var descr = current.descr || null;
 	
 			// addItem(item, {country, flag}, keywordmatch, distance)
-			
 			this.ui.addItem(current, countrydef, search, current.distance);
 
 		}
@@ -279,27 +354,34 @@ DiscoJuice.Control = {
 	},
 	
 	
-	"selectProvider": function(entityID) {
+	"selectProvider": function(entityID, subID) {
 	
-		// console.log('entityid: '	 + entityID);
+		// console.log('entityid: '  + entityID);
 	
 		var callback;
 		var that = this;
-		var mustwait = that.discoWrite(entityID);
+		var mustwait = that.discoWrite(entityID, subID);
 		
 		if (this.parent.Utils.options.get('cookie', false)) {
-			this.parent.Utils.log('COOKIE write ' + entityID);
-			this.parent.Utils.createCookie(entityID);		
+			var relID = entityID;
+			if (subID) relID += '#' + subID;
+			
+			this.parent.Utils.log('COOKIE write ' + relID);
+			this.parent.Utils.createCookie(relID);
 		}
 
 		var entity = null;
 		for(i = 0; i < this.data.length; i++) {
-			if (this.data[i].entityID === entityID) {
-				entity = this.data[i];
+			if (this.data[i].entityID == entityID) {
+				if (!subID || subID == this.data[i].subID) {
+					entity = this.data[i];
+				}
 			}
 		}
 
-		// console.log(entity);
+		console.log('Entity Selected');
+		console.log(entity);
+		return;
 
 		callback = this.parent.Utils.options.get('callback');	
 		if (callback) {
@@ -321,9 +403,7 @@ DiscoJuice.Control = {
 	"discoReadSetup": function() {
 		var settings = this.parent.Utils.options.get('disco');
 		
-		if (!settings) {
-			return;
-		}
+		if (!settings) return;
 	
 		var html = '';
 		var returnurl = settings.url;
@@ -332,42 +412,82 @@ DiscoJuice.Control = {
 		var i;
 		var currentStore;
 		
-		if (!stores) {
-			return;
-		}
+		if (!stores) return;
 		
 		for(i = 0; i < stores.length; i++) {
 			currentStore = stores[i];
-			
 			this.parent.Utils.log('Setting up DisoJuice Read from Store [' + currentStore + ']');
-			
 			iframeurl = currentStore + '?entityID=' + escape(spentityid) + '&isPassive=true&returnIDParam=entityID&return=' + escape(returnurl);
-			
+			html = '<iframe src="' + iframeurl + '" style="display: none"></iframe>';
+			this.ui.addContent(html);
+		}
+	},
+	
+	// Setup an iframe to read discovery cookies from other domains
+	"discoSubReadSetup": function() {
+		var settings = this.parent.Utils.options.get('disco');
+		
+		if (!settings) return;
+	
+		var html = '';
+		var returnurl = settings.url;
+		var spentityid = settings.spentityid;
+		var stores = settings.subIDstores;
+		var i;
+		var currentStore;
+		
+		if (!stores) return;
+		
+		for(var idp in stores) {
+			returnurl = settings.url + 'entityID=' + escape(idp);
+			currentStore = stores[idp];
+			this.parent.Utils.log('Setting up SubID DisoJuice Read from Store [' + idp + '] =>  [' + currentStore + ']');
+			iframeurl = currentStore + '?entityID=' + escape(spentityid) + '&isPassive=true&returnIDParam=subID&return=' + escape(returnurl);
+			this.parent.Utils.log('iFrame URL is  [' + iframeurl + ']');
+			this.parent.Utils.log('return URL is  [' + returnurl + ']');
 			html = '<iframe src="' + iframeurl + '" style="display: none"></iframe>';
 			this.ui.addContent(html);
 		}
 	},
 
 
-	"discoWrite": function(e) {
+	"discoWrite": function(entityID, subID) {
 	
 		var settings = this.parent.Utils.options.get('disco');
-		if (!settings) {
-			return false;
-		}
-		if (!settings.writableStore) {
-			return false;
-		}
+		if (!settings) return false;
+		if (!settings.writableStore) return false;
 	
 		var html = '';
 		var returnurl = settings.url;
 		var spentityid = settings.spentityid;
 		var writableStore = settings.writableStore;
 		
-		this.parent.Utils.log('DiscoJuice.Control discoWrite(' + e + ') to ' + writableStore);
+		if (subID) {
+			
+			if (settings.subIDwritableStores && settings.subIDwritableStores[entityID]) {
+			
+				writableStore = settings.subIDwritableStores[entityID];
+				
+				this.parent.Utils.log('DiscoJuice.Control discoWrite(' + entityID + ') with SubID [' + subID + ']');
+					
+				iframeurl = writableStore + escape(subID);
+				this.parent.Utils.log('DiscoJuice.Control discoWrite iframeURL (' + iframeurl + ') ');
+					
+				html = '<iframe src="' + iframeurl + '" style="display: none"></iframe>';
+				this.ui.addContent(html);
+				return true;
+				
+			
+			} else {
+				return false;
+			}
+			
+		}
+		
+		this.parent.Utils.log('DiscoJuice.Control discoWrite(' + entityID + ') to ' + writableStore);
 			
 		iframeurl = writableStore + '?entityID=' + escape(spentityid) + '&IdPentityID=' + 
-			escape(e) + '&isPassive=true&returnIDParam=bogus&return=' + escape(returnurl);
+			escape(entityID) + '&isPassive=true&returnIDParam=bogus&return=' + escape(returnurl);
 			
 		html = '<iframe src="' + iframeurl + '" style="display: none"></iframe>';
 		this.ui.addContent(html);
@@ -386,9 +506,7 @@ DiscoJuice.Control = {
 			minLength: 0,
 			source: function( request, response ) {
 				var term = request.term;
-				if (term.length === 1) {
-					return;
-				}
+				if (term.length === 1) return;
 //				that.resetCategories();							
 				that.prepareData();
 			}
@@ -481,7 +599,7 @@ DiscoJuice.Control = {
 				
 				$.getJSON(countryapi, function(data) {
 		//			DiscoJuice.log(data);
-					if (data.status === 'ok' && data.country) {
+					if (data.status == 'ok' && data.country) {
 						that.parent.Utils.createCookie(data.country, 'Country2');
 						that.setCountry(data.country);
 						that.parent.Utils.log('DiscoJuice getCountry() : Country lookup succeeded: ' + data.country);
@@ -506,7 +624,8 @@ DiscoJuice.Control = {
 		//this.ui.popup.find("select.discojuice_filterTypeSelect").val()
 		this.ui.popup.find("select.discojuice_filterCountrySelect").val('all');
 	},
-
+	
+		
 	"getCategories": function () {
 		var filters = {};
 		var type, country;
@@ -534,6 +653,5 @@ DiscoJuice.Control = {
 		this.ui.popup.find("input.discojuice_search").val('');
 	}
 
-};
-
 
+};
\ No newline at end of file
diff --git a/modules/discojuice/www/discojuice/discojuice.misc.js b/modules/discojuice/www/discojuice/discojuice.misc.js
index f85eacad3849a594a51920d7a1448e1936a96e3d..da89a947e564ea46fa441638073fb4bf140a3882 100644
--- a/modules/discojuice/www/discojuice/discojuice.misc.js
+++ b/modules/discojuice/www/discojuice/discojuice.misc.js
@@ -66,7 +66,7 @@ DiscoJuice.Constants = {
 		'CH': 'ch.png',
 		'TR': 'tr.png',
 		'GB': 'gb.png',
-		'US': 'us.png'
+		'US': 'us.png',
 	}
 };
 
diff --git a/modules/discojuice/www/discojuice/discojuice.ui.js b/modules/discojuice/www/discojuice/discojuice.ui.js
index 7d9907691a8d71073adb2935081ad33b9c18a1ec..efeb3cbeac2e29b3975d95f69ed9300ef562498b 100644
--- a/modules/discojuice/www/discojuice/discojuice.ui.js
+++ b/modules/discojuice/www/discojuice/discojuice.ui.js
@@ -99,7 +99,9 @@ DiscoJuice.UI = {
 		if (debugweight) {
 			textLink += '<div class="debug">';
 			
-			textLink += '<input type="text" style="display: block; width: 80%" name="debug.entityID" value="' + item.entityID + '" />';
+			if (item.subID) {
+				textLink += '<input value="' + item.subID + '" />';
+			}
 			
 			var w = 0;
 			if (item.weight) {
@@ -128,8 +130,13 @@ DiscoJuice.UI = {
 		}
 		
 		
+		var relID = item.entityID;
+		if (item.subID) {
+			relID += '#' + item.subID;
+		}
+		
 		// Wrap in A element
-		textLink = '<a href="" class="' + classes + '" rel="' + escape(item.entityID) + '" title="' + escape(item.title) + '">' + 
+		textLink = '<a href="" class="' + classes + '" rel="' + escape(relID) + '" title="' + escape(item.title) + '">' + 
 			textLink + '</a>';
 
 
@@ -147,8 +154,18 @@ DiscoJuice.UI = {
 			$(this).click(function(event) {
 				event.preventDefault();
 				overthere.hide();
-				var entityID = unescape($(this).attr('rel'));
-				overthere.control.selectProvider(entityID);
+							
+				// The "rel" attribute is containing: 'entityid#subid'
+				// THe following code, decodes that.
+				var relID = unescape($(this).attr('rel'));
+				var entityID = relID;
+				var subID = undefined;
+				if (relID.match(/^.*#.+?$/)) {
+					var matched = /^(.*)#(.+?)$/.exec(relID);
+					entityID = matched[1];
+					subID = matched[2];
+				}
+				overthere.control.selectProvider(entityID, subID);
 			});
 		});
 		
@@ -170,6 +187,10 @@ DiscoJuice.UI = {
 
 	"enable": function(control) {
 		var imgpath = this.parent.Utils.options.get('discoPath', '') + 'images/';
+		
+		var textSearch = this.parent.Utils.options.get('textSearch', 'or search for a provider, in example Univerity of Oslo');
+		var textHelp = this.parent.Utils.options.get('textHelp', 'Help me, I cannot find my provider');
+		var textHelpMore = this.parent.Utils.options.get('textHelpMore', 'If your institusion is not connected to Foodle, you may create a new account using any of the Guest providers, such as <strong>OpenIdP (Guest users)</strong>.');
 	
 		var html = 	'<div style="display: none" class="discojuice">' +
 			'<div class="top">' +
@@ -186,15 +207,14 @@ DiscoJuice.UI = {
 			'</div>' +
 	
 			'<div id="search" class="" >' +
-				'<p><input type="search" class="discojuice_search" results=5 autosave="discojuice" name="searchfield" placeholder="or search for a provider, in example Univerity of Oslo" value="" /></p>' +
+				'<p><input type="search" class="discojuice_search" results=5 autosave="discojuice" name="searchfield" placeholder="' + textSearch + '" value="" /></p>' +
 				'<div class="discojuice_whatisthis" style="margin-top: 15px; font-size: 11px;">' +
-					'<a  href="#" class="textlink discojuice_what">Help me, I cannot find my provider</a>' +
-//					'<p class="discojuice_whattext">If your institusion is not connected to Foodle, you may either select to login one of the commercial providers such as Facebook or Google, or you may create a new account using any of the Guest providers, such as Feide OpenIdP.</p>' +
-					'<p class="discojuice_whattext">If your institusion is not connected to Foodle, you may create a new account using any of the Guest providers, such as <strong>OpenIdP (Guest users)</strong>.</p>' +
+					'<a  href="#" class="textlink discojuice_what">' + textHelp + '</a>' +
+					'<p class="discojuice_whattext">' + textHelpMore + '</p>' +
 				'</div>' +
 			'</div>' +
 			
-			'<div id="discojuice_locatemediv" style="display: none">' +
+			'<div id="locatemediv">' +
 				'<div class="locatemebefore">' +
 					'<p style="margin-top: 10px"><a id="locateme" href="">' +
 						'<img style="float: left; margin-right: 5px; margin-top: -10px" src="' + imgpath + 'target.png" alt="locate me..." />' +
@@ -207,6 +227,7 @@ DiscoJuice.UI = {
 			
 			'<div class="filters bottom">' +
 				'<p style="margin 0px; text-align: right; color: #ccc; font-size: 75%">DiscoJuice &copy; UNINETT</p>' +
+				'<button id="discojuiceextesion_listener" style="display:none">' +
 			'</div>' +
 	
 
@@ -233,6 +254,9 @@ DiscoJuice.UI = {
 			});
 		}
 
+		this.popup.find("#discojuiceextesion_listener").click(function() {
+			that.control.discojuiceextension();
+		});
 
 		// Add listeners to the close button.
 		this.popup.find(".discojuice_close").click(function() {
@@ -245,9 +269,7 @@ DiscoJuice.UI = {
 		});
 
 
-		if (this.parent.Utils.options.get('location', false) && !!navigator.geolocation) {
-			this.popup.find("div#discojuice_locatemediv").show();
-			
+		if (this.parent.Utils.options.get('location', false) && navigator.geolocation) {
 			var that = this;
 			$("#locateme").click(function(event) {
 				var imgpath = that.parent.Utils.options.get('discoPath', '') + 'images/';
diff --git a/modules/discojuice/www/discojuice/logos/arcada.png b/modules/discojuice/www/discojuice/logos/arcada.png
new file mode 100644
index 0000000000000000000000000000000000000000..c59831bdcc4afa1d820d6c9036853676c31eb72e
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/arcada.png differ
diff --git a/modules/discojuice/www/discojuice/logos/bibsys.png b/modules/discojuice/www/discojuice/logos/bibsys.png
new file mode 100644
index 0000000000000000000000000000000000000000..eeb444867a929b87ab9ecbcd0ebb0330c66d0f47
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/bibsys.png differ
diff --git a/modules/discojuice/www/discojuice/logos/helsinki.png b/modules/discojuice/www/discojuice/logos/helsinki.png
new file mode 100644
index 0000000000000000000000000000000000000000..71a0d35e10018ac73ba5a9a09cc1d86ca15f3f8a
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/helsinki.png differ
diff --git a/modules/discojuice/www/discojuice/logos/himolde.png b/modules/discojuice/www/discojuice/logos/himolde.png
new file mode 100644
index 0000000000000000000000000000000000000000..8a0e1591317464aa8063f1055b2f6151cd2a7d35
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/himolde.png differ
diff --git a/modules/discojuice/www/discojuice/logos/hint.png b/modules/discojuice/www/discojuice/logos/hint.png
new file mode 100644
index 0000000000000000000000000000000000000000..813bd0e75e27ddff3a0d26fddeb3671a3ac2fcd0
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/hint.png differ
diff --git a/modules/discojuice/www/discojuice/logos/hist.png b/modules/discojuice/www/discojuice/logos/hist.png
new file mode 100644
index 0000000000000000000000000000000000000000..733852480ec2291347a87f98d4fe9b6f46f5c5e8
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/hist.png differ
diff --git a/modules/discojuice/www/discojuice/logos/iktsenter.png b/modules/discojuice/www/discojuice/logos/iktsenter.png
new file mode 100644
index 0000000000000000000000000000000000000000..9049030992999ad4589271797ac15cd54d119b26
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/iktsenter.png differ
diff --git a/modules/discojuice/www/discojuice/logos/moreogromsdal.png b/modules/discojuice/www/discojuice/logos/moreogromsdal.png
new file mode 100644
index 0000000000000000000000000000000000000000..a726db6edc0bfb43a7cd541bddc96f07a43e3961
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/moreogromsdal.png differ
diff --git a/modules/discojuice/www/discojuice/logos/nordtrondelag.png b/modules/discojuice/www/discojuice/logos/nordtrondelag.png
new file mode 100644
index 0000000000000000000000000000000000000000..c23c1cd3f5493da778c5467440a22265cb4ac36c
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/nordtrondelag.png differ
diff --git a/modules/discojuice/www/discojuice/logos/noreoguvdal.png b/modules/discojuice/www/discojuice/logos/noreoguvdal.png
new file mode 100644
index 0000000000000000000000000000000000000000..45fd7039dc850188133b99529b3371c86bfc4e38
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/noreoguvdal.png differ
diff --git a/modules/discojuice/www/discojuice/logos/sor-trondelag.png b/modules/discojuice/www/discojuice/logos/sor-trondelag.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef70b8e6e3ec1dfd9e5121f9e61e2cef5974cc7e
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/sor-trondelag.png differ
diff --git a/modules/discojuice/www/discojuice/logos/tampere.png b/modules/discojuice/www/discojuice/logos/tampere.png
new file mode 100644
index 0000000000000000000000000000000000000000..bb1ad09584b88a6622fd4de00d95569d070afed0
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/tampere.png differ
diff --git a/modules/discojuice/www/discojuice/logos/trondheim-kommune.png b/modules/discojuice/www/discojuice/logos/trondheim-kommune.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba72946e30fba4cf6093f566e8b307fd34a75650
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/trondheim-kommune.png differ
diff --git a/modules/discojuice/www/discojuice/logos/uin.png b/modules/discojuice/www/discojuice/logos/uin.png
new file mode 100644
index 0000000000000000000000000000000000000000..a72dda6c205cba1c213f37021b3e7daef7927b05
Binary files /dev/null and b/modules/discojuice/www/discojuice/logos/uin.png differ