drawing board. If I actually could provide the Lat/Lng for each object, the problem would go away. It turns out that there are not very many services that want to let you do this for free using a desktop tool. If you are willing to do a web mashup you can get away with quite a bit, but the traditional languages are left out in the cold for the most part. This is where MapQuest comes in. They have a free service (you have to register, but that's it) that will let you have access to their mapping systems. Of course, they have no interface for Delphi, but they did publish their XML specifications so it's not too hard to write one. Keep in mind that you have to comply with the MapQuest TOS. The major one for me was that you can't use the Lat/Lng addresses with any other system than theirs. That means I can't use maps.live.com to produce my maps, I have to figure out how to use MapQuest. Considering my other choices was a complete web mashup rewrite or some commercial system that was going to cost a fortune, I think I'll live within those parameters.I've only implemented the single interface I needed so far (GeoCoding), but the other interfaces are equally easy. This code is virtually identical (in the HTTP POST) as my DHL code. I've reposted the whole thing here for those needing a complete unit but will likely factor it out for my personal use.Enjoy!1. This is how the classes are used. I assume you recognize that the txtXXX are just text box fields and the resolver form has a single control on it that is a list box (other than the Select / Cancel buttons).uses mapquest_api, w_AddyResolver;procedure TForm1.btnGeoCodeClick(Sender: tobject);var geocode:TMapQuestGeoCoder; index, ix:integer;begingeocode:=TMapQuestGeoCoder.Create; //create the geocoder objectgeocode.Password:='YOUR PASS'; //assign the password and client id you got from mapquestgeocode.ClientID:='YOUR ID'; //this will NOT work without it!!!geocode.Address := edtAddress.Text; //assign the address info you want to codegeocode.City := edtCity.Text;geocode.State := edtState.Text;geocode.PostalCode := edtPostalCode.Text;geocode.Country := edtCountry.Text;if geocode.getFromMapQuest(true) then //this will send the info to mapquest and return the results if geocode.ReturnedAddresses.Count>0 then //if we got a response begin if geoCode.ReturnedAddresses.Count=1 then //if there's only 1, no need to show a resolver index:=0 else //we got multiple responses, the user will have to resolve which addy is correct begin index:=-1; //default to failure for ix := 0 to geoCode.ReturnedAddresses.Count-1 do //for each addy with geoCode.ReturnedAddresses.Address[ix] do addyResolver.lb.Items.Add(Address+' '+City+' '+State+' '+Country); //load the listbox if addyResolver.ShowModal=mrOk then //prompt the user, if they select one, mrOk will be set index:=addyResolver.lb.ItemIndex; //get the addy if index<0 then exit; //if the user failed to pick, get out end; lblLat.Caption:=geoCode.ReturnedAddresses.Address[index].Lat; //display the lat and long values lblLong.Caption:=geoCode.ReturnedAddresses.Address[index].Long; end;end;2. And this is the actual unit that does the work. BTW, the XML parser I'm using is OpenXML, a freely available, full source implementation that works for Delphi and Kylix. unit mapquest_api;interfaceuses classes, contnrs;type //base class, you must derive descendants to make use of this class //in order to successfully communicate with mapquest, you must attach