diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java
index e082fee..f30ae09 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionExpressionMap.java
@@ -2,9 +2,9 @@
 
 import java.util.HashMap;
 
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
-public class FunctionExpressionMap extends HashMap<Integer, FunIdentifier> {
+public class FunctionExpressionMap extends HashMap<Integer, AsterixFunction> {
     /**
      * 
      */
@@ -24,7 +24,7 @@
         this.varargs = varargs;
     }
 
-    public FunIdentifier get(int arity) {
+    public AsterixFunction get(int arity) {
         if (varargs) {
             return super.get(-1);
         } else {
@@ -32,7 +32,7 @@
         }
     }
 
-    public FunIdentifier put(int arity, FunIdentifier fd) {
+    public AsterixFunction put(int arity, AsterixFunction fd) {
         if (varargs) {
             return super.put(-1, fd);
         } else {
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java
index fa3e8fc..1027c42 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/FunctionSignatures.java
@@ -3,7 +3,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
 public class FunctionSignatures {
     private final Map<String, FunctionExpressionMap> functionMap;
@@ -12,7 +12,7 @@
         functionMap = new HashMap<String, FunctionExpressionMap>();
     }
 
-    public FunIdentifier get(String name, int arity) {
+    public AsterixFunction get(String name, int arity) {
         FunctionExpressionMap possibleFD = functionMap.get(name);
         if (possibleFD == null) {
             return null;
@@ -21,8 +21,8 @@
         }
     }
 
-    public void put(FunIdentifier fd, boolean varargs) {
-        String name = fd.getValue();
+    public void put(AsterixFunction fd, boolean varargs) {
+        String name = fd.getFunctionName();
         FunctionExpressionMap func = functionMap.get(name);
         if (func == null) {
             func = new FunctionExpressionMap(varargs);
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java
index 3f9c2be..ef338d4 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/context/Scope.java
@@ -2,10 +2,10 @@
 
 import java.util.HashMap;
 
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
 import edu.uci.ics.asterix.aql.expression.Identifier;
 import edu.uci.ics.asterix.aql.expression.VarIdentifier;
 import edu.uci.ics.asterix.aql.parser.ScopeChecker;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
 public final class Scope {
     private Scope parent;
@@ -78,7 +78,7 @@
      * @param varargs
      *            whether this function has varargs
      */
-    public void addFunctionDescriptor(FunIdentifier fd, boolean varargs) {
+    public void addFunctionDescriptor(AsterixFunction fd, boolean varargs) {
         if (functionSignatures == null) {
             functionSignatures = new FunctionSignatures();
         }
@@ -94,8 +94,8 @@
      *            # of arguments
      * @return FunctionDescriptor of the function found; otherwise null
      */
-    public FunIdentifier findFunctionSignature(String name, int arity) {
-        FunIdentifier fd = null;
+    public AsterixFunction findFunctionSignature(String name, int arity) {
+        AsterixFunction fd = null;
         if (functionSignatures != null) {
             fd = functionSignatures.get(name, arity);
         }
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java
index 39a21e3..cda7e69 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CallExpr.java
@@ -6,25 +6,26 @@
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
 public class CallExpr implements Expression {
-    private FunIdentifier ident;
+    private AsterixFunction ident;
     private List<Expression> exprList;
     private boolean isBuiltin;
 
     public CallExpr() {
     }
 
-    public CallExpr(FunIdentifier ident, List<Expression> exprList) {
+    public CallExpr(AsterixFunction ident, List<Expression> exprList) {
         this.ident = ident;
         this.exprList = exprList;
     }
 
-    public FunIdentifier getIdent() {
+    public AsterixFunction getIdent() {
         return ident;
     }
 
-    public void setIdent(FunIdentifier ident) {
+    public void setIdent(AsterixFunction ident) {
         this.ident = ident;
     }
 
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java
index e18200f..6ffd39d 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/CreateFunctionStatement.java
@@ -3,26 +3,25 @@
 import java.util.ArrayList;
 import java.util.List;
 
-
 import edu.uci.ics.asterix.aql.base.Statement;
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
-import edu.uci.ics.asterix.aql.util.FunctionUtil;
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
 public class CreateFunctionStatement implements Statement {
 
-    private FunIdentifier funIdentifier;
+    private AsterixFunction asterixFunction;
     private String functionBody;
     private boolean ifNotExists;
     private List<String> paramList;
 
-    public FunIdentifier getFunctionIdentifier() {
-        return funIdentifier;
+    public AsterixFunction getFunctionIdentifier() {
+        return asterixFunction;
     }
 
-    public void setFunctionIdentifier(FunIdentifier funIdentifier) {
-        this.funIdentifier = funIdentifier;
+    public void setFunctionIdentifier(AsterixFunction AsterixFunction) {
+        this.asterixFunction = AsterixFunction;
     }
 
     public String getFunctionBody() {
@@ -37,10 +36,10 @@
         this.ifNotExists = ifNotExists;
     }
 
-    public CreateFunctionStatement(FunIdentifier funIdentifier, List<VarIdentifier> parameterList, String functionBody,
+    public CreateFunctionStatement(AsterixFunction AsterixFunction, List<VarIdentifier> parameterList, String functionBody,
             boolean ifNotExists) {
         
-        this.funIdentifier = funIdentifier;
+        this.asterixFunction = AsterixFunction;
         this.functionBody = functionBody;
         this.ifNotExists = ifNotExists;
         this.paramList = new ArrayList<String>();
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunIdentifier.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunIdentifier.java
deleted file mode 100644
index 85651fe..0000000
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunIdentifier.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package edu.uci.ics.asterix.aql.expression;
-
-public class FunIdentifier extends Identifier {
-    private int arity;
-
-    public FunIdentifier() {
-    }
-
-    public FunIdentifier(String name, int arity) {
-        this.value = name;
-        this.arity = arity;
-    }
-
-    public int getArity() {
-        return arity;
-    }
-
-    public void setArity(int arity) {
-        this.arity = arity;
-    }
-
-    public boolean equals(Object o) {
-        if (FunIdentifier.class.isInstance(o)) {
-            FunIdentifier obj = (FunIdentifier) o;
-            if (obj.getArity() == arity && obj.getValue().equals(value)) {
-                return true;
-            } else {
-                return false;
-            }
-        } else {
-            return false;
-        }
-    }
-
-    @Override
-    public String toString() {
-        return value + "@" + arity;
-    }
-
-}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java
index 1428a54..e69035a 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/FunctionDecl.java
@@ -7,26 +7,27 @@
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlVisitorWithVoidReturn;
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
 public class FunctionDecl implements Statement {
-    private FunIdentifier ident;
+    private AsterixFunction ident;
     private List<VarIdentifier> paramList;
     private Expression funcBody;
 
     public FunctionDecl() {
     }
 
-    public FunctionDecl(FunIdentifier ident, List<VarIdentifier> paramList, Expression funcBody) {
+    public FunctionDecl(AsterixFunction ident, List<VarIdentifier> paramList, Expression funcBody) {
         this.ident = ident;
         this.paramList = paramList;
         this.funcBody = funcBody;
     }
 
-    public FunIdentifier getIdent() {
+    public AsterixFunction getIdent() {
         return ident;
     }
 
-    public void setIdent(FunIdentifier ident) {
+    public void setIdent(AsterixFunction ident) {
         this.ident = ident;
     }
 
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java
index f4b895b..f01991b 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/expression/visitor/AQLPrintVisitor.java
@@ -294,7 +294,7 @@
 
     @Override
     public void visit(FunctionDecl fd, Integer step) throws AsterixException {
-        out.println(skip(step) + "FunctionDecl " + fd.getIdent().getValue() + "(" + fd.getParamList().toString()
+        out.println(skip(step) + "FunctionDecl " + fd.getIdent().getFunctionName() + "(" + fd.getParamList().toString()
                 + ") {");
         fd.getFuncBody().accept(this, step + 1);
         out.println(skip(step) + "}");
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java
index 51537e3..5171d5a 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/parser/ScopeChecker.java
@@ -3,8 +3,8 @@
 import java.util.Stack;
 
 import edu.uci.ics.asterix.aql.context.Scope;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
 import edu.uci.ics.asterix.aql.expression.Identifier;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 import edu.uci.ics.hyracks.algebricks.core.algebra.base.Counter;
 
 public abstract class ScopeChecker {
@@ -95,7 +95,7 @@
      * 
      * @return functionDescriptor
      */
-    public final FunIdentifier lookupFunctionSignature(String name, int arity) {
+    public final AsterixFunction lookupFunctionSignature(String name, int arity) {
         if (name != null) {
             return getCurrentScope().findFunctionSignature(name, arity);
         } else {
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java
index 5f03cca1..fdb56be 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/AqlRewriter.java
@@ -7,8 +7,8 @@
 
 import edu.uci.ics.asterix.aql.base.Clause;
 import edu.uci.ics.asterix.aql.base.Expression;
-import edu.uci.ics.asterix.aql.base.Expression.Kind;
 import edu.uci.ics.asterix.aql.base.Statement;
+import edu.uci.ics.asterix.aql.base.Expression.Kind;
 import edu.uci.ics.asterix.aql.expression.BeginFeedStatement;
 import edu.uci.ics.asterix.aql.expression.CallExpr;
 import edu.uci.ics.asterix.aql.expression.ControlFeedStatement;
@@ -26,7 +26,6 @@
 import edu.uci.ics.asterix.aql.expression.FieldAccessor;
 import edu.uci.ics.asterix.aql.expression.FieldBinding;
 import edu.uci.ics.asterix.aql.expression.ForClause;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
 import edu.uci.ics.asterix.aql.expression.FunctionDecl;
 import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
 import edu.uci.ics.asterix.aql.expression.GbyVariableExpressionPair;
@@ -65,13 +64,14 @@
 import edu.uci.ics.asterix.aql.expression.WriteFromQueryResultStatement;
 import edu.uci.ics.asterix.aql.expression.WriteStatement;
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
-import edu.uci.ics.asterix.aql.util.FunctionUtil;
+import edu.uci.ics.asterix.aql.util.FunctionUtils;
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
 import edu.uci.ics.asterix.common.functions.FunctionConstants;
 import edu.uci.ics.asterix.metadata.MetadataManager;
 import edu.uci.ics.asterix.metadata.MetadataTransactionContext;
 import edu.uci.ics.asterix.metadata.entities.Function;
 import edu.uci.ics.asterix.om.functions.AsterixBuiltinFunctions;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 import edu.uci.ics.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
 import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
 
@@ -130,7 +130,7 @@
             return;
         }
         List<FunctionDecl> fdecls = buildFunctionDeclList(topExpr);
-        List<FunIdentifier> funIds = new ArrayList<FunIdentifier>();
+        List<AsterixFunction> funIds = new ArrayList<AsterixFunction>();
         for (FunctionDecl fdecl : fdecls) {
             funIds.add(fdecl.getIdent());
         }
@@ -148,20 +148,20 @@
     }
 
     private void buildOtherUdfs(Expression expression, List<FunctionDecl> functionDecls,
-            List<FunIdentifier> declaredFunctions) throws AsterixException {
+            List<AsterixFunction> declaredFunctions) throws AsterixException {
         if (expression == null) {
             return;
         }
 
-        List<FunIdentifier> functionCalls = getFunctionCalls(expression);
-        for (FunIdentifier funId : functionCalls) {
+        List<AsterixFunction> functionCalls = getFunctionCalls(expression);
+        for (AsterixFunction funId : functionCalls) {
             if (AsterixBuiltinFunctions.isBuiltinCompilerFunction(new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
-                    funId.getValue(), false))) {
+                    funId.getFunctionName(), false))) {
                 continue;
             }
 
             if (AsterixBuiltinFunctions.isBuiltinCompilerFunction(new FunctionIdentifier(AlgebricksBuiltinFunctions.ALGEBRICKS_NS,
-                    funId.getValue(), false))) {
+                    funId.getFunctionName(), false))) {
                 continue;
             }
             
@@ -178,48 +178,48 @@
         }
     }
 
-    private FunctionDecl getFunctionDecl(FunIdentifier funId) throws AsterixException {
-        Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, dataverseName, funId.getValue(), funId
+    private FunctionDecl getFunctionDecl(AsterixFunction funId) throws AsterixException {
+        Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, dataverseName, funId.getFunctionName(), funId
                 .getArity());
         if (function == null) {
             throw new AsterixException(" unknown function " + funId);
         }
-        return FunctionUtil.getFunctionDecl(function);
+        return FunctionUtils.getFunctionDecl(function);
 
     }
 
-    private List<FunIdentifier> getFunctionCalls(Expression expression) throws AsterixException {
-        Map<FunIdentifier, DfsColor> color = new HashMap<FunIdentifier, DfsColor>();
-        Map<FunIdentifier, List<FunIdentifier>> arcs = new HashMap<FunIdentifier, List<FunIdentifier>>();
+    private List<AsterixFunction> getFunctionCalls(Expression expression) throws AsterixException {
+        Map<AsterixFunction, DfsColor> color = new HashMap<AsterixFunction, DfsColor>();
+        Map<AsterixFunction, List<AsterixFunction>> arcs = new HashMap<AsterixFunction, List<AsterixFunction>>();
         GatherFunctionCalls gfc = new GatherFunctionCalls();
         expression.accept(gfc, null);
-        List<FunIdentifier> calls = gfc.getCalls();
+        List<AsterixFunction> calls = gfc.getCalls();
         return calls;
     }
 
     private void checkRecursivity(List<FunctionDecl> fdecls) throws AsterixException {
-        Map<FunIdentifier, DfsColor> color = new HashMap<FunIdentifier, DfsColor>();
-        Map<FunIdentifier, List<FunIdentifier>> arcs = new HashMap<FunIdentifier, List<FunIdentifier>>();
+        Map<AsterixFunction, DfsColor> color = new HashMap<AsterixFunction, DfsColor>();
+        Map<AsterixFunction, List<AsterixFunction>> arcs = new HashMap<AsterixFunction, List<AsterixFunction>>();
         for (FunctionDecl fd : fdecls) {
             GatherFunctionCalls gfc = new GatherFunctionCalls();
             fd.getFuncBody().accept(gfc, null);
-            List<FunIdentifier> calls = gfc.getCalls();
+            List<AsterixFunction> calls = gfc.getCalls();
             arcs.put(fd.getIdent(), calls);
             color.put(fd.getIdent(), DfsColor.WHITE);
         }
-        for (FunIdentifier a : arcs.keySet()) {
+        for (AsterixFunction a : arcs.keySet()) {
             if (color.get(a) == DfsColor.WHITE) {
                 checkRecursivityDfs(a, arcs, color);
             }
         }
     }
 
-    private void checkRecursivityDfs(FunIdentifier a, Map<FunIdentifier, List<FunIdentifier>> arcs,
-            Map<FunIdentifier, DfsColor> color) throws AsterixException {
+    private void checkRecursivityDfs(AsterixFunction a, Map<AsterixFunction, List<AsterixFunction>> arcs,
+            Map<AsterixFunction, DfsColor> color) throws AsterixException {
         color.put(a, DfsColor.GRAY);
-        List<FunIdentifier> next = arcs.get(a);
+        List<AsterixFunction> next = arcs.get(a);
         if (next != null) {
-            for (FunIdentifier f : next) {
+            for (AsterixFunction f : next) {
                 DfsColor dc = color.get(f);
                 if (dc == DfsColor.GRAY) {
                     throw new AsterixException("Recursive function calls, created by calling " + f + " starting from "
@@ -245,7 +245,7 @@
 
     private static class GatherFunctionCalls implements IAqlExpressionVisitor<Void, Void> {
 
-        private final List<FunIdentifier> calls = new ArrayList<FunIdentifier>();
+        private final List<AsterixFunction> calls = new ArrayList<AsterixFunction>();
 
         public GatherFunctionCalls() {
         }
@@ -530,7 +530,7 @@
             return null;
         }
 
-        public List<FunIdentifier> getCalls() {
+        public List<AsterixFunction> getCalls() {
             return calls;
         }
 
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java
index 5c59c7c..f0b2da6 100644
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/rewrites/InlineUdfsVisitor.java
@@ -6,8 +6,8 @@
 
 import edu.uci.ics.asterix.aql.base.Clause;
 import edu.uci.ics.asterix.aql.base.Expression;
-import edu.uci.ics.asterix.aql.base.Expression.Kind;
 import edu.uci.ics.asterix.aql.base.IAqlExpression;
+import edu.uci.ics.asterix.aql.base.Expression.Kind;
 import edu.uci.ics.asterix.aql.expression.BeginFeedStatement;
 import edu.uci.ics.asterix.aql.expression.CallExpr;
 import edu.uci.ics.asterix.aql.expression.ControlFeedStatement;
@@ -25,7 +25,6 @@
 import edu.uci.ics.asterix.aql.expression.FieldAccessor;
 import edu.uci.ics.asterix.aql.expression.FieldBinding;
 import edu.uci.ics.asterix.aql.expression.ForClause;
-import edu.uci.ics.asterix.aql.expression.FunIdentifier;
 import edu.uci.ics.asterix.aql.expression.FunctionDecl;
 import edu.uci.ics.asterix.aql.expression.FunctionDropStatement;
 import edu.uci.ics.asterix.aql.expression.GbyVariableExpressionPair;
@@ -65,6 +64,7 @@
 import edu.uci.ics.asterix.aql.expression.WriteStatement;
 import edu.uci.ics.asterix.aql.expression.visitor.IAqlExpressionVisitor;
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 import edu.uci.ics.hyracks.algebricks.core.utils.Pair;
 
 public class InlineUdfsVisitor implements IAqlExpressionVisitor<Boolean, List<FunctionDecl>> {
@@ -337,7 +337,7 @@
         return new Pair<Boolean, ArrayList<Expression>>(changed, newList);
     }
 
-    private static FunctionDecl findFuncDeclaration(FunIdentifier fid, List<FunctionDecl> sequence) {
+    private static FunctionDecl findFuncDeclaration(AsterixFunction fid, List<FunctionDecl> sequence) {
         for (FunctionDecl f : sequence) {
             if (f.getIdent().equals(fid)) {
                 return f;
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtil.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtil.java
deleted file mode 100644
index 0214ada..0000000
--- a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtil.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package edu.uci.ics.asterix.aql.util;
-
-import java.io.StringReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import edu.uci.ics.asterix.aql.expression.FunctionDecl;
-import edu.uci.ics.asterix.aql.expression.Query;
-import edu.uci.ics.asterix.aql.expression.VarIdentifier;
-import edu.uci.ics.asterix.aql.parser.AQLParser;
-import edu.uci.ics.asterix.aql.parser.ParseException;
-import edu.uci.ics.asterix.common.exceptions.AsterixException;
-import edu.uci.ics.asterix.metadata.entities.Function;
-
-public class FunctionUtil {
-
-
-    public static FunctionDecl getFunctionDecl(Function function) throws AsterixException {
-        String functionBody = function.getFunctionBody();
-        List<String> params = function.getParams();
-        List<VarIdentifier> varIdentifiers = new ArrayList<VarIdentifier>();
-
-        StringBuilder builder = new StringBuilder();
-        builder.append(" declare function " + function.getFunctionName());
-        builder.append("(");
-        for (String param : params) {
-            VarIdentifier varId = new VarIdentifier(param);
-            varIdentifiers.add(varId);
-            builder.append(param);
-            builder.append(",");
-        }
-        builder.delete(builder.length() - 1, builder.length());
-        builder.append(")");
-        builder.append("{");
-        builder.append(functionBody);
-        builder.append("}");
-        AQLParser parser = new AQLParser(new StringReader(new String(builder)));
-
-        Query query = null;
-        try {
-            query = (Query) parser.Statement();
-        } catch (ParseException pe) {
-            throw new AsterixException(pe);
-        }
-
-        FunctionDecl decl = (FunctionDecl) query.getPrologDeclList().get(0);
-        return decl;
-    }
-}
diff --git a/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtils.java b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtils.java
new file mode 100644
index 0000000..d246a92
--- /dev/null
+++ b/asterix-aql/src/main/java/edu/uci/ics/asterix/aql/util/FunctionUtils.java
@@ -0,0 +1,97 @@
+package edu.uci.ics.asterix.aql.util;
+
+/*
+ * Copyright 2009-2011 by The Regents of the University of California
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * you may obtain a copy of the License from
+ * 
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import java.io.StringReader;
+import java.util.ArrayList;
+import java.util.List;
+
+import edu.uci.ics.asterix.aql.expression.FunctionDecl;
+import edu.uci.ics.asterix.aql.expression.Query;
+import edu.uci.ics.asterix.aql.expression.VarIdentifier;
+import edu.uci.ics.asterix.aql.parser.AQLParser;
+import edu.uci.ics.asterix.aql.parser.ParseException;
+import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.common.functions.FunctionConstants;
+import edu.uci.ics.asterix.metadata.MetadataException;
+import edu.uci.ics.asterix.metadata.MetadataManager;
+import edu.uci.ics.asterix.metadata.MetadataTransactionContext;
+import edu.uci.ics.asterix.metadata.entities.Function;
+import edu.uci.ics.asterix.om.functions.AsterixBuiltinFunctions;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
+import edu.uci.ics.asterix.om.functions.AsterixFunctionInfo;
+import edu.uci.ics.hyracks.algebricks.core.algebra.functions.AlgebricksBuiltinFunctions;
+import edu.uci.ics.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import edu.uci.ics.hyracks.algebricks.core.algebra.functions.IFunctionInfo;
+
+public class FunctionUtils {
+
+    public static FunctionDecl getFunctionDecl(Function function) throws AsterixException {
+        String functionBody = function.getFunctionBody();
+        List<String> params = function.getParams();
+        List<VarIdentifier> varIdentifiers = new ArrayList<VarIdentifier>();
+
+        StringBuilder builder = new StringBuilder();
+        builder.append(" declare function " + function.getFunctionName());
+        builder.append("(");
+        for (String param : params) {
+            VarIdentifier varId = new VarIdentifier(param);
+            varIdentifiers.add(varId);
+            builder.append(param);
+            builder.append(",");
+        }
+        builder.delete(builder.length() - 1, builder.length());
+        builder.append(")");
+        builder.append("{");
+        builder.append(functionBody);
+        builder.append("}");
+        AQLParser parser = new AQLParser(new StringReader(new String(builder)));
+
+        Query query = null;
+        try {
+            query = (Query) parser.Statement();
+        } catch (ParseException pe) {
+            throw new AsterixException(pe);
+        }
+
+        FunctionDecl decl = (FunctionDecl) query.getPrologDeclList().get(0);
+        return decl;
+    }
+
+    public static IFunctionInfo getFunctionInfo(FunctionIdentifier fi) {
+        return AsterixBuiltinFunctions.getAsterixFunctionInfo(fi);
+    }
+
+    public static IFunctionInfo getFunctionInfo(MetadataTransactionContext mdTxnCtx, String dataverseName,
+            AsterixFunction asterixFunction) throws MetadataException {
+        FunctionIdentifier fid = new FunctionIdentifier(FunctionConstants.ASTERIX_NS,
+                asterixFunction.getFunctionName(), asterixFunction.getArity(), true);
+        IFunctionInfo finfo = AsterixBuiltinFunctions.getAsterixFunctionInfo(fid);
+        if (fid == null) {
+            fid = new FunctionIdentifier(AlgebricksBuiltinFunctions.ALGEBRICKS_NS, asterixFunction.getFunctionName(),
+                    asterixFunction.getArity(), true);
+        }
+        if (fid == null) {
+            Function function = MetadataManager.INSTANCE.getFunction(mdTxnCtx, dataverseName, asterixFunction
+                    .getFunctionName(), asterixFunction.getArity());
+            if (function != null) {
+                finfo = new AsterixFunctionInfo(dataverseName, asterixFunction, false);
+                // todo: for external functions, we shall construct another kind of function info (that extends AsterixFunctionInfo)
+                // and has additional information.
+            }
+        }
+        return finfo; // could be null
+    }
+}
diff --git a/asterix-aql/src/main/javacc/AQL.jj b/asterix-aql/src/main/javacc/AQL.jj
index 544e855..1fa40b8 100644
--- a/asterix-aql/src/main/javacc/AQL.jj
+++ b/asterix-aql/src/main/javacc/AQL.jj
@@ -37,6 +37,7 @@
 import edu.uci.ics.asterix.aql.context.RootScopeFactory;
 import edu.uci.ics.asterix.common.annotations.*;
 import edu.uci.ics.asterix.common.exceptions.AsterixException;
+import edu.uci.ics.asterix.om.functions.AsterixFunction;
 
 
 public class AQLParser extends ScopeChecker {
@@ -1027,7 +1028,8 @@
 FunctionDecl FunctionDeclaration() throws ParseException:
 {
   FunctionDecl func = new FunctionDecl();
-  FunIdentifier ident = new FunIdentifier();
+  AsterixFunction ident;
+  String functionName;
   int arity = 0;
   List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
   Expression funcBody;
@@ -1039,7 +1041,7 @@
     <IDENTIFIER>
 	{
 	  Token t = getToken(0);
-	  ident.setValue(t.toString());
+	  functionName = t.toString();
 	}
     <LEFTPAREN> (<VARIABLE>
     {
@@ -1059,7 +1061,7 @@
     })*)? <RIGHTPAREN> "{" funcBody = Expression() "}"
 
     {
-      ident.setArity(arity);
+      ident = new AsterixFunction(functionName,arity);
       getCurrentScope().addFunctionDescriptor(ident, false);
       func.setIdent(ident);
       func.setFuncBody(funcBody);
@@ -1071,7 +1073,8 @@
 CreateFunctionStatement FunctionCreation() throws ParseException:
 {
   CreateFunctionStatement cfs = null;
-  FunIdentifier ident = new FunIdentifier();
+  AsterixFunction ident;
+  String functionName;
   int arity = 0;
   boolean ifNotExists = false;
   List<VarIdentifier> paramList = new ArrayList<VarIdentifier>();
@@ -1084,7 +1087,7 @@
     <IDENTIFIER>
 	{
 	  Token t = getToken(0);
-	  ident.setValue(t.toString());
+	  functionName= t.toString();
 	}
 	
 	(
@@ -1115,7 +1118,7 @@
           }
           "}"
     {
-      ident.setArity(arity);
+      ident = new AsterixFunction(functionName, arity);
       getCurrentScope().addFunctionDescriptor(ident, false);
       cfs = new CreateFunctionStatement(ident, paramList, funcBody, ifNotExists);
       return cfs;
@@ -1728,10 +1731,10 @@
      } ("," tmp = Expression() { argList.add(tmp); arity++; })*)? <RIGHTPAREN>
 
      {
-       FunIdentifier fd = lookupFunctionSignature(funcName.toString(), arity);
+       AsterixFunction fd = lookupFunctionSignature(funcName.toString(), arity);
 	     if(fd == null)
 	     {
-	        fd = new FunIdentifier(funcName.toString(), arity);
+	        fd = new AsterixFunction(funcName.toString(), arity);
 //	     	notFoundFunctionList.add(fd);
 	     }
 //	     	throw new ParseException("can't find function "+ funcName.toString() + "@" + arity);
