[Demonstration 1]

[Buggy Method]
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // load preferences from XML source
    addPreferencesFromResource(R.xml.preferences);
    // get preferences from application context
    // Note: fragment does not have context thus it has to be requested from the activity the
    // fragment is attached to
    SharedPreferences defaultPreferences = PreferenceManager.getDefaultSharedPreferences(this.getActivity());
    // get url from shared preferences and set it as summary
    Preference urlPref = findPreference(getString(R.string.pref_url_key));
    url_address = defaultPreferences.getString(getString(R.string.pref_url_key), "");
    urlPref.setSummary(url_address);
    urlPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            String key = preference.getKey();
            String value = (String) newValue;
            if (key.equals(getString(R.string.pref_url_key))) {
                // url input
                Log.d(TAG, "onSharedPreferencesChanged(): key = " + key + ", value = " + newValue);
                if (validateUrl(value)) {
                    preference.setSummary(value);
                    return true;
                } else {
                    builder.setTitle("Invalid URL address");
                    builder.setMessage("Valid URL example:\nhttp://foo.bar.com");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.show();
                    return false;
                }
            }
            return false;
        }
    });
    // get port from shared preferences and set it a summary
    Preference portPref = findPreference(getString(R.string.pref_port_key));
    port_number = defaultPreferences.getString(getString(R.string.pref_port_key), "");
    portPref.setSummary(port_number);
    // set port preference change listener
    portPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {

        @Override
        public boolean onPreferenceChange(Preference preference, Object newValue) {
            final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
            String key = preference.getKey();
            String value = (String) newValue;
            if (key.equals(getString(R.string.pref_port_key))) {
                // port input
                Log.d(TAG, "onSharedPreferencesChanged(): key = " + key + ", value = " + newValue);
                if (validateUrl(value)) {
                    preference.setSummary(value);
                    return true;
                } else {
                    builder.setTitle("Invalid port");
                    builder.setMessage("Port must be a number between 0-65535");
                    builder.setPositiveButton(android.R.string.ok, null);
                    builder.show();
                    return false;
                }
            }
            return false;
        }
    });
    try {
        centralUnit = CentralUnitConnection.getInstance();
    } catch (MalformedURLException e) {
        Log.e(TAG, "onCreate() Unable to intialize CentralUnit: " + e.getMessage());
    }
}

[Buggy Hunk]
if ( validateUrl(value) ) {

[Patch]
if ( validatePort(value) ) {

[Demonstration 2]

[Buggy Method]
@Override
public CommandResult execute(CommandSource src, CommandContext args) throws CommandException {
    String timeValue = args.<String>getOne("h/m/s").get();
    int timeAmount = args.<Integer>getOne("time").get();
    Optional<String> reasonOP = args.getOne("reason");
    double restartTime;
    plugin.reason = reasonOP.orElse(null);
    switch(timeValue) {
        case "h":
            restartTime = timeAmount * 3600;
            break;
        case "m":
            restartTime = (timeAmount * 60) + 1;
            break;
        case "s":
            restartTime = timeAmount;
            break;
        default:
            plugin.sendMessage(src, Messages.getRestartFormatMessage());
            src.sendMessage(Text.of());
            throw new CommandException(plugin.fromLegacy(Messages.getErrorInvalidTimescale()));
    }
    plugin.logger.info("[MMCReboot] " + src.getName() + " is setting a new restart time...");
    if (plugin.tasksScheduled) {
        plugin.cancelTasks();
    }
    Config.restartInterval = restartTime / 3600.0;
    plugin.logger.info("[MMCReboot] scheduling restart tasks...");
    plugin.removeScoreboard();
    plugin.scheduleTasks();
    plugin.isRestarting = true;
    if (restartTime <= 300) {
        plugin.displayRestart();
    }
    double timeLeft = (Config.restartInterval * 3600) - ((double) (System.currentTimeMillis() - plugin.startTimestamp) / 1000);
    int hours = (int) (timeLeft / 3600);
    int minutes = (int) ((timeLeft - hours * 3600) / 60);
    int seconds = (int) timeLeft % 60;
    if (reasonOP.isPresent()) {
        plugin.sendMessage(src, Messages.getRestartMessageWithReason().replace("%hours%", String.valueOf(hours)).replace("%minutes%", String.valueOf(minutes)).replace("%seconds%", String.valueOf(seconds)));
        plugin.sendMessage(src, "&6" + plugin.reason);
    } else {
        plugin.sendMessage(src, Messages.getRestartMessageWithoutReason().replace("%hours%", String.valueOf(hours)).replace("%minutes%", String.valueOf(minutes)).replace("%seconds%", String.valueOf(seconds)));
    }
    return CommandResult.success();
}

[Buggy Hunk]
plugin.displayRestart();

[Patch]
plugin.displayRestart(Config.restartInterval * 3600);

[Demonstration 3]

[Buggy Method]
@Override
public void onExercisesEmpty() {
    mExercisesEmpty = true;
}

[Buggy Hunk]
mExercisesEmpty = true;

[Patch]
Log.i(TAG, "Exercises empty: " + mExercises);