def relocate_instance(part, target_parent, name=None, include_children=True):
    """
    Move the `Part` instance to target parent.

    .. versionadded:: 2.3

    :param part: `Part` object to be moved
    :type part: :class:`Part`
    :param target_parent: `Part` object under which the desired `Part` is moved
    :type target_parent: :class:`Part`
    :param name: how the moved top-level `Part` should be called
    :type name: basestring
    :param include_children: True to move also the descendants of `Part`. If False, the children will be lost.
    :type include_children: bool
    :return: moved :class: `Part` instance
    """
    # First, if the user doesn't provide the name, then just use the default "Clone - ..." name
    if not name:
        name = "CLONE - {}".format(part.name)
    # Initially the model of the part needs to be recreated under the model of the target_parent. Retrieve them.
    part_model = part.model()
    target_parent_model = target_parent.model()

    # Call the move_part() function for those models.
    relocate_model(part=part_model, target_parent=target_parent_model, name=part_model.name,
                   include_children=include_children)

    # Populate the descendants of the Part (category=Instance), in order to avoid to retrieve children for every
    # level and save time. Only need it the children should be included.
    if include_children:
        part.populate_descendants()

    # This function will move the part instance under the target_parent instance, and its children if required.
    moved_instance = move_part_instance(part_instance=part, target_parent=target_parent, part_model=part_model,
                                        name=name, include_children=include_children)
    return moved_instance