const __be32 *phandle;
        int sz;
 
-       np->name = __of_get_property(np, "name", NULL) ? : "<NULL>";
-       np->type = __of_get_property(np, "device_type", NULL) ? : "<NULL>";
-
-       phandle = __of_get_property(np, "phandle", &sz);
-       if (!phandle)
-               phandle = __of_get_property(np, "linux,phandle", &sz);
-       if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
-               phandle = __of_get_property(np, "ibm,phandle", &sz);
-       np->phandle = (phandle && (sz >= 4)) ? be32_to_cpup(phandle) : 0;
+       if (!of_node_check_flag(np, OF_OVERLAY)) {
+               np->name = __of_get_property(np, "name", NULL);
+               np->type = __of_get_property(np, "device_type", NULL);
+               if (!np->name)
+                       np->name = "<NULL>";
+               if (!np->type)
+                       np->type = "<NULL>";
+
+               phandle = __of_get_property(np, "phandle", &sz);
+               if (!phandle)
+                       phandle = __of_get_property(np, "linux,phandle", &sz);
+               if (IS_ENABLED(CONFIG_PPC_PSERIES) && !phandle)
+                       phandle = __of_get_property(np, "ibm,phandle", &sz);
+               if (phandle && (sz >= 4))
+                       np->phandle = be32_to_cpup(phandle);
+               else
+                       np->phandle = 0;
+       }
 
        np->child = NULL;
        np->sibling = np->parent->child;
 
        int ret = 0;
        bool check_for_non_overlay_node = false;
 
-       if (!of_prop_cmp(overlay_prop->name, "name") ||
-           !of_prop_cmp(overlay_prop->name, "phandle") ||
-           !of_prop_cmp(overlay_prop->name, "linux,phandle"))
-               return 0;
+       if (target->in_livetree)
+               if (!of_prop_cmp(overlay_prop->name, "name") ||
+                   !of_prop_cmp(overlay_prop->name, "phandle") ||
+                   !of_prop_cmp(overlay_prop->name, "linux,phandle"))
+                       return 0;
 
        if (target->in_livetree)
                prop = of_find_property(target->np, overlay_prop->name, NULL);
 
        if (!prop) {
                check_for_non_overlay_node = true;
+               if (!target->in_livetree) {
+                       new_prop->next = target->np->deadprops;
+                       target->np->deadprops = new_prop;
+               }
                ret = of_changeset_add_property(&ovcs->cset, target->np,
                                                new_prop);
        } else if (!of_prop_cmp(prop->name, "#address-cells")) {
                struct target *target, struct device_node *node)
 {
        const char *node_kbasename;
+       const __be32 *phandle;
        struct device_node *tchild;
        struct target target_child;
-       int ret = 0;
+       int ret = 0, size;
 
        node_kbasename = kbasename(node->full_name);
 
                        return -ENOMEM;
 
                tchild->parent = target->np;
+               tchild->name = __of_get_property(node, "name", NULL);
+               tchild->type = __of_get_property(node, "device_type", NULL);
+
+               if (!tchild->name)
+                       tchild->name = "<NULL>";
+               if (!tchild->type)
+                       tchild->type = "<NULL>";
+
+               /* ignore obsolete "linux,phandle" */
+               phandle = __of_get_property(node, "phandle", &size);
+               if (phandle && (size == 4))
+                       tchild->phandle = be32_to_cpup(phandle);
+
                of_node_set_flag(tchild, OF_OVERLAY);
 
                ret = of_changeset_attach_node(&ovcs->cset, tchild);