diff --git a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
index 92f6ec8c91..e828aad940 100644
--- a/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
+++ b/src/java/org/apache/poi/ss/formula/eval/FunctionEval.java
@@ -17,264 +17,324 @@
 
 package org.apache.poi.ss.formula.eval;
 
-import org.apache.poi.ss.formula.atp.AnalysisToolPak;
-import org.apache.poi.ss.formula.function.FunctionMetadata;
-import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
-import org.apache.poi.ss.formula.functions.*;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.TreeSet;
 
+import org.apache.poi.ss.formula.atp.AnalysisToolPak;
+import org.apache.poi.ss.formula.function.FunctionMetadata;
+import org.apache.poi.ss.formula.function.FunctionMetadataRegistry;
+import org.apache.poi.ss.formula.functions.Address;
+import org.apache.poi.ss.formula.functions.AggregateFunction;
+import org.apache.poi.ss.formula.functions.BooleanFunction;
+import org.apache.poi.ss.formula.functions.CalendarFieldFunction;
+import org.apache.poi.ss.formula.functions.Choose;
+import org.apache.poi.ss.formula.functions.Code;
+import org.apache.poi.ss.formula.functions.Column;
+import org.apache.poi.ss.formula.functions.Columns;
+import org.apache.poi.ss.formula.functions.Count;
+import org.apache.poi.ss.formula.functions.Counta;
+import org.apache.poi.ss.formula.functions.Countblank;
+import org.apache.poi.ss.formula.functions.Countif;
+import org.apache.poi.ss.formula.functions.DateFunc;
+import org.apache.poi.ss.formula.functions.Days360;
+import org.apache.poi.ss.formula.functions.Errortype;
+import org.apache.poi.ss.formula.functions.Even;
+import org.apache.poi.ss.formula.functions.FinanceFunction;
+import org.apache.poi.ss.formula.functions.Function;
+import org.apache.poi.ss.formula.functions.Hlookup;
+import org.apache.poi.ss.formula.functions.Hyperlink;
+import org.apache.poi.ss.formula.functions.IPMT;
+import org.apache.poi.ss.formula.functions.IfFunc;
+import org.apache.poi.ss.formula.functions.Index;
+import org.apache.poi.ss.formula.functions.Intercept;
+import org.apache.poi.ss.formula.functions.Irr;
+import org.apache.poi.ss.formula.functions.LogicalFunction;
+import org.apache.poi.ss.formula.functions.Lookup;
+import org.apache.poi.ss.formula.functions.Match;
+import org.apache.poi.ss.formula.functions.MinaMaxa;
+import org.apache.poi.ss.formula.functions.Mirr;
+import org.apache.poi.ss.formula.functions.Mode;
+import org.apache.poi.ss.formula.functions.Na;
+import org.apache.poi.ss.formula.functions.NotImplementedFunction;
+import org.apache.poi.ss.formula.functions.Now;
+import org.apache.poi.ss.formula.functions.Npv;
+import org.apache.poi.ss.formula.functions.NumericFunction;
+import org.apache.poi.ss.formula.functions.Odd;
+import org.apache.poi.ss.formula.functions.Offset;
+import org.apache.poi.ss.formula.functions.PPMT;
+import org.apache.poi.ss.formula.functions.Rank;
+import org.apache.poi.ss.formula.functions.Rate;
+import org.apache.poi.ss.formula.functions.Replace;
+import org.apache.poi.ss.formula.functions.Rept;
+import org.apache.poi.ss.formula.functions.Roman;
+import org.apache.poi.ss.formula.functions.RowFunc;
+import org.apache.poi.ss.formula.functions.Rows;
+import org.apache.poi.ss.formula.functions.Slope;
+import org.apache.poi.ss.formula.functions.Substitute;
+import org.apache.poi.ss.formula.functions.Subtotal;
+import org.apache.poi.ss.formula.functions.Sumif;
+import org.apache.poi.ss.formula.functions.Sumproduct;
+import org.apache.poi.ss.formula.functions.Sumx2my2;
+import org.apache.poi.ss.formula.functions.Sumx2py2;
+import org.apache.poi.ss.formula.functions.Sumxmy2;
+import org.apache.poi.ss.formula.functions.T;
+import org.apache.poi.ss.formula.functions.TextFunction;
+import org.apache.poi.ss.formula.functions.TimeFunc;
+import org.apache.poi.ss.formula.functions.Today;
+import org.apache.poi.ss.formula.functions.Value;
+import org.apache.poi.ss.formula.functions.Vlookup;
+import org.apache.poi.ss.formula.functions.WeekdayFunc;
+
 /**
  * @author Amol S. Deshmukh < amolweb at ya hoo dot com >
  * @author Johan Karlsteen - added Intercept and Slope
  */
 public final class FunctionEval {
-	/**
-	 * Some function IDs that require special treatment
-	 */
-	private static final class FunctionID {
-		/** 1 */
-		public static final int IF = FunctionMetadataRegistry.FUNCTION_INDEX_IF;
-		/** 4 */
-		public static final int SUM = FunctionMetadataRegistry.FUNCTION_INDEX_SUM;
-		/** 78 */
-		public static final int OFFSET = 78;
-		/** 100 */
-		public static final int CHOOSE = FunctionMetadataRegistry.FUNCTION_INDEX_CHOOSE;
-		/** 148 */
-		public static final int INDIRECT = FunctionMetadataRegistry.FUNCTION_INDEX_INDIRECT;
-		/** 255 */
-		public static final int EXTERNAL_FUNC = FunctionMetadataRegistry.FUNCTION_INDEX_EXTERNAL;
-	}
-	// convenient access to namespace
-	private static final FunctionID ID = null;
+    /**
+     * Some function IDs that require special treatment
+     */
+    private static final class FunctionID {
+        /** 1 */
+        public static final int IF = FunctionMetadataRegistry.FUNCTION_INDEX_IF;
+        /** 4 */
+        public static final int SUM = FunctionMetadataRegistry.FUNCTION_INDEX_SUM;
+        /** 78 */
+        public static final int OFFSET = 78;
+        /** 100 */
+        public static final int CHOOSE = FunctionMetadataRegistry.FUNCTION_INDEX_CHOOSE;
+        /** 148 */
+        public static final int INDIRECT = FunctionMetadataRegistry.FUNCTION_INDEX_INDIRECT;
+        /** 255 */
+        public static final int EXTERNAL_FUNC = FunctionMetadataRegistry.FUNCTION_INDEX_EXTERNAL;
+    }
+    // convenient access to namespace
+    private static final FunctionID ID = null;
 
-	/**
-	 * Array elements corresponding to unimplemented functions are <code>null</code>
-	 */
-	protected static final Function[] functions = produceFunctions();
+    /**
+     * Array elements corresponding to unimplemented functions are <code>null</code>
+     */
+    protected static final Function[] functions = produceFunctions();
 
-	private static Function[] produceFunctions() {
-		Function[] retval = new Function[368];
+    private static Function[] produceFunctions() {
+        Function[] retval = new Function[368];
 
-		retval[0] = new Count();
-		retval[ID.IF] = new IfFunc();
-		retval[2] = LogicalFunction.ISNA;
-		retval[3] = LogicalFunction.ISERROR;
-		retval[ID.SUM] = AggregateFunction.SUM;
-		retval[5] = AggregateFunction.AVERAGE;
-		retval[6] = AggregateFunction.MIN;
-		retval[7] = AggregateFunction.MAX;
-		retval[8] = new RowFunc(); // ROW
-		retval[9] = new Column();
-		retval[10] = new Na();
-		retval[11] = new Npv();
-		retval[12] = AggregateFunction.STDEV;
-		retval[13] = NumericFunction.DOLLAR;
+        retval[0] = new Count();
+        retval[ID.IF] = new IfFunc();
+        retval[2] = LogicalFunction.ISNA;
+        retval[3] = LogicalFunction.ISERROR;
+        retval[ID.SUM] = AggregateFunction.SUM;
+        retval[5] = AggregateFunction.AVERAGE;
+        retval[6] = AggregateFunction.MIN;
+        retval[7] = AggregateFunction.MAX;
+        retval[8] = new RowFunc(); // ROW
+        retval[9] = new Column();
+        retval[10] = new Na();
+        retval[11] = new Npv();
+        retval[12] = AggregateFunction.STDEV;
+        retval[13] = NumericFunction.DOLLAR;
 
-		retval[15] = NumericFunction.SIN;
-		retval[16] = NumericFunction.COS;
-		retval[17] = NumericFunction.TAN;
-		retval[18] = NumericFunction.ATAN;
-		retval[19] = NumericFunction.PI;
-		retval[20] = NumericFunction.SQRT;
-		retval[21] = NumericFunction.EXP;
-		retval[22] = NumericFunction.LN;
-		retval[23] = NumericFunction.LOG10;
-		retval[24] = NumericFunction.ABS;
-		retval[25] = NumericFunction.INT;
-		retval[26] = NumericFunction.SIGN;
-		retval[27] = NumericFunction.ROUND;
-		retval[28] = new Lookup();
-		retval[29] = new Index();
-		retval[30] = new Rept();
+        retval[15] = NumericFunction.SIN;
+        retval[16] = NumericFunction.COS;
+        retval[17] = NumericFunction.TAN;
+        retval[18] = NumericFunction.ATAN;
+        retval[19] = NumericFunction.PI;
+        retval[20] = NumericFunction.SQRT;
+        retval[21] = NumericFunction.EXP;
+        retval[22] = NumericFunction.LN;
+        retval[23] = NumericFunction.LOG10;
+        retval[24] = NumericFunction.ABS;
+        retval[25] = NumericFunction.INT;
+        retval[26] = NumericFunction.SIGN;
+        retval[27] = NumericFunction.ROUND;
+        retval[28] = new Lookup();
+        retval[29] = new Index();
+        retval[30] = new Rept();
 
-		retval[31] = TextFunction.MID;
-		retval[32] = TextFunction.LEN;
-		retval[33] = new Value();
-		retval[34] = BooleanFunction.TRUE;
-		retval[35] = BooleanFunction.FALSE;
-		retval[36] = BooleanFunction.AND;
-		retval[37] = BooleanFunction.OR;
-		retval[38] = BooleanFunction.NOT;
-		retval[39] = NumericFunction.MOD;
+        retval[31] = TextFunction.MID;
+        retval[32] = TextFunction.LEN;
+        retval[33] = new Value();
+        retval[34] = BooleanFunction.TRUE;
+        retval[35] = BooleanFunction.FALSE;
+        retval[36] = BooleanFunction.AND;
+        retval[37] = BooleanFunction.OR;
+        retval[38] = BooleanFunction.NOT;
+        retval[39] = NumericFunction.MOD;
 
-		retval[46] = AggregateFunction.VAR;
-		retval[48] = TextFunction.TEXT;
+        retval[46] = AggregateFunction.VAR;
+        retval[48] = TextFunction.TEXT;
 
-		retval[56] = FinanceFunction.PV;
-		retval[57] = FinanceFunction.FV;
-		retval[58] = FinanceFunction.NPER;
-		retval[59] = FinanceFunction.PMT;
+        retval[56] = FinanceFunction.PV;
+        retval[57] = FinanceFunction.FV;
+        retval[58] = FinanceFunction.NPER;
+        retval[59] = FinanceFunction.PMT;
 
-      retval[60] = new Rate();
-      retval[61] = new Mirr();
+        retval[60] = new Rate();
+        retval[61] = new Mirr();
 
-		retval[62] = new Irr();
-		retval[63] = NumericFunction.RAND;
-		retval[64] = new Match();
-		retval[65] = DateFunc.instance;
-		retval[66] = new TimeFunc();
-		retval[67] = CalendarFieldFunction.DAY;
-		retval[68] = CalendarFieldFunction.MONTH;
-		retval[69] = CalendarFieldFunction.YEAR;
+        retval[62] = new Irr();
+        retval[63] = NumericFunction.RAND;
+        retval[64] = new Match();
+        retval[65] = DateFunc.instance;
+        retval[66] = new TimeFunc();
+        retval[67] = CalendarFieldFunction.DAY;
+        retval[68] = CalendarFieldFunction.MONTH;
+        retval[69] = CalendarFieldFunction.YEAR;
 
-		retval[70] = WeekdayFunc.instance;
-		retval[71] = CalendarFieldFunction.HOUR;
-		retval[72] = CalendarFieldFunction.MINUTE;
-		retval[73] = CalendarFieldFunction.SECOND;
-		retval[74] = new Now();
+        retval[70] = WeekdayFunc.instance;
+        retval[71] = CalendarFieldFunction.HOUR;
+        retval[72] = CalendarFieldFunction.MINUTE;
+        retval[73] = CalendarFieldFunction.SECOND;
+        retval[74] = new Now();
 
-		retval[76] = new Rows();
-		retval[77] = new Columns();
-		retval[82] = TextFunction.SEARCH;
-		retval[ID.OFFSET] = new Offset();
-		retval[82] = TextFunction.SEARCH;
+        retval[76] = new Rows();
+        retval[77] = new Columns();
+        retval[82] = TextFunction.SEARCH;
+        retval[ID.OFFSET] = new Offset();
+        retval[82] = TextFunction.SEARCH;
 
-		retval[97] = NumericFunction.ATAN2;
-		retval[98] = NumericFunction.ASIN;
-		retval[99] = NumericFunction.ACOS;
-		retval[ID.CHOOSE] = new Choose();
-		retval[101] = new Hlookup();
-		retval[102] = new Vlookup();
+        retval[97] = NumericFunction.ATAN2;
+        retval[98] = NumericFunction.ASIN;
+        retval[99] = NumericFunction.ACOS;
+        retval[ID.CHOOSE] = new Choose();
+        retval[101] = new Hlookup();
+        retval[102] = new Vlookup();
 
-		retval[105] = LogicalFunction.ISREF;
+        retval[105] = LogicalFunction.ISREF;
 
-		retval[109] = NumericFunction.LOG;
+        retval[109] = NumericFunction.LOG;
 
         retval[111] = TextFunction.CHAR;
-		retval[112] = TextFunction.LOWER;
-		retval[113] = TextFunction.UPPER;
+        retval[112] = TextFunction.LOWER;
+        retval[113] = TextFunction.UPPER;
 
-		retval[115] = TextFunction.LEFT;
-		retval[116] = TextFunction.RIGHT;
-		retval[117] = TextFunction.EXACT;
-		retval[118] = TextFunction.TRIM;
-		retval[119] = new Replace();
-		retval[120] = new Substitute();
+        retval[115] = TextFunction.LEFT;
+        retval[116] = TextFunction.RIGHT;
+        retval[117] = TextFunction.EXACT;
+        retval[118] = TextFunction.TRIM;
+        retval[119] = new Replace();
+        retval[120] = new Substitute();
         retval[121] = new Code();
 
-		retval[124] = TextFunction.FIND;
+        retval[124] = TextFunction.FIND;
 
-		retval[127] = LogicalFunction.ISTEXT;
-		retval[128] = LogicalFunction.ISNUMBER;
-		retval[129] = LogicalFunction.ISBLANK;
-		retval[130] = new T();
+        retval[127] = LogicalFunction.ISTEXT;
+        retval[128] = LogicalFunction.ISNUMBER;
+        retval[129] = LogicalFunction.ISBLANK;
+        retval[130] = new T();
 
-		retval[ID.INDIRECT] = null; // Indirect.evaluate has different signature
+        retval[ID.INDIRECT] = null; // Indirect.evaluate has different signature
         retval[162] = TextFunction.CLEAN;  //Aniket Banerjee    
         retval[167] = new IPMT();
         retval[168] = new PPMT();
-		retval[169] = new Counta();
+        retval[169] = new Counta();
 
-		retval[183] = AggregateFunction.PRODUCT;
-		retval[184] = NumericFunction.FACT;
+        retval[183] = AggregateFunction.PRODUCT;
+        retval[184] = NumericFunction.FACT;
 
-		retval[190] = LogicalFunction.ISNONTEXT;
+        retval[190] = LogicalFunction.ISNONTEXT;
         retval[194] = AggregateFunction.VARP;
-		retval[197] = NumericFunction.TRUNC;
-		retval[198] = LogicalFunction.ISLOGICAL;
+        retval[197] = NumericFunction.TRUNC;
+        retval[198] = LogicalFunction.ISLOGICAL;
 
-		retval[212] = NumericFunction.ROUNDUP;
-		retval[213] = NumericFunction.ROUNDDOWN;
+        retval[212] = NumericFunction.ROUNDUP;
+        retval[213] = NumericFunction.ROUNDDOWN;
         retval[216] = new Rank();
         retval[219] = new Address();  //Aniket Banerjee
         retval[220] = new Days360();
-		retval[221] = new Today();
+        retval[221] = new Today();
 
-		retval[227] = AggregateFunction.MEDIAN;
-		retval[228] = new Sumproduct();
-		retval[229] = NumericFunction.SINH;
-		retval[230] = NumericFunction.COSH;
-		retval[231] = NumericFunction.TANH;
-		retval[232] = NumericFunction.ASINH;
-		retval[233] = NumericFunction.ACOSH;
-		retval[234] = NumericFunction.ATANH;
+        retval[227] = AggregateFunction.MEDIAN;
+        retval[228] = new Sumproduct();
+        retval[229] = NumericFunction.SINH;
+        retval[230] = NumericFunction.COSH;
+        retval[231] = NumericFunction.TANH;
+        retval[232] = NumericFunction.ASINH;
+        retval[233] = NumericFunction.ACOSH;
+        retval[234] = NumericFunction.ATANH;
 
-		retval[ID.EXTERNAL_FUNC] = null; // ExternalFunction is a FreeREfFunction
+        retval[ID.EXTERNAL_FUNC] = null; // ExternalFunction is a FreeREfFunction
 
-		retval[261] = new Errortype();
+        retval[261] = new Errortype();
 
-		retval[269] = AggregateFunction.AVEDEV;
+        retval[269] = AggregateFunction.AVEDEV;
 
-		retval[276] = NumericFunction.COMBIN;
+        retval[276] = NumericFunction.COMBIN;
 
-		retval[279] = new Even();
+        retval[279] = new Even();
 
-		retval[285] = NumericFunction.FLOOR;
+        retval[285] = NumericFunction.FLOOR;
 
-		retval[288] = NumericFunction.CEILING;
+        retval[288] = NumericFunction.CEILING;
 
-		retval[298] = new Odd();
+        retval[298] = new Odd();
 
         retval[300] = NumericFunction.POISSON;
 
-		retval[303] = new Sumxmy2();
-		retval[304] = new Sumx2my2();
-		retval[305] = new Sumx2py2();
+        retval[303] = new Sumxmy2();
+        retval[304] = new Sumx2my2();
+        retval[305] = new Sumx2py2();
 
-		retval[311] = new Intercept();
-		retval[315] = new Slope();
+        retval[311] = new Intercept();
+        retval[315] = new Slope();
 
-		retval[318] = AggregateFunction.DEVSQ;
+        retval[318] = AggregateFunction.DEVSQ;
 
-		retval[321] = AggregateFunction.SUMSQ;
+        retval[321] = AggregateFunction.SUMSQ;
 
-		retval[325] = AggregateFunction.LARGE;
-		retval[326] = AggregateFunction.SMALL;
-		retval[328] = AggregateFunction.PERCENTILE;
-		
-		retval[330] = new Mode();
+        retval[325] = AggregateFunction.LARGE;
+        retval[326] = AggregateFunction.SMALL;
+        retval[328] = AggregateFunction.PERCENTILE;
 
-		retval[336] = TextFunction.CONCATENATE;
-		retval[337] = NumericFunction.POWER;
+        retval[330] = new Mode();
 
-		retval[342] = NumericFunction.RADIANS;
-		retval[343] = NumericFunction.DEGREES;
+        retval[336] = TextFunction.CONCATENATE;
+        retval[337] = NumericFunction.POWER;
 
-		retval[344] = new Subtotal();
-		retval[345] = new Sumif();
-		retval[346] = new Countif();
-		retval[347] = new Countblank();
+        retval[342] = NumericFunction.RADIANS;
+        retval[343] = NumericFunction.DEGREES;
+
+        retval[344] = new Subtotal();
+        retval[345] = new Sumif();
+        retval[346] = new Countif();
+        retval[347] = new Countblank();
 
         retval[354] = new Roman();
 
-		retval[359] = new Hyperlink();
+        retval[359] = new Hyperlink();
 
-		retval[362] = MinaMaxa.MAXA;
-		retval[363] = MinaMaxa.MINA;
+        retval[362] = MinaMaxa.MAXA;
+        retval[363] = MinaMaxa.MINA;
 
-		for (int i = 0; i < retval.length; i++) {
-			Function f = retval[i];
-			if (f == null) {
-				FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByIndex(i);
-				if (fm == null) {
-					continue;
-				}
-				retval[i] = new NotImplementedFunction(fm.getName());
-			}
-		}
-		return retval;
-	}
-	/**
-	 * @return <code>null</code> if the specified functionIndex is for INDIRECT() or any external (add-in) function.
-	 */
-	public static Function getBasicFunction(int functionIndex) {
-		// check for 'free ref' functions first
-		switch (functionIndex) {
-			case FunctionID.INDIRECT:
-			case FunctionID.EXTERNAL_FUNC:
-				return null;
-		}
-		// else - must be plain function
-		Function result = functions[functionIndex];
-		if (result == null) {
-			throw new NotImplementedException("FuncIx=" + functionIndex);
-		}
-		return result;
-	}
+        for (int i = 0; i < retval.length; i++) {
+            Function f = retval[i];
+            if (f == null) {
+                FunctionMetadata fm = FunctionMetadataRegistry.getFunctionByIndex(i);
+                if (fm == null) {
+                    continue;
+                }
+                retval[i] = new NotImplementedFunction(fm.getName());
+            }
+        }
+        return retval;
+    }
+    /**
+     * @return <code>null</code> if the specified functionIndex is for INDIRECT() or any external (add-in) function.
+     */
+    public static Function getBasicFunction(int functionIndex) {
+        // check for 'free ref' functions first
+        switch (functionIndex) {
+        case FunctionID.INDIRECT:
+        case FunctionID.EXTERNAL_FUNC:
+            return null;
+        }
+        // else - must be plain function
+        Function result = functions[functionIndex];
+        if (result == null) {
+            throw new NotImplementedException("FuncIx=" + functionIndex);
+        }
+        return result;
+    }
 
     /**
      * Register a new function in runtime.
@@ -310,12 +370,12 @@ public final class FunctionEval {
      * @return an array of supported functions
      * @since 3.8 beta6
      */
-    public static Collection<String> getSupportedFunctionNames(){
+    public static Collection<String> getSupportedFunctionNames() {
         Collection<String> lst = new TreeSet<String>();
-        for(int i = 0; i < functions.length; i++){
+        for (int i = 0; i < functions.length; i++) {
             Function func = functions[i];
             FunctionMetadata metaData = FunctionMetadataRegistry.getFunctionByIndex(i);
-            if(func != null && !(func instanceof NotImplementedFunction)){
+            if (func != null && !(func instanceof NotImplementedFunction)) {
                 lst.add(metaData.getName());
             }
         }
@@ -329,11 +389,11 @@ public final class FunctionEval {
      * @return an array of not supported functions
      * @since 3.8 beta6
      */
-    public static Collection<String> getNotSupportedFunctionNames(){
+    public static Collection<String> getNotSupportedFunctionNames() {
         Collection<String> lst = new TreeSet<String>();
-        for(int i = 0; i < functions.length; i++){
+        for (int i = 0; i < functions.length; i++) {
             Function func = functions[i];
-            if(func != null && (func instanceof NotImplementedFunction)){
+            if (func != null && (func instanceof NotImplementedFunction)) {
                 FunctionMetadata metaData = FunctionMetadataRegistry.getFunctionByIndex(i);
                 lst.add(metaData.getName());
             }