diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,23 @@
+1.31.1
+
+* BUG FIX: [Allow whitespace after record pun entry](https://github.com/dhall-lang/dhall-haskell/pull/1733)
+    * The record pun feature introduced in the previous release did not
+      correctly parse record puns with trailing whitespace, which this change
+      fixes.
+* [Expose `{default,}InputNormalizer`](https://github.com/dhall-lang/dhall-haskell/pull/1727)
+    * The previous version introduced a breaking change to the `autoWith` type
+      that required access to the implementation of `InputNormalizer`, which was
+      not exported.  This change fixes that.
+* Build against latest dependencies
+    * [`QuickCheck-2.14`](https://github.com/dhall-lang/dhall-haskell/pull/1721)
+    * [`haskell-lsp-0.21`](https://github.com/dhall-lang/dhall-haskell/pull/1730)
+    * [`repline-0.3` / `haskeline-0.8`](https://github.com/dhall-lang/dhall-haskell/pull/1717)
+    * [`template-haskell-2.16`](https://github.com/dhall-lang/dhall-haskell/pull/1719)
+* [Prefer to format using record puns when possible](https://github.com/dhall-lang/dhall-haskell/pull/1729)
+    * `dhall format` will now reformat code to use record puns when applicable
+* Fixes and improvements to error messages:
+    * [#1721](https://github.com/dhall-lang/dhall-haskell/pull/1724)
+
 1.31.0
 
 * [Supports version 15.0.0 of the standard](https://github.com/dhall-lang/dhall-lang/releases/tag/v15.0.0)
diff --git a/dhall-lang/tests/alpha-normalization/success/regression/preludeBoolFoldA.dhall b/dhall-lang/tests/alpha-normalization/success/regression/preludeBoolFoldA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/alpha-normalization/success/regression/preludeBoolFoldA.dhall
@@ -0,0 +1,6 @@
+-- For https://github.com/dhall-lang/dhall-haskell/issues/929
+  λ(b : Bool)
+→ λ(bool : Type)
+→ λ(true : bool)
+→ λ(false : bool)
+→ if b then true else false
diff --git a/dhall-lang/tests/alpha-normalization/success/regression/preludeBoolFoldB.dhall b/dhall-lang/tests/alpha-normalization/success/regression/preludeBoolFoldB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/alpha-normalization/success/regression/preludeBoolFoldB.dhall
@@ -0,0 +1,1 @@
+λ(_ : Bool) → λ(_ : Type) → λ(_ : _) → λ(_ : _@1) → if _@3 then _@1 else _
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/EnvironmentVariableA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/EnvironmentVariableA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/EnvironmentVariableA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/EnvironmentVariableB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/EnvironmentVariableB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/EnvironmentVariableB.dhall
@@ -0,0 +1,1 @@
+env:FOO
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithQueryA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithQueryA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithQueryA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithQueryB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithQueryB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithQueryB.dhall
@@ -0,0 +1,1 @@
+http://foo:bar@baz:123/path1/path2?query
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithoutQueryA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithoutQueryA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithoutQueryA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithoutQueryB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithoutQueryB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpImportWithoutQueryB.dhall
@@ -0,0 +1,1 @@
+http://foo:bar@baz:123/path1/path2
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithEmptyQueryA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithEmptyQueryA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithEmptyQueryA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithEmptyQueryB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithEmptyQueryB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithEmptyQueryB.dhall
@@ -0,0 +1,2 @@
+{- an empty query string is not the same as an absent query string -}
+https://foo:bar@baz:123/path1/path2?
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithQueryA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithQueryA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithQueryA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithQueryB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithQueryB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithQueryB.dhall
@@ -0,0 +1,1 @@
+https://foo:bar@baz:123/path1/path2?query
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyPathCharsA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyPathCharsA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyPathCharsA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyPathCharsB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyPathCharsB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyPathCharsB.dhall
@@ -0,0 +1,1 @@
+https://authority/path:with!funny-characters
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyQueryCharsA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyQueryCharsA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyQueryCharsA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyQueryCharsB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyQueryCharsB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithTrickyQueryCharsB.dhall
@@ -0,0 +1,1 @@
+https://authority/path?a%23b%5Bc
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithoutQueryA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithoutQueryA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithoutQueryA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithoutQueryB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithoutQueryB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/HttpsImportWithoutQueryB.dhall
@@ -0,0 +1,1 @@
+https://foo:bar@baz:123/path1/path2
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalHereImportA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHereImportA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHereImportA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalHereImportB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHereImportB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHereImportB.dhall
@@ -0,0 +1,1 @@
+./path0/path1/path2/file
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalHomeImportA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHomeImportA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHomeImportA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalHomeImportB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHomeImportB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/LocalHomeImportB.dhall
@@ -0,0 +1,1 @@
+~/path0/path1/path2/file
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalParentImportA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/LocalParentImportA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/LocalParentImportA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalParentImportB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/LocalParentImportB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/LocalParentImportB.dhall
@@ -0,0 +1,1 @@
+../path0/path1/path2/file
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalRootImportA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/LocalRootImportA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/LocalRootImportA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/LocalRootImportB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/LocalRootImportB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/LocalRootImportB.dhall
@@ -0,0 +1,1 @@
+/path0/path1/path2/file
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/MissingA.dhallb b/dhall-lang/tests/binary-decode/success/unit/imports/MissingA.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/binary-decode/success/unit/imports/MissingA.dhallb differ
diff --git a/dhall-lang/tests/binary-decode/success/unit/imports/MissingB.dhall b/dhall-lang/tests/binary-decode/success/unit/imports/MissingB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/binary-decode/success/unit/imports/MissingB.dhall
@@ -0,0 +1,1 @@
+missing
diff --git a/dhall-lang/tests/import/failure/unit/EnvUnset.dhall b/dhall-lang/tests/import/failure/unit/EnvUnset.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/failure/unit/EnvUnset.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_UNSET
diff --git a/dhall-lang/tests/import/failure/unit/EnvUnsetAsText.dhall b/dhall-lang/tests/import/failure/unit/EnvUnsetAsText.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/failure/unit/EnvUnsetAsText.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_UNSET as Text
diff --git a/dhall-lang/tests/import/success/unit/AlternativeChain1A.dhall b/dhall-lang/tests/import/success/unit/AlternativeChain1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeChain1A.dhall
@@ -0,0 +1,1 @@
+missing ? missing ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeChain1B.dhall b/dhall-lang/tests/import/success/unit/AlternativeChain1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeChain1B.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeChain2A.dhall b/dhall-lang/tests/import/success/unit/AlternativeChain2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeChain2A.dhall
@@ -0,0 +1,1 @@
+missing ? 42 ? 10
diff --git a/dhall-lang/tests/import/success/unit/AlternativeChain2B.dhall b/dhall-lang/tests/import/success/unit/AlternativeChain2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeChain2B.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeEnvA.dhall b/dhall-lang/tests/import/success/unit/AlternativeEnvA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeEnvA.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_UNSET ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeEnvB.dhall b/dhall-lang/tests/import/success/unit/AlternativeEnvB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeEnvB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeHashMismatchA.dhall b/dhall-lang/tests/import/success/unit/AlternativeHashMismatchA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeHashMismatchA.dhall
@@ -0,0 +1,1 @@
+../../data/simple.dhall sha256:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeHashMismatchB.dhall b/dhall-lang/tests/import/success/unit/AlternativeHashMismatchB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeHashMismatchB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeImportErrorA.dhall b/dhall-lang/tests/import/success/unit/AlternativeImportErrorA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeImportErrorA.dhall
@@ -0,0 +1,1 @@
+missing ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeImportErrorB.dhall b/dhall-lang/tests/import/success/unit/AlternativeImportErrorB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeImportErrorB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNestedImportErrorA.dhall b/dhall-lang/tests/import/success/unit/AlternativeNestedImportErrorA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNestedImportErrorA.dhall
@@ -0,0 +1,1 @@
+../../failure/missing.dhall ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNestedImportErrorB.dhall b/dhall-lang/tests/import/success/unit/AlternativeNestedImportErrorB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNestedImportErrorB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNoError1A.dhall b/dhall-lang/tests/import/success/unit/AlternativeNoError1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNoError1A.dhall
@@ -0,0 +1,1 @@
+42 ? 10
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNoError1B.dhall b/dhall-lang/tests/import/success/unit/AlternativeNoError1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNoError1B.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNoError2A.dhall b/dhall-lang/tests/import/success/unit/AlternativeNoError2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNoError2A.dhall
@@ -0,0 +1,1 @@
+42 ? missing
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNoError2B.dhall b/dhall-lang/tests/import/success/unit/AlternativeNoError2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNoError2B.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNoError3A.dhall b/dhall-lang/tests/import/success/unit/AlternativeNoError3A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNoError3A.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_VAR ? 10
diff --git a/dhall-lang/tests/import/success/unit/AlternativeNoError3B.dhall b/dhall-lang/tests/import/success/unit/AlternativeNoError3B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeNoError3B.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeParseErrorA.dhall b/dhall-lang/tests/import/success/unit/AlternativeParseErrorA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeParseErrorA.dhall
@@ -0,0 +1,1 @@
+../../data/example.txt ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeParseErrorB.dhall b/dhall-lang/tests/import/success/unit/AlternativeParseErrorB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeParseErrorB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeSubExprA.dhall b/dhall-lang/tests/import/success/unit/AlternativeSubExprA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeSubExprA.dhall
@@ -0,0 +1,1 @@
+missing + 10 ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeSubExprB.dhall b/dhall-lang/tests/import/success/unit/AlternativeSubExprB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeSubExprB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeTypeErrorA.dhall b/dhall-lang/tests/import/success/unit/AlternativeTypeErrorA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeTypeErrorA.dhall
@@ -0,0 +1,1 @@
+../../data/doesNotTypecheck.dhall ? 42
diff --git a/dhall-lang/tests/import/success/unit/AlternativeTypeErrorB.dhall b/dhall-lang/tests/import/success/unit/AlternativeTypeErrorB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AlternativeTypeErrorB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/AsTextA.dhall b/dhall-lang/tests/import/success/unit/AsTextA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AsTextA.dhall
@@ -0,0 +1,1 @@
+../../data/example.txt as Text
diff --git a/dhall-lang/tests/import/success/unit/AsTextB.dhall b/dhall-lang/tests/import/success/unit/AsTextB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/AsTextB.dhall
@@ -0,0 +1,3 @@
+''
+Hello, world!
+''
diff --git a/dhall-lang/tests/import/success/unit/EnvSetA.dhall b/dhall-lang/tests/import/success/unit/EnvSetA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/EnvSetA.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_VAR
diff --git a/dhall-lang/tests/import/success/unit/EnvSetAsTextA.dhall b/dhall-lang/tests/import/success/unit/EnvSetAsTextA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/EnvSetAsTextA.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_VAR as Text
diff --git a/dhall-lang/tests/import/success/unit/EnvSetAsTextB.dhall b/dhall-lang/tests/import/success/unit/EnvSetAsTextB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/EnvSetAsTextB.dhall
@@ -0,0 +1,1 @@
+"6 * 7"
diff --git a/dhall-lang/tests/import/success/unit/EnvSetB.dhall b/dhall-lang/tests/import/success/unit/EnvSetB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/EnvSetB.dhall
@@ -0,0 +1,1 @@
+42
diff --git a/dhall-lang/tests/import/success/unit/NormalizeA.dhall b/dhall-lang/tests/import/success/unit/NormalizeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/NormalizeA.dhall
@@ -0,0 +1,1 @@
+../../../../../dhall-lang/tests/normalization/success/unit/OperatorPlusOneAndOneA.dhall
diff --git a/dhall-lang/tests/import/success/unit/NormalizeB.dhall b/dhall-lang/tests/import/success/unit/NormalizeB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/NormalizeB.dhall
@@ -0,0 +1,1 @@
+2
diff --git a/dhall-lang/tests/import/success/unit/RemoteAsTextA.dhall b/dhall-lang/tests/import/success/unit/RemoteAsTextA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/RemoteAsTextA.dhall
@@ -0,0 +1,1 @@
+https://raw.githubusercontent.com/dhall-lang/dhall-lang/0b983b92aa2222dc3e292c20550ee37dea3f41df/tests/import/data/example.txt as Text
diff --git a/dhall-lang/tests/import/success/unit/RemoteAsTextB.dhall b/dhall-lang/tests/import/success/unit/RemoteAsTextB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/RemoteAsTextB.dhall
@@ -0,0 +1,3 @@
+''
+Hello, world!
+''
diff --git a/dhall-lang/tests/import/success/unit/SimpleA.dhall b/dhall-lang/tests/import/success/unit/SimpleA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/SimpleA.dhall
@@ -0,0 +1,1 @@
+../../data/simple.dhall
diff --git a/dhall-lang/tests/import/success/unit/SimpleB.dhall b/dhall-lang/tests/import/success/unit/SimpleB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/SimpleB.dhall
@@ -0,0 +1,1 @@
+3
diff --git a/dhall-lang/tests/import/success/unit/SimpleHashA.dhall b/dhall-lang/tests/import/success/unit/SimpleHashA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/SimpleHashA.dhall
@@ -0,0 +1,1 @@
+../../data/simple.dhall sha256:15f52ecf91c94c1baac02d5a4964b2ed8fa401641a2c8a95e8306ec7c1e3b8d2
diff --git a/dhall-lang/tests/import/success/unit/SimpleHashB.dhall b/dhall-lang/tests/import/success/unit/SimpleHashB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/SimpleHashB.dhall
@@ -0,0 +1,1 @@
+3
diff --git a/dhall-lang/tests/import/success/unit/SimpleRemoteA.dhall b/dhall-lang/tests/import/success/unit/SimpleRemoteA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/SimpleRemoteA.dhall
@@ -0,0 +1,1 @@
+https://raw.githubusercontent.com/dhall-lang/dhall-lang/0b983b92aa2222dc3e292c20550ee37dea3f41df/tests/import/data/simple.dhall
diff --git a/dhall-lang/tests/import/success/unit/SimpleRemoteB.dhall b/dhall-lang/tests/import/success/unit/SimpleRemoteB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/SimpleRemoteB.dhall
@@ -0,0 +1,1 @@
+3
diff --git a/dhall-lang/tests/import/success/unit/asLocation/AbsoluteA.dhall b/dhall-lang/tests/import/success/unit/asLocation/AbsoluteA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/AbsoluteA.dhall
@@ -0,0 +1,1 @@
+/absolute/import as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/AbsoluteB.dhall b/dhall-lang/tests/import/success/unit/asLocation/AbsoluteB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/AbsoluteB.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "/absolute/import"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize1A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize1A.dhall
@@ -0,0 +1,1 @@
+./foo/./bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize1B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize1B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/asLocation/foo/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize2A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize2A.dhall
@@ -0,0 +1,1 @@
+./foo/baz/../bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize2B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize2B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/asLocation/foo/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize3A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize3A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize3A.dhall
@@ -0,0 +1,1 @@
+./../bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize3B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize3B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize3B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize4A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize4A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize4A.dhall
@@ -0,0 +1,1 @@
+../../bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize4B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize4B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize4B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize5A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize5A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize5A.dhall
@@ -0,0 +1,1 @@
+./foo/../../bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Canonicalize5B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize5B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Canonicalize5B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Chain1A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Chain1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Chain1A.dhall
@@ -0,0 +1,1 @@
+./Relative1A.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Chain1B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Chain1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Chain1B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/asLocation/some/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Chain2A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Chain2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Chain2A.dhall
@@ -0,0 +1,1 @@
+./Canonicalize4A.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Chain2B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Chain2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Chain2B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Chain3A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Chain3A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Chain3A.dhall
@@ -0,0 +1,1 @@
+../asLocation/Canonicalize4A.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Chain3B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Chain3B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Chain3B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/DontTryResolvingA.dhall b/dhall-lang/tests/import/success/unit/asLocation/DontTryResolvingA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/DontTryResolvingA.dhall
@@ -0,0 +1,1 @@
+(missing as Location) ? 42  -- `missing` fails as an import, but definitely resolves as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/DontTryResolvingB.dhall b/dhall-lang/tests/import/success/unit/asLocation/DontTryResolvingB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/DontTryResolvingB.dhall
@@ -0,0 +1,1 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Missing
diff --git a/dhall-lang/tests/import/success/unit/asLocation/EnvA.dhall b/dhall-lang/tests/import/success/unit/asLocation/EnvA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/EnvA.dhall
@@ -0,0 +1,1 @@
+env:DHALL_TEST_VAR as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/EnvB.dhall b/dhall-lang/tests/import/success/unit/asLocation/EnvB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/EnvB.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Environment
+  "DHALL_TEST_VAR"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/HashA.dhall b/dhall-lang/tests/import/success/unit/asLocation/HashA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/HashA.dhall
@@ -0,0 +1,6 @@
+{-
+  If you have set XDG_CACHE_HOME as described in tests/README.md, this hash will
+  be available in the cache. Since this is an `as Location` test however, you
+  mustn't use the cache value here.
+-}
+./some/import.dhall sha256:efc43103e49b56c5bf089db8e0365bbfc455b8a2f0dc6ee5727a3586f85969fd as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/HashB.dhall b/dhall-lang/tests/import/success/unit/asLocation/HashB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/HashB.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/asLocation/some/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/HomeA.dhall b/dhall-lang/tests/import/success/unit/asLocation/HomeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/HomeA.dhall
@@ -0,0 +1,1 @@
+~/some/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/HomeB.dhall b/dhall-lang/tests/import/success/unit/asLocation/HomeB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/HomeB.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "~/some/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/MissingA.dhall b/dhall-lang/tests/import/success/unit/asLocation/MissingA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/MissingA.dhall
@@ -0,0 +1,1 @@
+missing as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/MissingB.dhall b/dhall-lang/tests/import/success/unit/asLocation/MissingB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/MissingB.dhall
@@ -0,0 +1,1 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Missing
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Relative1A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Relative1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Relative1A.dhall
@@ -0,0 +1,1 @@
+./some/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Relative1B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Relative1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Relative1B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/asLocation/some/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Relative2A.dhall b/dhall-lang/tests/import/success/unit/asLocation/Relative2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Relative2A.dhall
@@ -0,0 +1,1 @@
+../some/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/Relative2B.dhall b/dhall-lang/tests/import/success/unit/asLocation/Relative2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/Relative2B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Local
+  "./dhall-lang/tests/import/success/unit/some/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteA.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteA.dhall
@@ -0,0 +1,1 @@
+https://example.com/foo/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteB.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteB.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://example.com/foo/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize1A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize1A.dhall
@@ -0,0 +1,1 @@
+https://example.com/foo/./bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize1B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize1B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://example.com/foo/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize2A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize2A.dhall
@@ -0,0 +1,1 @@
+https://example.com/foo/bar/../baz/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize2B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize2B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://example.com/foo/baz/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize3A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize3A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize3A.dhall
@@ -0,0 +1,1 @@
+https://example.com/foo/bar/../../baz/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize3B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize3B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize3B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://example.com/baz/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize4A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize4A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize4A.dhall
@@ -0,0 +1,4 @@
+{-
+  The standardized behaviour does not respect https://tools.ietf.org/html/rfc3986#section-5.2 .
+-}
+https://example.com/../bar/import.dhall as Location
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize4B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize4B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteCanonicalize4B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://example.com/../bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChain1A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain1A.dhall
@@ -0,0 +1,1 @@
+https://raw.githubusercontent.com/dhall-lang/dhall-lang/0b983b92aa2222dc3e292c20550ee37dea3f41df/tests/import/data/simpleLocation.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChain1B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain1B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://raw.githubusercontent.com/dhall-lang/dhall-lang/0b983b92aa2222dc3e292c20550ee37dea3f41df/tests/import/data/simple.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChain2A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain2A.dhall
@@ -0,0 +1,1 @@
+https://raw.githubusercontent.com/Nadrieril/dhall-rust/f7d8c64a9799f139ad65427c2518376adb9e2e2f/dhall/tests/import/success/unit/asLocation/Canonicalize3A.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChain2B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain2B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://raw.githubusercontent.com/Nadrieril/dhall-rust/f7d8c64a9799f139ad65427c2518376adb9e2e2f/dhall/tests/import/success/unit/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChain3A.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain3A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain3A.dhall
@@ -0,0 +1,1 @@
+https://raw.githubusercontent.com/Nadrieril/dhall-rust/f7d8c64a9799f139ad65427c2518376adb9e2e2f/dhall/tests/import/success/unit/asLocation/Canonicalize5A.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChain3B.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain3B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChain3B.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Remote
+  "https://raw.githubusercontent.com/Nadrieril/dhall-rust/f7d8c64a9799f139ad65427c2518376adb9e2e2f/dhall/tests/import/success/unit/bar/import.dhall"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChainEnvA.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainEnvA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainEnvA.dhall
@@ -0,0 +1,5 @@
+{-
+    This test verifies that `env:VAR as Location` isn't rejected as referentially opaque,
+    as `env:VAR` on its own would.
+-}
+https://raw.githubusercontent.com/Nadrieril/dhall-rust/f7d8c64a9799f139ad65427c2518376adb9e2e2f/dhall/tests/import/success/unit/asLocation/EnvA.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChainEnvB.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainEnvB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainEnvB.dhall
@@ -0,0 +1,2 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Environment
+  "HOME"
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChainMissingA.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainMissingA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainMissingA.dhall
@@ -0,0 +1,6 @@
+{- This test verifies that `missing as Location` succeeds when chained since:
+   * The `missing` is never actually resolved (due to the `as Location`)
+   * The `missing` should be treated as referentially transparent (and therefore
+     be a valid transitive dependency of a remote import)
+-}
+https://raw.githubusercontent.com/Nadrieril/dhall-rust/f7d8c64a9799f139ad65427c2518376adb9e2e2f/dhall/tests/import/success/unit/asLocation/MissingA.dhall
diff --git a/dhall-lang/tests/import/success/unit/asLocation/RemoteChainMissingB.dhall b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainMissingB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/import/success/unit/asLocation/RemoteChainMissingB.dhall
@@ -0,0 +1,1 @@
+< Environment : Text | Local : Text | Missing | Remote : Text >.Missing
diff --git a/dhall-lang/tests/normalization/success/regression/NaturalFoldExtraArgA.dhall b/dhall-lang/tests/normalization/success/regression/NaturalFoldExtraArgA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/normalization/success/regression/NaturalFoldExtraArgA.dhall
@@ -0,0 +1,2 @@
+{- Checks that builtins don't accidentally discard further arguments than their arity -}
+Natural/fold 0 (Bool -> Bool) (λ(_ : (Bool -> Bool)) → λ(_ : Bool) → True) (λ(_ : Bool) → False) True
diff --git a/dhall-lang/tests/normalization/success/regression/NaturalFoldExtraArgB.dhall b/dhall-lang/tests/normalization/success/regression/NaturalFoldExtraArgB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/normalization/success/regression/NaturalFoldExtraArgB.dhall
@@ -0,0 +1,1 @@
+False
diff --git a/dhall-lang/tests/normalization/success/regression/TrickyBinderIdentityA.dhall b/dhall-lang/tests/normalization/success/regression/TrickyBinderIdentityA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/normalization/success/regression/TrickyBinderIdentityA.dhall
@@ -0,0 +1,1 @@
+let T = Natural let ap = λ(f : T → List T) -> λ(x : T) -> f x in ap (λ(x : T) -> ap (λ(y : T) -> [x, y]) 1) 0
diff --git a/dhall-lang/tests/normalization/success/regression/TrickyBinderIdentityB.dhall b/dhall-lang/tests/normalization/success/regression/TrickyBinderIdentityB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/normalization/success/regression/TrickyBinderIdentityB.dhall
@@ -0,0 +1,1 @@
+[ 0, 1 ]
diff --git a/dhall-lang/tests/parser/failure/spacing/AnnotationNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/AnnotationNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/AnnotationNoSpace.dhall
@@ -0,0 +1,1 @@
+x :T
diff --git a/dhall-lang/tests/parser/failure/spacing/ApplicationNoSpace1.dhall b/dhall-lang/tests/parser/failure/spacing/ApplicationNoSpace1.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ApplicationNoSpace1.dhall
@@ -0,0 +1,1 @@
+f(x)
diff --git a/dhall-lang/tests/parser/failure/spacing/ApplicationNoSpace2.dhall b/dhall-lang/tests/parser/failure/spacing/ApplicationNoSpace2.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ApplicationNoSpace2.dhall
@@ -0,0 +1,2 @@
+-- There needs to be a space between a function and its argument
+./example.dhall[1]
diff --git a/dhall-lang/tests/parser/failure/spacing/AssertNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/AssertNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/AssertNoSpace.dhall
@@ -0,0 +1,1 @@
+assert :T
diff --git a/dhall-lang/tests/parser/failure/spacing/ForallNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/ForallNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ForallNoSpace.dhall
@@ -0,0 +1,1 @@
+forall(x :T) -> x
diff --git a/dhall-lang/tests/parser/failure/spacing/HeadersNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/HeadersNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/HeadersNoSpace.dhall
@@ -0,0 +1,1 @@
+https://example.com/foo using(x)
diff --git a/dhall-lang/tests/parser/failure/spacing/IfNoSpace1.dhall b/dhall-lang/tests/parser/failure/spacing/IfNoSpace1.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/IfNoSpace1.dhall
@@ -0,0 +1,1 @@
+if(b) then x else y
diff --git a/dhall-lang/tests/parser/failure/spacing/IfNoSpace2.dhall b/dhall-lang/tests/parser/failure/spacing/IfNoSpace2.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/IfNoSpace2.dhall
@@ -0,0 +1,1 @@
+if b then(x) else y
diff --git a/dhall-lang/tests/parser/failure/spacing/IfNoSpace3.dhall b/dhall-lang/tests/parser/failure/spacing/IfNoSpace3.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/IfNoSpace3.dhall
@@ -0,0 +1,1 @@
+if b then x else(y)
diff --git a/dhall-lang/tests/parser/failure/spacing/ImportAltNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/ImportAltNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ImportAltNoSpace.dhall
@@ -0,0 +1,1 @@
+x ?y
diff --git a/dhall-lang/tests/parser/failure/spacing/ImportHashedNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/ImportHashedNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ImportHashedNoSpace.dhall
@@ -0,0 +1,1 @@
+missingsha256:0000000000000000000000000000000000000000000000000000000000000000
diff --git a/dhall-lang/tests/parser/failure/spacing/LambdaNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/LambdaNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/LambdaNoSpace.dhall
@@ -0,0 +1,1 @@
+\(x :T) -> x
diff --git a/dhall-lang/tests/parser/failure/spacing/LetAnnotNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/LetAnnotNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/LetAnnotNoSpace.dhall
@@ -0,0 +1,1 @@
+let x :T = y in e
diff --git a/dhall-lang/tests/parser/failure/spacing/LetNoSpace1.dhall b/dhall-lang/tests/parser/failure/spacing/LetNoSpace1.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/LetNoSpace1.dhall
@@ -0,0 +1,1 @@
+letx = y in e
diff --git a/dhall-lang/tests/parser/failure/spacing/LetNoSpace2.dhall b/dhall-lang/tests/parser/failure/spacing/LetNoSpace2.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/LetNoSpace2.dhall
@@ -0,0 +1,1 @@
+let x = y in(e)
diff --git a/dhall-lang/tests/parser/failure/spacing/ListLitEmptyNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/ListLitEmptyNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ListLitEmptyNoSpace.dhall
@@ -0,0 +1,1 @@
+[] :T
diff --git a/dhall-lang/tests/parser/failure/spacing/MergeAnnotationNoSpace3.dhall b/dhall-lang/tests/parser/failure/spacing/MergeAnnotationNoSpace3.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/MergeAnnotationNoSpace3.dhall
@@ -0,0 +1,1 @@
+merge x y :T
diff --git a/dhall-lang/tests/parser/failure/spacing/MergeNoSpace1.dhall b/dhall-lang/tests/parser/failure/spacing/MergeNoSpace1.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/MergeNoSpace1.dhall
@@ -0,0 +1,1 @@
+merge(x) y
diff --git a/dhall-lang/tests/parser/failure/spacing/MergeNoSpace2.dhall b/dhall-lang/tests/parser/failure/spacing/MergeNoSpace2.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/MergeNoSpace2.dhall
@@ -0,0 +1,1 @@
+merge x(y)
diff --git a/dhall-lang/tests/parser/failure/spacing/NaturalPlusNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/NaturalPlusNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/NaturalPlusNoSpace.dhall
@@ -0,0 +1,1 @@
+x +y
diff --git a/dhall-lang/tests/parser/failure/spacing/RecordTypeNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/RecordTypeNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/RecordTypeNoSpace.dhall
@@ -0,0 +1,1 @@
+{ x :T }
diff --git a/dhall-lang/tests/parser/failure/spacing/SomeNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/SomeNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/SomeNoSpace.dhall
@@ -0,0 +1,1 @@
+Some(x)
diff --git a/dhall-lang/tests/parser/failure/spacing/ToMapAnnotNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/ToMapAnnotNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ToMapAnnotNoSpace.dhall
@@ -0,0 +1,1 @@
+toMap x :T
diff --git a/dhall-lang/tests/parser/failure/spacing/ToMapNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/ToMapNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/ToMapNoSpace.dhall
@@ -0,0 +1,1 @@
+toMap(x)
diff --git a/dhall-lang/tests/parser/failure/spacing/UnionTypeNoSpace.dhall b/dhall-lang/tests/parser/failure/spacing/UnionTypeNoSpace.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/spacing/UnionTypeNoSpace.dhall
@@ -0,0 +1,1 @@
+< x :T >
diff --git a/dhall-lang/tests/parser/failure/unit/AssertNoAnnotation.dhall b/dhall-lang/tests/parser/failure/unit/AssertNoAnnotation.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/AssertNoAnnotation.dhall
@@ -0,0 +1,1 @@
+assert
diff --git a/dhall-lang/tests/parser/failure/unit/BoolLitTrueWithIndex.dhall b/dhall-lang/tests/parser/failure/unit/BoolLitTrueWithIndex.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/BoolLitTrueWithIndex.dhall
@@ -0,0 +1,1 @@
+True@0
diff --git a/dhall-lang/tests/parser/failure/unit/BuiltinBoolWithIndex.dhall b/dhall-lang/tests/parser/failure/unit/BuiltinBoolWithIndex.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/BuiltinBoolWithIndex.dhall
@@ -0,0 +1,1 @@
+Bool@1
diff --git a/dhall-lang/tests/parser/failure/unit/BuiltinTypeWithIndex.dhall b/dhall-lang/tests/parser/failure/unit/BuiltinTypeWithIndex.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/BuiltinTypeWithIndex.dhall
@@ -0,0 +1,1 @@
+Type@0
diff --git a/dhall-lang/tests/parser/failure/unit/ImportEnvWrongEscape.dhall b/dhall-lang/tests/parser/failure/unit/ImportEnvWrongEscape.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/ImportEnvWrongEscape.dhall
@@ -0,0 +1,1 @@
+env:"\$"
diff --git a/dhall-lang/tests/parser/failure/unit/ListLitEmptyAnnotation.dhall b/dhall-lang/tests/parser/failure/unit/ListLitEmptyAnnotation.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/ListLitEmptyAnnotation.dhall
@@ -0,0 +1,1 @@
+([]) : List T
diff --git a/dhall-lang/tests/parser/failure/unit/ListLitEmptyMissingAnnotation.dhall b/dhall-lang/tests/parser/failure/unit/ListLitEmptyMissingAnnotation.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/ListLitEmptyMissingAnnotation.dhall
@@ -0,0 +1,1 @@
+[]
diff --git a/dhall-lang/tests/parser/failure/unit/MergeAlone.dhall b/dhall-lang/tests/parser/failure/unit/MergeAlone.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/MergeAlone.dhall
@@ -0,0 +1,1 @@
+merge
diff --git a/dhall-lang/tests/parser/failure/unit/MergeOneArgument.dhall b/dhall-lang/tests/parser/failure/unit/MergeOneArgument.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/MergeOneArgument.dhall
@@ -0,0 +1,1 @@
+merge x
diff --git a/dhall-lang/tests/parser/failure/unit/NaturalLitLeadingZero.dhall b/dhall-lang/tests/parser/failure/unit/NaturalLitLeadingZero.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/NaturalLitLeadingZero.dhall
@@ -0,0 +1,1 @@
+042
diff --git a/dhall-lang/tests/parser/failure/unit/OldUnionLitSyntax.dhall b/dhall-lang/tests/parser/failure/unit/OldUnionLitSyntax.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/OldUnionLitSyntax.dhall
@@ -0,0 +1,1 @@
+< x = 3 | y : Bool >
diff --git a/dhall-lang/tests/parser/failure/unit/RecordLitPunDotted.dhall b/dhall-lang/tests/parser/failure/unit/RecordLitPunDotted.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/RecordLitPunDotted.dhall
@@ -0,0 +1,1 @@
+{ x.y.z }
diff --git a/dhall-lang/tests/parser/failure/unit/RecordTypeTrailingComma.dhall b/dhall-lang/tests/parser/failure/unit/RecordTypeTrailingComma.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/RecordTypeTrailingComma.dhall
@@ -0,0 +1,1 @@
+{ x: T, }
diff --git a/dhall-lang/tests/parser/failure/unit/SomeAlone.dhall b/dhall-lang/tests/parser/failure/unit/SomeAlone.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/SomeAlone.dhall
@@ -0,0 +1,1 @@
+Some
diff --git a/dhall-lang/tests/parser/failure/unit/UsingToMap.dhall b/dhall-lang/tests/parser/failure/unit/UsingToMap.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/failure/unit/UsingToMap.dhall
@@ -0,0 +1,8 @@
+{-  At one point the Haskell implementation permitted this idiom, which was not
+    standards-compliant
+
+    The problem with the following expression is that the argument to `using`
+    is parsed as a `completionExpression`, which means that any use of `toMap`
+    within a `using` clause must be parenthesized
+-}
+https://example.com using toMap { Foo = "Bar" }
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolAndA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolAndA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolAndA.dhall
@@ -0,0 +1,1 @@
+x && y
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolAndAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolAndAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolAndAssocA.dhall
@@ -0,0 +1,1 @@
+w && x && y && z
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolAndAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolAndAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolAndAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolAndB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolAndB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolAndB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolEQA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolEQA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolEQA.dhall
@@ -0,0 +1,1 @@
+x == y
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolEQAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolEQAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolEQAssocA.dhall
@@ -0,0 +1,1 @@
+w == x == y == z
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolEQAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolEQAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolEQAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolEQB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolEQB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolEQB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolNEA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolNEA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolNEA.dhall
@@ -0,0 +1,1 @@
+x != y
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolNEAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolNEAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolNEAssocA.dhall
@@ -0,0 +1,1 @@
+w != x != y != z
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolNEAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolNEAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolNEAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolNEB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolNEB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolNEB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolOrA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolOrA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolOrA.dhall
@@ -0,0 +1,1 @@
+x || y
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolOrAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/BoolOrAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/BoolOrAssocA.dhall
@@ -0,0 +1,1 @@
+w || x || y || z
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolOrAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolOrAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolOrAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/BoolOrB.dhallb b/dhall-lang/tests/parser/success/unit/operators/BoolOrB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/BoolOrB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/EquivalenceA.dhall b/dhall-lang/tests/parser/success/unit/operators/EquivalenceA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/EquivalenceA.dhall
@@ -0,0 +1,1 @@
+x === y
diff --git a/dhall-lang/tests/parser/success/unit/operators/EquivalenceB.dhallb b/dhall-lang/tests/parser/success/unit/operators/EquivalenceB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/EquivalenceB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/ImportAltA.dhall b/dhall-lang/tests/parser/success/unit/operators/ImportAltA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/ImportAltA.dhall
@@ -0,0 +1,1 @@
+x ? y
diff --git a/dhall-lang/tests/parser/success/unit/operators/ImportAltAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/ImportAltAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/ImportAltAssocA.dhall
@@ -0,0 +1,1 @@
+w ? x ? y ? z
diff --git a/dhall-lang/tests/parser/success/unit/operators/ImportAltAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/ImportAltAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/ImportAltAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/ImportAltB.dhallb b/dhall-lang/tests/parser/success/unit/operators/ImportAltB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/ImportAltB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/ListAppendA.dhall b/dhall-lang/tests/parser/success/unit/operators/ListAppendA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/ListAppendA.dhall
@@ -0,0 +1,1 @@
+x # y
diff --git a/dhall-lang/tests/parser/success/unit/operators/ListAppendAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/ListAppendAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/ListAppendAssocA.dhall
@@ -0,0 +1,1 @@
+w # x # y # z
diff --git a/dhall-lang/tests/parser/success/unit/operators/ListAppendAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/ListAppendAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/ListAppendAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/ListAppendB.dhallb b/dhall-lang/tests/parser/success/unit/operators/ListAppendB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/ListAppendB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalPlusA.dhall b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusA.dhall
@@ -0,0 +1,1 @@
+x + y
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalPlusAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusAssocA.dhall
@@ -0,0 +1,1 @@
+w + x + y + z
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalPlusAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalPlusB.dhallb b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/NaturalPlusB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalTimesA.dhall b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesA.dhall
@@ -0,0 +1,1 @@
+x * y
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalTimesAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesAssocA.dhall
@@ -0,0 +1,1 @@
+w * x * y * z
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalTimesAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/NaturalTimesB.dhallb b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/NaturalTimesB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/PrecedenceBoolA.dhall b/dhall-lang/tests/parser/success/unit/operators/PrecedenceBoolA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/PrecedenceBoolA.dhall
@@ -0,0 +1,1 @@
+a && b || c d == e || f != g && h || i
diff --git a/dhall-lang/tests/parser/success/unit/operators/PrecedenceBoolB.dhallb b/dhall-lang/tests/parser/success/unit/operators/PrecedenceBoolB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/PrecedenceBoolB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/PrecedenceNatA.dhall b/dhall-lang/tests/parser/success/unit/operators/PrecedenceNatA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/PrecedenceNatA.dhall
@@ -0,0 +1,1 @@
+a + b * d + e f * (g + h)
diff --git a/dhall-lang/tests/parser/success/unit/operators/PrecedenceNatB.dhallb b/dhall-lang/tests/parser/success/unit/operators/PrecedenceNatB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/PrecedenceNatB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/PrecedenceRecordA.dhall b/dhall-lang/tests/parser/success/unit/operators/PrecedenceRecordA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/PrecedenceRecordA.dhall
@@ -0,0 +1,1 @@
+a // b c /\ d ⫽ e.{x} ∧ f
diff --git a/dhall-lang/tests/parser/success/unit/operators/PrecedenceRecordB.dhallb b/dhall-lang/tests/parser/success/unit/operators/PrecedenceRecordB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/PrecedenceRecordB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeA.dhall
@@ -0,0 +1,1 @@
+x //\\ y
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeAssocA.dhall
@@ -0,0 +1,1 @@
+w //\\ x //\\ y //\\ z
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeA.dhall
@@ -0,0 +1,1 @@
+x ∧ y
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeAssocA.dhall
@@ -0,0 +1,1 @@
+w ∧ x /\ y ∧ z
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordMergeUnicodeB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeA.dhall
@@ -0,0 +1,1 @@
+x /\ y
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeAssocA.dhall
@@ -0,0 +1,1 @@
+w /\ x /\ y /\ z
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeA.dhall
@@ -0,0 +1,1 @@
+x ⩓ y
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeAssocA.dhall
@@ -0,0 +1,1 @@
+w ⩓ x //\\ y ⩓ z
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RecursiveRecordTypeMergeUnicodeB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeA.dhall b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeA.dhall
@@ -0,0 +1,1 @@
+x // y
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeAssocA.dhall
@@ -0,0 +1,1 @@
+w // x // y // z
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeA.dhall b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeA.dhall
@@ -0,0 +1,1 @@
+x ⫽ y
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeAssocA.dhall
@@ -0,0 +1,1 @@
+w ⫽ x // y ⫽ z
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeB.dhallb b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/RightBiasedRecordMergeUnicodeB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/TextAppendA.dhall b/dhall-lang/tests/parser/success/unit/operators/TextAppendA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/TextAppendA.dhall
@@ -0,0 +1,1 @@
+x ++ y
diff --git a/dhall-lang/tests/parser/success/unit/operators/TextAppendAssocA.dhall b/dhall-lang/tests/parser/success/unit/operators/TextAppendAssocA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/parser/success/unit/operators/TextAppendAssocA.dhall
@@ -0,0 +1,1 @@
+w ++ x ++ y ++ z
diff --git a/dhall-lang/tests/parser/success/unit/operators/TextAppendAssocB.dhallb b/dhall-lang/tests/parser/success/unit/operators/TextAppendAssocB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/TextAppendAssocB.dhallb differ
diff --git a/dhall-lang/tests/parser/success/unit/operators/TextAppendB.dhallb b/dhall-lang/tests/parser/success/unit/operators/TextAppendB.dhallb
new file mode 100644
Binary files /dev/null and b/dhall-lang/tests/parser/success/unit/operators/TextAppendB.dhallb differ
diff --git a/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping1A.dhall b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping1A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping1A.dhall
@@ -0,0 +1,1 @@
+let T = 0 in λ(T : Type) → λ(x : T) → 1
diff --git a/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping1B.dhall b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping1B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping1B.dhall
@@ -0,0 +1,1 @@
+∀(T : Type) → ∀(x : T) → Natural
diff --git a/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping2A.dhall b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping2A.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping2A.dhall
@@ -0,0 +1,1 @@
+(λ(T : Type) → let x = 0 in λ(x : T) → x) : ∀(T : Type) → ∀(x : T) → T
diff --git a/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping2B.dhall b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping2B.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/LambdaInLetScoping2B.dhall
@@ -0,0 +1,1 @@
+∀(T : Type) → ∀(x : T) → T
diff --git a/dhall-lang/tests/type-inference/success/regression/RecursiveRecordTypeMergeTripleCollisionA.dhall b/dhall-lang/tests/type-inference/success/regression/RecursiveRecordTypeMergeTripleCollisionA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/RecursiveRecordTypeMergeTripleCollisionA.dhall
@@ -0,0 +1,1 @@
+{ x : { a : Bool } } ⩓ { x : { b : Bool } } ⩓ { x : { c : Bool } }
diff --git a/dhall-lang/tests/type-inference/success/regression/RecursiveRecordTypeMergeTripleCollisionB.dhall b/dhall-lang/tests/type-inference/success/regression/RecursiveRecordTypeMergeTripleCollisionB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/RecursiveRecordTypeMergeTripleCollisionB.dhall
@@ -0,0 +1,1 @@
+Type
diff --git a/dhall-lang/tests/type-inference/success/regression/TodoA.dhall b/dhall-lang/tests/type-inference/success/regression/TodoA.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/TodoA.dhall
@@ -0,0 +1,1 @@
+λ(todo : ∀(a : Type) → a) → todo
diff --git a/dhall-lang/tests/type-inference/success/regression/TodoB.dhall b/dhall-lang/tests/type-inference/success/regression/TodoB.dhall
new file mode 100644
--- /dev/null
+++ b/dhall-lang/tests/type-inference/success/regression/TodoB.dhall
@@ -0,0 +1,1 @@
+∀(todo : ∀(a : Type) → a) → ∀(a : Type) → a
diff --git a/dhall.cabal b/dhall.cabal
--- a/dhall.cabal
+++ b/dhall.cabal
@@ -1,5 +1,5 @@
 Name: dhall
-Version: 1.31.0
+Version: 1.31.1
 Cabal-Version: >=1.10
 Build-Type: Simple
 Tested-With: GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.1
@@ -178,29 +178,40 @@
     dhall-lang/Prelude/XML/text
     dhall-lang/Prelude/package.dhall
     dhall-lang/tests/alpha-normalization/success/unit/*.dhall
+    dhall-lang/tests/alpha-normalization/success/regression/*.dhall
     dhall-lang/tests/binary-decode/failure/unit/*.dhallb
     dhall-lang/tests/binary-decode/success/unit/*.dhall
     dhall-lang/tests/binary-decode/success/unit/*.dhallb
+    dhall-lang/tests/binary-decode/success/unit/imports/*.dhall
+    dhall-lang/tests/binary-decode/success/unit/imports/*.dhallb
     dhall-lang/tests/import/cache/dhall/1220efc43103e49b56c5bf089db8e0365bbfc455b8a2f0dc6ee5727a3586f85969fd
     dhall-lang/tests/import/data/*.dhall
     dhall-lang/tests/import/data/*.txt
     dhall-lang/tests/import/failure/*.dhall
+    dhall-lang/tests/import/failure/unit/*.dhall
     dhall-lang/tests/import/success/*.dhall
+    dhall-lang/tests/import/success/unit/*.dhall
+    dhall-lang/tests/import/success/unit/asLocation/*.dhall
     dhall-lang/tests/normalization/success/*.dhall
     dhall-lang/tests/normalization/success/haskell-tutorial/access/*.dhall
     dhall-lang/tests/normalization/success/haskell-tutorial/combineTypes/*.dhall
     dhall-lang/tests/normalization/success/haskell-tutorial/prefer/*.dhall
     dhall-lang/tests/normalization/success/haskell-tutorial/projection/*.dhall
+    dhall-lang/tests/normalization/success/regression/*.dhall
     dhall-lang/tests/normalization/success/simple/*.dhall
     dhall-lang/tests/normalization/success/simplifications/*.dhall
     dhall-lang/tests/normalization/success/unit/*.dhall
     dhall-lang/tests/parser/failure/*.dhall
+    dhall-lang/tests/parser/failure/spacing/*.dhall
+    dhall-lang/tests/parser/failure/unit/*.dhall
     dhall-lang/tests/parser/success/*.dhall
     dhall-lang/tests/parser/success/*.dhallb
     dhall-lang/tests/parser/success/text/*.dhall
     dhall-lang/tests/parser/success/text/*.dhallb
     dhall-lang/tests/parser/success/unit/*.dhall
     dhall-lang/tests/parser/success/unit/*.dhallb
+    dhall-lang/tests/parser/success/unit/operators/*.dhall
+    dhall-lang/tests/parser/success/unit/operators/*.dhallb
     dhall-lang/tests/parser/success/unit/import/*.dhall
     dhall-lang/tests/parser/success/unit/import/*.dhallb
     dhall-lang/tests/parser/success/unit/import/urls/*.dhall
@@ -398,6 +409,7 @@
     dhall-lang/tests/type-inference/success/prelude/Text/concatMap/*.dhall
     dhall-lang/tests/type-inference/success/prelude/Text/concatMapSep/*.dhall
     dhall-lang/tests/type-inference/success/prelude/Text/concatSep/*.dhall
+    dhall-lang/tests/type-inference/success/regression/*.dhall
     dhall-lang/tests/type-inference/success/simple/*.dhall
     dhall-lang/tests/type-inference/success/simple/access/*.dhall
     dhall-lang/tests/type-inference/success/unit/*.dhall
@@ -462,10 +474,10 @@
         prettyprinter-ansi-terminal >= 1.1.1    && < 1.2 ,
         pretty-simple                              < 4   ,
         profunctors                 >= 3.1.2    && < 5.6 ,
-        repline                     >= 0.2.1.0  && < 0.3 ,
+        repline                     >= 0.2.1.0  && < 0.4 ,
         serialise                   >= 0.2.0.0  && < 0.3 ,
         scientific                  >= 0.3.0.0  && < 0.4 ,
-        template-haskell            >= 2.11.1.0 && < 2.16,
+        template-haskell            >= 2.11.1.0 && < 2.17,
         text                        >= 0.11.1.0 && < 1.3 ,
         text-manipulate             >= 0.2.0.1  && < 0.3 ,
         th-lift-instances           >= 0.1.13   && < 0.2 ,
@@ -622,7 +634,7 @@
         lens-family-core                               ,
         megaparsec                                     ,
         prettyprinter                                  ,
-        QuickCheck                >= 2.10     && < 2.14,
+        QuickCheck                >= 2.10     && < 2.15,
         quickcheck-instances      >= 0.3.12   && < 0.4 ,
         scientific                                     ,
         semigroups                                     ,
diff --git a/src/Dhall.hs b/src/Dhall.hs
--- a/src/Dhall.hs
+++ b/src/Dhall.hs
@@ -61,6 +61,8 @@
     , genericAuto
     , genericAutoWith
     , InterpretOptions(..)
+    , InputNormalizer(..)
+    , defaultInputNormalizer
     , SingletonConstructors(..)
     , defaultInterpretOptions
     , bool
@@ -1346,6 +1348,7 @@
 newtype InputNormalizer = InputNormalizer
   { getInputNormalizer :: Dhall.Core.ReifiedNormalizer Void }
 
+-- | Default normalization-related settings (no custom normalization)
 defaultInputNormalizer :: InputNormalizer
 defaultInputNormalizer = InputNormalizer
  { getInputNormalizer = Dhall.Core.ReifiedNormalizer (const (pure Nothing)) }
diff --git a/src/Dhall/Map.hs b/src/Dhall/Map.hs
--- a/src/Dhall/Map.hs
+++ b/src/Dhall/Map.hs
@@ -2,6 +2,7 @@
 {-# LANGUAGE DeriveAnyClass     #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE DeriveLift         #-}
 {-# LANGUAGE DeriveTraversable  #-}
 {-# LANGUAGE RecordWildCards    #-}
 {-# LANGUAGE TypeFamilies       #-}
@@ -80,7 +81,6 @@
 import qualified Data.Map
 import qualified Data.Set
 import qualified GHC.Exts
-import qualified Language.Haskell.TH.Syntax as Syntax
 import qualified Prelude
 
 {-| A `Map` that remembers the original ordering of keys
@@ -91,18 +91,12 @@
     and also to improve performance
 -}
 data Map k v = Map (Data.Map.Map k v) (Keys k)
-    deriving (Data, Generic, NFData)
-
-instance (Data k, Data v, Lift k, Lift v, Ord k) => Lift (Map k v) where
-    lift = Syntax.liftData
+    deriving (Data, Generic, Lift, NFData)
 
 data Keys a
     = Sorted
     | Original [a]
-    deriving (Data, Generic, NFData)
-
-instance (Data a, Lift a) => Lift (Keys a) where
-    lift = Syntax.liftData
+    deriving (Data, Generic, Lift, NFData)
 
 instance (Ord k, Eq v) => Eq (Map k v) where
   m1 == m2 =
diff --git a/src/Dhall/Parser/Expression.hs b/src/Dhall/Parser/Expression.hs
--- a/src/Dhall/Parser/Expression.hs
+++ b/src/Dhall/Parser/Expression.hs
@@ -772,8 +772,6 @@
 
                             value <- expression
 
-                            whitespace
-
                             let cons key (key', values) =
                                     (key, RecordLit [ (key', values) ])
 
@@ -786,7 +784,7 @@
                                 x :| [] -> return (x, Var (V x 0))
                                 _       -> empty
 
-                    normalRecordEntry <|> punnedEntry
+                    (normalRecordEntry <|> punnedEntry) <* whitespace
 
             let nonEmptyRecordLiteral = do
                     as <- Text.Megaparsec.sepBy1 keysValue (_comma *> whitespace)
diff --git a/src/Dhall/Pretty/Internal.hs b/src/Dhall/Pretty/Internal.hs
--- a/src/Dhall/Pretty/Internal.hs
+++ b/src/Dhall/Pretty/Internal.hs
@@ -64,7 +64,7 @@
     ) where
 
 import Data.Foldable
-import Data.List.NonEmpty (NonEmpty)
+import Data.List.NonEmpty (NonEmpty(..))
 import Data.Monoid ((<>))
 import Data.Text (Text)
 import Data.Text.Prettyprint.Doc (Doc, Pretty, space)
@@ -1324,7 +1324,14 @@
       where
         consolidated = consolidateRecordLiteral a
 
-        prettyRecordEntry = prettyKeyValue prettyAnyLabels equals
+        prettyRecordEntry (keys, value) =
+            case keys of
+                key :| []
+                    | Var (V key' 0) <- Dhall.Syntax.shallowDenote value
+                    , key == key' ->
+                        duplicate (prettyAnyLabel key)
+                _ ->
+                    prettyKeyValue prettyAnyLabels equals (keys, value)
 
     prettyCompletionLit
         :: Pretty a => Int -> Map Text (Expr Src a) -> Doc Ann
diff --git a/src/Dhall/Repl.hs b/src/Dhall/Repl.hs
--- a/src/Dhall/Repl.hs
+++ b/src/Dhall/Repl.hs
@@ -1,5 +1,6 @@
 -- | This module contains the implementation of the @dhall repl@ subcommand
 
+{-# language CPP               #-}
 {-# language FlexibleContexts  #-}
 {-# language NamedFieldPuns    #-}
 {-# language OverloadedStrings #-}
@@ -55,11 +56,16 @@
 import qualified Dhall.Version                           as Meta
 import qualified System.Console.ANSI
 import qualified System.Console.Haskeline.Completion     as Haskeline
-import qualified System.Console.Haskeline.MonadException as Haskeline
 import qualified System.Console.Repline                  as Repline
 import qualified System.IO
 import qualified Text.Megaparsec                         as Megaparsec
 
+#if MIN_VERSION_haskeline(0,8,0)
+import qualified Control.Monad.Catch
+#else
+import qualified System.Console.Haskeline.MonadException
+#endif
+
 type Repl = Repline.HaskelineT (State.StateT Env IO)
 
 -- | Implementation of the @dhall repl@ subcommand
@@ -293,9 +299,7 @@
 
   pure $ saveFilePrefix <> "-" <> show nextIndex
 
-loadBinding
-  :: ( MonadFail m, MonadIO m, MonadState Env m, Haskeline.MonadException m )
-  => [String] -> m ()
+loadBinding :: [String] -> Repl ()
 loadBinding [] = do
   mFile <- currentSaveFile
 
@@ -402,7 +406,7 @@
   liftIO (throwIO Interrupt)
 
 help
-  :: ( Haskeline.MonadException m, MonadFail m, MonadIO m, MonadState Env m )
+  :: ( MonadFail m, MonadIO m, MonadState Env m )
   => HelpOptions m -> [String] -> m ()
 help hs _ = do
   liftIO (putStrLn "Type any expression to normalize it or use one of the following commands:")
@@ -425,9 +429,7 @@
 
 type HelpOptions m = [HelpOption m]
 
-helpOptions
-  :: ( Haskeline.MonadException m, MonadFail m, MonadIO m, MonadState Env m )
-  => HelpOptions m
+helpOptions :: HelpOptions Repl
 helpOptions =
   [ HelpOption
       "help"
@@ -481,9 +483,7 @@
       cmdQuit
   ]
 
-options
-  :: ( Haskeline.MonadException m, MonadFail m, MonadIO m, MonadState Env m )
-  => Repline.Options m
+options :: Repline.Options Repl
 options = (\h -> (helpOptionName h, helpOptionFunction h)) <$> helpOptions
 
 completer
@@ -579,9 +579,13 @@
   in liftIO (putStrLn message)
 
 
-dontCrash :: ( MonadIO m, Haskeline.MonadException m ) => m () -> m ()
+dontCrash :: Repl () -> Repl ()
 dontCrash m =
-  Haskeline.catch
+#if MIN_VERSION_haskeline(0,8,0)
+  Control.Monad.Catch.catch
+#else
+  System.Console.Haskeline.MonadException.catch
+#endif
     m
     ( \ e@SomeException{} -> liftIO ( putStrLn ( displayException e ) ) )
 
diff --git a/src/Dhall/Syntax.hs b/src/Dhall/Syntax.hs
--- a/src/Dhall/Syntax.hs
+++ b/src/Dhall/Syntax.hs
@@ -3,6 +3,7 @@
 {-# LANGUAGE DeriveAnyClass     #-}
 {-# LANGUAGE DeriveDataTypeable #-}
 {-# LANGUAGE DeriveGeneric      #-}
+{-# LANGUAGE DeriveLift         #-}
 {-# LANGUAGE DeriveTraversable  #-}
 {-# LANGUAGE LambdaCase         #-}
 {-# LANGUAGE OverloadedLists    #-}
@@ -101,7 +102,6 @@
 import qualified Data.Text.Prettyprint.Doc  as Pretty
 import qualified Dhall.Crypto
 import qualified Dhall.Optics               as Optics
-import qualified Language.Haskell.TH.Syntax as Syntax
 import qualified Network.URI                as URI
 
 {-| Constants for a pure type system
@@ -124,10 +124,7 @@
     Dhall is not a dependently typed language
 -}
 data Const = Type | Kind | Sort
-    deriving (Show, Eq, Ord, Data, Bounded, Enum, Generic, NFData)
-
-instance Lift Const where
-    lift = Syntax.liftData
+    deriving (Show, Eq, Ord, Data, Bounded, Enum, Generic, Lift, NFData)
 
 instance Pretty Const where
     pretty = Pretty.unAnnotate . prettyConst
@@ -165,10 +162,7 @@
     appear as a numeric suffix.
 -}
 data Var = V Text !Int
-    deriving (Data, Generic, Eq, Ord, Show, NFData)
-
-instance Lift Var where
-    lift = Syntax.liftData
+    deriving (Data, Generic, Eq, Ord, Show, Lift, NFData)
 
 instance IsString Var where
     fromString str = V (fromString str) 0
@@ -196,7 +190,7 @@
     , annotation  :: Maybe (Maybe s, Expr s a)
     , bindingSrc2 :: Maybe s
     , value       :: Expr s a
-    } deriving (Data, Eq, Foldable, Functor, Generic, NFData, Ord, Show, Traversable)
+    } deriving (Data, Eq, Foldable, Functor, Generic, Lift, NFData, Ord, Show, Traversable)
 
 instance Bifunctor Binding where
     first k (Binding src0 a src1 b src2 c) =
@@ -214,7 +208,7 @@
 -- | This wrapper around 'Prelude.Double' exists for its 'Eq' instance which is
 -- defined via the binary encoding of Dhall @Double@s.
 newtype DhallDouble = DhallDouble { getDhallDouble :: Double }
-    deriving (Show, Data, NFData, Generic)
+    deriving (Show, Data, Lift, NFData, Generic)
 
 -- | This instance satisfies all the customary 'Eq' laws except substitutivity.
 --
@@ -245,10 +239,7 @@
 
 -- | The body of an interpolated @Text@ literal
 data Chunks s a = Chunks [(Text, Expr s a)] Text
-    deriving (Functor, Foldable, Generic, Traversable, Show, Eq, Ord, Data, NFData)
-
-instance (Lift s, Lift a, Data s, Data a) => Lift (Chunks s a) where
-    lift = Syntax.liftData
+    deriving (Functor, Foldable, Generic, Traversable, Show, Eq, Ord, Data, Lift, NFData)
 
 instance Data.Semigroup.Semigroup (Chunks s a) where
     Chunks xysL zL <> Chunks         []    zR =
@@ -273,7 +264,7 @@
     | PreferFromWith (Expr s a)
       -- ^ Stores the original @with@ expression
     | PreferFromCompletion
-    deriving (Data, Eq, Foldable, Functor, Generic, NFData, Ord, Show, Traversable)
+    deriving (Data, Eq, Foldable, Functor, Generic, Lift, NFData, Ord, Show, Traversable)
 
 instance Bifunctor PreferAnnotation where
     first _  PreferFromSource      = PreferFromSource
@@ -480,7 +471,7 @@
     | ImportAlt (Expr s a) (Expr s a)
     -- | > Embed import                             ~  import
     | Embed a
-    deriving (Foldable, Generic, Traversable, Show, Data, NFData)
+    deriving (Foldable, Generic, Traversable, Show, Data, Lift, NFData)
 -- NB: If you add a constructor to Expr, please also update the Arbitrary
 -- instance in Dhall.Test.QuickCheck.
 
@@ -496,9 +487,6 @@
 
 -- | Note that this 'Ord' instance inherits `DhallDouble`'s defects.
 deriving instance (Ord s, Ord a) => Ord (Expr s a)
-
-instance (Lift s, Lift a, Data s, Data a) => Lift (Expr s a) where
-    lift = Syntax.liftData
 
 -- This instance is hand-written due to the fact that deriving
 -- it does not give us an INLINABLE pragma. We annotate this fmap
diff --git a/src/Dhall/Util.hs b/src/Dhall/Util.hs
--- a/src/Dhall/Util.hs
+++ b/src/Dhall/Util.hs
@@ -69,7 +69,7 @@
 
     preview =
             Data.Text.unlines header
-        <>  separator <> "\n"
+        <>  Data.Text.take 80 separator <> "\n"
         <>  Data.Text.unlines footer
 
 {-| Like `snip`, but for `Doc`s
diff --git a/tests/Dhall/Test/Regression.hs b/tests/Dhall/Test/Regression.hs
--- a/tests/Dhall/Test/Regression.hs
+++ b/tests/Dhall/Test/Regression.hs
@@ -44,6 +44,7 @@
         , issue1341
         , issue1584
         , issue1646
+        , issue1732
         , parsing0
         , typeChecking0
         , typeChecking1
@@ -194,6 +195,13 @@
     -- This test ensures that the parser doesn't eagerly consume trailing
     -- whitespace after a `Double`
     _ <- Util.code "./tests/regression/issue1646.dhall"
+    return () )
+
+issue1732 :: TestTree
+issue1732 = Test.Tasty.HUnit.testCase "Issue #1732" (do
+    -- This test ensures that the parser allows whitespace after a record pun
+    -- entry
+    _ <- Util.code "./tests/regression/issue1732.dhall"
     return () )
 
 parsing0 :: TestTree
diff --git a/tests/format/ipfsB.dhall b/tests/format/ipfsB.dhall
--- a/tests/format/ipfsB.dhall
+++ b/tests/format/ipfsB.dhall
@@ -50,13 +50,13 @@
             [ toRule
                 { host = "localhost"
                 , path = "/"
-                , serviceName = serviceName
+                , serviceName
                 , servicePort = gatewayPort
                 }
             , toRule
                 { host = "localhost"
                 , path = "/"
-                , serviceName = serviceName
+                , serviceName
                 , servicePort = apiPort
                 }
             ]
diff --git a/tests/format/punA.dhall b/tests/format/punA.dhall
new file mode 100644
--- /dev/null
+++ b/tests/format/punA.dhall
@@ -0,0 +1,1 @@
+{ x = x, y = 1, z = z }
diff --git a/tests/format/punB.dhall b/tests/format/punB.dhall
new file mode 100644
--- /dev/null
+++ b/tests/format/punB.dhall
@@ -0,0 +1,1 @@
+{ x, y = 1, z }
diff --git a/tests/regression/issue1732.dhall b/tests/regression/issue1732.dhall
new file mode 100644
--- /dev/null
+++ b/tests/regression/issue1732.dhall
@@ -0,0 +1,1 @@
+let x = 0 in { x , a = 0 }
