@Nullable
    private Waypoint findWaypoint(@NonNull final Waypoint searchWp) {
        //try to match prefix
        final String searchWpPrefix = searchWp.getPrefix();
        if (StringUtils.isNotBlank(searchWpPrefix)) {
            for (final Waypoint waypoint : waypoints) {
                if (searchWpPrefix.equals(waypoint.getPrefix())) {
                    return waypoint;
                }
            }
            return null;
        }

        //try to match coordinate
        final Geopoint searchWpPoint = searchWp.getCoords();
        if (null != searchWpPoint) {
            for (final Waypoint waypoint : waypoints) {
                // waypoint can have no coords such as a Final set by cache owner
                final Geopoint coords = waypoint.getCoords();
                if (coords != null && coords.equalsDecMinute(searchWpPoint)) {
                    return waypoint;
                }
            }
        }

        //try to match calculate coordinate
        if (searchWp.isCalculated()) {
            for (final Waypoint waypoint : waypoints) {
                // calculated waypoints match if they have same config
                if (waypoint.isCalculated() && Objects.equals(waypoint.getCalcStateConfig(), searchWp.getCalcStateConfig())) {
                    return waypoint;
                }
            }
        }

        //try to match name if prefix is empty and coords are not equal.
        //But only, if coordinates of waypoint can be updated, otherwise create a new waypoint
        //(it's not a bug, it's a feature - otherwise the coordinates gets lost)
        final String searchWpName = searchWp.getName();
        final String searchWpType = searchWp.getWaypointType().getL10n();
        if (StringUtils.isNotBlank(searchWpName)) {
            for (final Waypoint waypoint : waypoints) {
                final Geopoint point = waypoint.getCoords();
                final boolean canChangeCoordinates = null == searchWpPoint || null == point;
                if (canChangeCoordinates && searchWpName.equals(waypoint.getName()) && searchWpType.equals(waypoint.getWaypointType().getL10n())) {
                    return waypoint;
                }
            }
        }
        return null;
    }
changes this cache's variables with the given one's. Change is forced!
main/src/main/java/cgeo/geocaching/models/Geocache.java