diff --git a/tools/gn/xcode_object.cc b/tools/gn/xcode_object.cc
index dc5bfb8..039cb52 100644
--- a/tools/gn/xcode_object.cc
+++ b/tools/gn/xcode_object.cc
@@ -404,7 +404,7 @@
 }
 
 std::string PBXFileReference::Name() const {
-  return path_;
+  return name_;
 }
 
 void PBXFileReference::Print(std::ostream& out, unsigned indent) const {
@@ -417,16 +417,17 @@
     PrintProperty(out, rules, "explicitFileType", type_);
     PrintProperty(out, rules, "includeInIndex", 0u);
   } else {
-    base::StringPiece ext = FindExtension(&path_);
+    base::StringPiece ext = FindExtension(&name_);
     if (HasExplicitFileType(ext))
       PrintProperty(out, rules, "explicitFileType", GetSourceType(ext));
     else
       PrintProperty(out, rules, "lastKnownFileType", GetSourceType(ext));
   }
 
-  if (name_ != path_ && !name_.empty())
+  if (!name_.empty())
     PrintProperty(out, rules, "name", name_);
 
+  DCHECK(!path_.empty());
   PrintProperty(out, rules, "path", path_);
   PrintProperty(out, rules, "sourceTree",
                 type_.empty() ? "<group>" : "BUILT_PRODUCTS_DIR");
@@ -471,36 +472,39 @@
   return children_.back().get();
 }
 
-PBXFileReference* PBXGroup::AddSourceFile(const std::string& source_path) {
+PBXFileReference* PBXGroup::AddSourceFile(const std::string& navigator_path,
+                                          const std::string& source_path) {
+  DCHECK(!navigator_path.empty());
   DCHECK(!source_path.empty());
-  std::string::size_type sep = source_path.find("/");
+  std::string::size_type sep = navigator_path.find("/");
   if (sep == std::string::npos) {
     children_.push_back(base::MakeUnique<PBXFileReference>(
-        std::string(), source_path, std::string()));
+        navigator_path, source_path, std::string()));
     return static_cast<PBXFileReference*>(children_.back().get());
   }
 
   PBXGroup* group = nullptr;
-  base::StringPiece component(source_path.data(), sep);
+  base::StringPiece component(navigator_path.data(), sep);
   for (const auto& child : children_) {
     if (child->Class() != PBXGroupClass)
       continue;
 
     PBXGroup* child_as_group = static_cast<PBXGroup*>(child.get());
-    if (child_as_group->path_ == component) {
+    if (child_as_group->name_ == component) {
       group = child_as_group;
       break;
     }
   }
 
   if (!group) {
-    children_.push_back(base::WrapUnique(new PBXGroup(component.as_string())));
+    children_.push_back(base::WrapUnique(
+        new PBXGroup(component.as_string(), component.as_string())));
     group = static_cast<PBXGroup*>(children_.back().get());
   }
 
   DCHECK(group);
-  DCHECK(group->path_ == component);
-  return group->AddSourceFile(source_path.substr(sep + 1));
+  DCHECK(group->name_ == component);
+  return group->AddSourceFile(navigator_path.substr(sep + 1), source_path);
 }
 
 PBXObjectClass PBXGroup::Class() const {
@@ -530,7 +534,7 @@
   PrintProperty(out, rules, "children", children_);
   if (!name_.empty())
     PrintProperty(out, rules, "name", name_);
-  if (!path_.empty())
+  if (is_source_ && !path_.empty())
     PrintProperty(out, rules, "path", path_);
   PrintProperty(out, rules, "sourceTree", "<group>");
   out << indent_str << "};\n";
@@ -598,6 +602,7 @@
   main_group_.reset(new PBXGroup);
   sources_ = static_cast<PBXGroup*>(
       main_group_->AddChild(base::MakeUnique<PBXGroup>(source_path, "Source")));
+  sources_->set_is_source(true);
   products_ = static_cast<PBXGroup*>(main_group_->AddChild(
       base::MakeUnique<PBXGroup>(std::string(), "Product")));
   main_group_->AddChild(base::MakeUnique<PBXGroup>(std::string(), "Build"));
@@ -607,8 +612,10 @@
 
 PBXProject::~PBXProject() {}
 
-void PBXProject::AddSourceFile(const std::string& source_path) {
-  PBXFileReference* file_reference = sources_->AddSourceFile(source_path);
+void PBXProject::AddSourceFile(const std::string& navigator_path,
+                               const std::string& source_path) {
+  PBXFileReference* file_reference =
+      sources_->AddSourceFile(navigator_path, source_path);
   base::StringPiece ext = FindExtension(&source_path);
   if (!IsSourceFileForIndexing(ext))
     return;
diff --git a/tools/gn/xcode_object.h b/tools/gn/xcode_object.h
index 2ad43cc..83a776a 100644
--- a/tools/gn/xcode_object.h
+++ b/tools/gn/xcode_object.h
@@ -218,7 +218,10 @@
   const std::string& path() const { return path_; }
 
   PBXObject* AddChild(std::unique_ptr<PBXObject> child);
-  PBXFileReference* AddSourceFile(const std::string& source_path);
+  PBXFileReference* AddSourceFile(const std::string& navigator_path,
+                                  const std::string& source_path);
+  bool is_source() { return is_source_; }
+  void set_is_source(const bool is_source) { is_source_ = is_source; }
 
   // PBXObject implementation.
   PBXObjectClass Class() const override;
@@ -230,6 +233,7 @@
   std::vector<std::unique_ptr<PBXObject>> children_;
   std::string name_;
   std::string path_;
+  bool is_source_ = false;
 
   DISALLOW_COPY_AND_ASSIGN(PBXGroup);
 };
@@ -271,7 +275,8 @@
              const PBXAttributes& attributes);
   ~PBXProject() override;
 
-  void AddSourceFile(const std::string& source_path);
+  void AddSourceFile(const std::string& navigator_path,
+                     const std::string& source_path);
   void AddAggregateTarget(const std::string& name,
                           const std::string& shell_script);
   void AddNativeTarget(const std::string& name,
diff --git a/tools/gn/xcode_writer.cc b/tools/gn/xcode_writer.cc
index 633a1c8..07b50e4 100644
--- a/tools/gn/xcode_writer.cc
+++ b/tools/gn/xcode_writer.cc
@@ -353,7 +353,7 @@
   for (const SourceFile& source : sources) {
     std::string source_file =
         RebasePath(source.value(), source_dir, absolute_source_path);
-    sources_for_indexing->AddSourceFile(source_file);
+    sources_for_indexing->AddSourceFile(source_file, source_file);
   }
 
   projects_.push_back(std::move(sources_for_indexing));
