diff --git a/CHANGES b/CHANGES
index f7aba71..d55e4b8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -24,6 +24,8 @@
 
   BUG FIXES
 
+    TAJO-2013: FilterPushDownRule fails due to the unsupported index. (jinho)
+
     TAJO-2014: TestRpcClientManager fails occasionally. (jinho)
 
     TAJO-2000: BSTIndex can cause OOM. (jinho)
diff --git a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
index e44bba5..1ac29ef 100644
--- a/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
+++ b/tajo-plan/src/main/java/org/apache/tajo/plan/rewrite/rules/FilterPushDownRule.java
@@ -24,6 +24,7 @@
 import com.google.common.collect.Sets;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.tajo.SessionVars;
 import org.apache.tajo.algebra.JoinType;
 import org.apache.tajo.catalog.*;
 import org.apache.tajo.datum.Datum;
@@ -57,7 +58,8 @@
   private CatalogService catalog;
 
   static class FilterPushDownContext {
-    Set<EvalNode> pushingDownFilters = TUtil.newHashSet();
+    Set<EvalNode> pushingDownFilters = new HashSet<>();
+    LogicalPlanRewriteRuleContext rewriteRuleContext;
 
     public void clear() {
       pushingDownFilters.clear();
@@ -111,6 +113,7 @@
         . It not, create new HavingNode and set parent's child.
      */
     FilterPushDownContext context = new FilterPushDownContext();
+    context.rewriteRuleContext = rewriteRuleContext;
     LogicalPlan plan = rewriteRuleContext.getPlan();
     catalog = rewriteRuleContext.getCatalog();
     for (LogicalPlan.QueryBlock block : plan.getQueryBlocks()) {
@@ -129,7 +132,7 @@
   @Override
   public LogicalNode visitFilter(FilterPushDownContext context, LogicalPlan plan, LogicalPlan.QueryBlock block,
                                  SelectionNode selNode, Stack<LogicalNode> stack) throws TajoException {
-    context.pushingDownFilters.addAll(TUtil.newHashSet(AlgebraicUtil.toConjunctiveNormalFormArray(selNode.getQual())));
+    context.pushingDownFilters.addAll(new HashSet<>(Arrays.asList(AlgebraicUtil.toConjunctiveNormalFormArray(selNode.getQual()))));
 
     stack.push(selNode);
     visit(context, plan, block, selNode.getChild(), stack);
@@ -147,7 +150,7 @@
     } else { // if there remain search conditions
 
       // check if it can be evaluated here
-      Set<EvalNode> matched = TUtil.newHashSet();
+      Set<EvalNode> matched = new HashSet<>();
       for (EvalNode eachEval : context.pushingDownFilters) {
         if (LogicalPlanner.checkIfBeEvaluatedAtThis(eachEval, selNode)) {
           matched.add(eachEval);
@@ -168,9 +171,9 @@
   @Override
   public LogicalNode visitJoin(FilterPushDownContext context, LogicalPlan plan, LogicalPlan.QueryBlock block,
                                JoinNode joinNode, Stack<LogicalNode> stack) throws TajoException {
-    Set<EvalNode> onPredicates = TUtil.newHashSet();
+    Set<EvalNode> onPredicates = new HashSet<>();
     if (joinNode.hasJoinQual()) {
-      onPredicates.addAll(TUtil.newHashSet(AlgebraicUtil.toConjunctiveNormalFormArray(joinNode.getJoinQual())));
+      onPredicates.addAll(new HashSet<>(Arrays.asList(AlgebraicUtil.toConjunctiveNormalFormArray(joinNode.getJoinQual()))));
     }
     // clear join qual
     joinNode.clearJoinQual();
@@ -293,7 +296,7 @@
                                                            final Set<EvalNode> onPredicates,
                                                            final Set<EvalNode> wherePredicates)
       throws TajoException {
-    Set<EvalNode> nonPushableQuals = TUtil.newHashSet();
+    Set<EvalNode> nonPushableQuals = new HashSet<>();
     // TODO: non-equi theta join quals must not be pushed until TAJO-742 is resolved.
     nonPushableQuals.addAll(extractNonEquiThetaJoinQuals(wherePredicates, block, joinNode));
     nonPushableQuals.addAll(extractNonEquiThetaJoinQuals(onPredicates, block, joinNode));
@@ -340,8 +343,8 @@
                                                                 final Set<EvalNode> onPredicates,
                                                                 final Set<EvalNode> wherePredicates,
                                                                 final JoinNode joinNode) throws TajoException {
-    Set<String> nullSupplyingTableNameSet = TUtil.newHashSet();
-    Set<String> preservedTableNameSet = TUtil.newHashSet();
+    Set<String> nullSupplyingTableNameSet = new HashSet<>();
+    Set<String> preservedTableNameSet = new HashSet<>();
     String leftRelation = PlannerUtil.getTopRelationInLineage(plan, joinNode.getLeftChild());
     String rightRelation = PlannerUtil.getTopRelationInLineage(plan, joinNode.getRightChild());
 
@@ -359,7 +362,7 @@
       nullSupplyingTableNameSet.add(rightRelation);
     }
 
-    Set<EvalNode> nonPushableQuals = TUtil.newHashSet();
+    Set<EvalNode> nonPushableQuals = new HashSet<>();
     for (EvalNode eachQual : onPredicates) {
       for (String relName : preservedTableNameSet) {
         if (isEvalNeedRelation(eachQual, relName)) {
@@ -425,7 +428,7 @@
       LogicalPlan.QueryBlock block,
       LogicalNode node, LogicalNode childNode) throws TajoException {
     // transformed -> pushingDownFilters
-    Map<EvalNode, EvalNode> transformedMap = TUtil.newHashMap();
+    Map<EvalNode, EvalNode> transformedMap = new HashMap<>();
 
     if (originEvals.isEmpty()) {
       return transformedMap;
@@ -483,7 +486,7 @@
     }
 
     // node in column -> child out column
-    Map<String, String> columnMap = TUtil.newHashMap();
+    Map<String, String> columnMap = new HashMap<>();
 
     for (int i = 0; i < node.getInSchema().size(); i++) {
       String inColumnName = node.getInSchema().getColumn(i).getQualifiedName();
@@ -643,7 +646,7 @@
   }
 
   private Collection<EvalNode> reverseTransform(BiMap<EvalNode, EvalNode> map, Set<EvalNode> remainFilters) {
-    Set<EvalNode> reversed = TUtil.newHashSet();
+    Set<EvalNode> reversed = new HashSet<>();
     for (EvalNode evalNode : remainFilters) {
       reversed.add(map.get(evalNode));
     }
@@ -655,7 +658,7 @@
       LogicalNode childNode, List<EvalNode> notMatched,
       Set<String> partitionColumns, int columnOffset) throws TajoException {
     // canonical name -> target
-    Map<String, Target> nodeTargetMap = TUtil.newHashMap();
+    Map<String, Target> nodeTargetMap = new HashMap<>();
     for (Target target : node.getTargets()) {
       nodeTargetMap.put(target.getCanonicalName(), target);
     }
@@ -780,8 +783,8 @@
                                        HavingNode havingNode,
                                        GroupbyNode groupByNode) throws TajoException {
     // find aggregation column
-    Set<Column> groupingColumns = TUtil.newHashSet(groupByNode.getGroupingColumns());
-    Set<String> aggrFunctionOutColumns = TUtil.newHashSet();
+    Set<Column> groupingColumns = new HashSet<>(Arrays.asList(groupByNode.getGroupingColumns()));
+    Set<String> aggrFunctionOutColumns = new HashSet<>();
     for (Column column : groupByNode.getOutSchema().getRootColumns()) {
       if (!groupingColumns.contains(column)) {
         aggrFunctionOutColumns.add(column.getQualifiedName());
@@ -896,7 +899,7 @@
     List<EvalNode> matched = TUtil.newList();
 
     // find partition column and check matching
-    Set<String> partitionColumns = TUtil.newHashSet();
+    Set<String> partitionColumns = new HashSet<>();
     TableDesc table = scanNode.getTableDesc();
     boolean hasQualifiedName = false;
     if (table.hasPartition()) {
@@ -905,7 +908,7 @@
         hasQualifiedName = c.hasQualifier();
       }
     }
-    Set<EvalNode> partitionEvals = TUtil.newHashSet();
+    Set<EvalNode> partitionEvals = new HashSet<>();
     for (EvalNode eval : context.pushingDownFilters) {
       if (table.hasPartition()) {
         Set<Column> columns = EvalTreeUtil.findUniqueColumns(eval);
@@ -966,35 +969,37 @@
       scanNode.setQual(qual);
 
       // Index path can be identified only after filters are pushed into each scan.
-      String databaseName, tableName;
-      databaseName = CatalogUtil.extractQualifier(table.getName());
-      tableName = CatalogUtil.extractSimpleName(table.getName());
-      Set<Predicate> predicates = TUtil.newHashSet();
-      for (EvalNode eval : PlannerUtil.getAllEqualEvals(qual)) {
-        BinaryEval binaryEval = (BinaryEval) eval;
-        // TODO: consider more complex predicates
-        if (binaryEval.getLeftExpr().getType() == EvalType.FIELD &&
-            binaryEval.getRightExpr().getType() == EvalType.CONST) {
-          predicates.add(new Predicate(binaryEval.getType(),
-              ((FieldEval) binaryEval.getLeftExpr()).getColumnRef(),
-              ((ConstEval)binaryEval.getRightExpr()).getValue()));
-        } else if (binaryEval.getLeftExpr().getType() == EvalType.CONST &&
-            binaryEval.getRightExpr().getType() == EvalType.FIELD) {
-          predicates.add(new Predicate(binaryEval.getType(),
-              ((FieldEval) binaryEval.getRightExpr()).getColumnRef(),
-              ((ConstEval)binaryEval.getLeftExpr()).getValue()));
+      if(context.rewriteRuleContext.getQueryContext().getBool(SessionVars.INDEX_ENABLED)) {
+        String databaseName, tableName;
+        databaseName = CatalogUtil.extractQualifier(table.getName());
+        tableName = CatalogUtil.extractSimpleName(table.getName());
+        Set<Predicate> predicates = new HashSet<>();
+        for (EvalNode eval : PlannerUtil.getAllEqualEvals(qual)) {
+          BinaryEval binaryEval = (BinaryEval) eval;
+          // TODO: consider more complex predicates
+          if (binaryEval.getLeftExpr().getType() == EvalType.FIELD &&
+              binaryEval.getRightExpr().getType() == EvalType.CONST) {
+            predicates.add(new Predicate(binaryEval.getType(),
+                ((FieldEval) binaryEval.getLeftExpr()).getColumnRef(),
+                ((ConstEval) binaryEval.getRightExpr()).getValue()));
+          } else if (binaryEval.getLeftExpr().getType() == EvalType.CONST &&
+              binaryEval.getRightExpr().getType() == EvalType.FIELD) {
+            predicates.add(new Predicate(binaryEval.getType(),
+                ((FieldEval) binaryEval.getRightExpr()).getColumnRef(),
+                ((ConstEval) binaryEval.getLeftExpr()).getValue()));
+          }
         }
-      }
 
-      // for every subset of the set of columns, find all matched index paths
-      for (Set<Predicate> subset : Sets.powerSet(predicates)) {
-        if (subset.size() == 0)
-          continue;
-        Column[] columns = extractColumns(subset);
-        if (catalog.existIndexByColumns(databaseName, tableName, columns)) {
-          IndexDesc indexDesc = catalog.getIndexByColumns(databaseName, tableName, columns);
-          block.addAccessPath(scanNode, new IndexScanInfo(
-              table.getStats(), indexDesc, getSimplePredicates(indexDesc, subset)));
+        // for every subset of the set of columns, find all matched index paths
+        for (Set<Predicate> subset : Sets.powerSet(predicates)) {
+          if (subset.size() == 0)
+            continue;
+          Column[] columns = extractColumns(subset);
+          if (catalog.existIndexByColumns(databaseName, tableName, columns)) {
+            IndexDesc indexDesc = catalog.getIndexByColumns(databaseName, tableName, columns);
+            block.addAccessPath(scanNode, new IndexScanInfo(
+                table.getStats(), indexDesc, getSimplePredicates(indexDesc, subset)));
+          }
         }
       }
     }
@@ -1023,7 +1028,7 @@
 
   private static SimplePredicate[] getSimplePredicates(IndexDesc desc, Set<Predicate> predicates) {
     SimplePredicate[] simplePredicates = new SimplePredicate[predicates.size()];
-    Map<Column, Datum> colToValue = TUtil.newHashMap();
+    Map<Column, Datum> colToValue = new HashMap<>();
     for (Predicate predicate : predicates) {
       colToValue.put(predicate.column, predicate.value);
     }
