diff --git a/src/qdoc/generator.cpp b/src/qdoc/generator.cpp
index c7831d1fdd25d798ca14cf4b4bf097f3799976b9..de9976502b3318623166135906cce0b765271115 100644
--- a/src/qdoc/generator.cpp
+++ b/src/qdoc/generator.cpp
@@ -677,6 +677,7 @@ QString Generator::fullDocumentLocation(const Node *node, bool useSubdir)
     case Node::QmlType:
     case Node::Page:
     case Node::Group:
+    case Node::HeaderFile:
     case Node::Module:
     case Node::JsModule:
     case Node::QmlModule:
diff --git a/src/qdoc/helpprojectwriter.cpp b/src/qdoc/helpprojectwriter.cpp
index 500052eb61da06337f59e2df5803e8aca4d12b94..226ca4154ce35d5a5ff6a61957d35c45843d9642 100644
--- a/src/qdoc/helpprojectwriter.cpp
+++ b/src/qdoc/helpprojectwriter.cpp
@@ -216,7 +216,10 @@ QStringList HelpProjectWriter::keywordDetails(const Node *node) const
         else
             details << node->name();
         // "id"
-        details << node->parent()->name()+"::"+node->name();
+        if (!node->isRelatedNonmember())
+            details << node->parent()->name()+"::"+node->name();
+        else
+            details << node->name();
     }
     else if (node->isQmlType() || node->isQmlBasicType()) {
         details << node->name();
@@ -491,6 +494,9 @@ void HelpProjectWriter::generateSections(HelpProject &project, QXmlStreamWriter
         QSet<const Node*> childSet;
         const NodeList &children = aggregate->childNodes();
         foreach (const Node *child, children) {
+            // Skip related non-members adopted by some other aggregate
+            if (child->parent() != aggregate)
+                continue;
             if (child->isIndexNode() || child->isPrivate())
                 continue;
             if (child->isTextPageNode()) {
diff --git a/src/qdoc/node.cpp b/src/qdoc/node.cpp
index 774d41f311ca21cb3aa7f4b32ce26777a3e8dd33..82bcd1b252e70e0752e49196294e4b1d7c89000b 100644
--- a/src/qdoc/node.cpp
+++ b/src/qdoc/node.cpp
@@ -3101,11 +3101,11 @@ QString Node::fullDocumentName() const
         if (n->isTextPageNode())
             break;
 
-        // Examine the parent node if one exists.
-        if (n->parent())
-            n = n->parent();
-        else
+        // Examine the parent if the node is a member
+        if (!n->parent() || n->isRelatedNonmember())
             break;
+
+        n = n->parent();
     } while (true);
 
     // Create a name based on the type of the ancestor node.