[Demonstration 1]

[Buggy Method]
public ValueUpdate<Coordinate> calculatePosition(List<GyroscopeMeasurement> gyroscopeMeasurementsSinceLastUpdate, List<AccelerometerMeasurement> accelerometerMeasurementsSinceLastUpdate, List<ValueUpdate<Coordinate>> rfidTagDetectedLocations) {
    if (gyroscopeMeasurementsSinceLastUpdate == null && accelerometerMeasurementsSinceLastUpdate == null && rfidTagDetectedLocations == null) {
        return this.lastKnownTrainPosition;
    }
    // Sort gyroscope measurements in increasing order by time
    if (gyroscopeMeasurementsSinceLastUpdate != null) {
        Collections.sort(gyroscopeMeasurementsSinceLastUpdate);
    }
    // Sort accelerometer measurements in increasing order by time
    if (accelerometerMeasurementsSinceLastUpdate != null) {
        Collections.sort(accelerometerMeasurementsSinceLastUpdate);
    }
    if (imuCalibrator.isCalibrationComplete()) {
        // Filtering
        for (int i = 0; i < gyroscopeMeasurementsSinceLastUpdate.size(); i++) {
            // retrieve original value
            GyroscopeMeasurement gyroscopeMeasurement = gyroscopeMeasurementsSinceLastUpdate.get(i);
            // filter value
            gyroscopeMeasurement = gyrCalibrationFilter.filter(gyroscopeMeasurement);
            // replace with filtered value
            gyroscopeMeasurementsSinceLastUpdate.set(i, gyroscopeMeasurement);
        }
        for (int i = 0; i < accelerometerMeasurementsSinceLastUpdate.size(); i++) {
            // retrieve original value
            AccelerometerMeasurement accelerometerMeasurement = accelerometerMeasurementsSinceLastUpdate.get(i);
            // filter value
            accelerometerMeasurement = accCalibrationFilter.filter(accelerometerMeasurement);
            // replace with filtered value
            accelerometerMeasurementsSinceLastUpdate.set(i, accelerometerMeasurement);
        }
    } else if (gyroscopeMeasurementsSinceLastUpdate != null && accelerometerMeasurementsSinceLastUpdate != null) {
        // Calibration
        for (GyroscopeMeasurement m : gyroscopeMeasurementsSinceLastUpdate) {
            imuCalibrator.addMeasurement(m);
        }
        for (AccelerometerMeasurement m : accelerometerMeasurementsSinceLastUpdate) {
            imuCalibrator.addMeasurement(m);
        }
        if (imuCalibrator.isCalibrationComplete()) {
            // Assign calibration values
            accCalibrationFilter.setXOffset(imuCalibrator.getAccXOffset());
            accCalibrationFilter.setYOffset(imuCalibrator.getAccYOffset());
            accCalibrationFilter.setZOffset(imuCalibrator.getAccZOffset());
            gyrCalibrationFilter.setXOffset(imuCalibrator.getGyrXOffset());
            gyrCalibrationFilter.setYOffset(imuCalibrator.getGyrYOffset());
            gyrCalibrationFilter.setZOffset(imuCalibrator.getGyrZOffset());
        }
    }
    ValueUpdate<Coordinate> startPosition = lastKnownTrainPosition;
    ValueUpdate<Coordinate> endPosition = lastKnownTrainPosition;
    if (rfidTagDetectedLocations.size() > 0) {
        int lastIndex = rfidTagDetectedLocations.size() - 1;
        if (lastIndex == 0) {
            startPosition = this.lastRfidTagPositionResults.getLastKnownTrainPosition();
            endPosition = rfidTagDetectedLocations.get(lastIndex);
        } else {
            startPosition = rfidTagDetectedLocations.get(lastIndex - 1);
            endPosition = rfidTagDetectedLocations.get(lastIndex);
        }
        // Use RFID Tag Plus IMU
        RfidTagPositionResults rfidTagPositionResults = calculationPositionFromRfidTagUpdates(startPosition, endPosition);
        ImuPositionResults imuPositionResults = null;
        // Update the last RFID Tag position results
        lastRfidTagPositionResults = rfidTagPositionResults;
        if (imuCalibrator.isCalibrationComplete() && (accelerometerMeasurementsSinceLastUpdate.size() > 0)) {
            // Include IMU measurements
            List<GyroscopeMeasurement> postRfidTagGyroscopeMeasurements;
            if (gyroscopeMeasurementsSinceLastUpdate.size() > 0) {
                postRfidTagGyroscopeMeasurements = selectGyroscopeMeasurementsByTime(gyroscopeMeasurementsSinceLastUpdate, endPosition.getTimeObserved(), gyroscopeMeasurementsSinceLastUpdate.get(gyroscopeMeasurementsSinceLastUpdate.size() - 1).getTimeMeasured());
            } else {
                postRfidTagGyroscopeMeasurements = new LinkedList<GyroscopeMeasurement>();
            }
            List<AccelerometerMeasurement> postRfidTagAccelerometerMeasurements = selectAccelerometerMeasurementsByTime(accelerometerMeasurementsSinceLastUpdate, endPosition.getTimeObserved(), accelerometerMeasurementsSinceLastUpdate.get(accelerometerMeasurementsSinceLastUpdate.size() - 1).getTimeMeasured());
            imuPositionResults = calculatePositionFromImu(rfidTagPositionResults.getLastKnownTrainPosition(), rfidTagPositionResults.getLastKnownTrainOrientation(), rfidTagPositionResults.getLastKnownTrainVelocity(), lastKnownTrainAcceleration, postRfidTagGyroscopeMeasurements, postRfidTagAccelerometerMeasurements);
            // Save calculated values for future calculations
            lastKnownTrainPosition = imuPositionResults.getLastKnownTrainPosition();
            lastKnownTrainOrientation = imuPositionResults.getLastKnownTrainOrientation();
            lastKnownTrainVelocity = imuPositionResults.getLastKnownTrainVelocity();
            lastKnownTrainAcceleration = imuPositionResults.getLastKnownTrainAcceleration();
            lastImuPositionResults = imuPositionResults;
        } else {
            // Use RFID tag measurements only
            if (!lastKnownTrainPosition.getValue().equals(rfidTagPositionResults.getLastKnownTrainPosition().getValue())) {
                // Save calculated values for future calculations
                lastKnownTrainPosition = rfidTagPositionResults.getLastKnownTrainPosition();
                lastKnownTrainOrientation = rfidTagPositionResults.getLastKnownTrainOrientation();
                lastKnownTrainVelocity = rfidTagPositionResults.getLastKnownTrainVelocity();
                /*//This is good for a velocity only correction
					//Recommended for this to be used when RFID tag orientation information is not good enough.
					//Calculated velocity based on the last calculated train velocity
					ValueUpdate<Velocity> rfidTagVelocityUpdate = rfidTagPositionResults.getLastKnownTrainVelocity();
					double speed = Math.sqrt((rfidTagVelocityUpdate.getValue().getMetersPerSecondAlongXAxis()*rfidTagVelocityUpdate.getValue().getMetersPerSecondAlongXAxis())
							+ (rfidTagVelocityUpdate.getValue().getMetersPerSecondAlongYAxis()*rfidTagVelocityUpdate.getValue().getMetersPerSecondAlongYAxis()));
					
					double velocityX = Math.cos(lastKnownTrainOrientation.getValue().getRadiansRotationAlongZAxis())*speed;
					double velocityY = Math.sin(lastKnownTrainOrientation.getValue().getRadiansRotationAlongZAxis())*speed;
					
					lastKnownTrainVelocity = new ValueUpdate<Velocity>(new Velocity(velocityX, velocityY, 0), rfidTagVelocityUpdate.getTimeObserved()); */
            }
        }
    } else if (imuCalibrator.isCalibrationComplete()) {
        // Use IMU data Only
        ImuPositionResults imuPositionResults = calculatePositionFromImu(lastKnownTrainPosition, lastKnownTrainOrientation, lastKnownTrainVelocity, lastKnownTrainAcceleration, gyroscopeMeasurementsSinceLastUpdate, accelerometerMeasurementsSinceLastUpdate);
        // Save calculated values for future calculations
        lastKnownTrainPosition = imuPositionResults.getLastKnownTrainPosition();
        lastKnownTrainOrientation = imuPositionResults.getLastKnownTrainOrientation();
        lastKnownTrainVelocity = imuPositionResults.getLastKnownTrainVelocity();
        lastKnownTrainAcceleration = imuPositionResults.getLastKnownTrainAcceleration();
        lastImuPositionResults = imuPositionResults;
    } else {
        //imuCalibration is NOT complete
        if (accelerometerMeasurementsSinceLastUpdate.size() > 0) {
            Calendar newTimestamp = accelerometerMeasurementsSinceLastUpdate.get(accelerometerMeasurementsSinceLastUpdate.size() - 1).getTimeMeasured();
            //Replacing timestamp otherwise assuming that train is at rest since calibration is still in progress
            lastKnownTrainPosition = new ValueUpdate<Coordinate>(lastKnownTrainPosition.getValue(), newTimestamp);
            lastKnownTrainOrientation = new ValueUpdate<EulerAngleRotation>(lastKnownTrainOrientation.getValue(), newTimestamp);
            lastKnownTrainVelocity = new ValueUpdate<Velocity>(lastKnownTrainVelocity.getValue(), newTimestamp);
            lastKnownTrainAcceleration = new ValueUpdate<Acceleration>(lastKnownTrainAcceleration.getValue(), newTimestamp);
        }
    }
    System.out.println(String.format("orientation: %f rads\n", lastKnownTrainOrientation.getValue().getRadiansRotationAlongZAxis()));
    return lastKnownTrainPosition;
}

[Buggy Hunk]
endPosition);

[Patch]
endPosition, this.lastKnownTrainOrientation.getValue());

[Demonstration 2]

[Buggy Method]
@Override
public void setValue(Object value) {
    mValue = value;
    if (mValue == null || mValue.toString().equals("false")) {
        mValue = -1;
    }
    ODataRow row = new ODataRow();
    if (isEditable()) {
        if (mWidget != null) {
            switch(mWidget) {
                case RadioGroup:
                    if (mResourceArray != -1) {
                        ((RadioButton) mRadioGroup.getChildAt(getPos())).setChecked(true);
                        row = items.get(getPos());
                    } else {
                        Integer row_id = null;
                        if (mValue instanceof OM2ORecord) {
                            row = ((OM2ORecord) mValue).browse();
                            row_id = row.getInt(OColumn.ROW_ID);
                        } else
                            row_id = (Integer) mValue;
                        int index = 0;
                        for (int i = 0; i < items.size(); i++) {
                            if (items.get(i).getInt(OColumn.ROW_ID) == row_id) {
                                index = i;
                                break;
                            }
                        }
                        row = items.get(index);
                        ((RadioButton) mRadioGroup.getChildAt(index)).setChecked(true);
                    }
                    break;
                case Searchable:
                case SearchableLive:
                case SelectionDialog:
                    if (mResourceArray != -1) {
                        row = items.get(getPos());
                    } else {
                        if (mValue instanceof OM2ORecord)
                            row = ((OM2ORecord) mValue).browse();
                        else if (mValue instanceof Integer)
                            row = getRecordData((Integer) mValue);
                    }
                    txvView.setText(row.getString(mModel.getDefaultNameColumn()));
                    if (txvView.getTag() != null) {
                        AlertDialog dialog = (AlertDialog) txvView.getTag();
                        dialog.dismiss();
                    }
                    break;
                default:
                    break;
            }
        } else {
            if (mResourceArray != -1) {
                mSpinner.setSelection(getPos());
                row = items.get(getPos());
            } else if (mCol.getType().isAssignableFrom(OSelection.class)) {
                int pos = getPos();
                mSpinner.setSelection(pos);
            } else {
                Integer row_id = null;
                if (mValue instanceof OM2ORecord) {
                    row = ((OM2ORecord) mValue).browse();
                    row_id = row.getInt(OColumn.ROW_ID);
                } else if (mValue instanceof Integer)
                    row_id = (Integer) mValue;
                int index = 0;
                for (int i = 0; i < items.size(); i++) {
                    if (items.get(i).getInt(OColumn.ROW_ID) == row_id) {
                        index = i;
                        break;
                    }
                }
                row = items.get(index);
                mSpinner.setSelection(index);
            }
        }
    } else {
        if (mResourceArray != -1 || mCol.getType().isAssignableFrom(OSelection.class)) {
            row = items.get(getPos());
        } else {
            if (mValue instanceof OM2ORecord) {
                row = ((OM2ORecord) mValue).browse();
                if (row == null) {
                    row = new ODataRow();
                }
            } else {
                if (!(mValue instanceof Boolean) && mValue != null && !mValue.toString().equals("false")) {
                    int row_id = (Integer) mValue;
                    row = getRecordData(row_id);
                } else {
                    row = new ODataRow();
                    row.put(mModel.getDefaultNameColumn(), "No " + mCol.getLabel() + " selected");
                }
            }
        }
        if (!row.getString(mModel.getDefaultNameColumn()).equals("false"))
            txvView.setText(row.getString(mModel.getDefaultNameColumn()));
    }
    if (mValueUpdateListener != null && mValue != -1) {
        mValueUpdateListener.onValueUpdate(row);
    }
}

[Buggy Hunk]
if (mValueUpdateListener != null && mValue != -1) {

[Patch]
if (mValueUpdateListener != null && !mValue.equals(-1)) {

[Demonstration 3]

[Buggy Method]
@Override
public void onCallRemoved(Call call) {
    Log.i(this, "onCallRemoved: %s", call);
    if (mCallsManager.getCalls().isEmpty()) {
        /**
         * Let's add a 2 second delay before we send unbind to the services to hopefully
         *  give them enough time to process all the pending messages.
         */
        Handler handler = new Handler(Looper.getMainLooper());
        handler.postDelayed(new Runnable("ICC.oCR") {

            @Override
            public void loggedRun() {
                synchronized (mLock) {
                    // Check again to make sure there are no active calls.
                    if (mCallsManager.getCalls().isEmpty()) {
                        unbindFromServices();
                    }
                }
            }
        }.prepare(), Timeouts.getCallRemoveUnbindInCallServicesDelay(mContext.getContentResolver()));
    }
    call.removeListener(mCallListener);
    mCallIdMapper.removeCall(call);
}

[Buggy Hunk]
}.prepare(), Timeouts.getCallRemoveUnbindInCallServicesDelay(

[Patch]
}.prepare(), mTimeoutsAdapter.getCallRemoveUnbindInCallServicesDelay(