diff --git a/exec/ircbots/ham/ham.js b/exec/ircbots/ham/ham.js
new file mode 100644
index 0000000000000000000000000000000000000000..ab94b3505eabf55a7e6241928bafa83b5356b440
--- /dev/null
+++ b/exec/ircbots/ham/ham.js
@@ -0,0 +1,55 @@
+if(!js.global || js.global.HTTPRequest==undefined)
+	load("http.js");
+
+Bot_Commands["CALLSIGN"] = new Bot_Command(0,false,false);
+Bot_Commands["CALLSIGN"].command = function (target,onick,ouh,srv,lvl,cmd) {
+	var callsign;
+	var i;
+
+	// Remove empty cmd args
+	for(i=1; i<cmd.length; i++) {
+		if(cmd[i].search(/^\s*$/)==0) {
+			cmd.splice(i,1);
+			i--;
+		}
+	}
+
+	if(cmd.length==2)
+		callsign=cmd[1].toUpperCase();
+	else {
+		srv.o(target,"Usage: callsign <sign>");
+		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];
+			}
+		}
+	}
+	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 {
+		srv.o(target, "Unable to match callsign!");
+	}
+
+	return true;
+}