diff --git a/build.xml b/build.xml
index b1545b6..6e8d393 100644
--- a/build.xml
+++ b/build.xml
@@ -194,11 +194,12 @@
         <property name="hbase95.version" value="1.2.0" />
         <property name="zookeeper.version" value="3.4.5" />
         <property name="hadoop.version.full" value="2.6.0" />
-        <property name="hcatalog.version" value="0.13.0" />
+        <property name="hcatalog.version" value="1.2.0" />
         <property name="hbasecompatprofile" value="2" />
         <property name="avrohadoopprofile" value="2" />
       </then>
     </elseif>
+
     <else>
       <fail message="Unrecognized hadoopversion. Can only be 20, 23, 100, 200 or 210." />
     </else>
diff --git a/src/java/org/apache/sqoop/mapreduce/hcat/SqoopHCatUtilities.java b/src/java/org/apache/sqoop/mapreduce/hcat/SqoopHCatUtilities.java
index ebe7209..2101b06 100644
--- a/src/java/org/apache/sqoop/mapreduce/hcat/SqoopHCatUtilities.java
+++ b/src/java/org/apache/sqoop/mapreduce/hcat/SqoopHCatUtilities.java
@@ -40,6 +40,9 @@
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.metastore.HiveMetaStoreClient;
+import org.apache.hadoop.hive.ql.metadata.Table;
 import org.apache.hadoop.hive.shims.HadoopShims;
 import org.apache.hadoop.hive.shims.HadoopShims.HCatHadoopShims;
 import org.apache.hadoop.hive.shims.ShimLoader;
@@ -56,6 +59,7 @@
 import org.apache.hadoop.util.Shell;
 import org.apache.hadoop.util.StringUtils;
 import org.apache.hive.hcatalog.common.HCatConstants;
+import org.apache.hive.hcatalog.common.HCatUtil;
 import org.apache.hive.hcatalog.data.DefaultHCatRecord;
 import org.apache.hive.hcatalog.data.schema.HCatFieldSchema;
 import org.apache.hive.hcatalog.data.schema.HCatSchema;
@@ -66,7 +70,6 @@
 import org.apache.sqoop.config.ConfigurationHelper;
 import org.apache.sqoop.hive.HiveTypes;
 import org.apache.sqoop.manager.ConnManager;
-import org.apache.sqoop.tool.BaseSqoopTool;
 import org.apache.sqoop.util.Executor;
 import org.apache.sqoop.util.LoggingAsyncSink;
 import org.apache.sqoop.util.SubprocessSecurityManager;
@@ -158,6 +161,43 @@
 
   private static boolean testMode = false;
 
+  public static boolean isHCatView(final SqoopOptions opts)  {
+
+    String hCatDatabaseName = getHCatDbNameFromOptions(opts);
+
+    String hCatTableName = getHCatTableNameFromOptions(opts);
+
+    Configuration conf = opts.getConf();
+    HiveConf hiveConf;
+    try {
+      if (conf != null) {
+        hiveConf = HCatUtil.getHiveConf(conf);
+      } else {
+        hiveConf = new HiveConf(HCatInputFormat.class);
+      }
+      HiveMetaStoreClient client = HCatUtil.getHiveClient(hiveConf);
+      Table table = HCatUtil.getTable(client, hCatDatabaseName, hCatTableName);
+      return table.isView();
+    }
+    catch(Exception e){
+      LOG.warn("We were not able to determine if "+hCatDatabaseName+ ":"+hCatTableName+ "is view or table.");
+      LOG.info("isHCatView threw an exception:", e);
+      return false;
+    }
+  }
+
+  private static String getHCatTableNameFromOptions(SqoopOptions opts) {
+    String optHCTabName = opts.getHCatTableName();
+    return optHCTabName.toLowerCase();
+  }
+
+  private static String getHCatDbNameFromOptions(SqoopOptions opts) {
+    String hCatDatabaseName = opts.getHCatDatabaseName() != null ? opts
+        .getHCatDatabaseName() : DEFHCATDB;
+    hCatDatabaseName = hCatDatabaseName.toLowerCase();
+    return hCatDatabaseName;
+  }
+
   static class IntArrayWritable extends ArrayWritable {
     public IntArrayWritable() {
       super(IntWritable.class);
@@ -278,12 +318,10 @@
     dbTableName = dbTable;
     configuration = config;
     hCatJob = job;
-    hCatDatabaseName = options.getHCatDatabaseName() != null ? options
-      .getHCatDatabaseName() : DEFHCATDB;
-    hCatDatabaseName = hCatDatabaseName.toLowerCase();
+    hCatDatabaseName = getHCatDbNameFromOptions(opts);
 
     String optHCTabName = options.getHCatTableName();
-    hCatTableName = optHCTabName.toLowerCase();
+    hCatTableName = getHCatTableNameFromOptions(opts);
 
     if (!hCatTableName.equals(optHCTabName)) {
       LOG.warn("Provided HCatalog table name " + optHCTabName
diff --git a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
index 468bf34..235f67a 100644
--- a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
+++ b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
@@ -33,6 +33,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.util.StringUtils;
+import org.apache.sqoop.mapreduce.hcat.SqoopHCatUtilities;
 import org.apache.sqoop.util.CredentialsUtil;
 import org.apache.sqoop.util.LoggingUtils;
 import org.apache.sqoop.util.password.CredentialProviderHelper;
@@ -1560,6 +1561,9 @@
       }
       return;
     }
+    if(isSet(options.getHCatTableName()) && SqoopHCatUtilities.isHCatView(options)){
+      throw  new InvalidOptionsException("Reads/Writes from and to Views are not supported by HCatalog");
+    }
 
     if (options.explicitInputDelims()) {
       LOG.warn("Input field/record delimiter options are not "
@@ -1672,6 +1676,10 @@
     }
   }
 
+  private boolean isSet(String option) {
+    return org.apache.commons.lang.StringUtils.isNotBlank(option);
+  }
+
   protected void validateHBaseOptions(SqoopOptions options)
       throws InvalidOptionsException {
     if ((options.getHBaseColFamily() != null && options.getHBaseTable() == null)
diff --git a/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java b/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java
index ff3dde1..5ef9b2b 100644
--- a/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java
+++ b/src/test/org/apache/sqoop/hcat/HCatalogExportTest.java
@@ -32,8 +32,11 @@
 import java.util.Map;
 import java.util.TimeZone;
 
+import com.cloudera.sqoop.SqoopOptions;
+import junit.framework.JUnit4TestAdapter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.common.type.HiveChar;
 import org.apache.hadoop.hive.common.type.HiveDecimal;
 import org.apache.hadoop.hive.common.type.HiveVarchar;
@@ -46,14 +49,24 @@
 import org.junit.Before;
 
 import com.cloudera.sqoop.testutil.ExportJobTestCase;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test that we can export HCatalog tables into databases.
  */
+@RunWith(JUnit4.class)
 public class HCatalogExportTest extends ExportJobTestCase {
   private static final Log LOG =
     LogFactory.getLog(HCatalogExportTest.class);
   private HCatalogTestUtils utils = HCatalogTestUtils.instance();
+
+  @Rule
+  public ExpectedException exception = ExpectedException.none();
+
   @Before
   @Override
   public void setUp() {
@@ -142,6 +155,7 @@
     }
   }
 
+  @Test
   public void testIntTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -166,6 +180,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testExportWithColumnNameValue() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -182,7 +197,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
-
+  @Test
   public void testFloatTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -201,6 +216,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testNumberTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -220,6 +236,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testDateTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -248,6 +265,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testDateTypesToBigInt() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     long offset = TimeZone.getDefault().getRawOffset();
@@ -270,6 +288,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testStringTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -293,7 +312,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
-
+  @Test
   public void testBinaryTypes() throws Exception {
     ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 1, 2 });
     final int TOTAL_RECORDS = 1 * 10;
@@ -310,6 +329,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testColumnProjection() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -324,6 +344,8 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
 
   }
+
+  @Test
   public void testStaticPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -341,6 +363,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testStaticPartitioningWithMultipleKeys() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -361,6 +384,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testDynamicPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -374,6 +398,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testStaticAndDynamicPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -394,6 +419,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testMultipleStaticKeysAndDynamicPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -420,6 +446,7 @@
   /**
    * Test other file formats.
    */
+  @Test
   public void testSequenceFile() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -440,6 +467,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testTextFile() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -460,6 +488,7 @@
     runHCatExport(addlArgsArray, TOTAL_RECORDS, table, cols);
   }
 
+  @Test
   public void testPublishExportJobData() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -479,4 +508,63 @@
     assert (DummyDataPublisher.storeType.equals("hsqldb"));
     assert (DummyDataPublisher.operation.equals("export"));
   }
+
+  @Test
+  public void testWeCanTellIfHCatViewOrTable() throws Exception {
+    String tableName = getTableName().toUpperCase();
+    String viewName = "view";
+    SqoopHCatUtilities utils = SqoopHCatUtilities.instance();
+    createHCatTableAndView(tableName, viewName, utils);
+
+    Configuration conf = getConf();
+    conf.set("oraoop.disabled", "true");
+    SqoopOptions opts = getSqoopOptions(conf);
+    opts.setHCatTableName(tableName);
+
+    assertFalse(utils.isHCatView(opts));
+    opts.setHCatTableName(viewName);
+    assertTrue(utils.isHCatView(opts));
+  }
+
+  @Test
+  public void testExportHCatViewThrowsException() throws Exception {
+    String tableName = getTableName().toUpperCase();
+    String viewName = "view";
+    SqoopHCatUtilities utils = SqoopHCatUtilities.instance();
+    createHCatTableAndView(tableName, viewName, utils);
+
+    ArrayList<String> args = new ArrayList<String>();
+    args.add("--table");
+    args.add(getTableName());
+    args.add("--hcatalog-table");
+    args.add(viewName);
+    args.add("--connect");
+    args.add(getConnectString());
+
+    args.toArray(new String[0]);
+
+    SqoopHCatUtilities.instance().setConfigured(false);
+    exception.expect(java.io.IOException.class);
+    runExport(args.toArray(new String[0]));
+  }
+
+  private void createHCatTableAndView(String tableName, String viewName, SqoopHCatUtilities utils) throws Exception {
+    HCatalogTestUtils testUtils = HCatalogTestUtils.instance();
+    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(HCatalogTestUtils.forIdx(1),
+            "int", Types.INTEGER, HCatFieldSchema.Type.INT, 5, 5, 10,
+            10, KeyType.NOT_A_KEY)
+    };
+    testUtils.createHCatTable(CreateMode.CREATE_AND_LOAD, 10, tableName, cols);
+    String createViewCmd = "drop view " + viewName + "; create view " + viewName + " as select * from " + tableName;
+    utils.launchHCatCli(createViewCmd);
+  }
+
+  public static junit.framework.Test suite() {
+    return new JUnit4TestAdapter(HCatalogImportTest.class);
+  }
+
 }
diff --git a/src/test/org/apache/sqoop/hcat/HCatalogImportTest.java b/src/test/org/apache/sqoop/hcat/HCatalogImportTest.java
index fe5295a..28f83f2 100644
--- a/src/test/org/apache/sqoop/hcat/HCatalogImportTest.java
+++ b/src/test/org/apache/sqoop/hcat/HCatalogImportTest.java
@@ -35,6 +35,7 @@
 import java.util.Map;
 import java.util.TimeZone;
 
+import junit.framework.JUnit4TestAdapter;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
@@ -57,10 +58,16 @@
 import com.cloudera.sqoop.testutil.ImportJobTestCase;
 import com.cloudera.sqoop.tool.ImportTool;
 import com.cloudera.sqoop.tool.SqoopTool;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
 
 /**
  * Test that we can export HCatalog tables into databases.
  */
+@RunWith(JUnit4.class)
 public class HCatalogImportTest extends ImportJobTestCase {
   private static final Log LOG =
     LogFactory.getLog(HCatalogImportTest.class);
@@ -68,6 +75,9 @@
   private List<String> extraTestArgs = null;
   private List<String> configParams = null;
 
+  @Rule
+  public ExpectedException exception = ExpectedException.none();
+
   @Override
   @Before
   public void setUp() {
@@ -343,6 +353,7 @@
     validateHCatRecords(recs, tblSchema, 10, cols);
   }
 
+  @Test
   public void testIntTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -368,6 +379,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testFloatTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -387,6 +399,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testNumberTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -407,6 +420,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testDateTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -436,6 +450,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testDateTypesToBigInt() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     long offset = TimeZone.getDefault().getRawOffset();
@@ -459,6 +474,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testStringTypes() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -483,14 +499,16 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testBinaryTypes() throws Exception {
     ByteBuffer bb = ByteBuffer.wrap(new byte[] { 0, 1, 2 });
+    ByteBuffer bb10 = ByteBuffer.wrap(new byte[]{0, 1, 2, 0, 0, 0, 0, 0, 0, 0});
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
     ColumnGenerator[] cols = new ColumnGenerator[] {
       HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(0),
         "binary(10)", Types.BINARY, HCatFieldSchema.Type.BINARY, 0, 0,
-        bb.array(), bb.array(), KeyType.NOT_A_KEY),
+        bb10.array(), bb10.array(), KeyType.NOT_A_KEY),
       HCatalogTestUtils.colGenerator(HCatalogTestUtils.forIdx(1),
         "longvarbinary", Types.BINARY, HCatFieldSchema.Type.BINARY, 0, 0,
         bb.array(), bb.array(), KeyType.NOT_A_KEY),
@@ -500,6 +518,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testColumnProjection() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -518,6 +537,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, colNames);
   }
 
+  @Test
   public void testColumnProjectionMissingPartKeys() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -543,6 +563,7 @@
       LOG.info("Exception stack trace = " + sw);
     }
   }
+  @Test
   public void testStaticPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -560,6 +581,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testStaticPartitioningWithMultipleKeys() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -580,6 +602,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testDynamicPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -593,6 +616,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testStaticAndDynamicPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -613,6 +637,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testMultipleStaticKeysAndDynamicPartitioning() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -639,6 +664,7 @@
   /**
    * Test other file formats.
    */
+  @Test
   public void testSequenceFile() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -659,6 +685,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testTextFile() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -680,6 +707,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testTableCreation() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -694,10 +722,12 @@
     List<String> addlArgsArray = new ArrayList<String>();
     addlArgsArray.add("--create-hcatalog-table");
     setExtraArgs(addlArgsArray);
+    utils.dropHCatTableIfExists(table, SqoopHCatUtilities.DEFHCATDB);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols,
       null, true, false);
   }
 
+  @Test
   public void testTableCreationWithPartition() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -716,9 +746,11 @@
     addlArgsArray.add("2");
     addlArgsArray.add("--create-hcatalog-table");
     setExtraArgs(addlArgsArray);
+    utils.dropHCatTableIfExists(table, SqoopHCatUtilities.DEFHCATDB);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null, true, false);
   }
 
+  @Test
   public void testTableCreationWithMultipleStaticPartKeys() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -737,9 +769,11 @@
     addlArgsArray.add("1,2");
     addlArgsArray.add("--create-hcatalog-table");
     setExtraArgs(addlArgsArray);
+    utils.dropHCatTableIfExists(table, SqoopHCatUtilities.DEFHCATDB);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null, true, false);
   }
 
+  @Test
   public void testTableCreationWithStorageStanza() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -760,9 +794,11 @@
     addlArgsArray.add("--hcatalog-storage-stanza");
     addlArgsArray.add(HCatalogTestUtils.STORED_AS_TEXT);
     setExtraArgs(addlArgsArray);
+    utils.dropHCatTableIfExists(table, SqoopHCatUtilities.DEFHCATDB);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null, true, false);
   }
 
+  @Test
   public void testHiveDropDelims() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -780,6 +816,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testHiveDelimsReplacement() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -798,6 +835,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testDynamicKeyInMiddle() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -814,6 +852,7 @@
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testQueryImport() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -830,6 +869,7 @@
     runHCatQueryImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
 
+  @Test
   public void testCreateTableWithPreExistingTable() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -856,6 +896,7 @@
     }
   }
 
+  @Test
   public void testDropAndCreateWithPreExistingTable() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -875,6 +916,7 @@
       null, true, false);
   }
 
+  @Test
   public void testDropAndCreateWithoutPreExistingTable() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -893,6 +935,7 @@
       null, true, false);
   }
 
+  @Test
   public void testTableWithNonIdentColChars() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -905,6 +948,8 @@
     setExtraArgs(addlArgsArray);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null);
   }
+
+  @Test
   public void testTableCreationWithNonIdentColChars() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -916,10 +961,12 @@
     List<String> addlArgsArray = new ArrayList<String>();
     addlArgsArray.add("--create-hcatalog-table");
     setExtraArgs(addlArgsArray);
+    utils.dropHCatTableIfExists(table, SqoopHCatUtilities.DEFHCATDB);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols,
       null, true, false);
   }
 
+  @Test
   public void testPublishQueryImportData() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -941,6 +988,7 @@
     assert (DummyDataPublisher.storeTable.equals(getTableName()));
   }
 
+  @Test
   public void testPublishTableImportData() throws Exception {
     final int TOTAL_RECORDS = 1 * 10;
     String table = getTableName().toUpperCase();
@@ -959,9 +1007,70 @@
     List<String> addlArgsArray = new ArrayList<String>();
     addlArgsArray.add("--create-hcatalog-table");
     setExtraArgs(addlArgsArray);
+    utils.dropHCatTableIfExists(table, SqoopHCatUtilities.DEFHCATDB);
     runHCatImport(addlArgsArray, TOTAL_RECORDS, table, cols, null, true, false);
     assert (DummyDataPublisher.storeType.equals("hsqldb"));
     assert (DummyDataPublisher.operation.equals("import"));
     assert (DummyDataPublisher.storeTable.equals(getTableName()));
   }
+
+  @Test
+  public void testWeCanTellIfHCatViewOrTable() throws Exception {
+    String tableName = getTableName().toUpperCase();
+    String viewName = "view";
+    SqoopHCatUtilities utils = SqoopHCatUtilities.instance();
+    createHCatTableAndView(tableName, viewName, utils);
+
+    Configuration conf = getConf();
+    conf.set("oraoop.disabled", "true");
+    SqoopOptions opts = getSqoopOptions(conf);
+    opts.setHCatTableName(tableName);
+
+    assertFalse(utils.isHCatView(opts));
+    opts.setHCatTableName(viewName);
+    assertTrue(utils.isHCatView(opts));
+  }
+
+  @Test
+  public void testImportHCatViewThrowsException() throws Exception {
+    String tableName = getTableName().toUpperCase();
+    String viewName = "view";
+    SqoopHCatUtilities utils = SqoopHCatUtilities.instance();
+    createHCatTableAndView(tableName, viewName, utils);
+
+    ArrayList<String> args = new ArrayList<String>();
+
+    args.addAll(getConfigParams());
+    args.add("--table");
+    args.add(getTableName());
+    args.add("--hcatalog-table");
+    args.add(viewName);
+    args.add("--connect");
+    args.add(getConnectString());
+
+    args.toArray(new String[0]);
+
+    SqoopHCatUtilities.instance().setConfigured(false);
+    exception.expect(java.io.IOException.class);
+    runImport(new ImportTool(), args.toArray(new String[0]));
+  }
+
+  private void createHCatTableAndView(String tableName, String viewName, SqoopHCatUtilities utils) throws Exception {
+    HCatalogTestUtils testUtils = HCatalogTestUtils.instance();
+    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(HCatalogTestUtils.forIdx(1),
+            "int", Types.INTEGER, HCatFieldSchema.Type.INT, 5, 5, 10,
+            10, KeyType.NOT_A_KEY)
+    };
+    testUtils.createHCatTable(CreateMode.CREATE_AND_LOAD, 10, tableName, cols);
+    String createViewCmd = "drop view " + viewName + "; create view " + viewName + " as select * from " + tableName;
+    utils.launchHCatCli(createViewCmd);
+  }
+
+  public static junit.framework.Test suite() {
+    return new JUnit4TestAdapter(HCatalogImportTest.class);
+  }
 }
diff --git a/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java b/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java
index fb4a200..4301a33 100644
--- a/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java
+++ b/src/test/org/apache/sqoop/hcat/HCatalogTestUtils.java
@@ -177,29 +177,33 @@
    * memory list.
    */
   public void createHCatTableUsingSchema(String dbName,
-    String tableName, List<HCatFieldSchema> tableCols,
-    List<HCatFieldSchema> partKeys)
-    throws Exception {
+                                         String tableName, List<HCatFieldSchema> tableCols,
+                                         List<HCatFieldSchema> partKeys)
+      throws Exception {
 
     String databaseName = dbName == null
-      ? SqoopHCatUtilities.DEFHCATDB : dbName;
+        ? SqoopHCatUtilities.DEFHCATDB : dbName;
+    dropHCatTableIfExists(tableName, databaseName);
+    LOG.info("Successfully dropped HCatalog table if it existed previously " + databaseName
+        + '.' + tableName);
+    String createCmd = getHCatCreateTableCmd(databaseName, tableName,
+        tableCols, partKeys);
+    utils.launchHCatCli(createCmd);
+    LOG.info("Created HCatalog table " + dbName + "." + tableName);
+  }
+
+  public void dropHCatTableIfExists(String tableName, String databaseName) {
     LOG.info("Dropping HCatalog table if it exists " + databaseName
-      + '.' + tableName);
+        + '.' + tableName);
     String dropCmd = getHCatDropTableCmd(databaseName, tableName);
 
     try {
       utils.launchHCatCli(dropCmd);
     } catch (Exception e) {
       LOG.debug("Drop hcatalog table exception : " + e);
-      LOG.info("Unable to drop table." + dbName + "."
-        + tableName + ".   Assuming it did not exist");
+      LOG.info("Unable to drop table." + databaseName + "."
+          + tableName + ".   Assuming it did not exist");
     }
-    LOG.info("Creating HCatalog table if it exists " + databaseName
-      + '.' + tableName);
-    String createCmd = getHCatCreateTableCmd(databaseName, tableName,
-      tableCols, partKeys);
-    utils.launchHCatCli(createCmd);
-    LOG.info("Created HCatalog table " + dbName + "." + tableName);
   }
 
   /**
