TAXI_MAP_WIDTH = 580;
 TAXI_MAP_HEIGHT = 580;
 NUM_TAXI_BUTTONS = 0;
 NUM_TAXI_ROUTES = 0;
 
 TaxiButtonTypes = { };
 TaxiButtonTypes["CURRENT"] = {
 	file = "Interface\\TaxiFrame\\UI-Taxi-Icon-Green"
 }
 TaxiButtonTypes["REACHABLE"] = {
 	file = "Interface\\TaxiFrame\\UI-Taxi-Icon-White"
 }
 TaxiButtonTypes["DISTANT"] = {
 	file = "Interface\\TaxiFrame\\UI-Taxi-Icon-Yellow"
 }
 
+local taxiNodePositions = {};
+
 TAXI_BUTTON_MIN_DIST = 18;
 
 function TaxiFrame_OnLoad(self)
 	self:RegisterEvent("TAXIMAP_OPENED");
 	self:RegisterEvent("TAXIMAP_CLOSED");
 	self.InsetBg:SetHorizTile(false);
 	self.InsetBg:SetVertTile(false);
 end
 
 function TaxiFrame_OnEvent(self, event, ...)
 	if ( event == "TAXIMAP_OPENED" ) then
 		self.TitleText:SetText(FLIGHT_MAP);
 
 		-- Set the texture coords on the map
 		self.InsetBg:SetTexCoord(0,1,0,1);
 		SetTaxiMap(self.InsetBg);
 
 		-- Show the taxi node map and buttons
 		local num_nodes = NumTaxiNodes();
 		if ( num_nodes > NUM_TAXI_BUTTONS ) then
 			local button;
 			for i = NUM_TAXI_BUTTONS+1, num_nodes do
 				button = CreateFrame("Button", "TaxiButton"..i, TaxiRouteMap, "TaxiButtonTemplate");
 				button:SetID(i);
 			end
 		end
 		
 		-- Draw nodes
-		local taxiNodePositions = {};
 		local numValidFlightNodes = 0;
 		for index = 1, num_nodes do
 			local type = TaxiNodeGetType(index);
 			local button = _G["TaxiButton"..index];
 			taxiNodePositions[index] = {};
 			if ( type ~= "NONE" ) then
 				numValidFlightNodes = numValidFlightNodes + 1;
 				local x, y = TaxiNodePosition(button:GetID());
 				local currX = x*TAXI_MAP_WIDTH;
 				local currY = y*TAXI_MAP_HEIGHT;
 				taxiNodePositions[index].x = currX;
 				taxiNodePositions[index].y = currY;
 				-- check if we are obscuring a previous placement (eg: Ebon Hold and Light's Hope Chapel)
 				if ( numValidFlightNodes > 1 ) then
 					for checkNode = 1, index - 1 do
 						local checkX = taxiNodePositions[checkNode].x;
 						local checkY = taxiNodePositions[checkNode].y;
 						if ( taxiNodePositions[checkNode].x ) then
 							local distX = taxiNodePositions[index].x - checkX;
 							local distY = taxiNodePositions[index].y - checkY;
 							local distSq = distX*distX + distY*distY;
 							if ( distSq < TAXI_BUTTON_MIN_DIST * TAXI_BUTTON_MIN_DIST ) then
 								local scale = TAXI_BUTTON_MIN_DIST / sqrt(distSq);
 								taxiNodePositions[index].x = checkX + distX*scale;
 								taxiNodePositions[index].y = checkY + distY*scale;
 							end
 						end
 					end
 				end
 				-- set the button position
 				button:ClearAllPoints();
 				button:SetPoint("CENTER", self.InsetBg, "BOTTOMLEFT", floor(taxiNodePositions[index].x+.5), floor(taxiNodePositions[index].y+.5));
 				button:SetNormalTexture(TaxiButtonTypes[type].file);
 				button:Show();
 			else
 				button:Hide();
 			end
 		end
 	
 		-- Hide remaining nodes
 		for index = num_nodes+1, NUM_TAXI_BUTTONS, 1 do
 			local button = _G["TaxiButton"..index];
 			button:Hide();
 		end 
 
 		if ( num_nodes > NUM_TAXI_BUTTONS ) then
 			NUM_TAXI_BUTTONS = num_nodes
 		end
 
 		-- All set...
 		ShowUIPanel(self);
 		if ( not self:IsShown() ) then
 			CloseTaxiMap();
 		end
 		return;
 	end
 	if ( event == "TAXIMAP_CLOSED" ) then
 		HideUIPanel(self);
 		return;
 	end
 end
 
 function TaxiNodeOnButtonEnter(button) 
 	local index = button:GetID();
 	GameTooltip:SetOwner(button, "ANCHOR_RIGHT");
-	GameTooltip:AddLine(TaxiNodeName(index), "", 1.0, 1.0, 1.0);
+	GameTooltip:AddLine(TaxiNodeName(index), nil, nil, nil, true);
 	
 	-- Setup variables
 	local numRoutes = GetNumRoutes(index);
 	local line;
 	local sX, sY, dX, dY;
 	local w = TAXI_MAP_WIDTH;
 	local h = TAXI_MAP_HEIGHT;
 	
 	local type = TaxiNodeGetType(index);
 	if ( type == "REACHABLE" ) then
 		SetTooltipMoney(GameTooltip, TaxiNodeCost(button:GetID()));
 		TaxiNodeSetCurrent(index);
 
 		if ( numRoutes > NUM_TAXI_ROUTES ) then
 			for i = NUM_TAXI_ROUTES+1, numRoutes do
 				line = TaxiRouteMap:CreateTexture("TaxiRoute"..i, "BACKGROUND");
 				line:SetTexture("Interface\\TaxiFrame\\UI-Taxi-Line");
 			end
 			NUM_TAXI_ROUTES = numRoutes;
 		end
 
 		for i=1, NUM_TAXI_ROUTES do
 			line = _G["TaxiRoute"..i];
 			if ( i <= numRoutes ) then
-				sX = TaxiGetSrcX(index, i)*w;
-				sY = TaxiGetSrcY(index, i)*h;
-				dX = TaxiGetDestX(index, i)*w;
-				dY = TaxiGetDestY(index, i)*h;
+				local slot = TaxiGetNodeSlot(index, i, true);
+				sX = taxiNodePositions[slot].x;
+				sY = taxiNodePositions[slot].y;
+				slot = TaxiGetNodeSlot(index, i, false);
+				dX = taxiNodePositions[slot].x;
+				dY = taxiNodePositions[slot].y;
 				DrawRouteLine(line, "TaxiRouteMap", sX, sY, dX, dY, 32);
 				line:Show();
 			else
 				line:Hide();
 			end
 		end
 	elseif ( type == "CURRENT" ) then
-		GameTooltip:AddLine(TAXINODEYOUAREHERE, "", 0.5, 1.0, 0.5);
+		GameTooltip:AddLine(TAXINODEYOUAREHERE, 1.0, 1.0, 1.0, true);
 		DrawOneHopLines();
 	end
 
 	GameTooltip:Show();
 end
 
 -- Draw all flightpaths within one hop of current location
 function DrawOneHopLines()
 	local line;
 	local sX, sY, dX, dY;
 	local w = TAXI_MAP_WIDTH;
 	local h = TAXI_MAP_HEIGHT;
 	local numNodes = NumTaxiNodes();
 	local numLines = 0;
 	local numSingleHops = 0;
 	for i=1, numNodes  do
-		if ( GetNumRoutes(i) == 1 ) then
+		if ( GetNumRoutes(i) == 1 and TaxiNodeGetType(i) ~= "NONE" ) then
 			numSingleHops = numSingleHops + 1;
 			numLines = numLines + 1;
 			if ( numLines > NUM_TAXI_ROUTES ) then
 				line = TaxiRouteMap:CreateTexture("TaxiRoute"..numLines, "BACKGROUND");
 				line:SetTexture("Interface\\TaxiFrame\\UI-Taxi-Line");
 				NUM_TAXI_ROUTES = numLines;
 			else
 				line = _G["TaxiRoute"..numLines];
 			end
 			if ( line ) then
-				sX = TaxiGetSrcX(i, 1)*w;
-				sY = TaxiGetSrcY(i, 1)*h;
-				dX = TaxiGetDestX(i, 1)*w;
-				dY = TaxiGetDestY(i, 1)*h;
+				local slot = TaxiGetNodeSlot(i, 1, true);
+				sX = taxiNodePositions[slot].x;
+				sY = taxiNodePositions[slot].y;
+				slot = TaxiGetNodeSlot(i, 1, false);
+				dX = taxiNodePositions[slot].x;
+				dY = taxiNodePositions[slot].y;
 				DrawRouteLine(line, "TaxiRouteMap", sX, sY, dX, dY, 32);
 				line:Show();
 			end
 		end
 	end
 	for i=numLines+1, NUM_TAXI_ROUTES do
 		_G["TaxiRoute"..i]:Hide();
 	end
 	if ( numSingleHops == 0 ) then
 		UIErrorsFrame:AddMessage(ERR_TAXINOPATHS, 1.0, 0.1, 0.1, 1.0);
 		HideUIPanel(TaxiFrame);
 	end
 end
 
 
 -- The following function is used with permission from Daniel Stephens <iriel@vigilance-committee.org>
 TAXIROUTE_LINEFACTOR = 32/30; -- Multiplying factor for texture coordinates
 TAXIROUTE_LINEFACTOR_2 = TAXIROUTE_LINEFACTOR / 2; -- Half o that
 
 -- T        - Texture
 -- C        - Canvas Frame (for anchoring)
 -- sx,sy    - Coordinate of start of line
 -- ex,ey    - Coordinate of end of line
 -- w        - Width of line
 -- relPoint - Relative point on canvas to interpret coords (Default BOTTOMLEFT)
 function DrawRouteLine(T, C, sx, sy, ex, ey, w, relPoint)
    if (not relPoint) then relPoint = "BOTTOMLEFT"; end
 
    -- Determine dimensions and center point of line
    local dx,dy = ex - sx, ey - sy;
    local cx,cy = (sx + ex) / 2, (sy + ey) / 2;
 
    -- Normalize direction if necessary
    if (dx < 0) then
       dx,dy = -dx,-dy;
    end
 
    -- Calculate actual length of line
    local l = sqrt((dx * dx) + (dy * dy));
 
    -- Quick escape if it's zero length
    if (l == 0) then
       T:SetTexCoord(0,0,0,0,0,0,0,0);
       T:SetPoint("BOTTOMLEFT", C, relPoint, cx,cy);
       T:SetPoint("TOPRIGHT",   C, relPoint, cx,cy);
       return;
    end
 
    -- Sin and Cosine of rotation, and combination (for later)
    local s,c = -dy / l, dx / l;
    local sc = s * c;
 
    -- Calculate bounding box size and texture coordinates
    local Bwid, Bhgt, BLx, BLy, TLx, TLy, TRx, TRy, BRx, BRy;
    if (dy >= 0) then
       Bwid = ((l * c) - (w * s)) * TAXIROUTE_LINEFACTOR_2;
       Bhgt = ((w * c) - (l * s)) * TAXIROUTE_LINEFACTOR_2;
       BLx, BLy, BRy = (w / l) * sc, s * s, (l / w) * sc;
       BRx, TLx, TLy, TRx = 1 - BLy, BLy, 1 - BRy, 1 - BLx; 
       TRy = BRx;
    else
       Bwid = ((l * c) + (w * s)) * TAXIROUTE_LINEFACTOR_2;
       Bhgt = ((w * c) + (l * s)) * TAXIROUTE_LINEFACTOR_2;
       BLx, BLy, BRx = s * s, -(l / w) * sc, 1 + (w / l) * sc;
       BRy, TLx, TLy, TRy = BLx, 1 - BRx, 1 - BLx, 1 - BLy;
       TRx = TLy;
    end
 
    -- Set texture coordinates and anchors
    T:ClearAllPoints();
    T:SetTexCoord(TLx, TLy, BLx, BLy, TRx, TRy, BRx, BRy);
    T:SetPoint("BOTTOMLEFT", C, relPoint, cx - Bwid, cy - Bhgt);
    T:SetPoint("TOPRIGHT",   C, relPoint, cx + Bwid, cy + Bhgt);
 end