diff --git a/src/Airports/GenAirports850/lights.cxx b/src/Airports/GenAirports850/lights.cxx
index d125f5d0..798797cc 100644
--- a/src/Airports/GenAirports850/lights.cxx
+++ b/src/Airports/GenAirports850/lights.cxx
@@ -571,82 +571,60 @@ TGSuperPoly Runway::gen_touchdown_zone_lights( bool recip )
 {
     point_list lights; lights.clear();
     point_list normals; normals.clear();
-    int i;
 
-    SG_LOG(SG_GENERAL, SG_DEBUG, "gen touchdown zone lights " << rwy.rwnum[0] );
-
-    Point3D normal;
-    point_list corner = gen_corners( 0.0, rwy.threshold[0], rwy.threshold[1], 0.0 );
+    Point3D normal = gen_runway_light_vector( 3.0, recip );
 
     // determine the start point.
-    Point3D ref;
+    SGGeod ref;
     double length_hdg, left_hdg;
-    double lon = 0.0f, lat = 0.0f, r;
     if ( recip ) {
-        ref = (corner[0] + corner[1]) / 2;
         length_hdg = rwy.heading + 180.0;
-        if ( length_hdg > 360.0 ) { 
-            length_hdg -= 360.0; 
-        }
+        if ( length_hdg > 360.0 ) {length_hdg -= 360.0;}
+        ref = SGGeodesy::direct( GetEnd(), length_hdg, rwy.threshold[get_thresh0(recip)]);
     } else {
-        ref = (corner[2] + corner[3]) / 2;
         length_hdg = rwy.heading;
+        ref = SGGeodesy::direct(GetStart(), length_hdg, rwy.threshold[get_thresh0(recip)]);
     }
     left_hdg = length_hdg - 90.0;
-    if ( left_hdg < 0 ) { 
-        left_hdg += 360.0; 
-    }
+    if ( left_hdg < 0 ) { left_hdg += 360.0; }
 
-    SG_LOG(SG_GENERAL, SG_DEBUG, "length hdg = " << length_hdg << " left heading = " << left_hdg );
+    // calculate amount of touchdown light rows.
+    // They should cover a distance of 900m max. from the threshold or
+    // half the runway length, whichever is shorter.
+    int rows = (int)(rwy.length * 0.5) / 60;
+    if (rows > 15) rows = 15;
 
-    normal = gen_runway_light_vector( 3.0, recip );
-
-    for ( i = 0; i < 30; ++i ) {
-        // offset 100' upwind
-        geo_direct_wgs_84 ( ref.lat(), ref.lon(), length_hdg, 
-                            100 * SG_FEET_TO_METER, &lat, &lon, &r );
-        ref = Point3D( lon, lat, 0.0 );
-
-        Point3D pt1 = ref;
+    for ( int i = 0; i < rows; ++i ) {
+        // offset 60m upwind
+        ref = SGGeodesy::direct( ref, length_hdg, 60 );
+        SGGeod pt1 = ref;
 
         // left side bar
-        geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, 
-                            36 * SG_FEET_TO_METER, &lat, &lon, &r );
-        pt1 = Point3D( lon, lat, 0.0 );
-        lights.push_back( pt1 );
+        pt1 = SGGeodesy::direct( pt1, left_hdg, 9 );
+        lights.push_back( Point3D::fromSGGeod(pt1) );
         normals.push_back( normal );
     
-        geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, 
-                            5 * SG_FEET_TO_METER, &lat, &lon, &r );
-        pt1 = Point3D( lon, lat, 0.0 );
-        lights.push_back( pt1 );
+        pt1 = SGGeodesy::direct( pt1, left_hdg, 1.5 );
+        lights.push_back( Point3D::fromSGGeod(pt1) );
         normals.push_back( normal );
 
-        geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, 
-                            5 * SG_FEET_TO_METER, &lat, &lon, &r );
-        pt1 = Point3D( lon, lat, 0.0 );
-        lights.push_back( pt1 );
+        pt1 = SGGeodesy::direct( pt1, left_hdg, 1.5 );
+        lights.push_back( Point3D::fromSGGeod(pt1) );
         normals.push_back( normal );
 
         pt1 = ref;
 
         // right side bar
-        geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, 
-                            -36 * SG_FEET_TO_METER, &lat, &lon, &r );
-        pt1 = Point3D( lon, lat, 0.0 );
-        lights.push_back( pt1 );
-        normals.push_back( normal );
-    
-        geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, 
-                            -5 * SG_FEET_TO_METER, &lat, &lon, &r );
-        pt1 = Point3D( lon, lat, 0.0 );
-        lights.push_back( pt1 );
+        pt1 = SGGeodesy::direct( pt1, left_hdg, -9 );
+        lights.push_back( Point3D::fromSGGeod(pt1) );
         normals.push_back( normal );
 
-        geo_direct_wgs_84 ( pt1.lat(), pt1.lon(), left_hdg, 
-                            -5 * SG_FEET_TO_METER, &lat, &lon, &r );
-        pt1 = Point3D( lon, lat, 0.0 );
-        lights.push_back( pt1 );
+        pt1 = SGGeodesy::direct( pt1, left_hdg, -1.5 );
+        lights.push_back( Point3D::fromSGGeod(pt1) );
+        normals.push_back( normal );
+
+        pt1 = SGGeodesy::direct( pt1, left_hdg, -1.5 );
+        lights.push_back( Point3D::fromSGGeod(pt1) );
         normals.push_back( normal );
     }