diff --git a/src/java/org/apache/sqoop/orm/ClassWriter.java b/src/java/org/apache/sqoop/orm/ClassWriter.java
index e289429..6f6e66b 100644
--- a/src/java/org/apache/sqoop/orm/ClassWriter.java
+++ b/src/java/org/apache/sqoop/orm/ClassWriter.java
@@ -1099,7 +1099,7 @@
           sb.append("    setters.put(\"" + serializeRawColName(rawColName) + "\", new FieldSetterCommand() {" + sep);
           sb.append("      @Override" + sep);
           sb.append("      public void setField(Object value) {" + sep);
-          sb.append("        " + colName + " = (" + javaType + ")value;" + sep);
+          sb.append("        " +typeName+".this." + colName + " = (" + javaType + ")value;" + sep);
           sb.append("      }" + sep);
           sb.append("    });" + sep);
         }
diff --git a/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java b/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java
index 6f87a18..ff3dde1 100644
--- a/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java
+++ b/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java
@@ -102,8 +102,8 @@
     Object expectedMin = generator.getDBValue(minId);
     Object expectedMax = generator.getDBValue(maxId);
 
-    utils.assertSqlColValForRowId(conn, table, minId, colName, expectedMin);
-    utils.assertSqlColValForRowId(conn, table, maxId, colName, expectedMax);
+    utils.assertSqlColValForRowId(conn, table, minId, colName, true, expectedMin);
+    utils.assertSqlColValForRowId(conn, table, maxId, colName, true, expectedMax);
   }
 
   protected void runHCatExport(List<String> addlArgsArray,
@@ -111,7 +111,7 @@
     ColumnGenerator[] cols) throws Exception {
     utils.createHCatTable(CreateMode.CREATE_AND_LOAD,
       totalRecords, table, cols);
-    utils.createSqlTable(getConnection(), true, totalRecords, table, cols);
+    utils.createSqlTable(getConnection(), true, totalRecords, table, true, cols);
     Map<String, String> addlArgsMap = utils.getAddlTestArgs();
     addlArgsArray.add("--verbose");
     addlArgsArray.add("-m");
@@ -138,7 +138,7 @@
     runExport(exportArgs);
     verifyExport(totalRecords);
     for (int i = 0; i < cols.length; i++) {
-      assertColMinAndMax(HCatalogTestUtils.forIdx(i), cols[i]);
+      assertColMinAndMax(cols[i].getName(), cols[i]);
     }
   }
 
@@ -166,6 +166,23 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  public void testExportWithColumnNameValue() throws Exception {
+    final int TOTAL_RECORDS = 1 * 10;
+    String table = getTableName().toUpperCase();
+    String valueColumnThatHadIssuesWithClassWriter = "value";
+    ColumnGenerator[] cols = new ColumnGenerator[] {
+        HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(0),
+            "boolean", Types.BOOLEAN, HCatFieldSchema.Type.BOOLEAN, 0, 0,
+            Boolean.TRUE, Boolean.TRUE, KeyType.NOT_A_KEY),
+        HCatalogTestUtils.colGenerator(valueColumnThatHadIssuesWithClassWriter,
+            "int", Types.INTEGER, HCatFieldSchema.Type.INT, 5, 5, 10,
+            10, KeyType.NOT_A_KEY)
+    };
+    List<String> addlArgsArray = new ArrayList<String>();
+    runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
+  }
+
+
   public void testFloatTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -303,7 +320,7 @@
     };
     List<String> addlArgsArray = new ArrayList<String>();
     addlArgsArray.add("--columns");
-    addlArgsArray.add("ID,MSG");
+    addlArgsArray.add("id,msg");
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
 
   }
diff --git a/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java b/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java
index f4b1ea9..fb4a200 100644
--- a/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java
+++ b/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java
@@ -560,6 +560,7 @@
     }
   }
 
+
   /**
    * Verify that on a given row, a column has a given value.
    *
@@ -567,12 +568,12 @@
    *          the id column specifying the row to test.
    */
   public void assertSqlColValForRowId(Connection conn,
-    String table, int id, String colName,
+    String table, int id, String colName, boolean escapeId,
     Object expectedVal) throws SQLException {
     LOG.info("Verifying column " + colName + " has value " + expectedVal);
-
+    String escapeStr = escapeId? "\"" : "";
     PreparedStatement statement = conn.prepareStatement(
-      "SELECT " + colName + " FROM " + table + " WHERE id = " + id,
+      "SELECT "+escapeStr + colName + escapeStr+" FROM " + table + " WHERE "+escapeStr+"id"+escapeStr+" = " + id,
       ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
     Object actualVal = null;
     try {
@@ -590,6 +591,7 @@
     assertEquals(expectedVal, actualVal);
   }
 
+
   /**
    * Verify that on a given row, a column has a given value.
    *
@@ -652,12 +654,13 @@
     return "DROP TABLE " + tableName;
   }
 
-  public static String getSqlCreateTableStatement(String tableName,
+  public static String getSqlCreateTableStatement(String tableName, boolean escapeIdMsgCol,
     ColumnGenerator... extraCols) {
     StringBuilder sb = new StringBuilder();
     sb.append("CREATE TABLE ");
     sb.append(tableName);
-    sb.append(" (ID INT NOT NULL PRIMARY KEY, MSG VARCHAR(64)");
+    String escapeStr = escapeIdMsgCol? "\"" : "";
+    sb.append(" ("+escapeStr+"id"+escapeStr+" INT NOT NULL PRIMARY KEY, "+escapeStr+"msg"+escapeStr+" VARCHAR(64)");
     int colNum = 0;
     for (ColumnGenerator gen : extraCols) {
       sb.append(", \"" + gen.getName() + "\" " + gen.getDBTypeString());
@@ -686,9 +689,13 @@
     LOG.debug("Generated SQL insert table command : " + s);
     return s;
   }
-
   public void createSqlTable(Connection conn, boolean generateOnly,
-    int count, String table, ColumnGenerator... extraCols)
+                             int count, String table,  ColumnGenerator... extraCols)
+      throws Exception {
+    createSqlTable(conn, generateOnly, count, table, false, extraCols);
+  }
+  public void createSqlTable(Connection conn, boolean generateOnly,
+    int count, String table, boolean escapeIdMsgCols, ColumnGenerator... extraCols)
     throws Exception {
     PreparedStatement statement = conn.prepareStatement(
       getSqlDropTableStatement(table),
@@ -702,7 +709,7 @@
       statement.close();
     }
     statement = conn.prepareStatement(
-      getSqlCreateTableStatement(table, extraCols),
+      getSqlCreateTableStatement(table, escapeIdMsgCols ,extraCols),
       ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
     try {
       statement.executeUpdate();
