+ /**
+ * Merges a piece of data with the existing data at a specified path. Any pre-existing data which is not explicitly
+ * overwritten will be preserved. This means that if you store a container, its child lists will be merged. Unlike
+ * {@link #merge(LogicalDatastoreType, InstanceIdentifier, DataObject)}, this method will attempt to create
+ * semantically-significant parent nodes, like list entries and presence containers, as indicated by {@code path}.
+ *
+ * <p>
+ * If you require an explicit replace operation, use {@link #put} instead.
+ *
+ * <p>
+ * <b>WARNING:</b> Using this method may introduce garbage in data store, or recreate nodes, which were deleted by
+ * a previous transaction. It is not necessary in most scenarios and has a significantly higher cost
+ * than {@link #merge(LogicalDatastoreType, InstanceIdentifier, DataObject)}. It should only be used
+ * when absolutely necessary.
+ *
+ * @param store the logical data store which should be modified
+ * @param path the data object path
+ * @param data the data object to be merged to the specified path
+ * @throws IllegalStateException if the transaction has already been submitted
+ * @throws NullPointerException if any of the arguments is null
+ */
+ // FIXME: 4.0.0: make this method non-default
+ // TODO: can we come up with a better name?
+ @Beta
+ default <T extends DataObject> void mergeParentStructureMerge(@NonNull final LogicalDatastoreType store,
+ @NonNull final InstanceIdentifier<T> path, @NonNull final T data) {
+ merge(store, path, data, CREATE_MISSING_PARENTS);
+ }
+