diff --git a/android/config.go b/android/config.go
index 43d743b..5d38d71 100644
--- a/android/config.go
+++ b/android/config.go
@@ -712,6 +712,13 @@
 	return PrefixInList(path, *c.ProductVariables.CFIExcludePaths)
 }
 
+func (c *config) IntegerOverflowEnabledForPath(path string) bool {
+	if c.ProductVariables.IntegerOverflowIncludePaths == nil {
+		return false
+	}
+	return PrefixInList(path, *c.ProductVariables.IntegerOverflowIncludePaths)
+}
+
 func (c *config) CFIEnabledForPath(path string) bool {
 	if c.ProductVariables.CFIIncludePaths == nil {
 		return false
diff --git a/android/variable.go b/android/variable.go
index d58ed6a..aa751a0 100644
--- a/android/variable.go
+++ b/android/variable.go
@@ -167,6 +167,7 @@
 	MinimizeJavaDebugInfo      *bool `json:",omitempty"`
 
 	IntegerOverflowExcludePaths *[]string `json:",omitempty"`
+	IntegerOverflowIncludePaths *[]string `json:",omitempty"`
 
 	EnableCFI       *bool     `json:",omitempty"`
 	CFIExcludePaths *[]string `json:",omitempty"`
diff --git a/cc/sanitize.go b/cc/sanitize.go
index 1afec26..859478b 100644
--- a/cc/sanitize.go
+++ b/cc/sanitize.go
@@ -232,6 +232,14 @@
 		}
 	}
 
+	// Enable Integer Overflow for all components in the include paths
+	if !ctx.Host() && ctx.Config().IntegerOverflowEnabledForPath(ctx.ModuleDir()) && s.Integer_overflow == nil {
+		s.Integer_overflow = boolPtr(true)
+		if inList("integer_overflow", ctx.Config().SanitizeDeviceDiag()) {
+			s.Diag.Integer_overflow = boolPtr(true)
+		}
+	}
+
 	// CFI needs gold linker, and mips toolchain does not have one.
 	if !ctx.Config().EnableCFI() || ctx.Arch().ArchType == android.Mips || ctx.Arch().ArchType == android.Mips64 {
 		s.Cfi = nil
@@ -417,6 +425,7 @@
 			sanitizers = append(sanitizers, "unsigned-integer-overflow")
 			sanitizers = append(sanitizers, "signed-integer-overflow")
 			flags.CFlags = append(flags.CFlags, intOverflowCflags...)
+
 			if Bool(sanitize.Properties.Sanitize.Diag.Integer_overflow) {
 				diagSanitizers = append(diagSanitizers, "unsigned-integer-overflow")
 				diagSanitizers = append(diagSanitizers, "signed-integer-overflow")
@@ -424,6 +433,8 @@
 		}
 	}
 
+	diagSanitizeArgs := "-fno-sanitize-trap=" + strings.Join(diagSanitizers, ",")
+
 	if len(sanitizers) > 0 {
 		sanitizeArg := "-fsanitize=" + strings.Join(sanitizers, ",")
 		flags.CFlags = append(flags.CFlags, sanitizeArg)
@@ -436,10 +447,19 @@
 		} else {
 			flags.CFlags = append(flags.CFlags, "-fsanitize-trap=all", "-ftrap-function=abort")
 		}
+
+		// Specific settings for userdebug and eng builds
+		if Bool(ctx.Config().ProductVariables.Debuggable) {
+			// TODO(ivanlozano): uncomment after switch to clang-4536805.
+			// Run integer overflow sanitizers with the minimal runtime diagnostics.
+			if strings.Contains(sanitizeArg, "integer") && !strings.Contains(diagSanitizeArgs, "integer") && !Bool(sanitize.Properties.Sanitize.Address) {
+				//flags.CFlags = append(flags.CFlags, "-fsanitize-minimal-runtime")
+			}
+		}
 	}
 
 	if len(diagSanitizers) > 0 {
-		flags.CFlags = append(flags.CFlags, "-fno-sanitize-trap="+strings.Join(diagSanitizers, ","))
+		flags.CFlags = append(flags.CFlags, diagSanitizeArgs)
 	}
 	// FIXME: enable RTTI if diag + (cfi or vptr)
 
