diff --git a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/DmlTranslator.java b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/DmlTranslator.java
index 9e2150c..798e92d 100644
--- a/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/DmlTranslator.java
+++ b/asterix-algebra/src/main/java/edu/uci/ics/asterix/translator/DmlTranslator.java
@@ -12,6 +12,7 @@
 import edu.uci.ics.asterix.aql.expression.BeginFeedStatement;
 import edu.uci.ics.asterix.aql.expression.CallExpr;
 import edu.uci.ics.asterix.aql.expression.ControlFeedStatement;
+import edu.uci.ics.asterix.aql.expression.ControlFeedStatement.OperationType;
 import edu.uci.ics.asterix.aql.expression.CreateIndexStatement;
 import edu.uci.ics.asterix.aql.expression.DeleteStatement;
 import edu.uci.ics.asterix.aql.expression.FLWOGRExpression;
@@ -27,7 +28,6 @@
 import edu.uci.ics.asterix.aql.expression.VariableExpr;
 import edu.uci.ics.asterix.aql.expression.WhereClause;
 import edu.uci.ics.asterix.aql.expression.WriteFromQueryResultStatement;
-import edu.uci.ics.asterix.aql.expression.ControlFeedStatement.OperationType;
 import edu.uci.ics.asterix.aql.literal.StringLiteral;
 import edu.uci.ics.asterix.common.config.DatasetConfig.DatasetType;
 import edu.uci.ics.asterix.common.config.DatasetConfig.IndexType;
@@ -39,6 +39,7 @@
 import edu.uci.ics.asterix.metadata.declared.AqlCompiledMetadataDeclarations;
 import edu.uci.ics.asterix.metadata.entities.Dataset;
 import edu.uci.ics.asterix.metadata.entities.FeedDatasetDetails;
+import edu.uci.ics.asterix.metadata.entities.Index;
 import edu.uci.ics.asterix.om.functions.AsterixFunction;
 import edu.uci.ics.asterix.om.types.ARecordType;
 import edu.uci.ics.asterix.om.types.IAType;
@@ -70,16 +71,28 @@
         return compiledDmlStatements;
     }
 
-    private List<ICompiledDmlStatement> compileDmlStatements() throws AlgebricksException {
+    private List<ICompiledDmlStatement> compileDmlStatements() throws AlgebricksException, MetadataException {
         List<ICompiledDmlStatement> dmlStatements = new ArrayList<ICompiledDmlStatement>();
         for (Statement stmt : aqlStatements) {
             validateOperation(compiledDeclarations, stmt);
             switch (stmt.getKind()) {
                 case LOAD_FROM_FILE: {
-                    LoadFromFileStatement st1 = (LoadFromFileStatement) stmt;
-                    CompiledLoadFromFileStatement cls = new CompiledLoadFromFileStatement(st1.getDatasetName()
-                            .getValue(), st1.getAdapter(), st1.getProperties(), st1.dataIsAlreadySorted());
+                    LoadFromFileStatement loadStmt = (LoadFromFileStatement) stmt;
+                    CompiledLoadFromFileStatement cls = new CompiledLoadFromFileStatement(loadStmt.getDatasetName()
+                            .getValue(), loadStmt.getAdapter(), loadStmt.getProperties(), loadStmt.dataIsAlreadySorted());
                     dmlStatements.add(cls);
+                    // Also load the dataset's secondary indexes.
+                    List<Index> datasetIndexes = MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx,
+                    		compiledDeclarations.getDataverseName(), loadStmt.getDatasetName().getValue());
+                    for (Index index : datasetIndexes) {
+                        if (!index.isSecondaryIndex()) {
+                            continue;
+                        }
+                        // Create CompiledCreateIndexStatement from metadata entity 'index'.
+                        CompiledCreateIndexStatement cis = new CompiledCreateIndexStatement(index.getIndexName(),
+                                index.getDatasetName(), index.getKeyFieldNames(), index.getIndexType());
+                        dmlStatements.add(cis);
+                    }
                     break;
                 }
                 case WRITE_FROM_QUERY_RESULT: {
@@ -91,11 +104,27 @@
                 }
                 case CREATE_INDEX: {
                     CreateIndexStatement cis = (CreateIndexStatement) stmt;
+                    // Assumptions: We first processed the DDL, which added the secondary index to the metadata.
+                    // If the index's dataset is being loaded in this 'session', then let the load add 
+                    // the CompiledCreateIndexStatement to dmlStatements, and don't add it again here.
+                    // It's better to have the load handle this because:
+                    // 1. There may be more secondary indexes to load, which were possibly created in an earlier session.
+                    // 2. If the create index stmt came before the load stmt, then we would first create an empty index only to load it again later. 
+                    // This may cause problems because the index would be considered loaded (even though it was loaded empty). 
+                    for (Statement s : aqlStatements) {
+                    	if (s.getKind() != Kind.LOAD_FROM_FILE) {
+                    		continue;
+                    	}
+                    	LoadFromFileStatement loadStmt = (LoadFromFileStatement) s;
+                    	if (loadStmt.getDatasetName().equals(cis.getDatasetName())) {
+                    		cis.setNeedToCreate(false);
+                    	}
+                    }
                     if (cis.getNeedToCreate()) {
                         CompiledCreateIndexStatement ccis = new CompiledCreateIndexStatement(cis.getIndexName()
                                 .getValue(), cis.getDatasetName().getValue(), cis.getFieldExprs(), cis.getIndexType());
                         dmlStatements.add(ccis);
-                    }
+                    } 
                     break;
                 }
                 case INSERT: {
diff --git a/asterix-app/src/main/java/edu/uci/ics/asterix/api/common/APIFramework.java b/asterix-app/src/main/java/edu/uci/ics/asterix/api/common/APIFramework.java
index b0b27ed..a5e28a5 100644
--- a/asterix-app/src/main/java/edu/uci/ics/asterix/api/common/APIFramework.java
+++ b/asterix-app/src/main/java/edu/uci/ics/asterix/api/common/APIFramework.java
@@ -195,19 +195,6 @@
                     case LOAD_FROM_FILE: {
                         CompiledLoadFromFileStatement stmtLoad = (CompiledLoadFromFileStatement) stmt;
                         dmlJobs.addAll(DatasetOperations.createLoadDatasetJobSpec(stmtLoad, metadata));
-                        // Also load the dataset's secondary indexes.
-                        List<Index> datasetIndexes = MetadataManager.INSTANCE.getDatasetIndexes(mdTxnCtx,
-                                dataverseName, stmtLoad.getDatasetName());
-                        for (Index index : datasetIndexes) {
-                            if (!index.isSecondaryIndex()) {
-                                continue;
-                            }
-                            // Recreate CompiledCreateIndexStatement from metadata entity 'index'.
-                            CompiledCreateIndexStatement cis = new CompiledCreateIndexStatement(index.getIndexName(),
-                                    index.getDatasetName(), index.getKeyFieldNames(), index.getIndexType());
-                            JobSpecification jobSpec = IndexOperations.buildCreateIndexJobSpec(cis, metadata);
-                            dmlJobs.add(new Job(jobSpec));
-                        }
                         break;
                     }
                     case WRITE_FROM_QUERY_RESULT: {
