docs: @Override
  	public RandomVariable getValue(double evaluationTime, LIBORModelMonteCarloSimulationModel model) throws CalculationException {
  
  		final RandomVariable one	= model.getRandomVariableForConstant(1.0);
  		final RandomVariable zero	= model.getRandomVariableForConstant(0.0);
  
  		RandomVariable values = underlying.getValue(evaluationTime, model);
  
  		if(values.getFiltrationTime() > evaluationTime) {
  			RandomVariable filterNaN = values.isNaN().sub(1.0).mult(-1.0);
  			RandomVariable valuesFiltered = values.mult(filterNaN);
  
  			/*
  			 * Cut off two standard deviations from regression
  			 */
  			double valuesMean		= valuesFiltered.getAverage();
  			double valuesStdDev	= valuesFiltered.getStandardDeviation();
  			double valuesFloor		= valuesMean*(1.0-Math.signum(valuesMean)*1E-5)-3.0*valuesStdDev;
  			double valuesCap		= valuesMean*(1.0+Math.signum(valuesMean)*1E-5)+3.0*valuesStdDev;
  			RandomVariable filter = values.sub(valuesFloor).choose(one, zero)
  					.mult(values.sub(valuesCap).mult(-1.0).choose(one, zero));
  			filter = filter.mult(filterNaN);
  			// Filter values and regressionBasisFunctions
  			values = values.mult(filter);
  
  			RandomVariable[] regressionBasisFunctions			= getRegressionBasisFunctions(evaluationTime, model);
  			RandomVariable[] filteredRegressionBasisFunctions	= new RandomVariable[regressionBasisFunctions.length];
  			for(int i=0; i<regressionBasisFunctions.length; i++) {
  				filteredRegressionBasisFunctions[i] = regressionBasisFunctions[i].mult(filter);
  			}
  
  			// Remove foresight through conditional expectation
  			MonteCarloConditionalExpectationRegression condExpEstimator = new MonteCarloConditionalExpectationRegression(filteredRegressionBasisFunctions, regressionBasisFunctions);
  
  			// Calculate cond. expectation. Note that no discounting (numeraire division) is required!
  			values         = condExpEstimator.getConditionalExpectation(values);
  		}
  
  		// Return values
  		return values;
  	}