diff --git a/chrome/content/apps.js b/chrome/content/apps.js
index 7d5aaefa3..fb4334f52 100644
--- a/chrome/content/apps.js
+++ b/chrome/content/apps.js
@@ -34,6 +34,7 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'Advanced Web Stats':    { cats: { 1: 10 }, html: /aws.src = [^<]+caphyon\-analytics/i },
 		'Amiro.CMS':             { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+Amiro/i },
 		'Apache':                { cats: { 1: 22 }, headers: { 'Server': /Apache/i } },
+		'Apache Tomcat':         { cats: { 1: 22 }, headers: { 'Server': /Apache-Coyote/i } },
 		'AWStats':               { cats: { 1: 10 }, html: /<meta name=("|')generator("|') [^>]+AWStats/i },
 		'BIGACE':                { cats: { 1:  1 }, html: /(<meta name=("|')generator("|') [^>]+BIGACE|Powered by <a href=("|')[^>]+BIGACE|<!--\s+Site is running BIGACE)/i },
 		'BigDump':               { cats: { 1:  3 }, html: /<!-- <h1>BigDump: Staggered MySQL Dump Importer/ },
@@ -43,6 +44,7 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'Burning Board':         { cats: { 1:  2 }, html: /<a href=('|")[^>]+woltlab\.com.+Burning Board/i },
 		'chartbeat':             { cats: { 1: 10 }, html: /function loadChartbeat\(\) {/i },
 		'Chamilo':               { cats: { 1: 21 }, html: /<meta name=("|')generator("|') [^>]+Chamilo/i, headers: { 'X-Powered-By': /Chamilo/ } },
+		'Cherokee':              { cats: { 1: 22 }, headers: { 'Server': /Cherokee/i } },
 		'ClickTale':             { cats: { 1: 10 }, html: /if\(typeof ClickTale(Tag)*==("|')function("|')\)/ },
 		'Clicky':                { cats: { 1: 10 }, html: /<script src=("|')http:\/\/static\.getclicky\.com/i },
 		'CMS Made Simple':       { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+CMS Made Simple/i },
@@ -60,14 +62,15 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'cufon':                 { cats: { 1: 17 }, html: /(<script[^>]* src=("|')[^>]*cufon\-yui\.js|<script[^>]*>[^<]+Cufon\.now\(\))/i },
 		'Danneo CMS':            { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+Danneo/i },
 		'DataLife Engine':       { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+DataLife Engine/i },
+		'DHTMLX':                { cats: { 1: 12 }, html: /<script [^>]+dhtmlxcommon\.js/i },
 		'DirectAdmin':           { cats: { 1:  9 }, html: /<a[^>]+>DirectAdmin<\/a> Web Control Panel/i },
 		'Disqus':                { cats: { 1: 15 }, html: /(<div[^>]+id=("|')disqus_thread("|')|<script[^>]+disqus_url)/ },
-		'dojo':                  { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*dojo(\.xd)?\.js/i, env: /dojo/ },
+		'dojo':                  { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*dojo(\.xd)?\.js/i, env: /^dojo$/ },
 		'Dokeos':                { cats: { 1: 21 }, html: /(<meta name=("|')generator("|') [^>]+Dokeos|Portal <a[^>]+>Dokeos|@import "[^"]+dokeos_blue)/i, headers: { 'X-Powered-By': /Dokeos/ } },
 		'DokuWiki':              { cats: { 1:  8 }, html: /<meta name=("|')generator("|') [^>]+DokuWiki/i },
 		'DotNetNuke':            { cats: { 1:  1 }, html: /(<meta name=("|')generator("|') [^>]+DotNetNuke|<!\-\- by DotNetNuke Corporation)/i },
 		'DreamWeaver':           { cats: { 1: 20 }, html: /(<!\-\-[^>]*(InstanceBeginEditable|Dreamweaver[^>]+target|DWLayoutDefaultTable)|function MM_preloadImages\(\) {)/ },
-		'Drupal':                { cats: { 1:  1 }, html: /(<script [^>]+drupal\.js|jQuery\.extend\(Drupal\.settings, \{|Drupal\.extend\(\{ settings: \{|<link[^>]+sites\/(default|all)\/themes\/|<style[^>]+sites\/(default|all)\/(themes|modules)\/)/i, headers: { 'X-Drupal-Cache': /.*/, 'Expires': /19 Nov 1978/ } },
+		'Drupal':                { cats: { 1:  1 }, html: /(<script [^>]+drupal\.js|jQuery\.extend\(Drupal\.settings, \{|Drupal\.extend\(\{ settings: \{|<link[^>]+sites\/(default|all)\/themes\/|<style[^>]+sites\/(default|all)\/(themes|modules)\/)/i, headers: { 'X-Drupal-Cache': /.*/, 'Expires': /19 Nov 1978/ }, env: /^Drupal$/ },
 		'Dynamicweb':            { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+Dynamicweb/i },
 		'e107':                  { cats: { 1:  1 }, html: /<script [^>]+e107\.js/i },
 		'ExtJS':                 { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*ext\-base\.js("|')/i, env: /^Ext$/ },
@@ -77,7 +80,7 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'Flyspray':              { cats: { 1: 13 }, html: /(<a[^>]+>Powered by Flyspray|<map id=("|')projectsearchform)/ },
 		'FrontPage':             { cats: { 1: 20 }, html: /(<meta name=("|')GENERATOR("|') [^>]+Microsoft FrontPage|<html[^>]+urn:schemas\-microsoft\-com:office:office)/i },
 		'Get Satisfaction':      { cats: { 1: 13 }, html: /var feedback_widget = new GSFN\.feedback_widget\(feedback_widget_options\)/ },
-		'Google Analytics':      { cats: { 1: 10 }, html: /(\.google\-analytics\.com\/ga\.js|<script src=("|')[^"]+google-analytics\.com\/urchin\.js("|'))/i },
+		'Google Analytics':      { cats: { 1: 10 }, html: /(\.google\-analytics\.com\/ga\.js|<script src=("|')[^"]+google-analytics\.com\/urchin\.js("|'))/i, env: /^gaGlobal$/ },
 		'Google Font API':       { cats: { 1: 17 }, html: /<link[^>]* href=("|')http:\/\/fonts\.googleapis\.com/ },
 		'Google Friend Connect': { cats: { 1:  5 }, html: /<script[^>]* src=("|')[^>]*google.com\/friendconnect/i },
 		'Google Maps':           { cats: { 1:  5 }, html: /(<script[^>]* src=("|')[^>]*maps\.google\.com\/maps\?file=api|maps\.google\.com\/maps\/api\/staticmap)/i },
@@ -112,6 +115,7 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'Microsoft SharePoint':  { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+Microsoft SharePoint/i, headers: { 'MicrosoftSharePointTeamServices': /.*/, 'X-SharePointHealthScore': /.*/, 'SPRequestGuid': /.*/ } },
 		'MiniBB':                { cats: { 1:  2 }, html: /<a href=("|')[^>]+minibb.+\s+<!--End of copyright link/i },
 		'Mint':                  { cats: { 1: 10 }, html: /<script[^>]* src=("|')[^>]*mint\/\?js/i },
+		'Mixpanel':              { cats: { 1: 10 }, html: /<script[^>]* src=("|')[^>]*api\.mixpanel\.com\/track/i },
 		'MochiKit':              { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*MochiKit\.js/i, env: /^MochiKit$/ },
 		'Modernizr':             { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*modernizr[^>]*\.js/i },
 		'MODx':                  { cats: { 1:  1 }, html: /(<a[^>]+>Powered by MODx<\/a>|var el= \$\('modxhost'\);|<script type=("|')text\/javascript("|')>var MODX_MEDIA_PATH = "media";)/i },
@@ -122,6 +126,7 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'Movable Type':          { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+Movable Type/i },
 		'MyBB':                  { cats: { 1:  2 }, html: /(<script [^>]+\s+<!--\s+lang\.no_new_posts|<a[^>]* title=("|')Powered By MyBB)/i },
 		'MyBlogLog':             { cats: { 1:  5 }, html: /<script[^>]* src=("|')[^>]*pub\.mybloglog\.com/i },
+		'Mynetcap':              { cats: { 1:  1 }, html: /<meta name=("|')generator("|') [^>]+Mynetcap/i },
 		'Nedstat':               { cats: { 1: 10 }, html: /sitestat\(("|')http:\/\/nl\.sitestat\.com/ },
 		'Nginx':                 { cats: { 1: 22 }, headers: { 'Server': /nginx/i } },
 		'nopCommerce':           { cats: { 1:  6 }, html: /(<!\-\-Powered by nopCommerce|Powered by: <a[^>]+nopcommerce)/i },
@@ -146,7 +151,7 @@ if ( typeof wappalyzer != 'undefined' ) {
 		'Prestashop':            { cats: { 1:  6 }, html: /(<meta name=("|')generator("|') [^>]+PrestaShop|Powered by <a href=("|')[^>]+PrestaShop)/i },
 		'Prototype':             { cats: { 1: 12 }, html: /<script[^>]* src=("|')[^>]*(prototype|protoaculous)\.js("|')/i, env: /^Prototype$/ },
 		'punBB':                 { cats: { 1:  2 }, html: /Powered by <a href=("|')[^>]+punbb/i },
-		'Quantcast':             { cats: { 1: 10 }, html: /<script[^>]* src=("|')http:\/\/edge\.quantserve\.com\/quant\.js("|')>/i },
+		'Quantcast':             { cats: { 1: 10 }, html: /<script[^>]* src=("|')http:\/\/edge\.quantserve\.com\/quant\.js("|')>/i, env: /^quantserve$/ },
 		'Quick.Cart':            { cats: { 1:  6 }, html: /<a href="[^>]+opensolution\.org\/">Powered by/i },
 		'reCAPTCHA':             { cats: { 1: 16 }, html: /(<div[^>]+id=("|')recaptcha_image|<script[^>]+ src=("|')(api\-secure\.recaptcha\.net|recaptcha_ajax\.js))/ },
 		'Reddit':                { cats: { 1:  2 }, html: /(<script[^>]+>var reddit = {|<a[^>]+Powered by Reddit|powered by <a[^>]+>reddit<)/i, url: /^(www.)?reddit\.com/ },
diff --git a/chrome/content/content.js b/chrome/content/content.js
index 459a0a5e1..4058c4b42 100644
--- a/chrome/content/content.js
+++ b/chrome/content/content.js
@@ -1,5 +1,6 @@
 (function() {
 	self = {
+		element: false,
 		prevUrl: '',
 
 		init: function() {
@@ -65,10 +66,31 @@
 			try {
 				var element = content.document.createElement('wappalyzerData');
 
-				element.setAttribute('id', 'wappalyzerData');
+				element.setAttribute('id',    'wappalyzerData');
+				element.setAttribute('style', 'display: none');
+
+				content.document.documentElement.appendChild(element);
+
+				content.location.href = 'javascript:' +
+					'(function() {' +
+						'try {' +
+							'var event = document.createEvent("Events");' +
+
+							'event.initEvent("wappalyzerEvent", true, false);' +
+
+							'var environmentVars = "";' +
+
+							'for ( var i in window ) environmentVars += i + " ";' +
+
+							'document.getElementById("wappalyzerData").appendChild(document.createComment(environmentVars));' +
+
+							'document.getElementById("wappalyzerData").dispatchEvent(event);' +
+						'}' +
+						'catch(e) { }' +
+					'})();';
 
 				element.addEventListener('wappalyzerEvent', (function(event) {
-					environmentVars = event.target.innerHTML.split(' ');
+					environmentVars = event.target.childNodes[0].nodeValue;
 
 					self.log('getEnvironmentVars: ' + environmentVars);
 
@@ -78,25 +100,9 @@
 						href:            content.document.location.href,
 						html:            content.document.documentElement.innerHTML,
 						headers:         [],
-						environmentVars: environmentVars
+						environmentVars: environmentVars.split(' ')
 						});
 				}), true);
-
-				content.document.documentElement.appendChild(element);
-
-				content.location.href = 'javascript:' +
-					'(function() {' +
-						'try {' +
-							'for ( i in window ) {' +
-								'window.document.getElementById("wappalyzerData").innerHTML += i + " ";' +
-							'}' +
-
-							'var event = document.createEvent("Events");' + 'event.initEvent("wappalyzerEvent", true, false);' +
-
-							'document.getElementById("wappalyzerData").dispatchEvent(event);' +
-						'}' +
-						'catch(e) { }' +
-					'})();';
 			}
 			catch(e) { }
 
@@ -105,4 +111,6 @@
 	}
 
 	self.init();
+
+	return app;
 })();
diff --git a/chrome/content/options.xul b/chrome/content/options.xul
index cc37f8bd5..dba4fa01d 100755
--- a/chrome/content/options.xul
+++ b/chrome/content/options.xul
@@ -16,9 +16,9 @@
 	<prefpane label="&wappalyzer.options;">
 		<preferences>
 			<preference id="wappalyzer-location"        name="wappalyzer.location"       type="int"   />
-			<preference id="wappalyzer-auto-detect"     name="wappalyzer.autoDetect"     type="bool"  />
 			<preference id="wappalyzer-enable-tracking" name="wappalyzer.enableTracking" type="bool"  />
 			<preference id="wappalyzer-show-apps"       name="wappalyzer.showApps"       type="int"   />
+			<preference id="wappalyzer-popup"           name="wappalyzer.popupOnHover"   type="bool"  />
 			<preference id="wappalyzer-custom-apps"     name="wappalyzer.customApps"     type="string"/>
 			<preference id="wappalyzer-cat1"            name="wappalyzer.cat1"           type="bool"  />
 			<preference id="wappalyzer-cat2"            name="wappalyzer.cat2"           type="bool"  />
@@ -87,6 +87,19 @@
 										</menulist>
 									</hbox>
 								</row>
+								<row>
+									<hbox align="center">
+										<label control="wappalyzer-popup" value="&wappalyzer.popupOnHover;:"/>
+									</hbox>
+									<hbox align="center">
+										<menulist preference="wappalyzer-popup" id="wappalyzer-popup">
+											<menupopup>
+												<menuitem label="&wappalyzer.onHover;" value="true" />
+												<menuitem label="&wappalyzer.onClick;" value="false"/>
+											</menupopup>
+										</menulist>
+									</hbox>
+								</row>
 							</rows>
 						</grid>
 
diff --git a/chrome/content/wappalyzer.js b/chrome/content/wappalyzer.js
index c4424d38b..d0b27022d 100644
--- a/chrome/content/wappalyzer.js
+++ b/chrome/content/wappalyzer.js
@@ -4,7 +4,6 @@ var wappalyzer = (function() {
 	self = {
 		apps:           {},
 		appsDetected:   0,
-		autoDetect:     true,
 		browser:        false,
 		cats:           {},
 		checkUnique:    {},
@@ -17,6 +16,7 @@ var wappalyzer = (function() {
 		homeUrl:        'http://wappalyzer.com/',
 		hoverTimeout:   false,
 		newInstall:     false,
+		popupOnHover:   true,
 		prevUrl:        '',
 		prefs:          {},
 		regexBlacklist: /(dev\.|\/admin|\.local)/,
@@ -26,6 +26,7 @@ var wappalyzer = (function() {
 		showApps:       1,
 		showCats:       [],
 		strings:        {},
+		twitterUrl:     'https://twitter.com/Wappalyzer',
 		version:        '',
 
 		init: function() {
@@ -42,10 +43,10 @@ var wappalyzer = (function() {
 			self.prefs.addObserver('', wappalyzer, false);
 
 			self.showApps       = self.prefs.getIntPref( 'showApps');
-			self.autoDetect     = self.prefs.getBoolPref('autoDetect');
 			self.customApps     = self.prefs.getCharPref('customApps');
 			self.debug          = self.prefs.getBoolPref('debug');
 			self.enableTracking = self.prefs.getBoolPref('enableTracking');
+			self.popupOnHover   = self.prefs.getBoolPref('popupOnHover');
 			self.newInstall     = self.prefs.getBoolPref('newInstall');
 			self.version        = self.prefs.getCharPref('version');
 
@@ -57,28 +58,28 @@ var wappalyzer = (function() {
 
 			self.moveLocation(locationPref);
 
-			// Open page after upgrade
-			try {
-				var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
+			// Open page after installation
+			if ( self.newInstall ) {
+				self.prefs.setBoolPref('newInstall', false);
 
-				var enabledItems = prefs.getCharPref('extensions.enabledAddons');
-				var version      = enabledItems.replace(/(^.*wappalyzer[^:]+:)([^,]+),.*$/, '$2');
+				gBrowser.addEventListener('DOMContentLoaded', self.installSuccess, false);
+			} else {
+				// Open page after upgrade
+				try {
+					var prefs = Components.classes["@mozilla.org/preferences-service;1"].getService(Components.interfaces.nsIPrefBranch);
 
-				if ( version && self.version != version ) {
-					self.browser.addEventListener('load', self.upgradeSuccess, false);
+					var enabledItems = prefs.getCharPref('extensions.enabledAddons');
+					var version      = enabledItems.replace(/(^.*wappalyzer[^:]+:)([^,]+),.*$/, '$2');
 
-					self.version = version;
+					if ( version && self.version != version ) {
+						gBrowser.addEventListener('DOMContentLoaded', self.upgradeSuccess, false);
 
-					self.prefs.setCharPref('version', self.version);
-				}
-			}
-			catch(e) { }
+						self.version = version;
 
-			// Open page after installation
-			if ( self.newInstall ) {
-				self.prefs.setBoolPref('newInstall', false);
-
-				self.browser.addEventListener('load', self.installSuccess, false);
+						self.prefs.setCharPref('version', self.version);
+					}
+				}
+				catch(e) { }
 			}
 
 			// Listen messages sent from the content process
@@ -113,10 +114,6 @@ var wappalyzer = (function() {
 			}
 
 			switch(data) {
-				case 'autoDetect':
-					self.autoDetect = self.prefs.getBoolPref('autoDetect');
-
-					break;
 				case 'customApps':
 					self.customApps = self.prefs.getCharPref('customApps');
 
@@ -128,6 +125,12 @@ var wappalyzer = (function() {
 				case 'enableTracking':
 					self.enableTracking = self.prefs.getBoolPref('enableTracking');
 
+					break;
+				case 'popupOnHover':
+					self.popupOnHover = self.prefs.getBoolPref('popupOnHover');
+
+					self.moveLocation();
+
 					break;
 				case 'showApps':
 					self.showApps = self.prefs.getIntPref('showApps');
@@ -192,6 +195,16 @@ var wappalyzer = (function() {
 			var e         = document.getElementById(containerId);
 			var container = document.getElementById('wappalyzer-container');
 
+			if ( self.popupOnHover ) {
+				container.addEventListener('mouseover', function() {
+					self.hoverTimeout = setTimeout(function() {
+						document.getElementById('wappalyzer-apps').openPopup(document.getElementById('wappalyzer-container'), 'after_end');
+						}, 200);
+				}, false);
+
+				container.addEventListener('mouseout', function() { clearTimeout(self.hoverTimeout); }, false);
+			}
+
 			e.appendChild(container);
 		},
 
@@ -210,8 +223,7 @@ var wappalyzer = (function() {
 				target.documentElement.innerHTML,
 				[],
 				[],
-				true,
-				false
+				true
 				);
 		},
 
@@ -224,8 +236,7 @@ var wappalyzer = (function() {
 				message.json.html,
 				message.json.headers,
 				message.json.environmentVars,
-				true,
-				false
+				true
 				);
 		},
 
@@ -246,7 +257,6 @@ var wappalyzer = (function() {
 				doc.documentElement ? doc.documentElement.innerHTML : '',
 				[],
 				[],
-				false,
 				false
 				);
 		},
@@ -284,7 +294,7 @@ var wappalyzer = (function() {
 			onSecurityChange: function(a, b, c)          {}
 		},
 
-		analyzePage: function(doc, href, html, headers, environmentVars, doCount, manualDetect) {
+		analyzePage: function(doc, href, html, headers, environmentVars, doCount) {
 			self.log('analyzePage');
 
 			self.currentTab = false;
@@ -303,83 +313,81 @@ var wappalyzer = (function() {
 				html = '';
 			}
 
-			if ( self.autoDetect || ( !self.autoDetect && manualDetect ) ) {
-				// Prevent large documents from slowing things down
-				if ( html.length > 50000 ) {
-					html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
-				}
+			// Prevent large documents from slowing things down
+			if ( html.length > 50000 ) {
+				html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length);
+			}
 
-				// Scan URL, domain and response headers for patterns
-				if ( html ) {
-					// Check cached application names
-					if ( doc && typeof doc.detectedApps != 'undefined' ) {
-						for ( i in doc.detectedApps ) {
-							var appName = doc.detectedApps[i];
+			// Scan URL, domain and response headers for patterns
+			if ( html || self.request ) {
+				// Check cached application names
+				if ( doc && typeof doc.detectedApps != 'undefined' ) {
+					for ( i in doc.detectedApps ) {
+						var appName = doc.detectedApps[i];
 
-							if ( typeof self.checkUnique[appName] == 'undefined' ) {
-								self.log('CACHE'); //
+						if ( typeof self.checkUnique[appName] == 'undefined' ) {
+							self.log('CACHE'); //
 
-								self.showApp(appName, doc, href, doCount);
+							self.showApp(appName, doc, href, doCount);
 
-								self.checkUnique[appName] = true;
-							}
+							self.checkUnique[appName] = true;
 						}
 					}
+				}
 
-					for ( var appName in self.apps ) {
-						// Don't scan for apps that have already been detected
-						if ( typeof self.checkUnique[appName] == 'undefined' ) {
-							// Scan HTML
-							if ( typeof self.apps[appName].html != 'undefined' ) {
-								var regex = self.apps[appName].html;
+				for ( var appName in self.apps ) {
+					// Don't scan for apps that have already been detected
+					if ( typeof self.checkUnique[appName] == 'undefined' ) {
+						// Scan HTML
+						if ( html && typeof self.apps[appName].html != 'undefined' ) {
+							var regex = self.apps[appName].html;
 
-								if ( regex.test(html) ) {
-									self.showApp(appName, doc, href, doCount);
-								}
+							if ( regex.test(html) ) {
+								self.showApp(appName, doc, href, doCount);
 							}
+						}
 
-							// Scan URL
-							if ( href && typeof self.apps[appName].url != 'undefined' ) {
-								var regex = self.apps[appName].url;
+						// Scan URL
+						if ( href && typeof self.apps[appName].url != 'undefined' ) {
+							var regex = self.apps[appName].url;
 
-								if ( regex.test(href) ) {
-									self.showApp(appName, doc, href, doCount);
-								}
+							if ( regex.test(href) ) {
+								self.showApp(appName, doc, href, doCount);
 							}
+						}
 
-							// Scan response headers
-							if ( typeof self.apps[appName].headers != 'undefined' && self.request ) {
-								for ( var header in self.apps[appName].headers ) {
-									var regex = self.apps[appName].headers[header];
+						// Scan response headers
+						if ( typeof self.apps[appName].headers != 'undefined' && self.request ) {
+							for ( var header in self.apps[appName].headers ) {
+								var regex = self.apps[appName].headers[header];
 
-									try {
-										if ( regex.test(self.request.nsIHttpChannel.getResponseHeader(header)) ) {
-											self.showApp(appName, doc, href, doCount);
-										}
+								try {
+									if ( regex.test(self.request.nsIHttpChannel.getResponseHeader(header)) ) {
+										self.showApp(appName, doc, href, doCount);
 									}
-									catch(e) { }
 								}
+								catch(e) { }
 							}
+						}
 
-							// Scan environment variables
-							if ( environmentVars && typeof self.apps[appName].env != 'undefined' ) {
-								var regex = self.apps[appName].env;
+						// Scan environment variables
+						if ( environmentVars && typeof self.apps[appName].env != 'undefined' ) {
+							var regex = self.apps[appName].env;
 
-								for ( var i in environmentVars ) {
-									try {
-										if ( regex.test(environmentVars[i]) ) {
-											self.showApp(appName, doc, href, doCount);
-										}
+							for ( var i in environmentVars ) {
+								try {
+									if ( regex.test(environmentVars[i]) ) {
+										self.showApp(appName, doc, href, doCount);
 									}
-									catch(e) { }
 								}
+								catch(e) { }
 							}
 						}
 					}
 				}
-
-				html = ''; // Free memory
 			}
+
+			html = ''; // Free memory
 		},
 
 		showApp: function(detectedApp, doc, href, doCount) {
@@ -410,38 +418,36 @@ var wappalyzer = (function() {
 				if ( show && self.currentTab ) {
 					var e = document.getElementById('wappalyzer-detected-apps');
 
-					if ( self.autoDetect ) {
-						if ( self.showApps == 2 ) {
-							document.getElementById('wappalyzer-icon').setAttribute('src', 'chrome://wappalyzer/skin/icon16x16_hot.ico');
-
-							document.getElementById('wappalyzer-detected-apps').style.display = 'none';
-						}
-						else {
-							// Hide Wappalyzer icon
-							document.getElementById('wappalyzer-icon').style.display = 'none';
+					if ( self.showApps == 2 ) {
+						document.getElementById('wappalyzer-icon').setAttribute('src', 'chrome://wappalyzer/skin/icon16x16_hot.ico');
 
-							document.getElementById('wappalyzer-detected-apps').style.display = '';
-						}
+						document.getElementById('wappalyzer-detected-apps').style.display = 'none';
+					}
+					else {
+						// Hide Wappalyzer icon
+						document.getElementById('wappalyzer-icon').style.display = 'none';
 
-						// Show app icon and label
-						var child = document.createElement('image');
+						document.getElementById('wappalyzer-detected-apps').style.display = '';
+					}
 
-						if ( typeof self.apps[detectedApp].icon == 'string' ) {
-							child.setAttribute('src', self.apps[detectedApp].icon);
-						}
-						else {
-							child.setAttribute('src', 'chrome://wappalyzer/skin/icons/' + detectedApp + '.ico');
-						}
+					// Show app icon and label
+					var child = document.createElement('image');
 
-						child.setAttribute('class', 'wappalyzer-icon');
+					if ( typeof self.apps[detectedApp].icon == 'string' ) {
+						child.setAttribute('src', self.apps[detectedApp].icon);
+					}
+					else {
+						child.setAttribute('src', 'chrome://wappalyzer/skin/icons/' + detectedApp + '.ico');
+					}
 
-						if ( self.appsDetected ) {
-							child.setAttribute('style', 'margin-left: .5em');
-						}
+					child.setAttribute('class', 'wappalyzer-icon');
 
-						e.appendChild(child);
+					if ( self.appsDetected ) {
+						child.setAttribute('style', 'margin-left: .5em');
 					}
 
+					e.appendChild(child);
+
 					if ( self.showApps == 0 ) {
 						var child = document.createElement('label');
 
@@ -622,7 +628,7 @@ var wappalyzer = (function() {
 		installSuccess: function() {
 			self.log('installSuccess');
 
-			self.browser.removeEventListener('load', self.installSuccess, false);
+			gBrowser.removeEventListener('DOMContentLoaded', self.installSuccess, false);
 
 			self.openTab(self.homeUrl + 'install/success/');
 		},
@@ -630,7 +636,7 @@ var wappalyzer = (function() {
 		upgradeSuccess: function() {
 			self.log('upgradeSuccess');
 
-			self.browser.removeEventListener('load', self.upgradeSuccess, false);
+			gBrowser.removeEventListener('DOMContentLoaded', self.upgradeSuccess, false);
 
 			self.openTab(self.homeUrl + 'install/upgraded/');
 		}
diff --git a/chrome/content/wappalyzer.xul b/chrome/content/wappalyzer.xul
index 5d2b7d6f3..44ba8f8df 100755
--- a/chrome/content/wappalyzer.xul
+++ b/chrome/content/wappalyzer.xul
@@ -18,8 +18,6 @@
 			id="wappalyzer-container"
 			context="wappalyzer-menu"
 			popup="wappalyzer-apps"
-			onmouseover="wappalyzer.hoverTimeout = setTimeout(function() { document.getElementById('wappalyzer-apps').openPopup(document.getElementById('wappalyzer-container'), 'after_end'); }, 200);"
-			onmouseout="clearTimeout(wappalyzer.hoverTimeout);"
 			>
 			<image
 				id="wappalyzer-icon"
@@ -38,6 +36,7 @@
 				<menuseparator/>
 				<menuitem label="&wappalyzer.donate;"   oncommand="wappalyzer.openTab(wappalyzer.homeUrl + 'donate/');"/>
 				<menuitem label="&wappalyzer.feedback;" oncommand="wappalyzer.openTab(wappalyzer.homeUrl + '?redirect=feedback');"/>
+				<menuitem label="&wappalyzer.twitter;"  oncommand="wappalyzer.openTab(wappalyzer.twitterUrl);"/>
 				<menuitem label="&wappalyzer.home;"     oncommand="wappalyzer.openTab(wappalyzer.homeUrl);"/>
 			</menupopup>
 		</hbox>
diff --git a/chrome/locale/en-US/wappalyzer.dtd b/chrome/locale/en-US/wappalyzer.dtd
index c63be672d..2ed67d872 100755
--- a/chrome/locale/en-US/wappalyzer.dtd
+++ b/chrome/locale/en-US/wappalyzer.dtd
@@ -11,7 +11,11 @@
 <!ENTITY wappalyzer.labels         "Icons, text and popup">
 <!ENTITY wappalyzer.icons          "Icons and popup">
 <!ENTITY wappalyzer.popup          "Popup only">
+<!ENTITY wappalyzer.popupOnHover   "Show popup">
+<!ENTITY wappalyzer.onHover        "On hover and click">
+<!ENTITY wappalyzer.onClick        "On click only">
 <!ENTITY wappalyzer.categories     "Categories">
+<!ENTITY wappalyzer.twitter        "Twitter">
 <!ENTITY wappalyzer.home           "Go to Wappalyzer">
 <!ENTITY wappalyzer.privacy        "Privacy">
 <!ENTITY wappalyzer.donate         "Donate">
diff --git a/chrome/skin/icons/Apache Tomcat.ico b/chrome/skin/icons/Apache Tomcat.ico
new file mode 100644
index 000000000..4a498f745
Binary files /dev/null and b/chrome/skin/icons/Apache Tomcat.ico differ
diff --git a/chrome/skin/icons/Cherokee.ico b/chrome/skin/icons/Cherokee.ico
new file mode 100644
index 000000000..402bfff9f
Binary files /dev/null and b/chrome/skin/icons/Cherokee.ico differ
diff --git a/chrome/skin/icons/DHTMLX.ico b/chrome/skin/icons/DHTMLX.ico
new file mode 100644
index 000000000..d24acaa1b
Binary files /dev/null and b/chrome/skin/icons/DHTMLX.ico differ
diff --git a/chrome/skin/icons/Mixpanel.ico b/chrome/skin/icons/Mixpanel.ico
new file mode 100644
index 000000000..4a25cfeed
Binary files /dev/null and b/chrome/skin/icons/Mixpanel.ico differ
diff --git a/chrome/skin/icons/Mynetcap.ico b/chrome/skin/icons/Mynetcap.ico
new file mode 100644
index 000000000..c153eff66
Binary files /dev/null and b/chrome/skin/icons/Mynetcap.ico differ
diff --git a/defaults/preferences/defaults.js b/defaults/preferences/defaults.js
index bc5588c57..97a91f546 100644
--- a/defaults/preferences/defaults.js
+++ b/defaults/preferences/defaults.js
@@ -6,6 +6,7 @@ pref('wappalyzer.newInstall',     true);
 pref('wappalyzer.showApps',       1);
 pref('wappalyzer.customApps',     '');
 pref('wappalyzer.version',        '');
+pref('wappalyzer.popupOnHover',   true);
 
 pref('wappalyzer.cat1',           true);
 pref('wappalyzer.cat2',           true);
diff --git a/install.rdf b/install.rdf
index 019bc6dd3..2a0eb4572 100644
--- a/install.rdf
+++ b/install.rdf
@@ -1,11 +1,9 @@
 <?xml version="1.0"?>
 
-<!--DOCTYPE overlay SYSTEM "chrome://wappalyzer/locale/overlay.dtd"-->
-
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#">
 	<Description about="urn:mozilla:install-manifest">
 		<em:id>wappalyzer@crunchlabz.com</em:id>
-		<em:version>1.15.2</em:version>
+		<em:version>1.16.0</em:version>
 		<em:type>2</em:type>
 		<em:unpack>true</em:unpack>
 
diff --git a/wappalyzer.xpi b/wappalyzer.xpi
index 9bc0a63d2..b882fc1db 100644
Binary files a/wappalyzer.xpi and b/wappalyzer.xpi differ