diff --git a/asterix-app/src/test/java/edu/uci/ics/asterix/test/aql/TestsUtils.java b/asterix-app/src/test/java/edu/uci/ics/asterix/test/aql/TestsUtils.java
index 1555549..b82c13c 100644
--- a/asterix-app/src/test/java/edu/uci/ics/asterix/test/aql/TestsUtils.java
+++ b/asterix-app/src/test/java/edu/uci/ics/asterix/test/aql/TestsUtils.java
@@ -3,14 +3,21 @@
 import static org.junit.Assert.fail;
 
 import java.io.BufferedReader;
+import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileInputStream;
+import java.io.FileWriter;
+import java.io.IOException;
 import java.io.InputStreamReader;
 import java.io.PrintWriter;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 import org.json.JSONArray;
 import org.json.JSONException;
+import org.json.JSONObject;
 
+import edu.uci.ics.hyracks.algebricks.common.exceptions.NotImplementedException;
 import edu.uci.ics.hyracks.api.client.IHyracksClientConnection;
 
 public class TestsUtils {
@@ -31,57 +38,44 @@
         return path.delete();
     }
 
-    public static String getNextResult(JSONArray jArray) throws JSONException {
-        String result = null;
-        for (int i = 0; i < jArray.length(); i++) {
-            JSONArray resultArray = jArray.getJSONArray(i);
-            for (int j = 0; j < resultArray.length(); j++) {
-                return resultArray.getString(j);
-            }
-        }
-        return result;
-    }
-
     public static void runScriptAndCompareWithResult(IHyracksClientConnection hcc, File scriptFile, PrintWriter print,
-            File expectedFile, JSONArray jArray) throws Exception {
+            File expectedFile, File actualFile) throws Exception {
         BufferedReader readerExpected = new BufferedReader(new InputStreamReader(new FileInputStream(expectedFile),
                 "UTF-8"));
-
+        BufferedReader readerActual = new BufferedReader(
+                new InputStreamReader(new FileInputStream(actualFile), "UTF-8"));
         String lineExpected, lineActual;
-        int num = 0;
-        int chunkCounter = 0;
-        int recordCounter = 0;
-
+        int num = 1;
         try {
             while ((lineExpected = readerExpected.readLine()) != null) {
-                // Skip the blank line in the expected file.
-                if (lineExpected.isEmpty()) {
-                    continue;
+                lineActual = readerActual.readLine();
+                // Assert.assertEquals(lineExpected, lineActual);
+                if (lineActual == null) {
+                    if (lineExpected.isEmpty()) {
+                        continue;
+                    }
+                    throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected
+                            + "\n> ");
                 }
-                if (jArray.length() <= chunkCounter) {
-                    throw new Exception("No more results available.");
-                }
-                JSONArray resultArray = jArray.getJSONArray(chunkCounter);
 
-                if ((lineActual = resultArray.getString(recordCounter)) == null) {
-                    throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n<" + lineExpected
-                            + "\n>");
-
-                }
                 if (!equalStrings(lineExpected.split("Timestamp")[0], lineActual.split("Timestamp")[0])) {
                     fail("Result for " + scriptFile + " changed at line " + num + ":\n< " + lineExpected + "\n> "
                             + lineActual);
                 }
 
-                recordCounter++;
-                if (recordCounter >= resultArray.length()) {
-                    chunkCounter++;
-                    recordCounter = 0;
-                }
+                ++num;
             }
+            lineActual = readerActual.readLine();
+            // Assert.assertEquals(null, lineActual);
+            if (lineActual != null) {
+                throw new Exception("Result for " + scriptFile + " changed at line " + num + ":\n< \n> " + lineActual);
+            }
+            // actualFile.delete();
         } finally {
             readerExpected.close();
+            readerActual.close();
         }
+
     }
 
     private static boolean equalStrings(String s1, String s2) {
@@ -127,4 +121,80 @@
         return fname.substring(0, dot + 1) + EXTENSION_AQL_RESULT;
     }
 
+    public static void writeResultsToFile(File actualFile, JSONObject result) throws IOException, JSONException {
+        System.out.println("Writer filename: " + actualFile.toString());
+        BufferedWriter writer = new BufferedWriter(new FileWriter(actualFile));
+        Results res = new Results(result);
+        for (String line : res) {
+            writer.write(line);
+            writer.newLine();
+        }
+        writer.close();
+    }
+
+    public static class Results implements Iterable<String> {
+        private final JSONArray chunks;
+
+        public Results(JSONObject result) throws JSONException {
+            chunks = result.getJSONArray("results");
+        }
+
+        public Iterator<String> iterator() {
+            return new ResultIterator(chunks);
+        }
+    }
+
+    public static class ResultIterator implements Iterator<String> {
+        private final JSONArray chunks;
+
+        private int chunkCounter = 0;
+        private int recordCounter = 0;
+
+        public ResultIterator(JSONArray chunks) {
+            this.chunks = chunks;
+        }
+
+        @Override
+        public boolean hasNext() {
+            JSONArray resultArray;
+            try {
+                resultArray = chunks.getJSONArray(chunkCounter);
+                if (resultArray.getString(recordCounter) != null) {
+                    return true;
+                }
+            } catch (JSONException e) {
+                return false;
+            }
+            return false;
+        }
+
+        @Override
+        public String next() throws NoSuchElementException {
+            JSONArray resultArray;
+            String item = "";
+
+            try {
+                resultArray = chunks.getJSONArray(chunkCounter);
+                item = resultArray.getString(recordCounter);
+                if (item == null) {
+                    throw new NoSuchElementException();
+                }
+                item = item.trim();
+
+                recordCounter++;
+                if (recordCounter >= resultArray.length()) {
+                    chunkCounter++;
+                    recordCounter = 0;
+                }
+            } catch (JSONException e) {
+                throw new NoSuchElementException(e.getMessage());
+            }
+            return item;
+        }
+
+        @Override
+        public void remove() {
+            throw new NotImplementedException();
+        }
+    }
 }
diff --git a/asterix-app/src/test/java/edu/uci/ics/asterix/test/metadata/MetadataTest.java b/asterix-app/src/test/java/edu/uci/ics/asterix/test/metadata/MetadataTest.java
index 2519544..7ab39f4 100644
--- a/asterix-app/src/test/java/edu/uci/ics/asterix/test/metadata/MetadataTest.java
+++ b/asterix-app/src/test/java/edu/uci/ics/asterix/test/metadata/MetadataTest.java
@@ -260,11 +260,19 @@
                                 }
                             } else {
                                 expectedResultFile = expectedResultFileCtxs.get(queryCount).getFile();
-                                TestsUtils
-                                        .runScriptAndCompareWithResult(
-                                                AsterixHyracksIntegrationUtil.getHyracksClientConnection(), testFile,
-                                                new PrintWriter(System.err), expectedResultFile,
-                                                result.getJSONArray("results"));
+
+                                File actualFile = new File(PATH_ACTUAL + File.separator
+                                        + tcCtx.getTestCase().getFilePath().replace(File.separator, "_") + "_"
+                                        + cUnit.getName() + ".adm");
+
+                                File actualResultFile = tcCtx.getActualResultFile(cUnit, new File(PATH_ACTUAL));
+                                actualResultFile.getParentFile().mkdirs();
+
+                                TestsUtils.writeResultsToFile(actualFile, result);
+
+                                TestsUtils.runScriptAndCompareWithResult(
+                                        AsterixHyracksIntegrationUtil.getHyracksClientConnection(), testFile,
+                                        new PrintWriter(System.err), expectedResultFile, actualFile);
                             }
                             queryCount++;
                             break;
diff --git a/asterix-app/src/test/java/edu/uci/ics/asterix/test/runtime/ExecutionTest.java b/asterix-app/src/test/java/edu/uci/ics/asterix/test/runtime/ExecutionTest.java
index aacec61..974eb94 100644
--- a/asterix-app/src/test/java/edu/uci/ics/asterix/test/runtime/ExecutionTest.java
+++ b/asterix-app/src/test/java/edu/uci/ics/asterix/test/runtime/ExecutionTest.java
@@ -233,13 +233,6 @@
         for (CompilationUnit cUnit : cUnits) {
             LOGGER.info("[TEST]: " + tcCtx.getTestCase().getFilePath() + "/" + cUnit.getName());
 
-//            if (!(tcCtx.getTestCase().getFilePath().contains("dml") && cUnit.getName().equals(
-//                    "delete-from-loaded-dataset-with-index"))) {
-//                continue;
-//            }
-//
-//            System.out.println("/Test/: " + tcCtx.getTestCase().getFilePath() + "/" + cUnit.getName());
-
             testFileCtxs = tcCtx.getTestFiles(cUnit);
             expectedResultFileCtxs = tcCtx.getExpectedResultFiles(cUnit);
 
@@ -262,11 +255,19 @@
                                 }
                             } else {
                                 expectedResultFile = expectedResultFileCtxs.get(queryCount).getFile();
-                                TestsUtils
-                                        .runScriptAndCompareWithResult(
-                                                AsterixHyracksIntegrationUtil.getHyracksClientConnection(), testFile,
-                                                new PrintWriter(System.err), expectedResultFile,
-                                                result.getJSONArray("results"));
+
+                                File actualFile = new File(PATH_ACTUAL + File.separator
+                                        + tcCtx.getTestCase().getFilePath().replace(File.separator, "_") + "_"
+                                        + cUnit.getName() + ".adm");
+
+                                File actualResultFile = tcCtx.getActualResultFile(cUnit, new File(PATH_ACTUAL));
+                                actualResultFile.getParentFile().mkdirs();
+
+                                TestsUtils.writeResultsToFile(actualFile, result);
+
+                                TestsUtils.runScriptAndCompareWithResult(
+                                        AsterixHyracksIntegrationUtil.getHyracksClientConnection(), testFile,
+                                        new PrintWriter(System.err), expectedResultFile, actualFile);
                             }
                             queryCount++;
                             break;
diff --git a/asterix-test-framework/src/main/java/edu/uci/ics/asterix/testframework/context/TestCaseContext.java b/asterix-test-framework/src/main/java/edu/uci/ics/asterix/testframework/context/TestCaseContext.java
index d1818ff..bb89a76 100644
--- a/asterix-test-framework/src/main/java/edu/uci/ics/asterix/testframework/context/TestCaseContext.java
+++ b/asterix-test-framework/src/main/java/edu/uci/ics/asterix/testframework/context/TestCaseContext.java
@@ -107,6 +107,13 @@
         return resultFileCtxs;
     }
 
+    public File getActualResultFile(CompilationUnit cUnit, File actualResultsBase) {
+        File path = actualResultsBase;
+        path = new File(path, testSuite.getResultOffsetPath());
+        path = new File(path, testCase.getFilePath());
+        return new File(path, cUnit.getOutputDir().getValue() + ".adm");
+    }
+
     public static class Builder {
         public Builder() {
         }
