Buggy code:
public abstract class EmbeddedRungeKuttaIntegrator extends AdaptiveStepsizeIntegrator { protected EmbeddedRungeKuttaIntegrator ( final String name , final boolean fsal , final double [ ] c , final double [ ] [ ] a , final double [ ] b , final RungeKuttaStepInterpolator prototype , final double minStep , final double maxStep , final double scalAbsoluteTolerance , final double scalRelativeTolerance ) { } protected EmbeddedRungeKuttaIntegrator ( final String name , final boolean fsal , final double [ ] c , final double [ ] [ ] a , final double [ ] b , final RungeKuttaStepInterpolator prototype , final double minStep , final double maxStep , final double [ ] vecAbsoluteTolerance , final double [ ] vecRelativeTolerance ) { } public abstract int getOrder ( ) { } public double getSafety ( ) { } public void setSafety ( final double safety ) { } public double integrate ( final FirstOrderDifferentialEquations equations , final double t0 , final double [ ] y0 , final double t , final double [ ] y ) throws DerivativeException , IntegratorException { sanityChecks ( equations , t0 , y0 , t , y ) ; final boolean forward = t > t0 ; final int stages = ( c . length ) + 1 ; if ( y != y0 ) { System . arraycopy ( y0 , 0 , y , 0 , y0 . length ) ; } final double [ ] [ ] yDotK = new double [ stages ] [ ] ; for ( int i = 0 ; i < stages ; ++ i ) { yDotK [ i ] = new double [ y0 . length ] ; } final double [ ] yTmp = new double [ y0 . length ] ; AbstractStepInterpolator interpolator ; if ( ( requiresDenseOutput ( ) ) || ( ! ( eventsHandlersManager . isEmpty ( ) ) ) ) { final RungeKuttaStepInterpolator rki = ( ( RungeKuttaStepInterpolator ) ( prototype . copy ( ) ) ) ; rki . reinitialize ( equations , yTmp , yDotK , forward ) ; interpolator = rki ; } else { interpolator = new DummyStepInterpolator ( yTmp , forward ) ; } interpolator . storeTime ( t0 ) ; stepStart = t0 ; double hNew = 0 ; boolean firstTime = true ; for ( StepHandler handler : stepHandlers ) { handler . reset ( ) ; } <START_BUG> CombinedEventsManager manager = addEndTimeChecker ( t , eventsHandlersManager ) ; <END_BUG> boolean lastStep = false ; while ( ! lastStep ) { interpolator . shift ( ) ; double error = 0 ; for ( boolean loop = true ; loop ; ) { if ( firstTime || ( ! ( fsal ) ) ) { equations . computeDerivatives ( stepStart , y , yDotK [ 0 ] ) ; } if ( firstTime ) { final double [ ] scale ; if ( ( vecAbsoluteTolerance ) != null ) { scale = vecAbsoluteTolerance ; } else { scale = new double [ y0 . length ] ; for ( int i = 0 ; i < ( scale . length ) ; ++ i ) { scale [ i ] = scalAbsoluteTolerance ; } } hNew = initializeStep ( equations , forward , getOrder ( ) , scale , stepStart , y , yDotK [ 0 ] , yTmp , yDotK [ 1 ] ) ; firstTime = false ; } stepSize = hNew ; for ( int k = 1 ; k < stages ; ++ k ) { for ( int j = 0 ; j < ( y0 . length ) ; ++ j ) { double sum = ( a [ ( k - 1 ) ] [ 0 ] ) * ( yDotK [ 0 ] [ j ] ) ; for ( int l = 1 ; l < k ; ++ l ) { sum += ( a [ ( k - 1 ) ] [ l ] ) * ( yDotK [ l ] [ j ] ) ; } yTmp [ j ] = ( y [ j ] ) + ( ( stepSize ) * sum ) ; } equations . computeDerivatives ( ( ( stepStart ) + ( ( c [ ( k - 1 ) ] ) * ( stepSize ) ) ) , yTmp , yDotK [ k ] ) ; } for ( int j = 0 ; j < ( y0 . length ) ; ++ j ) { double sum = ( b [ 0 ] ) * ( yDotK [ 0 ] [ j ] ) ; for ( int l = 1 ; l < stages ; ++ l ) { sum += ( b [ l ] ) * ( yDotK [ l ] [ j ] ) ; } yTmp [ j ] = ( y [ j ] ) + ( ( stepSize ) * sum ) ; } error = estimateError ( yDotK , y , yTmp , stepSize ) ; if ( error <= 1.0 ) { interpolator . storeTime ( ( ( stepStart ) + ( stepSize ) ) ) ; if ( manager . evaluateStep ( interpolator ) ) { hNew = ( manager . getEventTime ( ) ) - ( stepStart ) ; } else { loop = false ; } } else { final double factor = Math . min ( maxGrowth , Math . max ( minReduction , ( ( safety ) * ( Math . pow ( error , exp ) ) ) ) ) ; hNew = filterStep ( ( ( stepSize ) * factor ) , forward , false ) ; } } final double nextStep = ( stepStart ) + ( stepSize ) ; System . arraycopy ( yTmp , 0 , y , 0 , y0 . length ) ; manager . stepAccepted ( nextStep , y ) ;

Fix:
CombinedEventsManager manager = addEndTimeChecker ( t0 , t , eventsHandlersManager ) ;