diff --git a/pre-upload.py b/pre-upload.py
index 7be4ea7..d913d2b 100755
--- a/pre-upload.py
+++ b/pre-upload.py
@@ -359,6 +359,12 @@
 def _run_checkpatch_no_tree(project, commit):
   return _run_checkpatch(project, commit, ['--no-tree'])
 
+def _kernel_configcheck(project, commit):
+  """Makes sure kernel config changes are not mixed with code changes"""
+  files = _get_affected_files(commit)
+  if not len(_filter_files(files, [r'chromeos/config'])) in [0, len(files)]:
+    return HookFailure('Changes to chromeos/config/ and regular files must '
+                       'be in separate commits:\n%s' % '\n'.join(files))
 
 def _run_json_check(project, commit):
   """Checks that all JSON files are syntactically valid."""
@@ -426,8 +432,9 @@
 # A dictionary of project-specific hooks(callbacks), indexed by project name.
 # dict[project] = [callback1, callback2]
 _PROJECT_SPECIFIC_HOOKS = {
-    "chromiumos/third_party/kernel": [_run_checkpatch],
-    "chromiumos/third_party/kernel-next": [_run_checkpatch],
+    "chromiumos/third_party/kernel": [_run_checkpatch, _kernel_configcheck],
+    "chromiumos/third_party/kernel-next": [_run_checkpatch,
+                                           _kernel_configcheck],
     "chromiumos/third_party/u-boot": [_run_checkpatch_no_tree,
                                       _check_change_has_branch_field],
     "chromiumos/platform/ec": [_run_checkpatch_no_tree,
diff --git a/pre-upload_unittest.py b/pre-upload_unittest.py
index 5c4398d..946b4a4 100755
--- a/pre-upload_unittest.py
+++ b/pre-upload_unittest.py
@@ -56,6 +56,44 @@
                        for line in [3, 4, 8]],
                       failure.items)
 
+class CheckKernelConfig(unittest.TestCase):
+  def tearDown(self):
+    self.mocker.UnsetStubs()
+
+  def runTest(self):
+    self.mocker = mox.Mox();
+
+    # Mixed changes, should fail
+    self.mocker.StubOutWithMock(pre_upload, '_get_affected_files')
+    pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(
+        ['/kernel/files/chromeos/config/base.config',
+         '/kernel/files/arch/arm/mach-exynos/mach-exynos5-dt.c'
+        ])
+    self.mocker.ReplayAll()
+    failure = pre_upload._kernel_configcheck('PROJECT', 'COMMIT')
+    self.assertTrue(failure)
+
+    # Code-only changes, should pass
+    self.mocker.UnsetStubs()
+    self.mocker.StubOutWithMock(pre_upload, '_get_affected_files')
+    pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(
+        ['/kernel/files/Makefile',
+         '/kernel/files/arch/arm/mach-exynos/mach-exynos5-dt.c'
+        ])
+    self.mocker.ReplayAll()
+    failure = pre_upload._kernel_configcheck('PROJECT', 'COMMIT')
+    self.assertFalse(failure)
+
+    # Config-only changes, should pass
+    self.mocker.UnsetStubs()
+    self.mocker.StubOutWithMock(pre_upload, '_get_affected_files')
+    pre_upload._get_affected_files(mox.IgnoreArg()).AndReturn(
+        ['/kernel/files/chromeos/config/base.config',
+        ])
+    self.mocker.ReplayAll()
+    failure = pre_upload._kernel_configcheck('PROJECT', 'COMMIT')
+    self.assertFalse(failure)
+
 
 if __name__ == '__main__':
   unittest.main()
