diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java
index 41eb883..3984fe8 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/IntroduceTransactionCommitByAssignOpRule.java
@@ -3,9 +3,9 @@
  * 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.
@@ -48,14 +48,14 @@
 
         Mutable<ILogicalOperator> childOfSelect = selectOperator.getInputs().get(0);
 
-        //[Direction] SelectOp(cond1)<--ChildOps... ==> SelectOp(booleanValue of cond1)<--NewAssignOp(cond1)<--ChildOps... 
-        //#. Create an assign-operator with a new local variable and the condition of the select-operator. 
+        //[Direction] SelectOp(cond1)<--ChildOps... ==> SelectOp(booleanValue of cond1)<--NewAssignOp(cond1)<--ChildOps...
+        //#. Create an assign-operator with a new local variable and the condition of the select-operator.
         //#. Set the input(child operator) of the new assign-operator to input(child operator) of the select-operator.
-        //	 (Later, the newly created assign-operator will apply the condition on behalf of the select-operator, 
+        //   (Later, the newly created assign-operator will apply the condition on behalf of the select-operator,
         //    and set the variable of the assign-operator to a boolean value according to the condition evaluation.)
         //#. Give the select-operator the result boolean value created by the newly created child assign-operator.
 
-        //create an assignOp with a variable and the condition of the select-operator. 
+        //create an assignOp with a variable and the condition of the select-operator.
         LogicalVariable v = context.newVar();
         AssignOperator assignOperator = new AssignOperator(v, new MutableObject<ILogicalExpression>(selectOperator
                 .getCondition().getValue()));
diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/SimilarityCheckRule.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/SimilarityCheckRule.java
index 5c42555..c4f2575 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/SimilarityCheckRule.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/optimizer/rules/SimilarityCheckRule.java
@@ -3,9 +3,9 @@
  * 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.
@@ -115,7 +115,7 @@
             ConstantExpression constExpr = (ConstantExpression) arg1;
             constVal = (AsterixConstantValue) constExpr.getValue();
             nonConstExpr = arg2;
-            // Get func ident as if swapping lhs and rhs.            
+            // Get func ident as if swapping lhs and rhs.
             normFuncIdent = getLhsAndRhsSwappedFuncIdent(funcIdent);
         } else if (arg2.getExpressionTag() == LogicalExpressionTag.CONSTANT) {
             ConstantExpression constExpr = (ConstantExpression) arg2;
@@ -144,7 +144,7 @@
             AsterixConstantValue constVal, VariableReferenceExpression varRefExpr, List<AssignOperator> assigns,
             IOptimizationContext context) throws AlgebricksException {
 
-        // Find variable in assigns to determine its originating function.    	
+        // Find variable in assigns to determine its originating function.
         LogicalVariable var = varRefExpr.getVariableReference();
         Mutable<ILogicalExpression> simFuncExprRef = null;
         ScalarFunctionCallExpression simCheckFuncExpr = null;
@@ -172,13 +172,13 @@
             }
         }
 
-        // Only non-null if we found that varRefExpr refers to an optimizable similarity function call. 
+        // Only non-null if we found that varRefExpr refers to an optimizable similarity function call.
         if (simCheckFuncExpr != null) {
             // Create a new assign under matchingAssign which assigns the result of our similarity-check function to a variable.
             LogicalVariable newVar = context.newVar();
             AssignOperator newAssign = new AssignOperator(newVar, new MutableObject<ILogicalExpression>(
                     simCheckFuncExpr));
-            // Hook up inputs. 
+            // Hook up inputs.
             newAssign.getInputs()
                     .add(new MutableObject<ILogicalOperator>(matchingAssign.getInputs().get(0).getValue()));
             matchingAssign.getInputs().get(0).setValue(newAssign);
diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java b/asterix-app/src/main/java/edu/uci/ics/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
index ce528bf..af7e511 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/hyracks/bootstrap/CCApplicationEntryPoint.java
@@ -3,9 +3,9 @@
  * 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.
@@ -46,137 +46,118 @@
 import edu.uci.ics.hyracks.api.lifecycle.LifeCycleComponentManager;
 
 public class CCApplicationEntryPoint implements ICCApplicationEntryPoint {
-	private static final Logger LOGGER = Logger
-			.getLogger(CCApplicationEntryPoint.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(CCApplicationEntryPoint.class.getName());
 
-	private static final String HYRACKS_CONNECTION_ATTR = "edu.uci.ics.asterix.HYRACKS_CONNECTION";
+    private static final String HYRACKS_CONNECTION_ATTR = "edu.uci.ics.asterix.HYRACKS_CONNECTION";
 
-	private Server webServer;
-	private Server jsonAPIServer;
-	private Server feedServer;
+    private Server webServer;
+    private Server jsonAPIServer;
+    private Server feedServer;
 
-	private static IAsterixStateProxy proxy;
-	private ICCApplicationContext appCtx;
+    private static IAsterixStateProxy proxy;
+    private ICCApplicationContext appCtx;
 
-	@Override
-	public void start(ICCApplicationContext ccAppCtx, String[] args)
-			throws Exception {
-		this.appCtx = ccAppCtx;
+    @Override
+    public void start(ICCApplicationContext ccAppCtx, String[] args) throws Exception {
+        this.appCtx = ccAppCtx;
 
-		if (LOGGER.isLoggable(Level.INFO)) {
-			LOGGER.info("Starting Asterix cluster controller");
-		}
+        if (LOGGER.isLoggable(Level.INFO)) {
+            LOGGER.info("Starting Asterix cluster controller");
+        }
 
-		appCtx.setThreadFactory(new AsterixThreadFactory(
-				new LifeCycleComponentManager()));
-		AsterixAppContextInfo.initialize(appCtx,
-				getNewHyracksClientConnection());
+        appCtx.setThreadFactory(new AsterixThreadFactory(new LifeCycleComponentManager()));
+        AsterixAppContextInfo.initialize(appCtx, getNewHyracksClientConnection());
 
-		proxy = AsterixStateProxy.registerRemoteObject();
-		appCtx.setDistributedState(proxy);
+        proxy = AsterixStateProxy.registerRemoteObject();
+        appCtx.setDistributedState(proxy);
 
-		AsterixMetadataProperties metadataProperties = AsterixAppContextInfo
-				.getInstance().getMetadataProperties();
-		MetadataManager.INSTANCE = new MetadataManager(proxy,
-				metadataProperties);
+        AsterixMetadataProperties metadataProperties = AsterixAppContextInfo.getInstance().getMetadataProperties();
+        MetadataManager.INSTANCE = new MetadataManager(proxy, metadataProperties);
 
-		AsterixAppContextInfo.getInstance().getCCApplicationContext()
-				.addJobLifecycleListener(FeedLifecycleListener.INSTANCE);
+        AsterixAppContextInfo.getInstance().getCCApplicationContext()
+                .addJobLifecycleListener(FeedLifecycleListener.INSTANCE);
 
-		AsterixExternalProperties externalProperties = AsterixAppContextInfo
-				.getInstance().getExternalProperties();
-		setupWebServer(externalProperties);
-		webServer.start();
+        AsterixExternalProperties externalProperties = AsterixAppContextInfo.getInstance().getExternalProperties();
+        setupWebServer(externalProperties);
+        webServer.start();
 
-		setupJSONAPIServer(externalProperties);
-		jsonAPIServer.start();
-		ExternalLibraryBootstrap.setUpExternaLibraries(false);
+        setupJSONAPIServer(externalProperties);
+        jsonAPIServer.start();
+        ExternalLibraryBootstrap.setUpExternaLibraries(false);
 
-		setupFeedServer(externalProperties);
-		feedServer.start();
+        setupFeedServer(externalProperties);
+        feedServer.start();
 
-		AsterixGlobalRecoveryManager.INSTANCE = new AsterixGlobalRecoveryManager((HyracksConnection) getNewHyracksClientConnection());
-		ClusterManager.INSTANCE.registerSubscriber(AsterixGlobalRecoveryManager.INSTANCE);
-		
-		ccAppCtx.addClusterLifecycleListener(ClusterLifecycleListener.INSTANCE);
-	}
+        AsterixGlobalRecoveryManager.INSTANCE = new AsterixGlobalRecoveryManager(
+                (HyracksConnection) getNewHyracksClientConnection());
+        ClusterManager.INSTANCE.registerSubscriber(AsterixGlobalRecoveryManager.INSTANCE);
 
-	@Override
-	public void stop() throws Exception {
-		if (LOGGER.isLoggable(Level.INFO)) {
-			LOGGER.info("Stopping Asterix cluster controller");
-		}
-		AsterixStateProxy.unregisterRemoteObject();
+        ccAppCtx.addClusterLifecycleListener(ClusterLifecycleListener.INSTANCE);
+    }
 
-		webServer.stop();
-		jsonAPIServer.stop();
-	}
+    @Override
+    public void stop() throws Exception {
+        if (LOGGER.isLoggable(Level.INFO)) {
+            LOGGER.info("Stopping Asterix cluster controller");
+        }
+        AsterixStateProxy.unregisterRemoteObject();
 
-	private IHyracksClientConnection getNewHyracksClientConnection()
-			throws Exception {
-		String strIP = appCtx.getCCContext().getClusterControllerInfo()
-				.getClientNetAddress();
-		int port = appCtx.getCCContext().getClusterControllerInfo()
-				.getClientNetPort();
-		return new HyracksConnection(strIP, port);
-	}
+        webServer.stop();
+        jsonAPIServer.stop();
+    }
 
-	private void setupWebServer(AsterixExternalProperties externalProperties)
-			throws Exception {
+    private IHyracksClientConnection getNewHyracksClientConnection() throws Exception {
+        String strIP = appCtx.getCCContext().getClusterControllerInfo().getClientNetAddress();
+        int port = appCtx.getCCContext().getClusterControllerInfo().getClientNetPort();
+        return new HyracksConnection(strIP, port);
+    }
 
-		webServer = new Server(externalProperties.getWebInterfacePort());
+    private void setupWebServer(AsterixExternalProperties externalProperties) throws Exception {
 
-		ServletContextHandler context = new ServletContextHandler(
-				ServletContextHandler.SESSIONS);
-		context.setContextPath("/");
+        webServer = new Server(externalProperties.getWebInterfacePort());
 
-		IHyracksClientConnection hcc = getNewHyracksClientConnection();
-		context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
+        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        context.setContextPath("/");
 
-		webServer.setHandler(context);
-		context.addServlet(new ServletHolder(new APIServlet()), "/*");
-	}
+        IHyracksClientConnection hcc = getNewHyracksClientConnection();
+        context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
 
-	private void setupJSONAPIServer(AsterixExternalProperties externalProperties)
-			throws Exception {
-		jsonAPIServer = new Server(externalProperties.getAPIServerPort());
+        webServer.setHandler(context);
+        context.addServlet(new ServletHolder(new APIServlet()), "/*");
+    }
 
-		ServletContextHandler context = new ServletContextHandler(
-				ServletContextHandler.SESSIONS);
-		context.setContextPath("/");
+    private void setupJSONAPIServer(AsterixExternalProperties externalProperties) throws Exception {
+        jsonAPIServer = new Server(externalProperties.getAPIServerPort());
 
-		IHyracksClientConnection hcc = getNewHyracksClientConnection();
-		context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
+        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        context.setContextPath("/");
 
-		jsonAPIServer.setHandler(context);
-		context.addServlet(new ServletHolder(new QueryAPIServlet()), "/query");
-		context.addServlet(new ServletHolder(new QueryStatusAPIServlet()),
-				"/query/status");
-		context.addServlet(new ServletHolder(new QueryResultAPIServlet()),
-				"/query/result");
-		context.addServlet(new ServletHolder(new UpdateAPIServlet()), "/update");
-		context.addServlet(new ServletHolder(new DDLAPIServlet()), "/ddl");
-		context.addServlet(new ServletHolder(new AQLAPIServlet()), "/aql");
-	}
+        IHyracksClientConnection hcc = getNewHyracksClientConnection();
+        context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
 
-	private void setupFeedServer(AsterixExternalProperties externalProperties)
-			throws Exception {
-		feedServer = new Server(externalProperties.getFeedServerPort());
+        jsonAPIServer.setHandler(context);
+        context.addServlet(new ServletHolder(new QueryAPIServlet()), "/query");
+        context.addServlet(new ServletHolder(new QueryStatusAPIServlet()), "/query/status");
+        context.addServlet(new ServletHolder(new QueryResultAPIServlet()), "/query/result");
+        context.addServlet(new ServletHolder(new UpdateAPIServlet()), "/update");
+        context.addServlet(new ServletHolder(new DDLAPIServlet()), "/ddl");
+        context.addServlet(new ServletHolder(new AQLAPIServlet()), "/aql");
+    }
 
-		ServletContextHandler context = new ServletContextHandler(
-				ServletContextHandler.SESSIONS);
-		context.setContextPath("/");
+    private void setupFeedServer(AsterixExternalProperties externalProperties) throws Exception {
+        feedServer = new Server(externalProperties.getFeedServerPort());
 
-		IHyracksClientConnection hcc = getNewHyracksClientConnection();
-		context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
+        ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+        context.setContextPath("/");
 
-		feedServer.setHandler(context);
-		context.addServlet(new ServletHolder(new FeedServlet()), "/");
-		context.addServlet(new ServletHolder(new FeedDashboardServlet()),
-				"/feed/dashboard");
-		context.addServlet(new ServletHolder(new FeedDataProviderServlet()),
-				"/feed/data");
+        IHyracksClientConnection hcc = getNewHyracksClientConnection();
+        context.setAttribute(HYRACKS_CONNECTION_ATTR, hcc);
 
-		// add paths here
-	}
+        feedServer.setHandler(context);
+        context.addServlet(new ServletHolder(new FeedServlet()), "/");
+        context.addServlet(new ServletHolder(new FeedDashboardServlet()), "/feed/dashboard");
+        context.addServlet(new ServletHolder(new FeedDataProviderServlet()), "/feed/data");
+
+        // add paths here
+    }
 }
\ No newline at end of file
diff --git a/asterix-common/src/main/java/edu/uci/ics/asterix/common/exceptions/ACIDException.java b/asterix-common/src/main/java/edu/uci/ics/asterix/common/exceptions/ACIDException.java
index 16b62f8..919d1f1 100644
--- a/asterix-common/src/main/java/edu/uci/ics/asterix/common/exceptions/ACIDException.java
+++ b/asterix-common/src/main/java/edu/uci/ics/asterix/common/exceptions/ACIDException.java
@@ -3,9 +3,9 @@
  * 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.
@@ -25,9 +25,6 @@
  */
 public class ACIDException extends Exception {
 
-    /**
-	 * 
-	 */
     private static final long serialVersionUID = -8855848112541877323L;
     private ITransactionContext txnContext;
 
diff --git a/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/AllTypesFunction.java b/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/AllTypesFunction.java
index c5063db..daac8ff 100644
--- a/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/AllTypesFunction.java
+++ b/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/AllTypesFunction.java
@@ -14,8 +14,6 @@
  */
 package edu.uci.ics.asterix.external.library;
 
-import edu.uci.ics.asterix.external.library.IExternalScalarFunction;
-import edu.uci.ics.asterix.external.library.IFunctionHelper;
 import edu.uci.ics.asterix.external.library.java.JObjects.JBoolean;
 import edu.uci.ics.asterix.external.library.java.JObjects.JCircle;
 import edu.uci.ics.asterix.external.library.java.JObjects.JDate;
@@ -37,79 +35,74 @@
 
 public class AllTypesFunction implements IExternalScalarFunction {
 
-	private JOrderedList newFieldList;
+    private JOrderedList newFieldList;
 
-	@Override
-	public void initialize(IFunctionHelper functionHelper) {
-		newFieldList = new JOrderedList(functionHelper.getObject(JTypeTag.INT));
-	}
+    @Override
+    public void initialize(IFunctionHelper functionHelper) {
+        newFieldList = new JOrderedList(functionHelper.getObject(JTypeTag.INT));
+    }
 
-	@Override
-	public void deinitialize() {
-	}
+    @Override
+    public void deinitialize() {
+    }
 
-	@Override
-	public void evaluate(IFunctionHelper functionHelper) throws Exception {
-		newFieldList.clear();
-		JRecord inputRecord = (JRecord) functionHelper.getArgument(0);
-		JInt id = (JInt) inputRecord.getValueByName("id");
-		JString name = (JString) inputRecord.getValueByName("name");
-		JFloat age = (JFloat) inputRecord.getValueByName("age");
-		JDouble salary = (JDouble) inputRecord.getValueByName("salary");
-		JBoolean married = (JBoolean) inputRecord.getValueByName("married");
-		JUnorderedList interest = (JUnorderedList) inputRecord
-				.getValueByName("interests");
-		JOrderedList children = (JOrderedList) inputRecord
-				.getValueByName("children");
-		JRecord address = (JRecord) inputRecord.getValueByName("address");
-		JDate dob = (JDate) inputRecord.getValueByName("dob");
-		JTime time = (JTime) inputRecord.getValueByName("time");
-		JDateTime dateTime = (JDateTime) inputRecord.getValueByName("datetime");
-		JDuration duration = (JDuration) inputRecord.getValueByName("duration");
-		JPoint location2d = (JPoint) inputRecord.getValueByName("location2d");
-		JPoint3D location3d = (JPoint3D) inputRecord
-				.getValueByName("location3d");
-		JLine line = (JLine) inputRecord.getValueByName("line");
-		JPolygon polygon = (JPolygon) inputRecord.getValueByName("polygon");
-		JCircle circle = (JCircle) inputRecord.getValueByName("circle");
+    @Override
+    public void evaluate(IFunctionHelper functionHelper) throws Exception {
+        newFieldList.clear();
+        JRecord inputRecord = (JRecord) functionHelper.getArgument(0);
+        JInt id = (JInt) inputRecord.getValueByName("id");
+        JString name = (JString) inputRecord.getValueByName("name");
+        JFloat age = (JFloat) inputRecord.getValueByName("age");
+        JDouble salary = (JDouble) inputRecord.getValueByName("salary");
+        JBoolean married = (JBoolean) inputRecord.getValueByName("married");
+        JUnorderedList interest = (JUnorderedList) inputRecord.getValueByName("interests");
+        JOrderedList children = (JOrderedList) inputRecord.getValueByName("children");
+        JRecord address = (JRecord) inputRecord.getValueByName("address");
+        JDate dob = (JDate) inputRecord.getValueByName("dob");
+        JTime time = (JTime) inputRecord.getValueByName("time");
+        JDateTime dateTime = (JDateTime) inputRecord.getValueByName("datetime");
+        JDuration duration = (JDuration) inputRecord.getValueByName("duration");
+        JPoint location2d = (JPoint) inputRecord.getValueByName("location2d");
+        JPoint3D location3d = (JPoint3D) inputRecord.getValueByName("location3d");
+        JLine line = (JLine) inputRecord.getValueByName("line");
+        JPolygon polygon = (JPolygon) inputRecord.getValueByName("polygon");
+        JCircle circle = (JCircle) inputRecord.getValueByName("circle");
 
-		JRecord result = (JRecord) functionHelper.getResultObject();
-		result.setField("id", id);
-		result.setField("name", name);
-		result.setField("age", age);
-		result.setField("salary", salary);
-		result.setField("married", married);
-		result.setField("interests", interest);
-		result.setField("children", children);
-		JInt zipCode = (JInt) functionHelper.getObject(JTypeTag.INT);
-		zipCode.setValue(92841);
-		address.addField("Zipcode", zipCode);
-		result.setField("address", address);
-		result.setField("dob", dob);
-		result.setField("time", time);
-		result.setField("datetime", dateTime);
-		result.setField("duration", duration);
-		result.setField("location2d", location2d);
-		result.setField("location3d", location3d);
-		result.setField("line", line);
-		result.setField("polygon", polygon);
-		result.setField("circle", circle);
+        JRecord result = (JRecord) functionHelper.getResultObject();
+        result.setField("id", id);
+        result.setField("name", name);
+        result.setField("age", age);
+        result.setField("salary", salary);
+        result.setField("married", married);
+        result.setField("interests", interest);
+        result.setField("children", children);
+        JInt zipCode = (JInt) functionHelper.getObject(JTypeTag.INT);
+        zipCode.setValue(92841);
+        address.addField("Zipcode", zipCode);
+        result.setField("address", address);
+        result.setField("dob", dob);
+        result.setField("time", time);
+        result.setField("datetime", dateTime);
+        result.setField("duration", duration);
+        result.setField("location2d", location2d);
+        result.setField("location3d", location3d);
+        result.setField("line", line);
+        result.setField("polygon", polygon);
+        result.setField("circle", circle);
 
-		JString newFieldString = (JString) functionHelper
-				.getObject(JTypeTag.STRING);
-		newFieldString.setValue("processed");
-		result.addField("status", newFieldString);
+        JString newFieldString = (JString) functionHelper.getObject(JTypeTag.STRING);
+        newFieldString.setValue("processed");
+        result.addField("status", newFieldString);
 
-		/*
-		 * JString element = (JString)
-		 * functionHelper.getObject(JTypeTag.STRING); element.setValue("raman");
-		 * newFieldList.add(element); result.addField("mylist", newFieldList);
-		 */
+        /*
+         * JString element = (JString)
+         * functionHelper.getObject(JTypeTag.STRING); element.setValue("raman");
+         * newFieldList.add(element); result.addField("mylist", newFieldList);
+         */
 
-		JString newFieldString2 = (JString) functionHelper
-				.getObject(JTypeTag.STRING);
-		newFieldString2.setValue("this is working");
-		result.addField("working", newFieldString);
-		functionHelper.setResult(result);
-	}
+        JString newFieldString2 = (JString) functionHelper.getObject(JTypeTag.STRING);
+        newFieldString2.setValue("this is working");
+        result.addField("working", newFieldString);
+        functionHelper.setResult(result);
+    }
 }
diff --git a/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/SumFactory.java b/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/SumFactory.java
index eabc6b5..f49e8c0 100644
--- a/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/SumFactory.java
+++ b/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/SumFactory.java
@@ -13,15 +13,13 @@
  * limitations under the License.
  */
 package edu.uci.ics.asterix.external.library;
-        
-import edu.uci.ics.asterix.external.library.IExternalScalarFunction;
-import edu.uci.ics.asterix.external.library.IFunctionFactory;
+
 
 public class SumFactory implements IFunctionFactory {
 
-	@Override
-	public IExternalScalarFunction getExternalFunction() {
-		return new SumFunction();
-	}
+    @Override
+    public IExternalScalarFunction getExternalFunction() {
+        return new SumFunction();
+    }
 
 }
diff --git a/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/UpperCaseFunction.java b/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/UpperCaseFunction.java
index e3d1c9c..58995c2 100644
--- a/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/UpperCaseFunction.java
+++ b/asterix-external-data/src/test/java/edu/uci/ics/asterix/external/library/UpperCaseFunction.java
@@ -16,52 +16,46 @@
 
 import java.util.Random;
 
-import edu.uci.ics.asterix.external.library.IExternalScalarFunction;
-import edu.uci.ics.asterix.external.library.IFunctionHelper;
-import edu.uci.ics.asterix.external.library.java.JTypeTag;
 import edu.uci.ics.asterix.external.library.java.JObjects.JInt;
 import edu.uci.ics.asterix.external.library.java.JObjects.JRecord;
 import edu.uci.ics.asterix.external.library.java.JObjects.JString;
+import edu.uci.ics.asterix.external.library.java.JTypeTag;
 
 /**
  * Accepts an input record of type Open{ id: int32, text: string }
- * 
  * Converts the text field into upper case and appends an additional field -
  * "substring" with value as a random substring of the text field.
- * 
  * Return Type Open{ id: int32, text: string }
- * 
  */
 public class UpperCaseFunction implements IExternalScalarFunction {
 
-	private Random random;
+    private Random random;
 
-	@Override
-	public void initialize(IFunctionHelper functionHelper) {
-		random = new Random();
-	}
+    @Override
+    public void initialize(IFunctionHelper functionHelper) {
+        random = new Random();
+    }
 
-	@Override
-	public void deinitialize() {
-	}
+    @Override
+    public void deinitialize() {
+    }
 
-	@Override
-	public void evaluate(IFunctionHelper functionHelper) throws Exception {
-		JRecord inputRecord = (JRecord) functionHelper.getArgument(0);
-		JInt id = (JInt) inputRecord.getValueByName("id");
-		id.setValue(id.getValue() * -1); // for maintaining uniqueness
-											// constraint in the case when
-											// output is re-inserted into source
-											// dataset
-		JString text = (JString) inputRecord.getValueByName("text");
-		text.setValue(text.getValue().toUpperCase());
-		JRecord result = (JRecord) functionHelper.getResultObject();
-		result.setField("id", id);
-		result.setField("text", text);
-		JString newField = (JString) functionHelper.getObject(JTypeTag.STRING);
-		newField.setValue(text.getValue().substring(
-				random.nextInt(text.getValue().length())));
-		result.addField("substring", newField);
-		functionHelper.setResult(result);
-	}
+    @Override
+    public void evaluate(IFunctionHelper functionHelper) throws Exception {
+        JRecord inputRecord = (JRecord) functionHelper.getArgument(0);
+        JInt id = (JInt) inputRecord.getValueByName("id");
+        id.setValue(id.getValue() * -1); // for maintaining uniqueness
+                                         // constraint in the case when
+                                         // output is re-inserted into source
+                                         // dataset
+        JString text = (JString) inputRecord.getValueByName("text");
+        text.setValue(text.getValue().toUpperCase());
+        JRecord result = (JRecord) functionHelper.getResultObject();
+        result.setField("id", id);
+        result.setField("text", text);
+        JString newField = (JString) functionHelper.getObject(JTypeTag.STRING);
+        newField.setValue(text.getValue().substring(random.nextInt(text.getValue().length())));
+        result.addField("substring", newField);
+        functionHelper.setResult(result);
+    }
 }
diff --git a/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeCloneTest.java b/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeCloneTest.java
index 4c3f1b4..141d9fa 100644
--- a/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeCloneTest.java
+++ b/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeCloneTest.java
@@ -3,9 +3,9 @@
  * 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.
@@ -14,23 +14,25 @@
  */
 package edu.uci.ics.asterix.lexergenerator;
 
-import static edu.uci.ics.asterix.lexergenerator.Fixtures.*;
-import static org.junit.Assert.*;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.createRule;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.ruleA;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.ruleB;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token2_name;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token_name;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import org.junit.Test;
 
-import edu.uci.ics.asterix.lexergenerator.LexerNode;
-
 public class LexerNodeCloneTest {
-    
+
     @Test
     public void Depth1() throws Exception {
         LexerNode node = new LexerNode();
         LexerNode newNode = node.clone();
         assertFalse(node == newNode);
     }
-    
-    
+
     @Test
     public void Depth2() throws Exception {
         LexerNode node = new LexerNode();
@@ -60,11 +62,11 @@
         LexerNode newNode = node.clone();
         // TODO
         // assertEquals(" ( my1!  (  || my3_clone!  || my4_clone!  || b!  ) " +
-        //		     " || my2!  (  || my3_clone!  || my4_clone!  || b!  ) " +
-        //		     " || a!  (  || my3_clone!  || my4_clone!  || b!  )  ) ", node.toString());
+        //           " || my2!  (  || my3_clone!  || my4_clone!  || b!  ) " +
+        //           " || a!  (  || my3_clone!  || my4_clone!  || b!  )  ) ", node.toString());
         // assertEquals(" ( my1_clone!  (  || my3_clone_clone!  || my4_clone_clone!  || b!  ) " +
-        //		     " || my2_clone!  (  || my3_clone_clone!  || my4_clone_clone!  || b!  ) " +
-        //		     " || a!  (  || my3_clone_clone!  || my4_clone_clone!  || b!  )  ) ", newNode.toString());
+        //           " || my2_clone!  (  || my3_clone_clone!  || my4_clone_clone!  || b!  ) " +
+        //           " || a!  (  || my3_clone_clone!  || my4_clone_clone!  || b!  )  ) ", newNode.toString());
     }
-    
+
 }
diff --git a/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeMergeNodeTest.java b/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeMergeNodeTest.java
index 2b0754d..5c2268d 100644
--- a/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeMergeNodeTest.java
+++ b/asterix-maven-plugins/lexer-generator-maven-plugin/src/test/java/edu/uci/ics/asterix/lexergenerator/LexerNodeMergeNodeTest.java
@@ -3,9 +3,9 @@
  * 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.
@@ -14,13 +14,23 @@
  */
 package edu.uci.ics.asterix.lexergenerator;
 
-import static edu.uci.ics.asterix.lexergenerator.Fixtures.*;
-import static org.junit.Assert.*;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule2;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule2_action;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule2_match;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule2_name;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule_action;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule_match;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.rule_name;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token2_name;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token2_return;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token_name;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token_return;
+import static edu.uci.ics.asterix.lexergenerator.Fixtures.token_tostring;
+import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
 
-import edu.uci.ics.asterix.lexergenerator.LexerNode;
-
 public class LexerNodeMergeNodeTest {
 
     @Test
@@ -32,13 +42,13 @@
         node2.append(rule);
         node2.merge(node);
         node2.appendTokenName(token_name);
-        
+
         LexerNode expected = new LexerNode();
         expected.append(rule2);
         expected.append(rule);
         expected.add(rule);
         expected.appendTokenName(token_name);
-        
+
         assertEquals(expected.toString(), node2.toString());
         assertEquals(expected.toJava(), node2.toJava());
     }
@@ -53,18 +63,13 @@
         node2.appendTokenName(token2_name);
         node.merge(node2);
 
-        assertEquals(" ( "+rule_name+token_tostring+" || "+rule2_name+token_tostring+" ) ", node.toString());
-        assertEquals(rule_match + "{"
-        		+ "\n" + rule_action
-        		+ "\n" + token_return
-        +"}"+rule2_match+"{" 
-        + "\n" + rule2_action
-        + "\n" + token2_return
-        +"}return parseError(TOKEN_MYTOKEN,TOKEN_MYTOKEN2);\n"
-, node.toJava());
+        assertEquals(" ( " + rule_name + token_tostring + " || " + rule2_name + token_tostring + " ) ", node.toString());
+        assertEquals(rule_match + "{" + "\n" + rule_action + "\n" + token_return + "}" + rule2_match + "{" + "\n"
+                + rule2_action + "\n" + token2_return + "}return parseError(TOKEN_MYTOKEN,TOKEN_MYTOKEN2);\n",
+                node.toJava());
     }
 
-    @Test(expected=Exception.class)
+    @Test(expected = Exception.class)
     public void MergeConflict() throws Exception {
         LexerNode node = new LexerNode();
         node.append(rule);
@@ -75,7 +80,7 @@
         try {
             node.merge(node2);
         } catch (Exception e) {
-            assertEquals("Rule conflict between: "+token_name +" and "+token2_name, e.getMessage());
+            assertEquals("Rule conflict between: " + token_name + " and " + token2_name, e.getMessage());
             throw e;
         }
     }
@@ -92,6 +97,6 @@
         node2.appendTokenName(token2_name);
         node2.removeTokensName();
         node.merge(node2);
-        assertEquals(rule_name+rule_name+token_tostring, node.toString());
+        assertEquals(rule_name + rule_name + token_tostring, node.toString());
     }
 }
diff --git a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalDatasetDetails.java b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalDatasetDetails.java
index 3255b34..eb83159 100644
--- a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalDatasetDetails.java
+++ b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalDatasetDetails.java
@@ -3,9 +3,9 @@
  * 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.
@@ -51,8 +51,9 @@
     protected String compactionPolicy;
     protected Map<String, String> compactionPolicyProperties;
 
-    public ExternalDatasetDetails(String adapter, Map<String, String> properties, String nodeGroupName, Date lastRefreshTime, ExternalDatasetTransactionState state,
-            String compactionPolicy, Map<String, String> compactionPolicyProperties) {
+    public ExternalDatasetDetails(String adapter, Map<String, String> properties, String nodeGroupName,
+            Date lastRefreshTime, ExternalDatasetTransactionState state, String compactionPolicy,
+            Map<String, String> compactionPolicyProperties) {
         this.properties = properties;
         this.adapter = adapter;
         this.nodeGroupName = nodeGroupName;
@@ -76,7 +77,7 @@
     }
 
     @SuppressWarnings("unchecked")
-	@Override
+    @Override
     public void writeDatasetDetailsRecordType(DataOutput out) throws HyracksDataException {
         IARecordBuilder externalRecordBuilder = new RecordBuilder();
         OrderedListBuilder listBuilder = new OrderedListBuilder();
@@ -84,7 +85,7 @@
         ArrayBackedValueStorage itemValue = new ArrayBackedValueStorage();
         externalRecordBuilder.reset(MetadataRecordTypes.EXTERNAL_DETAILS_RECORDTYPE);
         AMutableString aString = new AMutableString("");
-        
+
         ISerializerDeserializer<AString> stringSerde = AqlSerializerDeserializerProvider.INSTANCE
                 .getSerializerDeserializer(BuiltinType.ASTRING);
         ISerializerDeserializer<ADateTime> dateTimeSerde = AqlSerializerDeserializerProvider.INSTANCE
@@ -105,7 +106,8 @@
             String name = property.getKey();
             String value = property.getValue();
             itemValue.reset();
-            writePropertyTypeRecord(name, value, itemValue.getDataOutput(), MetadataRecordTypes.DATASOURCE_ADAPTER_PROPERTIES_RECORDTYPE);
+            writePropertyTypeRecord(name, value, itemValue.getDataOutput(),
+                    MetadataRecordTypes.DATASOURCE_ADAPTER_PROPERTIES_RECORDTYPE);
             listBuilder.addItem(itemValue);
         }
         fieldValue.reset();
@@ -117,19 +119,20 @@
         aString.setValue(getNodeGroupName());
         stringSerde.serialize(aString, fieldValue.getDataOutput());
         externalRecordBuilder.addField(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_GROUPNAME_FIELD_INDEX, fieldValue);
-        
-        
+
         // write field 3
         fieldValue.reset();
         dateTimeSerde.serialize(new ADateTime(lastRefreshTime.getTime()), fieldValue.getDataOutput());
-        externalRecordBuilder.addField(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_LAST_REFRESH_TIME_FIELD_INDEX, fieldValue);
-        
+        externalRecordBuilder.addField(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_LAST_REFRESH_TIME_FIELD_INDEX,
+                fieldValue);
+
         // write field 4
         fieldValue.reset();
         intSerde.serialize(new AInt32(state.ordinal()), fieldValue.getDataOutput());
-        externalRecordBuilder.addField(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_TRANSACTION_STATE_FIELD_INDEX, fieldValue);
-        
-     // write field 6
+        externalRecordBuilder.addField(MetadataRecordTypes.EXTERNAL_DETAILS_ARECORD_TRANSACTION_STATE_FIELD_INDEX,
+                fieldValue);
+
+        // write field 6
         fieldValue.reset();
         aString.setValue(getCompactionPolicy().toString());
         stringSerde.serialize(aString, fieldValue.getDataOutput());
@@ -189,25 +192,25 @@
     }
 
     @Override
-	public String getNodeGroupName() {
-		return nodeGroupName;
-	}
+    public String getNodeGroupName() {
+        return nodeGroupName;
+    }
 
-	public Date getTimestamp() {
-		return lastRefreshTime;
-	}
+    public Date getTimestamp() {
+        return lastRefreshTime;
+    }
 
-	public void setRefreshTimestamp(Date timestamp) {
-		this.lastRefreshTime = timestamp;
-	}
+    public void setRefreshTimestamp(Date timestamp) {
+        this.lastRefreshTime = timestamp;
+    }
 
-	public ExternalDatasetTransactionState getState() {
-		return state;
-	}
+    public ExternalDatasetTransactionState getState() {
+        return state;
+    }
 
-	public void setState(ExternalDatasetTransactionState state) {
-		this.state = state;
-	}
+    public void setState(ExternalDatasetTransactionState state) {
+        this.state = state;
+    }
 
     @Override
     public String getCompactionPolicy() {
diff --git a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalFile.java b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalFile.java
index 8f2fe3a..286b53d 100644
--- a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalFile.java
+++ b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entities/ExternalFile.java
@@ -1,4 +1,3 @@
-
 /*
  * Copyright 2009-2013 by The Regents of the University of California
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +19,7 @@
 import edu.uci.ics.asterix.metadata.MetadataCache;
 import edu.uci.ics.asterix.metadata.api.IMetadataEntity;
 
-public class ExternalFile implements IMetadataEntity, Comparable<ExternalFile>{
+public class ExternalFile implements IMetadataEntity, Comparable<ExternalFile> {
 
     /**
      * A class for metadata entity externalFile
@@ -36,7 +35,8 @@
     private int fileNumber;
     private ExternalFilePendingOp pendingOp;
 
-    public ExternalFile(String dataverseName, String datasetName, int fileNumber, String fileName, Date lastModefiedTime, long size, ExternalFilePendingOp pendingOp) {
+    public ExternalFile(String dataverseName, String datasetName, int fileNumber, String fileName,
+            Date lastModefiedTime, long size, ExternalFilePendingOp pendingOp) {
         this.dataverseName = dataverseName;
         this.datasetName = datasetName;
         this.fileNumber = fileNumber;
@@ -93,14 +93,14 @@
     public void setFileNumber(int fileNumber) {
         this.fileNumber = fileNumber;
     }
-    
-    public ExternalFilePendingOp getPendingOp() {
-		return pendingOp;
-	}
 
-	public void setPendingOp(ExternalFilePendingOp pendingOp) {
-		this.pendingOp = pendingOp;
-	}
+    public ExternalFilePendingOp getPendingOp() {
+        return pendingOp;
+    }
+
+    public void setPendingOp(ExternalFilePendingOp pendingOp) {
+        this.pendingOp = pendingOp;
+    }
 
     @Override
     public Object addToCache(MetadataCache cache) {
@@ -111,7 +111,7 @@
     @Override
     public Object dropFromCache(MetadataCache cache) {
         return null;
-    	//return cache.dropExternalFile(this);
+        //return cache.dropExternalFile(this);
     }
 
     @Override
diff --git a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
index 3c29457..6a55049 100644
--- a/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
+++ b/asterix-metadata/src/main/java/edu/uci/ics/asterix/metadata/entitytupletranslators/ExternalFileTupleTranslator.java
@@ -39,178 +39,141 @@
 import edu.uci.ics.hyracks.api.dataflow.value.ISerializerDeserializer;
 import edu.uci.ics.hyracks.dataflow.common.data.accessors.ITupleReference;
 
-public class ExternalFileTupleTranslator extends
-		AbstractTupleTranslator<ExternalFile> {
-	// Field indexes of serialized ExternalFile in a tuple.
-	// First key field.
-	public static final int EXTERNAL_FILE_DATAVERSENAME_TUPLE_FIELD_INDEX = 0;
-	// Second key field.
-	public static final int EXTERNAL_FILE_DATASETNAME_TUPLE_FIELD_INDEX = 1;
-	// Third key field
-	public static final int EXTERNAL_FILE_NUMBER_TUPLE_FIELD_INDEX = 2;
-	// Payload field containing serialized ExternalFile.
-	public static final int EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX = 3;
+public class ExternalFileTupleTranslator extends AbstractTupleTranslator<ExternalFile> {
+    // Field indexes of serialized ExternalFile in a tuple.
+    // First key field.
+    public static final int EXTERNAL_FILE_DATAVERSENAME_TUPLE_FIELD_INDEX = 0;
+    // Second key field.
+    public static final int EXTERNAL_FILE_DATASETNAME_TUPLE_FIELD_INDEX = 1;
+    // Third key field
+    public static final int EXTERNAL_FILE_NUMBER_TUPLE_FIELD_INDEX = 2;
+    // Payload field containing serialized ExternalFile.
+    public static final int EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX = 3;
 
-	protected AMutableInt32 aInt32 = new AMutableInt32(0);
-	protected AMutableDateTime aDateTime = new AMutableDateTime(0);
-	protected AMutableInt64 aInt64 = new AMutableInt64(0);
+    protected AMutableInt32 aInt32 = new AMutableInt32(0);
+    protected AMutableDateTime aDateTime = new AMutableDateTime(0);
+    protected AMutableInt64 aInt64 = new AMutableInt64(0);
 
-	@SuppressWarnings("unchecked")
-	protected ISerializerDeserializer<AInt32> intSerde = AqlSerializerDeserializerProvider.INSTANCE
-			.getSerializerDeserializer(BuiltinType.AINT32);
-	@SuppressWarnings("unchecked")
-	protected ISerializerDeserializer<ADateTime> dateTimeSerde = AqlSerializerDeserializerProvider.INSTANCE
-			.getSerializerDeserializer(BuiltinType.ADATETIME);
-	@SuppressWarnings("unchecked")
-	protected ISerializerDeserializer<AInt64> longSerde = AqlSerializerDeserializerProvider.INSTANCE
-			.getSerializerDeserializer(BuiltinType.AINT64);
-	@SuppressWarnings("unchecked")
-	private ISerializerDeserializer<ARecord> recordSerDes = AqlSerializerDeserializerProvider.INSTANCE
-			.getSerializerDeserializer(MetadataRecordTypes.EXTERNAL_FILE_RECORDTYPE);
+    @SuppressWarnings("unchecked")
+    protected ISerializerDeserializer<AInt32> intSerde = AqlSerializerDeserializerProvider.INSTANCE
+            .getSerializerDeserializer(BuiltinType.AINT32);
+    @SuppressWarnings("unchecked")
+    protected ISerializerDeserializer<ADateTime> dateTimeSerde = AqlSerializerDeserializerProvider.INSTANCE
+            .getSerializerDeserializer(BuiltinType.ADATETIME);
+    @SuppressWarnings("unchecked")
+    protected ISerializerDeserializer<AInt64> longSerde = AqlSerializerDeserializerProvider.INSTANCE
+            .getSerializerDeserializer(BuiltinType.AINT64);
+    @SuppressWarnings("unchecked")
+    private ISerializerDeserializer<ARecord> recordSerDes = AqlSerializerDeserializerProvider.INSTANCE
+            .getSerializerDeserializer(MetadataRecordTypes.EXTERNAL_FILE_RECORDTYPE);
 
-	public ExternalFileTupleTranslator(boolean getTuple) {
-		super(getTuple, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET
-				.getFieldCount());
-	}
+    public ExternalFileTupleTranslator(boolean getTuple) {
+        super(getTuple, MetadataPrimaryIndexes.EXTERNAL_FILE_DATASET.getFieldCount());
+    }
 
-	@Override
-	public ExternalFile getMetadataEntityFromTuple(ITupleReference tuple)
-			throws MetadataException, IOException {
-		byte[] serRecord = tuple
-				.getFieldData(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
-		int recordStartOffset = tuple
-				.getFieldStart(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
-		int recordLength = tuple
-				.getFieldLength(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
-		ByteArrayInputStream stream = new ByteArrayInputStream(serRecord,
-				recordStartOffset, recordLength);
-		DataInput in = new DataInputStream(stream);
-		ARecord externalFileRecord = (ARecord) recordSerDes.deserialize(in);
-		return createExternalFileFromARecord(externalFileRecord);
-	}
+    @Override
+    public ExternalFile getMetadataEntityFromTuple(ITupleReference tuple) throws MetadataException, IOException {
+        byte[] serRecord = tuple.getFieldData(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
+        int recordStartOffset = tuple.getFieldStart(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
+        int recordLength = tuple.getFieldLength(EXTERNAL_FILE_PAYLOAD_TUPLE_FIELD_INDEX);
+        ByteArrayInputStream stream = new ByteArrayInputStream(serRecord, recordStartOffset, recordLength);
+        DataInput in = new DataInputStream(stream);
+        ARecord externalFileRecord = (ARecord) recordSerDes.deserialize(in);
+        return createExternalFileFromARecord(externalFileRecord);
+    }
 
-	private ExternalFile createExternalFileFromARecord(
-			ARecord externalFileRecord) {
-		String dataverseName = ((AString) externalFileRecord
-				.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATAVERSENAME_FIELD_INDEX))
-				.getStringValue();
-		String datasetName = ((AString) externalFileRecord
-				.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATASET_NAME_FIELD_INDEX))
-				.getStringValue();
-		int fileNumber = ((AInt32) externalFileRecord
-				.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NUMBER_FIELD_INDEX))
-				.getIntegerValue();
-		String fileName = ((AString) externalFileRecord
-				.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NAME_FIELD_INDEX))
-				.getStringValue();
-		long fileSize = ((AInt64) externalFileRecord
-				.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_SIZE_FIELD_INDEX))
-				.getLongValue();
-		Date lastMoDifiedDate = new Date(
-				((ADateTime) externalFileRecord
-						.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_MOD_DATE_FIELD_INDEX))
-						.getChrononTime());
-		ExternalFilePendingOp pendingOp = ExternalFilePendingOp.values()[((AInt32) externalFileRecord
-				.getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_PENDING_OP_FIELD_INDEX))
-				.getIntegerValue()];
-		return new ExternalFile(dataverseName, datasetName, fileNumber,
-				fileName, lastMoDifiedDate, fileSize, pendingOp);
-	}
+    private ExternalFile createExternalFileFromARecord(ARecord externalFileRecord) {
+        String dataverseName = ((AString) externalFileRecord
+                .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATAVERSENAME_FIELD_INDEX)).getStringValue();
+        String datasetName = ((AString) externalFileRecord
+                .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATASET_NAME_FIELD_INDEX)).getStringValue();
+        int fileNumber = ((AInt32) externalFileRecord
+                .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NUMBER_FIELD_INDEX)).getIntegerValue();
+        String fileName = ((AString) externalFileRecord
+                .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NAME_FIELD_INDEX)).getStringValue();
+        long fileSize = ((AInt64) externalFileRecord
+                .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_SIZE_FIELD_INDEX)).getLongValue();
+        Date lastMoDifiedDate = new Date(
+                ((ADateTime) externalFileRecord
+                        .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_MOD_DATE_FIELD_INDEX))
+                        .getChrononTime());
+        ExternalFilePendingOp pendingOp = ExternalFilePendingOp.values()[((AInt32) externalFileRecord
+                .getValueByPos(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_PENDING_OP_FIELD_INDEX))
+                .getIntegerValue()];
+        return new ExternalFile(dataverseName, datasetName, fileNumber, fileName, lastMoDifiedDate, fileSize, pendingOp);
+    }
 
-	@Override
-	public ITupleReference getTupleFromMetadataEntity(ExternalFile externalFile)
-			throws MetadataException, IOException {
-		// write the key in the first 3 fields of the tuple
-		tupleBuilder.reset();
-		// dataverse name
-		aString.setValue(externalFile.getDataverseName());
-		stringSerde.serialize(aString, tupleBuilder.getDataOutput());
-		tupleBuilder.addFieldEndOffset();
-		// dataset name
-		aString.setValue(externalFile.getDatasetName());
-		stringSerde.serialize(aString, tupleBuilder.getDataOutput());
-		tupleBuilder.addFieldEndOffset();
-		// file number
-		aInt32.setValue(externalFile.getFileNumber());
-		intSerde.serialize(aInt32, tupleBuilder.getDataOutput());
-		tupleBuilder.addFieldEndOffset();
+    @Override
+    public ITupleReference getTupleFromMetadataEntity(ExternalFile externalFile) throws MetadataException, IOException {
+        // write the key in the first 3 fields of the tuple
+        tupleBuilder.reset();
+        // dataverse name
+        aString.setValue(externalFile.getDataverseName());
+        stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+        tupleBuilder.addFieldEndOffset();
+        // dataset name
+        aString.setValue(externalFile.getDatasetName());
+        stringSerde.serialize(aString, tupleBuilder.getDataOutput());
+        tupleBuilder.addFieldEndOffset();
+        // file number
+        aInt32.setValue(externalFile.getFileNumber());
+        intSerde.serialize(aInt32, tupleBuilder.getDataOutput());
+        tupleBuilder.addFieldEndOffset();
 
-		// write the pay-load in the fourth field of the tuple
-		recordBuilder.reset(MetadataRecordTypes.EXTERNAL_FILE_RECORDTYPE);
+        // write the pay-load in the fourth field of the tuple
+        recordBuilder.reset(MetadataRecordTypes.EXTERNAL_FILE_RECORDTYPE);
 
-		// write field 0
-		fieldValue.reset();
-		aString.setValue(externalFile.getDataverseName());
-		stringSerde.serialize(aString, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATAVERSENAME_FIELD_INDEX,
-						fieldValue);
+        // write field 0
+        fieldValue.reset();
+        aString.setValue(externalFile.getDataverseName());
+        stringSerde.serialize(aString, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATAVERSENAME_FIELD_INDEX, fieldValue);
 
-		// write field 1
-		fieldValue.reset();
-		aString.setValue(externalFile.getDatasetName());
-		stringSerde.serialize(aString, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATASET_NAME_FIELD_INDEX,
-						fieldValue);
+        // write field 1
+        fieldValue.reset();
+        aString.setValue(externalFile.getDatasetName());
+        stringSerde.serialize(aString, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_DATASET_NAME_FIELD_INDEX, fieldValue);
 
-		// write field 2
-		fieldValue.reset();
-		aInt32.setValue(externalFile.getFileNumber());
-		intSerde.serialize(aInt32, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NUMBER_FIELD_INDEX,
-						fieldValue);
+        // write field 2
+        fieldValue.reset();
+        aInt32.setValue(externalFile.getFileNumber());
+        intSerde.serialize(aInt32, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NUMBER_FIELD_INDEX, fieldValue);
 
-		// write field 3
-		fieldValue.reset();
-		aString.setValue(externalFile.getFileName());
-		stringSerde.serialize(aString, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NAME_FIELD_INDEX,
-						fieldValue);
+        // write field 3
+        fieldValue.reset();
+        aString.setValue(externalFile.getFileName());
+        stringSerde.serialize(aString, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_NAME_FIELD_INDEX, fieldValue);
 
-		// write field 4
-		fieldValue.reset();
-		aInt64.setValue(externalFile.getSize());
-		longSerde.serialize(aInt64, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_SIZE_FIELD_INDEX,
-						fieldValue);
+        // write field 4
+        fieldValue.reset();
+        aInt64.setValue(externalFile.getSize());
+        longSerde.serialize(aInt64, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_SIZE_FIELD_INDEX, fieldValue);
 
-		// write field 5
-		fieldValue.reset();
-		aDateTime.setValue(externalFile.getLastModefiedTime().getTime());
-		dateTimeSerde.serialize(aDateTime, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_MOD_DATE_FIELD_INDEX,
-						fieldValue);
+        // write field 5
+        fieldValue.reset();
+        aDateTime.setValue(externalFile.getLastModefiedTime().getTime());
+        dateTimeSerde.serialize(aDateTime, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_MOD_DATE_FIELD_INDEX, fieldValue);
 
-		// write field 6
-		fieldValue.reset();
-		aInt32.setValue(externalFile.getPendingOp().ordinal());
-		intSerde.serialize(aInt32, fieldValue.getDataOutput());
-		recordBuilder
-				.addField(
-						MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_PENDING_OP_FIELD_INDEX,
-						fieldValue);
+        // write field 6
+        fieldValue.reset();
+        aInt32.setValue(externalFile.getPendingOp().ordinal());
+        intSerde.serialize(aInt32, fieldValue.getDataOutput());
+        recordBuilder.addField(MetadataRecordTypes.EXTERNAL_FILE_ARECORD_FILE_PENDING_OP_FIELD_INDEX, fieldValue);
 
-		// write record
-		try {
-			recordBuilder.write(tupleBuilder.getDataOutput(), true);
-		} catch (AsterixException e) {
-			throw new MetadataException(e);
-		}
-		tupleBuilder.addFieldEndOffset();
+        // write record
+        try {
+            recordBuilder.write(tupleBuilder.getDataOutput(), true);
+        } catch (AsterixException e) {
+            throw new MetadataException(e);
+        }
+        tupleBuilder.addFieldEndOffset();
 
-		tuple.reset(tupleBuilder.getFieldEndOffsets(),
-				tupleBuilder.getByteArray());
-		return tuple;
-	}
+        tuple.reset(tupleBuilder.getFieldEndOffsets(), tupleBuilder.getByteArray());
+        return tuple;
+    }
 }
\ No newline at end of file
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalAvgAggregateFunction.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalAvgAggregateFunction.java
index c51787b..307f1e0 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalAvgAggregateFunction.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalAvgAggregateFunction.java
@@ -31,7 +31,7 @@
 
     @Override
     public void step(IFrameTupleReference tuple, byte[] state, int start, int len) throws AlgebricksException {
-    	processDataValues(tuple, state, start, len);
+        processDataValues(tuple, state, start, len);
     }
 
     @Override
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalSqlAvgAggregateFunction.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalSqlAvgAggregateFunction.java
index a472285..60b8788 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalSqlAvgAggregateFunction.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/aggregates/serializable/std/SerializableLocalSqlAvgAggregateFunction.java
@@ -29,7 +29,7 @@
 
     @Override
     public void step(IFrameTupleReference tuple, byte[] state, int start, int len) throws AlgebricksException {
-    	processDataValues(tuple, state, start, len);
+        processDataValues(tuple, state, start, len);
     }
 
     @Override
diff --git a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
index 8d50c1e..9a091e2 100644
--- a/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
+++ b/asterix-runtime/src/main/java/edu/uci/ics/asterix/runtime/evaluators/functions/EditDistanceStringIsFilterable.java
@@ -144,7 +144,7 @@
             }
             boolean usePrePost = BooleanSerializerDeserializer.getBoolean(argBuf.getByteArray(), 1);
 
-            // Compute result.			
+            // Compute result.
             int numGrams = (usePrePost) ? strLen + gramLen - 1 : strLen - gramLen + 1;
             int lowerBound = numGrams - edThresh * gramLen;
             try {
