diff --git a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
index 13a9697..468bf34 100644
--- a/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
+++ b/src/java/org/apache/sqoop/tool/BaseSqoopTool.java
@@ -1689,6 +1689,11 @@
           BaseSqoopTool.HBASE_TABLE_ARG);
       throw new InvalidOptionsException(validationMessage);
     }
+
+    if (options.getHBaseTable() != null && options.getFileLayout() != SqoopOptions.FileLayout.TextFile) {
+      String validationMessage = String.format("Can't run HBase import with file layout: %s", options.getFileLayout());
+      throw new InvalidOptionsException(validationMessage);
+    }
   }
 
   /**
diff --git a/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java b/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java
index 503a863..a792151 100644
--- a/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java
+++ b/src/test/org/apache/sqoop/tool/ImportToolValidateOptionsTest.java
@@ -5,12 +5,39 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
+import java.util.Arrays;
+
+import static com.cloudera.sqoop.SqoopOptions.FileLayout.SequenceFile;
+import static com.cloudera.sqoop.SqoopOptions.FileLayout.AvroDataFile;
+import static com.cloudera.sqoop.SqoopOptions.FileLayout.ParquetFile;
+import static com.cloudera.sqoop.SqoopOptions.FileLayout.TextFile;
+
+@RunWith(Parameterized.class)
 public class ImportToolValidateOptionsTest {
 
+  @Parameters(name = "fileLayout = {0}, validationMessage = {1}")
+  public static Iterable<? extends Object> fileLayoutAndValidationMessageParameters() {
+    return Arrays.asList(new Object[] {SequenceFile, String.format("Can't run HBase import with file layout: %s", SequenceFile)},
+        new Object[] {AvroDataFile, String.format("Can't run HBase import with file layout: %s", AvroDataFile)},
+        new Object[] {ParquetFile, String.format("Can't run HBase import with file layout: %s", ParquetFile)});
+  }
+
   private static final String TABLE_NAME = "testTableName";
   private static final String CONNECT_STRING = "testConnectString";
   private static final String CHECK_COLUMN_NAME = "checkColumnName";
+  private static final String HBASE_TABLE_NAME = "testHBaseTableName";
+  private static final String HBASE_COL_FAMILY = "testHBaseColumnFamily";
+  private SqoopOptions.FileLayout fileLayout;
+  private String validationMessage;
+
+  public ImportToolValidateOptionsTest(SqoopOptions.FileLayout fileLayout, String validationMessage) {
+    this.fileLayout = fileLayout;
+    this.validationMessage = validationMessage;
+  }
 
   @Rule
   public ExpectedException thrown = ExpectedException.none();
@@ -81,6 +108,31 @@
     importTool.validateOptions(options);
   }
 
+  @Test
+  public void testValidationFailsWithHBaseImportAndFileLayoutDifferentFromTexFile() throws Exception {
+    SqoopOptions options = buildBaseSqoopOptions();
+    options.setHBaseTable(HBASE_TABLE_NAME);
+    options.setHBaseColFamily(HBASE_COL_FAMILY);
+    options.setFileLayout(fileLayout);
+
+    thrown.expect(SqoopOptions.InvalidOptionsException.class);
+    thrown.expectMessage(validationMessage);
+
+    importTool.validateOptions(options);
+  }
+
+  @Test
+  public void testValidationSucceedsWithHBaseImportAndAsTextFile() throws Exception {
+    SqoopOptions options = buildBaseSqoopOptions();
+    options.setHBaseTable(HBASE_TABLE_NAME);
+    options.setHBaseColFamily(HBASE_COL_FAMILY);
+    options.setFileLayout(TextFile);
+
+    thrown.none();
+
+    importTool.validateOptions(options);
+  }
+
   private SqoopOptions buildBaseSqoopOptions() {
     SqoopOptions result = new SqoopOptions();
     result.setTableName(TABLE_NAME);
