diff --git a/src/BuildTiles/Main/main.cxx b/src/BuildTiles/Main/main.cxx
index 0443b9cd..318bfc82 100644
--- a/src/BuildTiles/Main/main.cxx
+++ b/src/BuildTiles/Main/main.cxx
@@ -191,6 +191,7 @@ int main(int argc, char **argv) {
     }
 
     std::vector<TGConstruct *> constructs;
+    SGMutex filelock;
 
 	/* fill the workqueue */
 	for (unsigned int i=0; i<bucketList.size(); i++) {
@@ -199,7 +200,7 @@ int main(int argc, char **argv) {
 
     // now create the worker threads for stage 1
     for (int i=0; i<num_threads; i++) {
-        TGConstruct* construct = new TGConstruct( areas, 1, wq );
+        TGConstruct* construct = new TGConstruct( areas, 1, wq, &filelock );
         //construct->set_cover( cover );
         construct->set_paths( work_dir, share_dir, output_dir, load_dirs );
         construct->set_options( ignoreLandmass, nudge );
@@ -232,7 +233,7 @@ int main(int argc, char **argv) {
 	}
 
     for (int i=0; i<num_threads; i++) {
-        TGConstruct* construct = new TGConstruct( areas, 2, wq );
+        TGConstruct* construct = new TGConstruct( areas, 2, wq, &filelock );
         //construct->set_cover( cover );
         construct->set_paths( work_dir, share_dir, output_dir, load_dirs );
         construct->set_options( ignoreLandmass, nudge );
@@ -264,7 +265,7 @@ int main(int argc, char **argv) {
 	}
 
     for (int i=0; i<num_threads; i++) {
-        TGConstruct* construct = new TGConstruct( areas, 3, wq );
+        TGConstruct* construct = new TGConstruct( areas, 3, wq, &filelock );
         //construct->set_cover( cover );
         construct->set_paths( work_dir, share_dir, output_dir, load_dirs );
         construct->set_options( ignoreLandmass, nudge );
diff --git a/src/BuildTiles/Main/tgconstruct.cxx b/src/BuildTiles/Main/tgconstruct.cxx
index 7b39ef78..7b1f8593 100644
--- a/src/BuildTiles/Main/tgconstruct.cxx
+++ b/src/BuildTiles/Main/tgconstruct.cxx
@@ -33,7 +33,7 @@
 const double TGConstruct::gSnap = 0.00000001;      // approx 1 mm
 
 // Constructor
-TGConstruct::TGConstruct( const TGAreaDefinitions& areas, unsigned int s, SGLockedQueue<SGBucket>& q) :
+TGConstruct::TGConstruct( const TGAreaDefinitions& areas, unsigned int s, SGLockedQueue<SGBucket>& q, SGMutex* l) :
         area_defs(areas),
         workQueue(q),
         stage(s),
@@ -44,6 +44,7 @@ TGConstruct::TGConstruct( const TGAreaDefinitions& areas, unsigned int s, SGLock
 {
     total_tiles = q.size();
     num_areas = areas.size();
+    lock = l;
 }
 
 
@@ -219,7 +220,7 @@ void TGConstruct::run()
 
                     // STEP 19)
                     // Write Custom objects to .stg file
-                    SG_LOG(SG_GENERAL, SG_ALERT, bucket.gen_index_str() << " - Generate Custome Objects");
+                    SG_LOG(SG_GENERAL, SG_ALERT, bucket.gen_index_str() << " - Generate Custom Objects");
                     AddCustomObjects();
                 }
                 break;
diff --git a/src/BuildTiles/Main/tgconstruct.hxx b/src/BuildTiles/Main/tgconstruct.hxx
index 83d2c9b4..8e0ff049 100644
--- a/src/BuildTiles/Main/tgconstruct.hxx
+++ b/src/BuildTiles/Main/tgconstruct.hxx
@@ -60,7 +60,7 @@ class TGConstruct : public SGThread
 {
 public:
     // Constructor
-    TGConstruct( const TGAreaDefinitions& areas, unsigned int s, SGLockedQueue<SGBucket>& q );
+    TGConstruct( const TGAreaDefinitions& areas, unsigned int s, SGLockedQueue<SGBucket>& q, SGMutex* l );
 
     // Destructor
     ~TGConstruct();
@@ -223,6 +223,9 @@ private:
 
     // Neighbor Faces
     neighbor_face_list  neighbor_faces;
+    
+    // file lock
+    SGMutex*    lock;
 };
 
 #endif // _CONSTRUCT_HXX
diff --git a/src/BuildTiles/Main/tgconstruct_clip.cxx b/src/BuildTiles/Main/tgconstruct_clip.cxx
index 332c888f..4c71e2e7 100644
--- a/src/BuildTiles/Main/tgconstruct_clip.cxx
+++ b/src/BuildTiles/Main/tgconstruct_clip.cxx
@@ -267,7 +267,7 @@ bool TGConstruct::ClipLandclassPolys( void ) {
             remains.SetTexMethod( TG_TEX_BY_GEODE, bucket.get_center_lat() );
             remains.SetId(9999);
 
-            SG_LOG( SG_CLIPPER, SG_INFO, "Adding remains to area " << area_defs.get_sliver_area_priority() );
+            SG_LOG( SG_CLIPPER, SG_DEBUG, "Adding remains to area " << area_defs.get_sliver_area_priority() );
             polys_clipped.add_poly( area_defs.get_sliver_area_priority(), remains );
         }
     }
diff --git a/src/BuildTiles/Main/tgconstruct_output.cxx b/src/BuildTiles/Main/tgconstruct_output.cxx
index 445c7332..7b8a5811 100644
--- a/src/BuildTiles/Main/tgconstruct_output.cxx
+++ b/src/BuildTiles/Main/tgconstruct_output.cxx
@@ -49,6 +49,8 @@ void TGConstruct::AddCustomObjects( void ) {
     string dest_ind = dest_i.str_native();
 
     FILE *fp;
+    
+    lock->lock();
     if ( (fp = fopen( dest_ind.c_str(), "w" )) == NULL ) {
         SG_LOG( SG_GENERAL, SG_ALERT, "ERROR: opening " << dest_ind << " for writing!" );
         exit(-1);
@@ -76,15 +78,15 @@ void TGConstruct::AddCustomObjects( void ) {
             //No custom objects
         } else {
             while ( ! in.eof() ) {
-                SG_LOG( SG_GENERAL, SG_INFO, "Collecting custom objects from " << index_file );
+                SG_LOG( SG_GENERAL, SG_DEBUG, "Collecting custom objects from " << index_file );
                 in.getline(line, 2048);
-                SG_LOG( SG_GENERAL, SG_INFO, "line = " << line );
+                SG_LOG( SG_GENERAL, SG_DEBUG, "line = " << line );
 
                 int result = sscanf( line, "%s %s", token, name );
-                SG_LOG( SG_GENERAL, SG_INFO, "scanf scanned " << result << " tokens" );
+                SG_LOG( SG_GENERAL, SG_DEBUG, "scanf scanned " << result << " tokens" );
 
                 if ( result > 0 ) {
-                    SG_LOG( SG_GENERAL, SG_INFO, "token = " << token << " name = " << name );
+                    SG_LOG( SG_GENERAL, SG_DEBUG, "token = " << token << " name = " << name );
 
                     if ( strcmp( token, "OBJECT" ) == 0 ) {
                         SGPath srcbase(base);
@@ -96,7 +98,7 @@ void TGConstruct::AddCustomObjects( void ) {
 #else
                         string command = "cp " + basecom + " " + dest_dir;
 #endif
-                        SG_LOG( SG_GENERAL, SG_INFO, "running " << command );
+                        SG_LOG( SG_GENERAL, SG_DEBUG, "running " << command );
                         system( command.c_str() );
 
                         fprintf(fp, "OBJECT %s\n", name);
@@ -109,6 +111,8 @@ void TGConstruct::AddCustomObjects( void ) {
     }
 
     fclose(fp);
+    
+    lock->unlock();
 }
 
 void TGConstruct::WriteBtgFile( void )
@@ -222,7 +226,11 @@ void TGConstruct::WriteBtgFile( void )
     obj.set_fan_materials( fan_materials );
 
     bool result;
+    
+    lock->lock();
     result = obj.write_bin( base, binname, bucket );
+    lock->unlock();
+    
     if ( !result )
     {
         throw sg_exception("error writing file. :-(");
diff --git a/src/BuildTiles/Main/tgconstruct_poly.cxx b/src/BuildTiles/Main/tgconstruct_poly.cxx
index e1ba81fa..fd598662 100644
--- a/src/BuildTiles/Main/tgconstruct_poly.cxx
+++ b/src/BuildTiles/Main/tgconstruct_poly.cxx
@@ -120,7 +120,7 @@ int TGConstruct::LoadLandclassPolys( void ) {
         } // of directory file children
     }
 
-    SG_LOG(SG_GENERAL, SG_ALERT, " Total polys read in this tile: " <<  total_polys_read );
+    SG_LOG(SG_GENERAL, SG_DEBUG, " Total polys read in this tile: " <<  total_polys_read );
 
     return total_polys_read;
 }
diff --git a/src/BuildTiles/Main/tgconstruct_shared.cxx b/src/BuildTiles/Main/tgconstruct_shared.cxx
index 1d4b4445..36ef7c7b 100644
--- a/src/BuildTiles/Main/tgconstruct_shared.cxx
+++ b/src/BuildTiles/Main/tgconstruct_shared.cxx
@@ -47,6 +47,9 @@ void TGConstruct::SaveSharedEdgeData( int stage )
 
             filepath = share_base + "/stage1/" + bucket.gen_base_path() + "/" + bucket.gen_index_str() + "_edges";
             SGPath file(filepath);
+
+            lock->lock();
+            
             file.create_dir( 0755 );
 
             gzFile fp;
@@ -86,6 +89,8 @@ void TGConstruct::SaveSharedEdgeData( int stage )
             }
 
             gzclose(fp);
+            
+            lock->unlock();
         }
         break;
 
@@ -102,23 +107,28 @@ void TGConstruct::SaveSharedEdgeData( int stage )
             // are updated, we'll need to traverse all of these point lists, and update
             // any border nodes elevation as well
             string dir;
-            string file;
+            string file_north, file_south, file_east, file_west;
+            gzFile fp;
             std::vector<SGGeod> north, south, east, west;
             int nCount;
 
             nodes.get_geod_edge( bucket, north, south, east, west );
 
             dir  = share_base + "/stage2/" + bucket.gen_base_path();
-
+            file_north = dir + "/" + bucket.gen_index_str() + "_north_edge";
+            file_south = dir + "/" + bucket.gen_index_str() + "_south_edge";
+            file_east  = dir + "/" + bucket.gen_index_str() + "_east_edge";
+            file_west  = dir + "/" + bucket.gen_index_str() + "_west_edge";
+            
             SGPath sgp( dir );
             sgp.append( "dummy" );
+            
+            lock->lock();
             sgp.create_dir( 0755 );
 
             // north edge
-            file = dir + "/" + bucket.gen_index_str() + "_north_edge";
-            gzFile fp;
-            if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+            if ( (fp = gzopen( file_north.c_str(), "wb9" )) == NULL ) {
+                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_north.c_str() << " for writing!" );
                 return;
             }
             sgClearWriteError();
@@ -133,9 +143,8 @@ void TGConstruct::SaveSharedEdgeData( int stage )
             gzclose(fp);
 
             // south edge
-            file = dir + "/" + bucket.gen_index_str() + "_south_edge";
-            if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+            if ( (fp = gzopen( file_south.c_str(), "wb9" )) == NULL ) {
+                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_south.c_str() << " for writing!" );
                 return;
             }
             sgClearWriteError();
@@ -149,9 +158,8 @@ void TGConstruct::SaveSharedEdgeData( int stage )
             gzclose(fp);
 
             // east edge
-            file = dir + "/" + bucket.gen_index_str() + "_east_edge";
-            if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+            if ( (fp = gzopen( file_east.c_str(), "wb9" )) == NULL ) {
+                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_east.c_str() << " for writing!" );
                 return;
             }
             sgClearWriteError();
@@ -165,9 +173,8 @@ void TGConstruct::SaveSharedEdgeData( int stage )
             gzclose(fp);
 
             // west egde
-            file = dir + "/" + bucket.gen_index_str() + "_west_edge";
-            if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+            if ( (fp = gzopen( file_west.c_str(), "wb9" )) == NULL ) {
+                SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_west.c_str() << " for writing!" );
                 return;
             }
             sgClearWriteError();
@@ -179,6 +186,8 @@ void TGConstruct::SaveSharedEdgeData( int stage )
                 WriteNeighborFaces( fp, west[i] );
             }
             gzclose(fp);
+            
+            lock->unlock();
         }
         break;
     }
@@ -392,38 +401,41 @@ void TGConstruct::ReadNeighborFaces( gzFile& fp )
 void TGConstruct::SaveToIntermediateFiles( int stage )
 {
     string dir;
-    string file;
+    string file_clipped;
+    string file_nodes;
     gzFile fp;
 
     switch( stage ) {
         case 1:     // Save the clipped polys and node list
         {
             /* Only create the file this isn't an ocean tile */
-            if ( !IsOceanTile() ) {
+            if ( !IsOceanTile() ) {                
                 dir  = share_base + "/stage1/" + bucket.gen_base_path();
-
                 SGPath sgp( dir );
                 sgp.append( "dummy" );
+                file_clipped = dir + "/" + bucket.gen_index_str() + "_clipped_polys";
+                file_nodes = dir + "/" + bucket.gen_index_str() + "_nodes";
+                
+                lock->lock();                
+                
                 sgp.create_dir( 0755 );
-
-                file = dir + "/" + bucket.gen_index_str() + "_clipped_polys";
-                if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+                if ( (fp = gzopen( file_clipped.c_str(), "wb9" )) == NULL ) {
+                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_clipped.c_str() << " for writing!" );
                     return;
                 }
                 sgClearWriteError();
                 polys_clipped.SaveToGzFile( fp );
                 gzclose( fp );
 
-                file = dir + "/" + bucket.gen_index_str() + "_nodes";
-
-                if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+                if ( (fp = gzopen( file_nodes.c_str(), "wb9" )) == NULL ) {
+                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_nodes.c_str() << " for writing!" );
                     return;
                 }
                 sgClearWriteError();
                 nodes.SaveToGzFile( fp );
                 gzclose( fp );
+                
+                lock->unlock();
             }
 
             break;
@@ -436,25 +448,29 @@ void TGConstruct::SaveToIntermediateFiles( int stage )
 
                 SGPath sgp( dir );
                 sgp.append( "dummy" );
+                file_clipped = dir + "/" + bucket.gen_index_str() + "_clipped_polys";
+                file_nodes = dir + "/" + bucket.gen_index_str() + "_nodes";
+                
+                lock->lock();
                 sgp.create_dir( 0755 );
 
-                file = dir + "/" + bucket.gen_index_str() + "_clipped_polys";
-                if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+                if ( (fp = gzopen( file_clipped.c_str(), "wb9" )) == NULL ) {
+                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_clipped.c_str() << " for writing!" );
                     return;
                 }
                 sgClearWriteError();
                 polys_clipped.SaveToGzFile( fp );
                 gzclose( fp );
 
-                file = dir + "/" + bucket.gen_index_str() + "_nodes";
-                if ( (fp = gzopen( file.c_str(), "wb9" )) == NULL ) {
-                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file.c_str() << " for writing!" );
+                if ( (fp = gzopen( file_nodes.c_str(), "wb9" )) == NULL ) {
+                    SG_LOG( SG_GENERAL, SG_INFO,"ERROR: opening " << file_nodes.c_str() << " for writing!" );
                     return;
                 }
                 sgClearWriteError();
                 nodes.SaveToGzFile( fp );
                 gzclose( fp );
+                
+                lock->unlock();
             }
             break;
         }