diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx
index 7aa8bb602b48a1d551004c095f4901e69c948dd6..3589e82c152e9155058c1d8e713341e8dff135d0 100644
--- a/Source/cmGlobalGenerator.cxx
+++ b/Source/cmGlobalGenerator.cxx
@@ -1091,6 +1091,18 @@ void cmGlobalGenerator::ClearEnabledLanguages()
   return this->CMakeInstance->GetState()->ClearEnabledLanguages();
 }
 
+void cmGlobalGenerator::CreateLocalGenerators()
+{
+  cmDeleteAll(this->LocalGenerators);
+  this->LocalGenerators.clear();
+  this->LocalGenerators.reserve(this->Makefiles.size());
+  for (std::vector<cmMakefile*>::const_iterator it = this->Makefiles.begin();
+       it != this->Makefiles.end(); ++it)
+    {
+    this->LocalGenerators.push_back(this->CreateLocalGenerator(*it));
+    }
+}
+
 void cmGlobalGenerator::Configure()
 {
   this->FirstTimeProgress = 0.0f;
@@ -1099,8 +1111,6 @@ void cmGlobalGenerator::Configure()
   cmMakefile* dirMf =
       new cmMakefile(this, this->GetCMakeInstance()->GetCurrentSnapshot());
   this->Makefiles.push_back(dirMf);
-  cmLocalGenerator *lg = this->CreateLocalGenerator(dirMf);
-  this->LocalGenerators.push_back(lg);
 
   // set the Start directories
   dirMf->SetCurrentSourceDirectory
@@ -1175,6 +1185,7 @@ void cmGlobalGenerator::Configure()
 
 void cmGlobalGenerator::CreateGenerationObjects(TargetTypes targetTypes)
 {
+  this->CreateLocalGenerators();
   cmDeleteAll(this->GeneratorTargets);
   this->GeneratorTargets.clear();
   this->CreateGeneratorTargets(targetTypes);
@@ -1246,11 +1257,6 @@ bool cmGlobalGenerator::Compute()
 
   unsigned int i;
 
-  for (i = 0; i < this->LocalGenerators.size(); ++i)
-    {
-    this->LocalGenerators[i]->ComputeObjectMaxPath();
-    }
-
   // Add generator specific helper commands
   for (i = 0; i < this->LocalGenerators.size(); ++i)
     {
@@ -1936,12 +1942,6 @@ void cmGlobalGenerator::AddMakefile(cmMakefile *mf)
   this->CMakeInstance->UpdateProgress("Configuring", prog);
 }
 
-//----------------------------------------------------------------------------
-void cmGlobalGenerator::AddLocalGenerator(cmLocalGenerator *lg)
-{
-  this->LocalGenerators.push_back(lg);
-}
-
 void cmGlobalGenerator::AddInstallComponent(const char* component)
 {
   if(component && *component)
diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h
index 40f98dc82421d2a9f6a2e20cec40205ce58ed17d..83cbc3fd98319d8648aa9ccf24bdb4383c40bdc6 100644
--- a/Source/cmGlobalGenerator.h
+++ b/Source/cmGlobalGenerator.h
@@ -186,7 +186,6 @@ public:
   {this->CurrentMakefile = mf;}
 
   void AddMakefile(cmMakefile *mf);
-  void AddLocalGenerator(cmLocalGenerator *lg);
 
   ///! Set an generator for an "external makefile based project"
   void SetExternalMakefileProjectGenerator(
@@ -466,6 +465,8 @@ private:
 
   virtual void ForceLinkerLanguages();
 
+  void CreateLocalGenerators();
+
   void CheckCompilerIdCompatibility(cmMakefile* mf,
                                     std::string const& lang) const;
 
diff --git a/Source/cmGlobalUnixMakefileGenerator3.cxx b/Source/cmGlobalUnixMakefileGenerator3.cxx
index cf4fd69e13a9b22d1a4d6a4d8faedf8172e06b66..0064713f2b32eef29d338094ad894ab37df60203 100644
--- a/Source/cmGlobalUnixMakefileGenerator3.cxx
+++ b/Source/cmGlobalUnixMakefileGenerator3.cxx
@@ -578,23 +578,18 @@ void cmGlobalUnixMakefileGenerator3
   if (!targetName.empty())
     {
     cmMakefile* mf;
-    cmLocalUnixMakefileGenerator3 *lg;
-    if (!this->LocalGenerators.empty())
+    if (!this->Makefiles.empty())
       {
-      lg = static_cast<cmLocalUnixMakefileGenerator3 *>
-        (this->LocalGenerators[0]);
-      mf = lg->GetMakefile();
+      mf = this->Makefiles[0];
       }
     else
       {
       cmState::Snapshot snapshot = this->CMakeInstance->GetCurrentSnapshot();
       mf = new cmMakefile(this, snapshot);
-      lg = static_cast<cmLocalUnixMakefileGenerator3 *>
-        (this->CreateLocalGenerator(mf));
       // set the Start directories
-      lg->GetMakefile()->SetCurrentSourceDirectory
+      mf->SetCurrentSourceDirectory
         (this->CMakeInstance->GetHomeDirectory());
-      lg->GetMakefile()->SetCurrentBinaryDirectory
+      mf->SetCurrentBinaryDirectory
         (this->CMakeInstance->GetHomeOutputDirectory());
       }
 
@@ -603,12 +598,12 @@ void cmGlobalUnixMakefileGenerator3
       {
       tname += "/fast";
       }
-    tname = lg->Convert(tname,cmLocalGenerator::HOME_OUTPUT);
+    cmOutputConverter conv(mf->GetStateSnapshot());
+    tname = conv.Convert(tname,cmOutputConverter::HOME_OUTPUT);
     cmSystemTools::ConvertToOutputSlashes(tname);
     makeCommand.push_back(tname);
-    if (this->LocalGenerators.empty())
+    if (this->Makefiles.empty())
       {
-      delete lg;
       delete mf;
       }
     }
diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx
index 6c7b194dfdc1d515e56e815cd9fa19668ef00a60..f4de0f266023c048f8cc2915de0fa53d3efd1522 100644
--- a/Source/cmLocalGenerator.cxx
+++ b/Source/cmLocalGenerator.cxx
@@ -54,6 +54,8 @@ cmLocalGenerator::cmLocalGenerator(cmGlobalGenerator* gg,
   this->EmitUniversalBinaryFlags = true;
   this->BackwardsCompatibility = 0;
   this->BackwardsCompatibilityFinal = false;
+
+  this->ComputeObjectMaxPath();
 }
 
 cmLocalGenerator::~cmLocalGenerator()
diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h
index 771131f1e8ecad9a4dbaca6830d0e8f877dcf2fd..6ea414a5001343e7a422d5cac9a3ed8b2bbee5cd 100644
--- a/Source/cmLocalGenerator.h
+++ b/Source/cmLocalGenerator.h
@@ -300,7 +300,6 @@ public:
   void CreateEvaluationFileOutputs(const std::string& config);
   void ProcessEvaluationFiles(std::vector<std::string>& generatedFiles);
 
-  void ComputeObjectMaxPath();
 protected:
   ///! put all the libraries for a target on into the given stream
   void OutputLinkLibraries(std::string& linkLibraries,
@@ -360,6 +359,8 @@ private:
   bool GetShouldUseOldFlags(bool shared, const std::string &lang) const;
   void AddPositionIndependentFlags(std::string& flags, std::string const& l,
                                    int targetType);
+
+  void ComputeObjectMaxPath();
 };
 
 #endif
diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx
index 8a3d19701e551e9fa59ac677fcf1b83d8c051b09..64806672753a26d2e604ff1e423d0ca4e8dd5f59 100644
--- a/Source/cmMakefile.cxx
+++ b/Source/cmMakefile.cxx
@@ -1756,11 +1756,6 @@ void cmMakefile::AddSubDirectory(const std::string& srcPath,
   cmMakefile* subMf = new cmMakefile(this->GlobalGenerator, newSnapshot);
   this->GetGlobalGenerator()->AddMakefile(subMf);
 
-  // create a new local generator and set its parent
-  cmLocalGenerator *lg2 = this->GetGlobalGenerator()
-        ->CreateLocalGenerator(subMf);
-  this->GetGlobalGenerator()->AddLocalGenerator(lg2);
-
   // set the subdirs start dirs
   subMf->SetCurrentSourceDirectory(srcPath);
   subMf->SetCurrentBinaryDirectory(binPath);