diff --git a/.editorconfig b/.editorconfig
index 8da4715e7dae6f3e4c91e9c5642ecab5d361d3f7..6e1faa73bc99322651d37b03aabb24a693f1f0e7 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,20 +1,38 @@
-# EditorConfig is awesome: https://EditorConfig.org
+; EditorConfig is awesome: https://EditorConfig.org
 
-# top-most EditorConfig file
+;top-most EditorConfig file
 root = true
 
-# Unix-style newlines with a newline ending every file
+; Ruby style as default
+; UTF-8 charset
+; Unix-style newlines with a newline ending every file
+; 2 space indent
+; Trim trailing whitespace
 [*]
-end_of_line = lf
-insert_final_newline = true
-trim_trailing_whitespace = true
-charset = utf-8
 indent_style = space
 indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+; Markdown
+; 4 space indent
+; Trailing whitespace is potentially meaningful, leave it
+[*.md]
+indent_size = 4
+trim_trailing_whitespace = false
 
-# The JSON files contain newlines inconsistently
+; Shell scripts & Python
+; 4 space indent
+[*.{sh,py}]
+indent_size = 4
+
+[Makefile]
+indent_style = tab
+
+; The JSON files contain newlines inconsistently
 [*.json]
-indent_size = 2
 insert_final_newline = ignore
 
 [*.{ps1,psm1}]
diff --git a/.gitattributes b/.gitattributes
index 9032a014a054849db4e22f22b6536cf92c7edd27..77515d78cbad2c4d1739da5120cdce402d747d74 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -3,3 +3,11 @@
 *.pp eol=lf
 *.sh eol=lf
 *.epp eol=lf
+.editorconfig eol=lf
+.gitattributes eol=lf
+.gitignore eol=lf
+.gitlab-ci.yml eol=lf
+.pdkignore eol=lf
+.vscode/* eol=lf
+Gemfile eol=lf
+metadata.json eol=lf
diff --git a/.gitignore b/.gitignore
index 4c4fe74cda71a571f53cdfe1ffdb9aaad0b4bb27..a9965320a67cf67e14f5bfa41aaf270ebbd32906 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,7 @@
 .project
 .envrc
 /inventory.yaml
+/spec/fixtures/litmus_inventory.yaml
 *~
 \#*\#
 .\#*
diff --git a/.pdkignore b/.pdkignore
index 3c059934e7b2f21e361661b8c5c72b819145d191..f96299629ecb210a0cdd0fdb38a4b955515392d6 100644
--- a/.pdkignore
+++ b/.pdkignore
@@ -25,10 +25,12 @@
 .project
 .envrc
 /inventory.yaml
+/spec/fixtures/litmus_inventory.yaml
 *~
 \#*\#
 .\#*
 /appveyor.yml
+/.editorconfig
 /.fixtures.yml
 /Gemfile
 /.gitattributes
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 24650e52586e9ab1e85de79e06f5dc8790efcdd2..a5f6a2b80eb07663d44f5e705340b4e116bb0b67 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -3,6 +3,7 @@
     "puppet.puppet-vscode",
     "rebornix.Ruby",
     "ms-vscode.powershell",
-    "EditorConfig.EditorConfig"
+    "EditorConfig.EditorConfig",
+    "glenbuktenica.unicode-substitutions"
   ]
 }
diff --git a/Gemfile b/Gemfile
index 581f5d708f2ae0c66e6298611cc15c5b6cfe539a..18272fd72e8b95feb3fe64e34a51a9b75a7af794 100644
--- a/Gemfile
+++ b/Gemfile
@@ -24,13 +24,13 @@ group :development do
   gem "puppet-module-posix-dev-r#{minor_version}", '~> 1.0',     require: false, platforms: [:ruby]
   gem "puppet-module-win-default-r#{minor_version}", '~> 1.0',   require: false, platforms: [:mswin, :mingw, :x64_mingw]
   gem "puppet-module-win-dev-r#{minor_version}", '~> 1.0',       require: false, platforms: [:mswin, :mingw, :x64_mingw]
-  gem "puppet-lint-absolute_classname-check", '3.0.0',           require: false
+  gem "puppet-lint-absolute_classname-check", '3.0.1',           require: false
   gem "puppet-lint-absolute_template_path", '1.0.1',             require: false
   gem "puppet-lint-empty_trailing_lines", '0.0.1',               require: false
-  gem "puppet-lint-file_ensure-check", '0.3.1',                  require: false
-  gem "puppet-lint-strict_indent-check", '2.0.7',                require: false
+  gem "puppet-lint-file_ensure-check", '1.0.0',                  require: false
+  gem "puppet-lint-strict_indent-check", '2.0.8',                require: false
   gem "puppet-lint-trailing_comma-check", '0.4.2',               require: false
-  gem "puppet-lint-unquoted_string-check", '2.0.0',              require: false
+  gem "puppet-lint-unquoted_string-check", '2.1.0',              require: false
 end
 group :system_tests do
   gem "puppet-module-posix-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby]
diff --git a/metadata.json b/metadata.json
index d7bee8372432735fcc66e742574d5085d4ed4e09..5356f1f295337ae1c610608587de931fab6b8031 100644
--- a/metadata.json
+++ b/metadata.json
@@ -64,7 +64,7 @@
       "version_requirement": ">= 5.5.10 < 6.0.0"
     }
   ],
-  "pdk-version": "2.1.0",
+  "pdk-version": "2.2.0",
   "template-url": "https://gitlab.it.liu.se/puppet-infra/pdk-templates.git#liu",
-  "template-ref": "heads/liu-0-g8fb0f81"
+  "template-ref": "heads/liu-0-gd8925d4"
 }
diff --git a/pdk.yaml b/pdk.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..4bef4bd0f902390cfeb13e968d1879c74963b50e
--- /dev/null
+++ b/pdk.yaml
@@ -0,0 +1,2 @@
+---
+ignore: []
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index c4cb9ef0f8906567ea118c5db8ba59e01707525b..ee9e00395e4a18319dfa49b95f7030797471cc8a 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -51,6 +51,18 @@ RSpec.configure do |c|
   c.after(:suite) do
     RSpec::Puppet::Coverage.report!(0)
   end
+
+  # Filter backtrace noise
+  backtrace_exclusion_patterns = [
+    %r{spec_helper},
+    %r{gems},
+  ]
+
+  if c.respond_to?(:backtrace_exclusion_patterns)
+    c.backtrace_exclusion_patterns = backtrace_exclusion_patterns
+  elsif c.respond_to?(:backtrace_clean_patterns)
+    c.backtrace_clean_patterns = backtrace_exclusion_patterns
+  end
 end
 
 # Ensures that a module is defined