diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 05e182c1..157cc405 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -49,6 +49,15 @@
       <option name="PACKAGES_TO_USE_STAR_IMPORTS">
         <value />
       </option>
+      <option name="PACKAGES_IMPORT_LAYOUT">
+        <value>
+          <package name="" alias="false" withSubpackages="true" />
+          <package name="java" alias="false" withSubpackages="true" />
+          <package name="javax" alias="false" withSubpackages="true" />
+          <package name="kotlin" alias="false" withSubpackages="true" />
+          <package name="" alias="true" withSubpackages="true" />
+        </value>
+      </option>
       <option name="NAME_COUNT_TO_USE_STAR_IMPORT" value="2147483647" />
       <option name="NAME_COUNT_TO_USE_STAR_IMPORT_FOR_MEMBERS" value="2147483647" />
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
diff --git a/.travis.yml b/.travis.yml
index 74540620..33211a14 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -5,6 +5,7 @@ android:
   - tools
   - platform-tools
   - build-tools-28.0.3
+  - build-tools-29.0.2
   - android-28
   - extra-google-google_play_services
   - extra-android-m2repository
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ea65908..423a2f11 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# 1.7.1 (July 27, 2020)
+
+- Change `ParisConfig` annotation to be applicable to class or interface types. New recommendation is to use it on an interface instead of a package
+to avoid a bug with spurious incremental annotation failure.
+
+- Fixed annotation processor bugs with Kotlin 1.4. Project should now be compatible with Kotlin 1.4.x - previous Paris versions would crash at compile time.
+
 # 1.6.0 (July 21, 2020)
 
 - Adding support for importantForAccessibility attribute (#138)
diff --git a/README.md b/README.md
index 854e1fac..f4807f8a 100644
--- a/README.md
+++ b/README.md
@@ -13,9 +13,9 @@ Paris lets you define and apply styles programmatically to Android views, includ
 In your project's `build.gradle`:
 ```gradle
 dependencies {
-    implementation 'com.airbnb.android:paris:1.6.0'
+    implementation 'com.airbnb.android:paris:1.7.1'
     // If you're using Paris annotations.
-    kapt 'com.airbnb.android:paris-processor:1.6.0'
+    kapt 'com.airbnb.android:paris-processor:1.7.1'
 }
 ```
 
diff --git a/build.gradle b/build.gradle
index bda69548..5769d3e0 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,7 +2,7 @@ apply plugin: "com.github.ben-manes.versions"
 
 buildscript {
     ext {
-        ANDROID_PLUGIN_VERSION = '3.6.3'
+        ANDROID_PLUGIN_VERSION = '4.0.1'
         BUTTERKNIFE_VERSION = '10.2.1'
         KOTLIN_VERSION = '1.3.72'
         VERSIONS_VERSION = '0.28.0'
diff --git a/gradle.properties b/gradle.properties
index 2e33aa88..cdd48a27 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,4 +1,4 @@
-VERSION_NAME=1.6.0
+VERSION_NAME=1.7.1
 GROUP=com.airbnb.android
 POM_DESCRIPTION=Paris is a system for creating and applying styles to views in Android.
 POM_URL=https://github.com/airbnb/paris
@@ -19,3 +19,4 @@ org.gradle.incremental=true
 org.gradle.configureondemand=true
 org.gradle.daemon=true
 kotlin.incremental=true
+kapt.includeCompileClasspath=false
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 13372aef..62d4c053 100644
Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 1bb22b46..5eb3db17 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
-#Tue Feb 27 15:54:16 PST 2018
+#Mon Jul 27 13:22:56 CDT 2020
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.5.1-all.zip
diff --git a/gradlew b/gradlew
index 9d82f789..fbd7c515 100755
--- a/gradlew
+++ b/gradlew
@@ -1,4 +1,20 @@
-#!/usr/bin/env bash
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
 
 ##############################################################################
 ##
@@ -6,20 +22,38 @@
 ##
 ##############################################################################
 
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
 
 APP_NAME="Gradle"
 APP_BASE_NAME=`basename "$0"`
 
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
 # Use the maximum available, or set MAX_FD != -1 to use that value.
 MAX_FD="maximum"
 
-warn ( ) {
+warn () {
     echo "$*"
 }
 
-die ( ) {
+die () {
     echo
     echo "$*"
     echo
@@ -30,6 +64,7 @@ die ( ) {
 cygwin=false
 msys=false
 darwin=false
+nonstop=false
 case "`uname`" in
   CYGWIN* )
     cygwin=true
@@ -40,28 +75,14 @@ case "`uname`" in
   MINGW* )
     msys=true
     ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
 esac
 
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-        PRG="$link"
-    else
-        PRG=`dirname "$PRG"`"/$link"
-    fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
 CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
 
+
 # Determine the Java command to use to start the JVM.
 if [ -n "$JAVA_HOME" ] ; then
     if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -85,7 +106,7 @@ location of your Java installation."
 fi
 
 # Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
     MAX_FD_LIMIT=`ulimit -H -n`
     if [ $? -eq 0 ] ; then
         if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
@@ -105,10 +126,11 @@ if $darwin; then
     GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
 fi
 
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
     APP_HOME=`cygpath --path --mixed "$APP_HOME"`
     CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    
     JAVACMD=`cygpath --unix "$JAVACMD"`
 
     # We build the pattern for arguments to be converted via cygpath
@@ -134,27 +156,30 @@ if $cygwin ; then
         else
             eval `echo args$i`="\"$arg\""
         fi
-        i=$((i+1))
+        i=`expr $i + 1`
     done
     case $i in
-        (0) set -- ;;
-        (1) set -- "$args0" ;;
-        (2) set -- "$args0" "$args1" ;;
-        (3) set -- "$args0" "$args1" "$args2" ;;
-        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
-        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
-        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
-        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
-        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
-        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+        0) set -- ;;
+        1) set -- "$args0" ;;
+        2) set -- "$args0" "$args1" ;;
+        3) set -- "$args0" "$args1" "$args2" ;;
+        4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
     esac
 fi
 
-# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
-function splitJvmOpts() {
-    JVM_OPTS=("$@")
+# Escape application args
+save () {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
 }
-eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
-JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
 
-exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
index aec99730..a9f778a7 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,3 +1,19 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem      https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
 @if "%DEBUG%" == "" @echo off
 @rem ##########################################################################
 @rem
@@ -8,14 +24,17 @@
 @rem Set local scope for the variables with windows NT shell
 if "%OS%"=="Windows_NT" setlocal
 
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
 set DIRNAME=%~dp0
 if "%DIRNAME%" == "" set DIRNAME=.
 set APP_BASE_NAME=%~n0
 set APP_HOME=%DIRNAME%
 
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
 @rem Find java.exe
 if defined JAVA_HOME goto findJavaFromJavaHome
 
@@ -46,10 +65,9 @@ echo location of your Java installation.
 goto fail
 
 :init
-@rem Get command-line arguments, handling Windowz variants
+@rem Get command-line arguments, handling Windows variants
 
 if not "%OS%" == "Windows_NT" goto win9xME_args
-if "%@eval[2+2]" == "4" goto 4NT_args
 
 :win9xME_args
 @rem Slurp the command line arguments.
@@ -60,17 +78,13 @@ set _SKIP=2
 if "x%~1" == "x" goto execute
 
 set CMD_LINE_ARGS=%*
-goto execute
-
-:4NT_args
-@rem Get arguments from the 4NT Shell from JP Software
-set CMD_LINE_ARGS=%$
 
 :execute
 @rem Setup the command line
 
 set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
 
+
 @rem Execute Gradle
 "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
 
diff --git a/paris-annotations/src/main/java/com/airbnb/paris/annotations/ParisConfig.java b/paris-annotations/src/main/java/com/airbnb/paris/annotations/ParisConfig.java
index cd555dbc..efd78eb8 100644
--- a/paris-annotations/src/main/java/com/airbnb/paris/annotations/ParisConfig.java
+++ b/paris-annotations/src/main/java/com/airbnb/paris/annotations/ParisConfig.java
@@ -5,8 +5,12 @@
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+/**
+ * Note that when using KAPT with incremental annotation processing it is recommended to only use this annotation on class or interface elements,
+ * not on package elements in package-info.java. This is because there is a bug where package-info is not properly reprocessed in incremental builds.
+ */
 @Retention(RetentionPolicy.CLASS)
-@Target(ElementType.PACKAGE)
+@Target({ElementType.PACKAGE, ElementType.TYPE})
 public @interface ParisConfig {
 
     String defaultStyleNameFormat() default "";
diff --git a/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyCompanionPropertyModel.kt b/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyCompanionPropertyModel.kt
index 346772e4..c4470d71 100644
--- a/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyCompanionPropertyModel.kt
+++ b/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyCompanionPropertyModel.kt
@@ -5,6 +5,7 @@ import com.airbnb.paris.processor.framework.KotlinCodeBlock
 import com.airbnb.paris.processor.framework.SkyProcessor
 import com.airbnb.paris.processor.framework.isJava
 import com.airbnb.paris.processor.framework.siblings
+import com.airbnb.paris.processor.framework.toStringId
 import javax.lang.model.element.Element
 import javax.lang.model.element.ElementKind
 import javax.lang.model.element.ExecutableElement
@@ -32,18 +33,23 @@ abstract class SkyCompanionPropertyModel(val element: VariableElement) : SkyMode
             // In Kotlin the annotated element is a private static field which is accompanied by a Companion method
 
             val getterName = "get${name.capitalize()}"
-            getterElement = element.siblings().asSequence()
+            val companionFunctions = element.siblings().asSequence()
                 .single {
                     it is TypeElement && it.simpleName.toString() == "Companion"
                 }
                 .enclosedElements
-                .single {
-                    val elementSimpleName = it.simpleName.toString()
-                    it is ExecutableElement &&
-                            // If the property is public the name of the getter function will be prepended with "get". If it's internal, it will also
-                            // be appended with "$" and an arbitrary string for obfuscation purposes.
-                            (elementSimpleName == getterName || elementSimpleName.startsWith("$getterName$"))
-                }
+                .filterIsInstance<ExecutableElement>()
+
+            // If the property is public the name of the getter function will be prepended with "get". If it's internal, it will also
+            // be appended with "$" and an arbitrary string for obfuscation purposes.
+            // Kotlin 1.4.x contains BOTH at once, but only the none synthetic one can be used, so we check for the real one first.
+            getterElement = companionFunctions.firstOrNull {
+                val elementSimpleName = it.simpleName.toString()
+                elementSimpleName == getterName
+            } ?: companionFunctions.firstOrNull {
+                val elementSimpleName = it.simpleName.toString()
+                elementSimpleName.startsWith("$getterName$")
+            } ?: error("${element.toStringId()} - could not get companion property")
 
             javaGetter = JavaCodeBlock.of("Companion.\$N()", getterElement.simpleName)
         }
diff --git a/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyPropertyModel.kt b/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyPropertyModel.kt
index a6f76e51..5410b89f 100644
--- a/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyPropertyModel.kt
+++ b/paris-processor/src/main/java/com/airbnb/paris/processor/framework/models/SkyPropertyModel.kt
@@ -36,23 +36,33 @@ abstract class SkyPropertyModel(val element: Element) : SkyModel {
             getterElement = element
             getter = name
         } else {
-            // In Kotlin it's an empty static method whose name is <property>$annotations that ends
-            // up being annotated
-            name = element.simpleName.toString().substringBefore("\$annotations")
+            // In Kotlin it's a synthetic empty static method whose name is <property>$annotations that ends
+            // up being annotated.
+            // In kotlin 1.4.0+ the method is changed to start with "get", so we need to handle both cases
+            name = element.simpleName.toString()
+                .substringBefore("\$annotations")
+                // get prefix will only exist for kotlin 1.4
+                .removePrefix("get")
+                .decapitalize()
+
             val getterName = "get${name.capitalize()}"
-            val kotlinGetterElement = element.siblings().asSequence()
-                .filter {
-                    val elementSimpleName = it.simpleName.toString()
-                    it is ExecutableElement &&
-                            // If the property is public the name of the getter function will be prepended with "get". If it's internal, it will also
-                            // be appended with "$" and an arbitrary string for obfuscation purposes.
-                            (elementSimpleName == getterName || elementSimpleName.startsWith("$getterName$")) &&
-                            it.parameters.isEmpty()
-                }
-                .singleOrNull() as ExecutableElement?
+            val getters = element.siblings().asSequence()
+                .filterIsInstance<ExecutableElement>()
+                .filter { it.parameters.isEmpty() }
 
-            kotlinGetterElement
-                ?: throw IllegalArgumentException("${element.toStringId()}: Could not find getter for property annotated with @StyleableChild. This probably means the property is private or protected.")
+            // If the property is public the name of the getter function will be prepended with "get". If it's internal, it will also
+            // be appended with "$" and an arbitrary string for obfuscation purposes.
+            // In kotlin 1.4.0 both versions will be present, so we check for the real getter first.
+            val kotlinGetterElement = getters.firstOrNull {
+                val elementSimpleName = it.simpleName.toString()
+                elementSimpleName == getterName
+            } ?: getters.firstOrNull {
+                val elementSimpleName = it.simpleName.toString()
+                elementSimpleName.startsWith("$getterName$")
+            } ?: error(
+                "${element.toStringId()}: Could not find getter ($getterName) for property annotated with @StyleableChild. " +
+                        "This probably means the property is private or protected."
+            )
 
             getterElement = kotlinGetterElement
             getter = "${kotlinGetterElement.simpleName}()"
diff --git a/sample/src/main/res/layout/activity_spannable.xml b/sample/src/main/res/layout/activity_spannable.xml
index e4880786..5d1ea234 100644
--- a/sample/src/main/res/layout/activity_spannable.xml
+++ b/sample/src/main/res/layout/activity_spannable.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<androidx.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
@@ -19,4 +19,4 @@
         tools:text="Spanned View"
         />
 
-</androidx.constraint.ConstraintLayout>
+</androidx.constraintlayout.widget.ConstraintLayout>