diff --git a/exec/ircbots/ham/ham.js b/exec/ircbots/ham/ham.js
index ab94b3505eabf55a7e6241928bafa83b5356b440..a914d0c58553cfe8ef07c379b6e7ee2ff01b6d30 100644
--- a/exec/ircbots/ham/ham.js
+++ b/exec/ircbots/ham/ham.js
@@ -1,6 +1,9 @@
 if(!js.global || js.global.HTTPRequest==undefined)
 	load("http.js");
 
+//Bot_Commands={};
+//function Bot_Command(x,y,z){}
+
 Bot_Commands["CALLSIGN"] = new Bot_Command(0,false,false);
 Bot_Commands["CALLSIGN"].command = function (target,onick,ouh,srv,lvl,cmd) {
 	var callsign;
@@ -21,35 +24,101 @@ Bot_Commands["CALLSIGN"].command = function (target,onick,ouh,srv,lvl,cmd) {
 		return true;
 	}
 
-	var CookieRequest=new HTTPRequest;
-	var m=CookieRequest.Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp');
-	var jsess='';
-	var cookies=['refineIndex=0'];
-	for(i in CookieRequest.response_headers) {
-		if(CookieRequest.response_headers[i].search(/^Set-Cookie:/i)!=-1) {
-			if(m=CookieRequest.response_headers[i].match(/^Set-Cookie:\s*(.*?);/)) {
-				cookies.push(m[1]);
-				if(m[1].search(/JSESSIONID_/)==0)
-					jsess=m[1];
+	function USCallsign(callsign, srv, target) {
+		var i;
+		var CookieRequest=new HTTPRequest();
+		var m=CookieRequest.Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp');
+		var jsess='';
+		var cookies=['refineIndex=0'];
+		for(i in CookieRequest.response_headers) {
+			if(CookieRequest.response_headers[i].search(/^Set-Cookie:/i)!=-1) {
+				if(m=CookieRequest.response_headers[i].match(/^Set-Cookie:\s*(.*?);/)) {
+					cookies.push(m[1]);
+					if(m[1].search(/JSESSIONID_/)==0)
+						jsess=m[1];
+				}
+			}
+		}
+		req=new HTTPRequest();
+		req.SetupPost('http://wireless2.fcc.gov/UlsApp/UlsSearch/results.jsp;'+jsess, undefined, undefined, 'fiUlsSearchByType=uls_l_callsign++++++++++++++++&fiUlsSearchByValue='+callsign+'&fiUlsExactMatchInd=Y&hiddenForm=hiddenForm&jsValidated=true&x=0&y=0');
+		req.request_headers.push("Cookie: "+cookies.join('; '));
+		req.request_headers.push("Referer: http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp");
+		req.SendRequest();
+		req.ReadResponse();
+
+		m=req.body.match(/(license.jsp\?licKey=[^\s]*)/);
+
+		if(m) {
+			var response=new HTTPRequest().Get('http://wireless2.fcc.gov/UlsApp/UlsSearch/'+m[1]);
+			m=response.match(/In the case of City, state and zip[^-]*?-->([\x00-\xff]*?)<\/td>/);
+			if(m) {
+				var info=callsign+':';
+				m[1]=m[1].replace(/<[^>]*>/g,'');
+				m[1]=m[1].replace(/[\r\n]/g,' ');
+				m[1]=m[1].replace(/\s+/g,' ');
+				info += m[1];
+
+				m=response.match(/>Type<\/td>[\x00-\xff]*?>([^<&]*)[<&]/);
+				if(m) {
+					m[1]=m[1].replace(/<[^>]*>/g,'');
+					m[1]=m[1].replace(/[\r\n]/g,' ');
+					m[1]=m[1].replace(/\s+/g,' ');
+					info += ' -  Type: '+m[1];
+				}
+
+				m=response.match(/<!--Example: Amateur Extra -->([^&<]*?)[&<]/);
+				if(m) {
+					m[1]=m[1].replace(/<[^>]*>/g,'');
+					m[1]=m[1].replace(/[\r\n]/g,' ');
+					m[1]=m[1].replace(/\s+/g,' ');
+					info += ' -  Class: '+m[1];
+				}
+
+				m=response.match(/>Status<\/td>[\x00-\xff]*?>([^<&]*)[<&]/);
+				if(m) {
+					m[1]=m[1].replace(/<[^>]*>/g,'');
+					m[1]=m[1].replace(/[\r\n]/g,' ');
+					m[1]=m[1].replace(/\s+/g,' ');
+					info += ' ('+m[1]+')';
+				}
+				srv.o(target,info);
+			}
+			else {
+				srv.o(target, "Unable to parse US callsign info!");
 			}
 		}
+		else {
+			srv.o(target, "Unable to match US callsign!");
+		}
+	}
+
+	function CanadaCallsign(callsign, srv, target) {
+		var result=new HTTPRequest().Post('http://www.callsign.ca/ind.php','indicatif='+callsign);
+		var m=result.match(/<H5>\s*([\x00-\xff]*?)<\/H5/);
+		if(m!=null) {
+			m[1]=m[1].replace(/<[^>]*>/g,'');
+			m[1]=m[1].replace(/[\r\n]/g,' ');
+			m[1]=m[1].replace(/\s+/g,' ');
+			srv.o(target, m[1]);
+		}
+		else {
+			srv.o(target, "Unable to match Canadian callsign!");
+		}
+	}
+
+	if(callsign.search(/(C[F-K]|C[Y-Z]|V[A-GOXY]|X[J-O])/)==0) {
+		CanadaCallsign(callsign, srv, target);
 	}
-	req=new HTTPRequest();
-	req.SetupPost('http://wireless2.fcc.gov/UlsApp/UlsSearch/results.jsp;'+jsess, undefined, undefined, 'fiUlsSearchByType=uls_l_callsign++++++++++++++++&fiUlsSearchByValue='+callsign+'&fiUlsExactMatchInd=Y&hiddenForm=hiddenForm&jsValidated=true&x=0&y=0');
-	req.request_headers.push("Cookie: "+cookies.join('; '));
-	req.request_headers.push("Referer: http://wireless2.fcc.gov/UlsApp/UlsSearch/searchLicense.jsp");
-	req.SendRequest();
-	req.ReadResponse();
-
-	//m=req.body.match(/<a href=license.jsp\?.*?>\s*([^<]+)<.*?nowrap>\s*(^[<]*?)\s*<.*?nowrap>\s*(^[<]*?)\s*<.*?nowrap>\s*(^[<]*?)\s*<.*?nowrap>\s*(^[<]*?)\s*<.*?nowrap>\s*(^[<]*?)\s*</);
-	m=req.body.match(/<a href=license.jsp\?.*?>\s*([^<]+)\s*<[\x00-\xff]*?nowrap>\s*([^<]*?)\s*<[\x00-\xff]*?nowrap>\s*([^<]*?)\s*<[\x00-\xff]*?nowrap>\s*([^<]*?)\s*<[\x00-\xff]*?nowrap>\s*([^<]*?)\s*<[\x00-\xff]*?nowrap>\s*([^<]*?)\s*</);
-
-	if(m) {
-		srv.o(target, callsign+" is : "+m[2]+" - "+m[5]+", Expiry: "+m[6]);
+	else if(callsign.search(/(A[A-L]|K|N|W)/)==0) {
+		USCallsign(callsign,srv,target);
 	}
 	else {
-		srv.o(target, "Unable to match callsign!");
+		srv.o(target,"Callsign country not supported.");
 	}
 
 	return true;
 }
+
+//var dumb={o:function(x,y) {log(y);}};
+//Bot_Commands["CALLSIGN"].command(undefined, undefined, undefined,dumb,undefined,['asdf','kj6pxy']);
+//Bot_Commands["CALLSIGN"].command(undefined, undefined, undefined,dumb,undefined,['asdf','va6rrx']);