@NonNull
    private static Single<Boolean> addToOrRemoveFromWatchlist(@NonNull final Geocache cache, final boolean doAdd) {

        final String logContext = "GCParser.addToOrRemoveFromWatchlist(cache = " + cache.getGeocode() + ", add = " + doAdd + ")";

        final ObjectNode jo = new ObjectNode(JsonUtils.factory).put("geocacheId", cache.getCacheId());
        final String uri = "https://www.geocaching.com/api/proxy/web/v1/watchlists/" + (doAdd ? "add" : "remove") + "?geocacheId=" + cache.getCacheId();

        final Single<Response> request = doAdd
            ? Network.postJsonRequest(uri, jo)
            : Network.deleteJsonRequest(uri, jo);
        return Network.completeWithSuccess(request)
            .toSingle(() -> {
                Log.i(logContext + ": success");
                return true;
            })
            .onErrorReturn((ex) -> {
                Log.e(logContext + ": error", ex);
                return false;
            })
            .map((successful) -> {
                if (successful) {
                    // Set cache properties
                    cache.setOnWatchlist(doAdd);
                    final String watchListPage = GCLogin.getInstance().postRequestLogged(cache.getLongUrl(), null);
                    cache.setWatchlistCount(getWatchListCount(watchListPage));
                }
                return successful;
            });
    }
internal method to handle add to / remove from watchlist
main/src/main/java/cgeo/geocaching/connector/gc/GCParser.java