diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/QuotedLineRecordReader.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/QuotedLineRecordReader.java
index c6e78b0..e6e8ae0 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/QuotedLineRecordReader.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/input/record/reader/stream/QuotedLineRecordReader.java
@@ -37,7 +37,7 @@
 public class QuotedLineRecordReader extends LineRecordReader {
 
     private char quote;
-    private char quoteEscape;
+    private char escape;
     private boolean prevCharEscape;
     private int readLength;
     private boolean inQuote;
@@ -54,7 +54,7 @@
         String quoteString = config.get(ExternalDataConstants.KEY_QUOTE);
         ExternalDataUtils.validateQuote(quoteString);
         this.quote = quoteString.charAt(0);
-        this.quoteEscape = ExternalDataUtils.validateGetQuoteEscape(config);
+        this.escape = ExternalDataUtils.validateGetEscape(config);
     }
 
     @Override
@@ -117,7 +117,7 @@
                 }
                 boolean maybeInQuote = false;
                 for (; bufferPosn < bufferLength; ++bufferPosn) {
-                    if (inputBuffer[bufferPosn] == quote && quoteEscape == quote) {
+                    if (inputBuffer[bufferPosn] == quote && escape == quote) {
                         inQuote |= maybeInQuote;
                         prevCharEscape |= maybeInQuote;
                     }
@@ -135,18 +135,16 @@
                         prevCharCR = (inputBuffer[bufferPosn] == ExternalDataConstants.CR);
                         // if this is an opening quote, mark it
                         inQuote = inputBuffer[bufferPosn] == quote && !prevCharEscape;
-                        // the quoteEscape != quote is for making an opening quote not an escape
-                        prevCharEscape =
-                                inputBuffer[bufferPosn] == quoteEscape && !prevCharEscape && quoteEscape != quote;
+                        // the escape != quote is for making an opening quote not an escape
+                        prevCharEscape = inputBuffer[bufferPosn] == escape && !prevCharEscape && escape != quote;
                     } else {
-                        // if quote == quoteEscape and current char is quote, then it could be closing or escaping
+                        // if quote == escape and current char is quote, then it could be closing or escaping
                         if (inputBuffer[bufferPosn] == quote && !prevCharEscape) {
                             // this is most likely a closing quote. the outcome depends on the next char
                             inQuote = false;
                             maybeInQuote = true;
                         }
-                        prevCharEscape =
-                                inputBuffer[bufferPosn] == quoteEscape && !prevCharEscape && quoteEscape != quote;
+                        prevCharEscape = inputBuffer[bufferPosn] == escape && !prevCharEscape && escape != quote;
                     }
                 }
                 readLength = bufferPosn - startPosn;
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java
index 7d1cdc0..ce95435 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataConstants.java
@@ -71,7 +71,7 @@
     public static final String KEY_LOCAL_SOCKET_PATH = "local-socket-path";
     public static final String KEY_FORMAT = "format";
     public static final String KEY_QUOTE = "quote";
-    public static final String KEY_QUOTE_ESCAPE = "quote-escape";
+    public static final String KEY_ESCAPE = "escape";
     public static final String KEY_PARSER = "parser";
     public static final String KEY_DATASET_RECORD = "dataset-record";
     public static final String KEY_HIVE_SERDE = "hive-serde";
diff --git a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataUtils.java b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataUtils.java
index b1f11c9..409b69b 100644
--- a/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataUtils.java
+++ b/asterixdb/asterix-external-data/src/main/java/org/apache/asterix/external/util/ExternalDataUtils.java
@@ -82,13 +82,13 @@
         return quote;
     }
 
-    public static char validateGetQuoteEscape(Map<String, String> configuration) throws HyracksDataException {
-        String quoteEscapeValue = configuration.get(ExternalDataConstants.KEY_QUOTE_ESCAPE);
-        if (quoteEscapeValue == null) {
+    public static char validateGetEscape(Map<String, String> configuration) throws HyracksDataException {
+        String escapeValue = configuration.get(ExternalDataConstants.KEY_ESCAPE);
+        if (escapeValue == null) {
             return ExternalDataConstants.ESCAPE;
         }
-        validateQuoteEscape(quoteEscapeValue);
-        return quoteEscapeValue.charAt(0);
+        validateEscape(escapeValue);
+        return escapeValue.charAt(0);
     }
 
     public static void validateDataParserParameters(Map<String, String> configuration) throws AsterixException {
@@ -331,11 +331,11 @@
             if (format.equals(ExternalDataConstants.FORMAT_CSV)) {
                 configuration.putIfAbsent(ExternalDataConstants.KEY_DELIMITER, ExternalDataConstants.DEFAULT_DELIMITER);
                 configuration.putIfAbsent(ExternalDataConstants.KEY_QUOTE, ExternalDataConstants.DEFAULT_QUOTE);
-                configuration.putIfAbsent(ExternalDataConstants.KEY_QUOTE_ESCAPE, ExternalDataConstants.DEFAULT_QUOTE);
+                configuration.putIfAbsent(ExternalDataConstants.KEY_ESCAPE, ExternalDataConstants.DEFAULT_QUOTE);
             } else if (format.equals(ExternalDataConstants.FORMAT_TSV)) {
                 configuration.putIfAbsent(ExternalDataConstants.KEY_DELIMITER, ExternalDataConstants.TAB_STR);
                 configuration.putIfAbsent(ExternalDataConstants.KEY_QUOTE, ExternalDataConstants.NULL_STR);
-                configuration.putIfAbsent(ExternalDataConstants.KEY_QUOTE_ESCAPE, ExternalDataConstants.NULL_STR);
+                configuration.putIfAbsent(ExternalDataConstants.KEY_ESCAPE, ExternalDataConstants.NULL_STR);
             }
         }
     }
@@ -396,7 +396,7 @@
         }
         char delimiter = validateGetDelimiter(configuration);
         validateGetQuote(configuration, delimiter);
-        validateGetQuoteEscape(configuration);
+        validateGetEscape(configuration);
         String value = configuration.get(KEY_REDACT_WARNINGS);
         if (value != null && !isBoolean(value)) {
             throw new RuntimeDataException(ErrorCode.INVALID_REQ_PARAM_VAL, KEY_REDACT_WARNINGS, value);
@@ -425,10 +425,9 @@
         }
     }
 
-    private static void validateQuoteEscape(String quoteEsc) throws RuntimeDataException {
-        if (quoteEsc.length() != 1) {
-            throw new RuntimeDataException(ErrorCode.PARSER_INVALID_CHAR_LENGTH, quoteEsc,
-                    ExternalDataConstants.KEY_QUOTE_ESCAPE);
+    private static void validateEscape(String esc) throws RuntimeDataException {
+        if (esc.length() != 1) {
+            throw new RuntimeDataException(ErrorCode.PARSER_INVALID_CHAR_LENGTH, esc, ExternalDataConstants.KEY_ESCAPE);
         }
     }
 
