diff --git a/src/BuildTiles/Main/tgconstruct.hxx b/src/BuildTiles/Main/tgconstruct.hxx
index 7f50bdac..66ec9840 100644
--- a/src/BuildTiles/Main/tgconstruct.hxx
+++ b/src/BuildTiles/Main/tgconstruct.hxx
@@ -40,8 +40,6 @@
 #include "tglandclass.hxx"
 
 #define FIND_SLIVERS    (0)
-#define USE_ACCUMULATOR (1)
-
 
 // Stage2 shared edge data
 struct TGNeighborFaces {
diff --git a/src/BuildTiles/Main/tgconstruct_clip.cxx b/src/BuildTiles/Main/tgconstruct_clip.cxx
index 31616ca2..08f61892 100644
--- a/src/BuildTiles/Main/tgconstruct_clip.cxx
+++ b/src/BuildTiles/Main/tgconstruct_clip.cxx
@@ -41,24 +41,14 @@ bool TGConstruct::ClipLandclassPolys( void ) {
     bool debug_area, debug_shape;
     static int accum_idx = 0;
 
-#if !USE_ACCUMULATOR
-    TGPolygon accum;
-#endif
-
     // Get clip bounds
     min.x() = bucket.get_center_lon() - 0.5 * bucket.get_width();
     min.y() = bucket.get_center_lat() - 0.5 * bucket.get_height();
     max.x() = bucket.get_center_lon() + 0.5 * bucket.get_width();
     max.y() = bucket.get_center_lat() + 0.5 * bucket.get_height();
 
-#if USE_ACCUMULATOR
-
     tgPolygonInitClipperAccumulator();
 
-#else
-    accum.erase();
-#endif
-
     // set up clipping tile : and remember to add the nodes!
     safety_base.erase();
 
@@ -146,20 +136,10 @@ bool TGConstruct::ClipLandclassPolys( void ) {
                 sprintf(layer, "pre_clip_accum_%d_%d", accum_idx, polys_in.get_shape( i, j ).id );
                 sprintf(name, "shape_accum %d,%d", i,j);
 
-#if USE_ACCUMULATOR
                 tgPolygonDumpAccumulator( ds_name, layer, name );
-#else
-                WriteDebugPoly( layer, name, accum );
-#endif
             }
 
-
-#if USE_ACCUMULATOR
             clipped = tgPolygonDiffClipperWithAccumulator( tmp );
-#else            
-            clipped = tgPolygonDiff( tmp, accum );
-#endif
-
 
             if ( debug_area || debug_shape ) {
                 char layer[32];
@@ -199,26 +179,19 @@ bool TGConstruct::ClipLandclassPolys( void ) {
                 }
             }
 
-#if USE_ACCUMULATOR
             if ( debug_shape ) {
                 tgPolygonAddToClipperAccumulator( tmp, true );
             } else {
-            tgPolygonAddToClipperAccumulator( tmp, false );
+                tgPolygonAddToClipperAccumulator( tmp, false );
             }
-#else
-            accum   = tgPolygonUnion( tmp, accum );
-#endif
 
             if ( debug_area || debug_shape ) {
                 char layer[32];
                 char name[32];
                 sprintf(layer, "post_clip_accum_%d_%d", accum_idx, polys_in.get_shape( i, j ).id );
                 sprintf(name, "shape_accum %d,%d", i,j);
-#if USE_ACCUMULATOR
+
                 tgPolygonDumpAccumulator( ds_name, layer, name );
-#else
-                WriteDebugPoly( layer, name, accum );
-#endif
             }
             accum_idx++;
         }
@@ -237,11 +210,7 @@ bool TGConstruct::ClipLandclassPolys( void ) {
     slivers.clear();
 
     // finally, what ever is left over goes to ocean
-#if USE_ACCUMULATOR
     remains = tgPolygonDiffClipperWithAccumulator( safety_base );
-#else
-    remains = tgPolygonDiff( safety_base, accum );
-#endif
 
     if ( remains.contours() > 0 ) {
         // cout << "remains contours = " << remains.contours() << endl;
@@ -284,12 +253,8 @@ bool TGConstruct::ClipLandclassPolys( void ) {
         }
     }
 
-#if USE_ACCUMULATOR
-
     tgPolygonFreeClipperAccumulator();
 
-#endif
-
     // Once clipping is complete, intersect the individual segments with their clip masks
     for (unsigned int area = 0; area < TG_MAX_AREA_TYPES; area++) {
         for (unsigned int shape = 0; shape < polys_clipped.area_size(area); shape++ ) {
@@ -317,4 +282,4 @@ bool TGConstruct::ClipLandclassPolys( void ) {
     }
 
     return true;
-}
+}
\ No newline at end of file
diff --git a/src/BuildTiles/Main/tgconstruct_math.cxx b/src/BuildTiles/Main/tgconstruct_math.cxx
index a4c1d692..bbbc905b 100644
--- a/src/BuildTiles/Main/tgconstruct_math.cxx
+++ b/src/BuildTiles/Main/tgconstruct_math.cxx
@@ -176,7 +176,6 @@ void TGConstruct::CalcPointNormals( void )
             for ( int j = 0; j < num_faces; j++ ) {
                 normal    = neighbor_faces->face_normals[j];
                 face_area = neighbor_faces->face_areas[j];
-                SG_LOG(SG_GENERAL, SG_ALERT, "\tAdding face area " << face_area << " and normal " << normal << " to node " << node.GetPosition() );
 
                 normal *= face_area;
                 total_area += face_area;
diff --git a/src/Lib/Geometry/util.cxx b/src/Lib/Geometry/util.cxx
index 7c1d3912..5866c9ad 100644
--- a/src/Lib/Geometry/util.cxx
+++ b/src/Lib/Geometry/util.cxx
@@ -639,7 +639,7 @@ makePolygonsTP (const Line &line, double width, poly_list& polys, texparams_list
         prev_inner = cur_inner;
     }
 }
-#endif
+#else
 
 void
 makePolygonsTP (const Line &line, double width, poly_list& polys, texparams_list &tps)
@@ -780,7 +780,7 @@ makePolygonsTP (const Line &line, double width, poly_list& polys, texparams_list
 
     sglog().setLogLevels( SG_ALL, SG_INFO );
 }
-
+#endif
 
 Rectangle
 makeBounds (const TGPolygon &polygon)
diff --git a/src/Lib/Polygon/polygon.cxx b/src/Lib/Polygon/polygon.cxx
index 4ce57d5b..b4aac5e6 100644
--- a/src/Lib/Polygon/polygon.cxx
+++ b/src/Lib/Polygon/polygon.cxx
@@ -28,12 +28,19 @@
 
 #include <iostream>
 #include <fstream>
+#include <limits.h>
 
 #include <simgear/constants.h>
 #include <simgear/debug/logstream.hxx>
 #include <Geometry/point3d.hxx>
 #include <Geometry/poly_support.hxx>
 #include <simgear/math/sg_geodesy.hxx>
+#include <simgear/math/SGVec3.hxx>
+#include <simgear/math/SGMisc.hxx>
+#include <simgear/math/SGMath.hxx>
+#include <simgear/math/SGGeometryFwd.hxx>
+#include <simgear/math/SGBox.hxx>
+#include <simgear/math/SGIntersect.hxx>
 #include <simgear/structure/exception.hxx>
 
 #include <Geometry/trinodes.hxx>
@@ -414,6 +421,19 @@ static Point3D MakeTGPoint( ClipperLib::IntPoint pt )
 	return tg_pt;
 }
 
+static SGVec3d MakeSGVec3D( ClipperLib::IntPoint pt )
+{
+    SGVec3d sgvec;
+    double x, y;
+
+    x = (double)( ((double)pt.X) / (double)FIXEDPT );
+    y = (double)( ((double)pt.Y) / (double)FIXEDPT );
+
+    sgvec = SGVec3d( x, y, 0.0f);
+
+    return sgvec;
+}
+
 double MakeClipperDelta( double mDelta )
 {
     double cDelta = mDelta * ( FIXEDPT / FIXED1M );
@@ -423,7 +443,7 @@ double MakeClipperDelta( double mDelta )
     return( cDelta );
 }
 
-void make_clipper_poly( const TGPolygon& in, ClipperLib::Polygons *out ) 
+static void make_clipper_poly( const TGPolygon& in, ClipperLib::Polygons *out ) 
 {
     ClipperLib::Polygon contour;
     Point3D  p;
@@ -456,41 +476,6 @@ void make_clipper_poly( const TGPolygon& in, ClipperLib::Polygons *out )
     }
 }
 
-#if 0
-void make_tg_poly_from_clipper_ex( const ClipperLib::ExPolygons& in, TGPolygon *out )
-{
-	int res_contour = 0;
-	out->erase();
-
-  	for (unsigned int i=0; i<in.size(); i++)
-    {
-      	const struct ClipperLib::ExPolygon* pg = &in[i];
-		ClipperLib::IntPoint ip;
-
-		// Get the boundary contour
-        for (unsigned int j = 0; j < pg->outer.size(); j++)
-        {
-			ip = ClipperLib::IntPoint( pg->outer[j].X, pg->outer[j].Y );
-       	    out->add_node(res_contour, MakeTGPoint(ip));
-        }
-        out->set_hole_flag(res_contour, 0);
-        res_contour++;
-
-        // then the holes
-        for (unsigned int j = 0; j < pg->holes.size(); j++)
-        {
-            for (unsigned int k = 0; k < pg->holes[j].size(); k++)
-            {
-				ip = ClipperLib::IntPoint( pg->holes[j].at(k).X, pg->holes[j].at(k).Y );
-               	out->add_node(res_contour, MakeTGPoint(ip));
-            }
-            out->set_hole_flag(res_contour, 1);
-            res_contour++;
-        }
-    }
-}
-#endif
-
 void make_tg_poly_from_clipper( const ClipperLib::Polygons& in, TGPolygon *out )
 {
 	out->erase();
@@ -517,40 +502,67 @@ void make_tg_poly_from_clipper( const ClipperLib::Polygons& in, TGPolygon *out )
     }
 }
 
-#if 0
-ClipperLib::Polygons clipper_simplify( ClipperLib::ExPolygons &in )
+
+void get_Clipper_bounding_box( const ClipperLib::Polygons& in, SGVec3d& min, SGVec3d& max )
 {
-    ClipperLib::Polygons out;
-    ClipperLib::Polygon  contour;
+    ClipperLib::IntPoint min_pt, max_pt;
 
-  	for (unsigned int i=0; i<in.size(); i++)
+    min_pt.X = min_pt.Y = LONG_LONG_MAX;
+    max_pt.X = max_pt.Y = LONG_LONG_MIN;
+
+    // for each polygon, we need to check the orientation, to set the hole flag...
+    for (unsigned int i=0; i<in.size(); i++)
     {
-      	const struct ClipperLib::ExPolygon* pg = &in[i];
-
-        // first the boundary
-        contour = pg->outer;
-        if ( !Orientation( contour ) ) {
-            ReversePolygon( contour );
-        }
-        out.push_back( contour );
-
-        // then the holes
-        for (unsigned int j = 0; j < pg->holes.size(); j++)
+        for (unsigned int j = 0; j < in[i].size(); j++)
         {
-            contour = pg->holes[j];
-            if ( Orientation( contour ) ) {
-                ReversePolygon( contour );
+            if ( in[i][j].X < min_pt.X ) {
+                min_pt.X = in[i][j].X;
+            }
+            if ( in[i][j].Y < min_pt.Y ) {
+                min_pt.Y = in[i][j].Y;
+            }
+
+            if ( in[i][j].X > max_pt.X ) {
+                max_pt.X = in[i][j].X;
+            }
+            if ( in[i][j].Y > max_pt.Y ) {
+                max_pt.Y = in[i][j].Y;
             }
-            out.push_back( contour );
         }
     }
 
-    // Now simplify
-    SimplifyPolygons(out);
-
-    return out;
+    min = MakeSGVec3D( min_pt );
+    max = MakeSGVec3D( max_pt );
+}
+
+void clipper_to_shapefile( ClipperLib::Polygons polys, char* ds )
+{
+    ClipperLib::Polygons contour;
+    TGPolygon tgcontour;
+    char layer[32];
+
+    void*       ds_id = tgShapefileOpenDatasource( ds );
+
+    for (unsigned int i = 0; i < polys.size(); ++i) {
+        if  ( Orientation( polys[i] ) ) {
+            sprintf( layer, "%04d_boundary", i );
+        } else {
+            sprintf( layer, "%04d_hole", i );
+        }
+
+        void* l_id  = tgShapefileOpenLayer( ds_id, layer );
+        contour.clear();
+        contour.push_back( polys[i] );
+
+        tgcontour.erase();
+        make_tg_poly_from_clipper( contour, &tgcontour );
+
+        tgShapefileCreateFeature( ds_id, l_id, tgcontour, "contour" );
+    }
+
+    // close after each write
+    ds_id = tgShapefileCloseDatasource( ds_id );
 }
-#endif
 
 TGPolygon polygon_clip_clipper( clip_op poly_op, const TGPolygon& subject, const TGPolygon& clip )
 {
@@ -614,7 +626,10 @@ TGPolygon tgPolygonUnion( const TGPolygon& subject, const TGPolygon& clip ) {
 
 
 // Accumulator optimization ( to keep from massive data copies and format changes
-ClipperLib::Polygons clipper_accumulator;
+// Start out the accumulator as a list of Polygons - so we can bounding box check
+// new additions
+typedef std::vector < ClipperLib::Polygons > ClipperPolysList;
+ClipperPolysList clipper_accumulator;
 
 void tgPolygonInitClipperAccumulator( void )
 {
@@ -632,8 +647,10 @@ void tgPolygonDumpAccumulator( char* ds, char* layer, char* name )
     void* l_id  = tgShapefileOpenLayer( ds_id, layer );
     TGPolygon accum;
 
-    make_tg_poly_from_clipper( clipper_accumulator, &accum );
-    tgShapefileCreateFeature( ds_id, l_id, accum, name );
+    for (unsigned int i=0; i<clipper_accumulator.size(); i++) {
+        make_tg_poly_from_clipper( clipper_accumulator[i], &accum );
+        tgShapefileCreateFeature( ds_id, l_id, accum, name );
+    }
 
     // close after each write
     ds_id = tgShapefileCloseDatasource( ds_id );
@@ -641,95 +658,57 @@ void tgPolygonDumpAccumulator( char* ds, char* layer, char* name )
 
 void tgPolygonAddToClipperAccumulator( const TGPolygon& subject, bool dump )
 {
-    std::ofstream subjectFile, clipFile, resultFile;
-
     ClipperLib::Polygons clipper_subject;
     make_clipper_poly( subject, &clipper_subject );
 
-    if (dump) {
-        subjectFile.open ("subject.txt");
-        subjectFile << clipper_subject;
-        subjectFile.close();
-
-        clipFile.open ("clip.txt");
-        clipFile << clipper_accumulator;
-        clipFile.close();
-    }
-
-    ClipperLib::Clipper c;
-    c.Clear();
-    c.AddPolygons(clipper_subject, ClipperLib::ptSubject);
-    c.AddPolygons(clipper_accumulator, ClipperLib::ptClip);
-
-    if ( !c.Execute(ClipperLib::ctUnion, clipper_accumulator, ClipperLib::pftEvenOdd, ClipperLib::pftEvenOdd) ) {
-        SG_LOG(SG_GENERAL, SG_ALERT, "Add to Accumulator returned FALSE" );
-        exit(-1);
-    }
-
-    if (dump) {
-        resultFile.open ("result.txt");
-        resultFile << clipper_accumulator;
-        resultFile.close();
-    }
-}
-
-void clipper_to_shapefile( ClipperLib::Polygons polys, char* ds )
-{
-    ClipperLib::Polygons contour;
-    TGPolygon tgcontour;
-    char layer[32];
-
-    void*       ds_id = tgShapefileOpenDatasource( ds );
-
-    for (unsigned int i = 0; i < polys.size(); ++i) {
-        if  ( Orientation( polys[i] ) ) {
-            sprintf( layer, "%04d_boundary", i );
-        } else {
-            sprintf( layer, "%04d_hole", i );
-        }
-
-        void* l_id  = tgShapefileOpenLayer( ds_id, layer );
-        contour.clear();
-        contour.push_back( polys[i] );
-
-        tgcontour.erase();
-        make_tg_poly_from_clipper( contour, &tgcontour );
-
-        tgShapefileCreateFeature( ds_id, l_id, tgcontour, "contour" );
-    }
-
-    // close after each write
-    ds_id = tgShapefileCloseDatasource( ds_id );
+    clipper_accumulator.push_back( clipper_subject );
 }
 
 TGPolygon tgPolygonDiffClipperWithAccumulator( const TGPolygon& subject )
 {
     TGPolygon result;
+    SGVec3d min, max, minp, maxp;
+    unsigned int num_hits = 0;
 
     ClipperLib::Polygons clipper_subject;
     make_clipper_poly( subject, &clipper_subject );
-    
-    ClipperLib::Polygons clipper_result;
-    
+
+    // Start with full poly
+    result = subject;
+    result.get_bounding_box(minp, maxp);
+    SGBoxd box1(minp, maxp);
+
     ClipperLib::Clipper c;
     c.Clear();
-    c.AddPolygons(clipper_subject, ClipperLib::ptSubject);
-    c.AddPolygons(clipper_accumulator, ClipperLib::ptClip);
 
-    if ( !c.Execute(ClipperLib::ctDifference, clipper_result, ClipperLib::pftNonZero, ClipperLib::pftNonZero) )
-    {
-        SG_LOG(SG_GENERAL, SG_ALERT, "Diff With Accumulator returned FALSE" );
-        exit(-1);
+    c.AddPolygons(clipper_subject, ClipperLib::ptSubject);
+
+    // clip result against all polygons in the accum that intersect our bb
+    for (unsigned int i=0; i < clipper_accumulator.size(); i++) {
+        get_Clipper_bounding_box( clipper_accumulator[i], min, max);
+        SGBoxd box2(min, max);
+
+        if ( intersects( box2, box1 ) )
+        {
+            c.AddPolygons(clipper_accumulator[i], ClipperLib::ptClip);
+            num_hits++;
+        }
     }
 
-    make_tg_poly_from_clipper( clipper_result, &result );
+    if (num_hits) {
+        ClipperLib::Polygons clipper_result;
+        
+        if ( !c.Execute(ClipperLib::ctDifference, clipper_result, ClipperLib::pftNonZero, ClipperLib::pftNonZero) ) {
+            SG_LOG(SG_GENERAL, SG_ALERT, "Diff With Accumulator returned FALSE" );
+            exit(-1);
+        }
+
+        make_tg_poly_from_clipper( clipper_result, &result );
+    }
 
     return result;
 }
 
-
-
-
 // CLIPPER
 TGPolygon tgPolygonDiffClipper( const TGPolygon& subject, const TGPolygon& clip ) {
     return polygon_clip_clipper( POLY_DIFF, subject, clip );
diff --git a/src/Prep/OGRDecode/ogr-decode.cxx b/src/Prep/OGRDecode/ogr-decode.cxx
index a1dcf92a..1a2cc1eb 100644
--- a/src/Prep/OGRDecode/ogr-decode.cxx
+++ b/src/Prep/OGRDecode/ogr-decode.cxx
@@ -193,8 +193,8 @@ void processLineStringWithTextureInfo(OGRLineString* poGeometry,
     double pt_x = 0.0f, pt_y = 0.0f;
     int i, j, numPoints, numSegs;
     double max_dist;
-    double min_dist;
-    double cur_dist;
+//    double min_dist;
+//    double cur_dist;
 
     numPoints = poGeometry->getNumPoints();
     if (numPoints < 2) {
@@ -203,8 +203,8 @@ void processLineStringWithTextureInfo(OGRLineString* poGeometry,
     }
 
     max_dist = (double)width * 10.0f;
-    min_dist = (double)width *  1.5f;
-    cur_dist = 0.0f;
+//  min_dist = (double)width *  1.5f;
+//  cur_dist = 0.0f;
 
     // because vector data can generate adjacent polys, lets stretch the two enpoints by a little bit
     p0 = Point3D(poGeometry->getX(0),poGeometry->getY(0),0);
@@ -230,16 +230,16 @@ void processLineStringWithTextureInfo(OGRLineString* poGeometry,
                 geo_direct_wgs_84( p0.y(), p0.x(), heading, dist*(j+1), &pt_y, &pt_x, &az2 );
                 line.addPoint( Point3D( pt_x, pt_y, 0.0f ) );
             }
-            cur_dist = 0.0f;
-        }
-        else if (dist + cur_dist < max_dist)
-        {
-            cur_dist += dist;
+//          cur_dist = 0.0f;
         }
+//      else if (dist + cur_dist < max_dist)
+//      {
+//          cur_dist += dist;
+//      }
         else
         {
             line.addPoint( p1 );
-            cur_dist = 0;
+//          cur_dist = 0;
         }
     }