diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..ecb10a8030edd5f85a6d69d49a311d2261c63fc9
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,15 @@
+# editorconfig.org
+
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+root = true
+
+[*]
+charset = utf-8
+end_of_line = lf
+indent_size = 2
+tab_width = 2
+indent_style = space
+insert_final_newline = true
+trim_trailing_whitespace = true
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
new file mode 100644
index 0000000000000000000000000000000000000000..048d2b55df83b7f90e7ec018acf19bd85f90be0b
--- /dev/null
+++ b/.github/CONTRIBUTING.md
@@ -0,0 +1,252 @@
+# Contribution guidelines
+
+## Table of contents
+
+* [Contributing](#contributing)
+* [Writing proper commits - short version](#writing-proper-commits-short-version)
+* [Writing proper commits - long version](#writing-proper-commits-long-version)
+* [Dependencies](#dependencies)
+  * [Note for OS X users](#note-for-os-x-users)
+* [The test matrix](#the-test-matrix)
+* [Syntax and style](#syntax-and-style)
+* [Running the unit tests](#running-the-unit-tests)
+* [Unit tests in docker](#unit-tests-in-docker)
+* [Integration tests](#integration-tests)
+
+This module has grown over time based on a range of contributions from
+people using it. If you follow these contributing guidelines your patch
+will likely make it into a release a little more quickly.
+
+## Contributing
+
+Please note that this project is released with a Contributor Code of Conduct.
+By participating in this project you agree to abide by its terms.
+[Contributor Code of Conduct](https://voxpupuli.org/coc/).
+
+* Fork the repo.
+* Create a separate branch for your change.
+* We only take pull requests with passing tests, and documentation. [GitHub Actions](https://docs.github.com/en/actions) run the tests for us. You can also execute them locally. This is explained [in a later section](#the-test-matrix).
+* Checkout [our docs](https://voxpupuli.org/docs/reviewing_pr/) we use to review a module and the [official styleguide](https://puppet.com/docs/puppet/6.0/style_guide.html). They provide some guidance for new code that might help you before you submit a pull request.
+* Add a test for your change. Only refactoring and documentation changes require no new tests. If you are adding functionality or fixing a bug, please add a test.
+* Squash your commits down into logical components. Make sure to rebase against our current master.
+* Push the branch to your fork and submit a pull request.
+
+Please be prepared to repeat some of these steps as our contributors review your code.
+
+Also consider sending in your profile code that calls this component module as an acceptance test or provide it via an issue. This helps reviewers a lot to test your use case and prevents future regressions!
+
+## Writing proper commits - short version
+
+* Make commits of logical units.
+* Check for unnecessary whitespace with "git diff --check" before committing.
+* Commit using Unix line endings (check the settings around "crlf" in git-config(1)).
+* Do not check in commented out code or unneeded files.
+* The first line of the commit message should be a short description (50 characters is the soft limit, excluding ticket number(s)), and should skip the full stop.
+* Associate the issue in the message. The first line should include the issue number in the form "(#XXXX) Rest of message".
+* The body should provide a meaningful commit message, which:
+  *uses the imperative, present tense: `change`, not `changed` or `changes`.
+  * includes motivation for the change, and contrasts its implementation with the previous behavior.
+  * Make sure that you have tests for the bug you are fixing, or feature you are adding.
+  * Make sure the test suites passes after your commit:
+  * When introducing a new feature, make sure it is properly documented in the README.md
+
+## Writing proper commits - long version
+
+  1.  Make separate commits for logically separate changes.
+
+      Please break your commits down into logically consistent units
+      which include new or changed tests relevant to the rest of the
+      change.  The goal of doing this is to make the diff easier to
+      read for whoever is reviewing your code.  In general, the easier
+      your diff is to read, the more likely someone will be happy to
+      review it and get it into the code base.
+
+      If you are going to refactor a piece of code, please do so as a
+      separate commit from your feature or bug fix changes.
+
+      We also really appreciate changes that include tests to make
+      sure the bug is not re-introduced, and that the feature is not
+      accidentally broken.
+
+      Describe the technical detail of the change(s).  If your
+      description starts to get too long, that is a good sign that you
+      probably need to split up your commit into more finely grained
+      pieces.
+
+      Commits which plainly describe the things which help
+      reviewers check the patch and future developers understand the
+      code are much more likely to be merged in with a minimum of
+      bike-shedding or requested changes.  Ideally, the commit message
+      would include information, and be in a form suitable for
+      inclusion in the release notes for the version of Puppet that
+      includes them.
+
+      Please also check that you are not introducing any trailing
+      whitespace or other "whitespace errors".  You can do this by
+      running "git diff --check" on your changes before you commit.
+
+  2.  Sending your patches
+
+      To submit your changes via a GitHub pull request, we _highly_
+      recommend that you have them on a topic branch, instead of
+      directly on `master`.
+      It makes things much easier to keep track of, especially if
+      you decide to work on another thing before your first change
+      is merged in.
+
+      GitHub has some pretty good
+      [general documentation](http://help.github.com/) on using
+      their site.  They also have documentation on
+      [creating pull requests](http://help.github.com/send-pull-requests/).
+
+      In general, after pushing your topic branch up to your
+      repository on GitHub, you can switch to the branch in the
+      GitHub UI and click "Pull Request" towards the top of the page
+      in order to open a pull request.
+
+
+  3.  Update the related GitHub issue.
+
+      If there is a GitHub issue associated with the change you
+      submitted, then you should update the ticket to include the
+      location of your branch, along with any other commentary you
+      may wish to make.
+
+## Dependencies
+
+The testing and development tools have a bunch of dependencies,
+all managed by [bundler](http://bundler.io/) according to the
+[Puppet support matrix](http://docs.puppetlabs.com/guides/platforms.html#ruby-versions).
+
+By default the tests use a baseline version of Puppet.
+
+If you have Ruby 2.x or want a specific version of Puppet,
+you must set an environment variable such as:
+
+```sh
+export PUPPET_VERSION="~> 5.5.6"
+```
+
+You can install all needed gems for spec tests into the modules directory by
+running:
+
+```sh
+bundle install --path .vendor/ --without development system_tests release --jobs "$(nproc)"
+```
+
+If you also want to run acceptance tests:
+
+```sh
+bundle install --path .vendor/ --with system_tests --without development release --jobs "$(nproc)"
+```
+
+Our all in one solution if you don't know if you need to install or update gems:
+
+```sh
+bundle install --path .vendor/ --with system_tests --without development release --jobs "$(nproc)"; bundle update; bundle clean
+```
+
+As an alternative to the `--jobs "$(nproc)` parameter, you can set an
+environment variable:
+
+```sh
+BUNDLE_JOBS="$(nproc)"
+```
+
+### Note for OS X users
+
+`nproc` isn't a valid command under OS x. As an alternative, you can do:
+
+```sh
+--jobs "$(sysctl -n hw.ncpu)"
+```
+
+## The test matrix
+
+### Syntax and style
+
+The test suite will run [Puppet Lint](http://puppet-lint.com/) and
+[Puppet Syntax](https://github.com/gds-operations/puppet-syntax) to
+check various syntax and style things. You can run these locally with:
+
+```sh
+bundle exec rake lint
+bundle exec rake validate
+```
+
+It will also run some [Rubocop](http://batsov.com/rubocop/) tests
+against it. You can run those locally ahead of time with:
+
+```sh
+bundle exec rake rubocop
+```
+
+### Running the unit tests
+
+The unit test suite covers most of the code, as mentioned above please
+add tests if you're adding new functionality. If you've not used
+[rspec-puppet](http://rspec-puppet.com/) before then feel free to ask
+about how best to test your new feature.
+
+To run the linter, the syntax checker and the unit tests:
+
+```sh
+bundle exec rake test
+```
+
+To run your all the unit tests
+
+```sh
+bundle exec rake spec
+```
+
+To run a specific spec test set the `SPEC` variable:
+
+```sh
+bundle exec rake spec SPEC=spec/foo_spec.rb
+```
+
+#### Unit tests in docker
+
+Some people don't want to run the dependencies locally or don't want to install
+ruby. We ship a Dockerfile that enables you to run all unit tests and linting.
+You only need to run:
+
+```sh
+docker build .
+```
+
+Please ensure that a docker daemon is running and that your user has the
+permission to talk to it. You can specify a remote docker host by setting the
+`DOCKER_HOST` environment variable. it will copy the content of the module into
+the docker image. So it will not work if a Gemfile.lock exists.
+
+### Integration tests
+
+The unit tests just check the code runs, not that it does exactly what
+we want on a real machine. For that we're using
+[beaker](https://github.com/puppetlabs/beaker).
+
+This fires up a new virtual machine (using vagrant) and runs a series of
+simple tests against it after applying the module. You can run this
+with:
+
+```sh
+BEAKER_setfile=debian10-x64 bundle exec rake beaker
+```
+
+You can replace the string `debian10` with any common operating system.
+The following strings are known to work:
+
+* ubuntu1604
+* ubuntu1804
+* ubuntu2004
+* debian9
+* debian10
+* centos7
+* centos8
+
+For more information and tips & tricks, see [voxpupuli-acceptance's documentation](https://github.com/voxpupuli/voxpupuli-acceptance#running-tests).
+
+The source of this file is in our [modulesync_config](https://github.com/voxpupuli/modulesync_config/blob/master/moduleroot/.github/CONTRIBUTING.md.erb)
+repository.
diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
new file mode 100644
index 0000000000000000000000000000000000000000..593e7aa834ff61e11eb55479d51d674665a1d402
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE.md
@@ -0,0 +1,26 @@
+<!--
+Thank you for contributing to this project!
+
+- This project has a Contributor Code of Conduct: https://voxpupuli.org/coc/
+- Please check that here is no existing issue or PR that addresses your problem.
+- Please fill the following form to enable us to help you.
+- Our vulnerabilities reporting process is at https://voxpupuli.org/security/
+
+-->
+
+## Affected Puppet, Ruby, OS and module versions/distributions
+
+- Puppet:
+- Ruby:
+- Distribution:
+- Module version:
+
+## How to reproduce (e.g Puppet code you use)
+
+## What are you seeing
+
+## What behaviour did you expect instead
+
+## Output log
+
+## Any additional information you'd like to impart
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000000000000000000000000000000000000..342807bcc10dd918cc4fb106af00260ead0d673d
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,20 @@
+<!--
+Thank you for contributing to this project!
+
+- This project has a Contributor Code of Conduct: https://voxpupuli.org/coc/
+- Please check that here is no existing issue or PR that addresses your problem.
+- Our vulnerabilities reporting process is at https://voxpupuli.org/security/
+
+-->
+#### Pull Request (PR) description
+<!--
+Replace this comment with a description of your pull request.
+-->
+
+#### This Pull Request (PR) fixes the following issues
+<!--
+Replace this comment with the list of issues or n/a.
+Use format:
+Fixes #123
+Fixes #124
+-->
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
new file mode 100644
index 0000000000000000000000000000000000000000..cacadf2209d9d05d10cccb81b2bff2102c0824b7
--- /dev/null
+++ b/.github/SECURITY.md
@@ -0,0 +1,3 @@
+# Vox Pupuli Security Policy
+
+Our vulnerabilities reporting process is at https://voxpupuli.org/security/
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2ce5b0558fd42eb57b2113b1b95becba64749f1c
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,86 @@
+---
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+name: CI
+
+on: pull_request
+
+jobs:
+  setup_matrix:
+    name: 'Setup Test Matrix'
+    runs-on: ubuntu-latest
+    timeout-minutes: 40
+    outputs:
+      puppet_unit_test_matrix: ${{ steps.get-outputs.outputs.puppet_unit_test_matrix }}
+      github_action_test_matrix: ${{ steps.get-outputs.outputs.github_action_test_matrix }}
+    env:
+      BUNDLE_WITHOUT: development:system_tests:release
+    steps:
+      - uses: actions/checkout@v2
+      - name: Setup ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: '3.0'
+          bundler-cache: true
+      - name: Run static validations
+        run: bundle exec rake validate lint check
+      - name: Run rake rubocop
+        run: bundle exec rake rubocop
+      - name: Setup Test Matrix
+        id: get-outputs
+        run: bundle exec metadata2gha --use-fqdn --pidfile-workaround false
+
+  unit:
+    needs: setup_matrix
+    runs-on: ubuntu-latest
+    timeout-minutes: 40
+    strategy:
+      fail-fast: false
+      matrix:
+        include: ${{fromJson(needs.setup_matrix.outputs.puppet_unit_test_matrix)}}
+    env:
+      BUNDLE_WITHOUT: development:system_tests:release
+      PUPPET_VERSION: "~> ${{ matrix.puppet }}.0"
+    name: Puppet ${{ matrix.puppet }} (Ruby ${{ matrix.ruby }})
+    steps:
+      - uses: actions/checkout@v2
+      - name: Setup ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: ${{ matrix.ruby }}
+          bundler-cache: true
+      - name: Run tests
+        run: bundle exec rake parallel_spec
+
+  acceptance:
+    needs: setup_matrix
+    runs-on: ubuntu-latest
+    env:
+      BUNDLE_WITHOUT: development:test:release
+    strategy:
+      fail-fast: false
+      matrix:
+        include: ${{fromJson(needs.setup_matrix.outputs.github_action_test_matrix)}}
+    name: ${{ matrix.puppet.name }} - ${{ matrix.setfile.name }}
+    steps:
+      - uses: actions/checkout@v2
+      - name: Setup ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: '3.0'
+          bundler-cache: true
+      - name: Run tests
+        run: bundle exec rake beaker
+        env:
+          BEAKER_PUPPET_COLLECTION: ${{ matrix.puppet.collection }}
+          BEAKER_setfile: ${{ matrix.setfile.value }}
+
+  tests:
+    needs:
+      - unit
+      - acceptance
+    runs-on: ubuntu-latest
+    name: Test suite
+    steps:
+      - run: echo Test suite completed
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000000000000000000000000000000000000..664ba69463db563abefd0eadb4ce7f695ebb2b42
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,34 @@
+---
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+name: Release
+
+on:
+  push:
+    tags:
+      - '*'
+
+env:
+  BUNDLE_WITHOUT: development:test:system_tests
+
+jobs:
+  deploy:
+    name: 'deploy to forge'
+    runs-on: ubuntu-latest
+    if: github.repository_owner == 'voxpupuli'
+    steps:
+      - name: Checkout repository
+        uses: actions/checkout@v2
+      - name: Setup Ruby
+        uses: ruby/setup-ruby@v1
+        with:
+          ruby-version: '2.7'
+          bundler-cache: true
+      - name: Build and Deploy
+        env:
+          # Configure secrets here:
+          #  https://docs.github.com/en/free-pro-team@latest/actions/reference/encrypted-secrets
+          BLACKSMITH_FORGE_USERNAME: '${{ secrets.PUPPET_FORGE_USERNAME }}'
+          BLACKSMITH_FORGE_API_KEY: '${{ secrets.PUPPET_FORGE_API_KEY }}'
+        run: bundle exec rake module:push
diff --git a/.gitignore b/.gitignore
index 2767022cd600dd0eb9d85289e0af0fda19b3b2e6..9b95224cec610c29434714ffbf809ae2de77832d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,27 +1,23 @@
-.git/
-.*.sw[op]
-.metadata
-.yardoc
-.yardwarns
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+pkg/
+Gemfile.lock
+Gemfile.local
+vendor/
+.vendor/
+spec/fixtures/manifests/
+spec/fixtures/modules/
+.vagrant/
+.bundle/
+.ruby-version
+coverage/
+log/
+.idea/
+.dependencies/
+.librarian/
+Puppetfile.lock
 *.iml
-/.bundle/
-/.idea/
-/.vagrant/
-/coverage/
-/bin/
-/doc/
-/Gemfile.local
-/Gemfile.lock
-/junit/
-/log/
-/pkg/
-/spec/fixtures/manifests/
-/spec/fixtures/modules/
-/tmp/
-/vendor/
-/convert_report.txt
-/update_report.txt
-.DS_Store
-.project
-.envrc
-/inventory.yaml
+.*.sw?
+.yardoc/
+Guardfile
diff --git a/.msync.yml b/.msync.yml
new file mode 100644
index 0000000000000000000000000000000000000000..43966c2f5e2814dd3fab5b09a448662549f19876
--- /dev/null
+++ b/.msync.yml
@@ -0,0 +1,5 @@
+---
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+modulesync_config_version: '4.2.0'
diff --git a/.overcommit.yml b/.overcommit.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d367adaea3a7e9f4ed6ad7471d1d03c4e5bbc595
--- /dev/null
+++ b/.overcommit.yml
@@ -0,0 +1,65 @@
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+#
+# Hooks are only enabled if you take action.
+#
+# To enable the hooks run:
+#
+# ```
+# bundle exec overcommit --install
+# # ensure .overcommit.yml does not harm to you and then
+# bundle exec overcommit --sign
+# ```
+#
+# (it will manage the .git/hooks directory):
+#
+# Examples howto skip a test for a commit or push:
+#
+# ```
+# SKIP=RuboCop git commit
+# SKIP=PuppetLint git commit
+# SKIP=RakeTask git push
+# ```
+#
+# Don't invoke overcommit at all:
+#
+# ```
+# OVERCOMMIT_DISABLE=1 git commit
+# ```
+#
+# Read more about overcommit: https://github.com/brigade/overcommit
+#
+# To manage this config yourself in your module add
+#
+# ```
+# .overcommit.yml:
+#   unmanaged: true
+# ```
+#
+# to your modules .sync.yml config
+---
+PreCommit:
+  RuboCop:
+    enabled: true
+    description: 'Runs rubocop on modified files only'
+    command: ['bundle', 'exec', 'rubocop']
+  PuppetLint:
+    enabled: true
+    description: 'Runs puppet-lint on modified files only'
+    command: ['bundle', 'exec', 'puppet-lint']
+  YamlSyntax:
+    enabled: true
+  JsonSyntax:
+    enabled: true
+  TrailingWhitespace:
+    enabled: true
+
+PrePush:
+  RakeTarget:
+    enabled: true
+    description: 'Run rake targets'
+    targets:
+      - 'validate'
+      - 'test'
+      - 'rubocop'
+    command: ['bundle', 'exec', 'rake']
diff --git a/.pmtignore b/.pmtignore
new file mode 100644
index 0000000000000000000000000000000000000000..65f50514936a3f30cf6c30fcc0a08ca93057f7db
--- /dev/null
+++ b/.pmtignore
@@ -0,0 +1,37 @@
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+docs/
+pkg/
+Gemfile
+Gemfile.lock
+Gemfile.local
+vendor/
+.vendor/
+spec/
+Rakefile
+.vagrant/
+.bundle/
+.ruby-version
+coverage/
+log/
+.idea/
+.dependencies/
+.github/
+.librarian/
+Puppetfile.lock
+*.iml
+.editorconfig
+.fixtures.yml
+.gitignore
+.msync.yml
+.overcommit.yml
+.pmtignore
+.rspec
+.rspec_parallel
+.rubocop.yml
+.sync.yml
+.*.sw?
+.yardoc/
+.yardopts
+Dockerfile
diff --git a/.rspec b/.rspec
index 16f9cdb013585a86aa600f8d0c002e8a2c33b6a9..f634583dea31ceb892a525348fcacee348d79f96 100644
--- a/.rspec
+++ b/.rspec
@@ -1,2 +1,5 @@
---color
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
 --format documentation
+--color
diff --git a/.rspec_parallel b/.rspec_parallel
new file mode 100644
index 0000000000000000000000000000000000000000..a9a84f85225ae345d841125bc929f1e83cd06c92
--- /dev/null
+++ b/.rspec_parallel
@@ -0,0 +1,4 @@
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+--format progress
diff --git a/.rubocop.yml b/.rubocop.yml
index bab25db5361fca376f4282262de0554e2f2338d2..53ac1898287ba321b6d4a59bfe05f16b87f299c7 100644
--- a/.rubocop.yml
+++ b/.rubocop.yml
@@ -1,133 +1,6 @@
 ---
-require:
-- rubocop-rspec
-- rubocop-i18n
-AllCops:
-  DisplayCopNames: true
-  TargetRubyVersion: '2.1'
-  Include:
-  - "./**/*.rb"
-  Exclude:
-  - bin/*
-  - ".vendor/**/*"
-  - "**/Gemfile"
-  - "**/Rakefile"
-  - pkg/**/*
-  - spec/fixtures/**/*
-  - vendor/**/*
-  - "**/Puppetfile"
-  - "**/Vagrantfile"
-  - "**/Guardfile"
-Metrics/LineLength:
-  Description: People have wide screens, use them.
-  Max: 200
-GetText:
-  Enabled: false
-GetText/DecorateString:
-  Description: We don't want to decorate test output.
-  Exclude:
-  - spec/**/*
-  Enabled: false
-RSpec/BeforeAfterAll:
-  Description: Beware of using after(:all) as it may cause state to leak between tests.
-    A necessary evil in acceptance testing.
-  Exclude:
-  - spec/acceptance/**/*.rb
-RSpec/HookArgument:
-  Description: Prefer explicit :each argument, matching existing module's style
-  EnforcedStyle: each
-Style/BlockDelimiters:
-  Description: Prefer braces for chaining. Mostly an aesthetical choice. Better to
-    be consistent then.
-  EnforcedStyle: braces_for_chaining
-Style/ClassAndModuleChildren:
-  Description: Compact style reduces the required amount of indentation.
-  EnforcedStyle: compact
-Style/EmptyElse:
-  Description: Enforce against empty else clauses, but allow `nil` for clarity.
-  EnforcedStyle: empty
-Style/FormatString:
-  Description: Following the main puppet project's style, prefer the % format format.
-  EnforcedStyle: percent
-Style/FormatStringToken:
-  Description: Following the main puppet project's style, prefer the simpler template
-    tokens over annotated ones.
-  EnforcedStyle: template
-Style/Lambda:
-  Description: Prefer the keyword for easier discoverability.
-  EnforcedStyle: literal
-Style/RegexpLiteral:
-  Description: Community preference. See https://github.com/voxpupuli/modulesync_config/issues/168
-  EnforcedStyle: percent_r
-Style/TernaryParentheses:
-  Description: Checks for use of parentheses around ternary conditions. Enforce parentheses
-    on complex expressions for better readability, but seriously consider breaking
-    it up.
-  EnforcedStyle: require_parentheses_when_complex
-Style/TrailingCommaInArguments:
-  Description: Prefer always trailing comma on multiline argument lists. This makes
-    diffs, and re-ordering nicer.
-  EnforcedStyleForMultiline: comma
-Style/TrailingCommaInLiteral:
-  Description: Prefer always trailing comma on multiline literals. This makes diffs,
-    and re-ordering nicer.
-  EnforcedStyleForMultiline: comma
-Style/SymbolArray:
-  Description: Using percent style obscures symbolic intent of array's contents.
-  EnforcedStyle: brackets
-RSpec/MessageSpies:
-  EnforcedStyle: receive
-Style/Documentation:
-  Exclude:
-  - lib/puppet/parser/functions/**/*
-  - spec/**/*
-Style/WordArray:
-  EnforcedStyle: brackets
-Style/CollectionMethods:
-  Enabled: true
-Style/MethodCalledOnDoEndBlock:
-  Enabled: true
-Style/StringMethods:
-  Enabled: true
-GetText/DecorateFunctionMessage:
-  Enabled: false
-GetText/DecorateStringFormattingUsingInterpolation:
-  Enabled: false
-GetText/DecorateStringFormattingUsingPercent:
-  Enabled: false
-Layout/EndOfLine:
-  Enabled: false
-Layout/IndentHeredoc:
-  Enabled: false
-Metrics/AbcSize:
-  Enabled: false
-Metrics/BlockLength:
-  Enabled: false
-Metrics/ClassLength:
-  Enabled: false
-Metrics/CyclomaticComplexity:
-  Enabled: false
-Metrics/MethodLength:
-  Enabled: false
-Metrics/ModuleLength:
-  Enabled: false
-Metrics/ParameterLists:
-  Enabled: false
-Metrics/PerceivedComplexity:
-  Enabled: false
-RSpec/DescribeClass:
-  Enabled: false
-RSpec/ExampleLength:
-  Enabled: false
-RSpec/MessageExpectation:
-  Enabled: false
-RSpec/MultipleExpectations:
-  Enabled: false
-RSpec/NestedGroups:
-  Enabled: false
-Style/AsciiComments:
-  Enabled: false
-Style/IfUnlessModifier:
-  Enabled: false
-Style/SymbolProc:
-  Enabled: false
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+inherit_gem:
+  voxpupuli-test: rubocop.yml
diff --git a/.sync.yml b/.sync.yml
index bfb177132f0f4bed7a880855ae9923db1675245b..55d2b755aa02da5da49599db81d4d61e97bcd397 100644
--- a/.sync.yml
+++ b/.sync.yml
@@ -1,114 +1,9 @@
 ---
-.travis.yml:
-  addons:
-    apt:
-      sources:
-        - augeas
-      packages:
-        - libaugeas-dev
-  branches:
-    - master
-    - /^\d/
-  deploy_to_forge:
-    enabled: true
-    tag_regex: "^\\d"
-  acceptance:
-    - '*'
-  user: camptocamp
-  secure: "XAv4O363tng0KuRnu1ZhhwORy+2CF9UQwdwlFmS+NG9jOaTZZN+PMK8iC7OSIvZN6cfKlYjHRHNuxFBnYlnMrLsM9fVxt4NjjznOgIKQpQDleWk4UitZj5ntyHmUtYtofUd5Bhi/sdYXwGN9pVRCrcfFBmsIRq/dOhXD7Wy5KcQ="
-  includes:
-    -
-      env: CHECK="check:symlinks check:git_ignore check:dot_underscore check:test_file rubocop syntax lint metadata_lint"
-      stage: static
-    -
-      env: PUPPET_GEM_VERSION="~> 5.0" CHECK=parallel_spec
-      rvm: 2.4.5
-      stage: spec
-    -
-      env: PUPPET_GEM_VERSION="~> 6.0" CHECK=parallel_spec
-      rvm: 2.5.3
-      stage: spec
-    - rvm: default
-      sudo: required
-      services: docker
-      env:
-        - PUPPET_INSTALL_TYPE=agent
-        - BEAKER_IS_PE=no
-        - BEAKER_PUPPET_COLLECTION=puppet5
-        - BEAKER_debug=true
-        - BEAKER_setfile=debian8-64{hypervisor=docker}
-      bundler_args:
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      stage: acceptance
-    - rvm: default
-      sudo: required
-      services: docker
-      env:
-        - PUPPET_INSTALL_TYPE=agent
-        - BEAKER_IS_PE=no
-        - BEAKER_PUPPET_COLLECTION=puppet5
-        - BEAKER_debug=true
-        - BEAKER_setfile=debian9-64{hypervisor=docker}
-      bundler_args:
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      stage: acceptance
-    - rvm: default
-      sudo: required
-      services: docker
-      env:
-        - PUPPET_INSTALL_TYPE=agent
-        - BEAKER_IS_PE=no
-        - BEAKER_PUPPET_COLLECTION=puppet5
-        - BEAKER_debug=true
-        - BEAKER_setfile=ubuntu1404-64{hypervisor=docker}
-      bundler_args:
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      stage: acceptance
-    - rvm: default
-      sudo: required
-      services: docker
-      env:
-        - PUPPET_INSTALL_TYPE=agent
-        - BEAKER_IS_PE=no
-        - BEAKER_PUPPET_COLLECTION=puppet5
-        - BEAKER_debug=true
-        - BEAKER_setfile=ubuntu1604-64{hypervisor=docker}
-      bundler_args:
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      stage: acceptance
-    - rvm: default
-      sudo: required
-      services: docker
-      env:
-        - PUPPET_INSTALL_TYPE=agent
-        - BEAKER_IS_PE=no
-        - BEAKER_PUPPET_COLLECTION=puppet5
-        - BEAKER_debug=true
-        - BEAKER_setfile=ubuntu1804-64{hypervisor=docker}
-      bundler_args:
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-    - rvm: default
-      sudo: required
-      services: docker
-      env:
-        - PUPPET_INSTALL_TYPE=agent
-        - BEAKER_IS_PE=no
-        - BEAKER_PUPPET_COLLECTION=puppet5
-        - BEAKER_debug=true
-        - BEAKER_setfile=centos7-64{hypervisor=docker}
-      bundler_args:
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      stage: acceptance
-
 Gemfile:
-  required:
+  optional:
     ':development':
       - gem: ruby-augeas
     ':system_tests':
-      - gem: beaker-hostgenerator
       - gem: "puppet-module-posix-system-r#{minor_version}"
-  optional:
-    ':development':
-      - gem: 'github_changelog_generator'
 Rakefile:
   changelog_version_tag_pattern: '%s'
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index cf6e3e3c534b9e98498e25bc171d4fdbbcc49c8c..0000000000000000000000000000000000000000
--- a/.travis.yml
+++ /dev/null
@@ -1,108 +0,0 @@
----
-dist: xenial
-language: ruby
-cache: bundler
-addons:
-  apt:
-    sources:
-      - augeas
-    packages:
-      - libaugeas-dev
-before_install:
-  - bundle -v
-  - rm -f Gemfile.lock
-  - gem update --system $RUBYGEMS_VERSION
-  - gem --version
-  - bundle -v
-script:
-  - 'bundle exec rake $CHECK'
-bundler_args: --without system_tests
-rvm:
-  - 2.5.3
-stages:
-  - static
-  - spec
-  - acceptance
-  -
-    if: tag =~ ^\d
-    name: deploy
-matrix:
-  fast_finish: true
-  include:
-    -
-      env: CHECK="check:symlinks check:git_ignore check:dot_underscore check:test_file rubocop syntax lint metadata_lint"
-      stage: static
-    -
-      env: PUPPET_GEM_VERSION="~> 5.0" CHECK=parallel_spec
-      rvm: 2.4.5
-      stage: spec
-    -
-      env: PUPPET_GEM_VERSION="~> 6.0" CHECK=parallel_spec
-      rvm: 2.5.3
-      stage: spec
-    -
-      bundler_args: "--with system_tests"
-      env: ["PUPPET_INSTALL_TYPE=agent", "BEAKER_IS_PE=no", "BEAKER_PUPPET_COLLECTION=puppet5", "BEAKER_debug=true", "BEAKER_setfile=debian8-64{hypervisor=docker}"]
-      rvm: default
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      services: docker
-      stage: acceptance
-      sudo: required
-    -
-      bundler_args: "--with system_tests"
-      env: ["PUPPET_INSTALL_TYPE=agent", "BEAKER_IS_PE=no", "BEAKER_PUPPET_COLLECTION=puppet5", "BEAKER_debug=true", "BEAKER_setfile=debian9-64{hypervisor=docker}"]
-      rvm: default
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      services: docker
-      stage: acceptance
-      sudo: required
-    -
-      bundler_args: "--with system_tests"
-      env: ["PUPPET_INSTALL_TYPE=agent", "BEAKER_IS_PE=no", "BEAKER_PUPPET_COLLECTION=puppet5", "BEAKER_debug=true", "BEAKER_setfile=ubuntu1404-64{hypervisor=docker}"]
-      rvm: default
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      services: docker
-      stage: acceptance
-      sudo: required
-    -
-      bundler_args: "--with system_tests"
-      env: ["PUPPET_INSTALL_TYPE=agent", "BEAKER_IS_PE=no", "BEAKER_PUPPET_COLLECTION=puppet5", "BEAKER_debug=true", "BEAKER_setfile=ubuntu1604-64{hypervisor=docker}"]
-      rvm: default
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      services: docker
-      stage: acceptance
-      sudo: required
-    -
-      bundler_args: "--with system_tests"
-      env: ["PUPPET_INSTALL_TYPE=agent", "BEAKER_IS_PE=no", "BEAKER_PUPPET_COLLECTION=puppet5", "BEAKER_debug=true", "BEAKER_setfile=ubuntu1804-64{hypervisor=docker}"]
-      rvm: default
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      services: docker
-      sudo: required
-    -
-      bundler_args: "--with system_tests"
-      env: ["PUPPET_INSTALL_TYPE=agent", "BEAKER_IS_PE=no", "BEAKER_PUPPET_COLLECTION=puppet5", "BEAKER_debug=true", "BEAKER_setfile=centos7-64{hypervisor=docker}"]
-      rvm: default
-      script: bundle exec rspec spec/acceptance/*_spec.rb
-      services: docker
-      stage: acceptance
-      sudo: required
-    -
-      env: DEPLOY_TO_FORGE=yes
-      stage: deploy
-branches:
-  only:
-    - master
-    - /^v\d/
-    - /^\d/
-notifications:
-  email: false
-deploy:
-  provider: puppetforge
-  user: camptocamp
-  password:
-    secure: "XAv4O363tng0KuRnu1ZhhwORy+2CF9UQwdwlFmS+NG9jOaTZZN+PMK8iC7OSIvZN6cfKlYjHRHNuxFBnYlnMrLsM9fVxt4NjjznOgIKQpQDleWk4UitZj5ntyHmUtYtofUd5Bhi/sdYXwGN9pVRCrcfFBmsIRq/dOhXD7Wy5KcQ="
-  on:
-    tags: true
-    all_branches: true
-    condition: "$DEPLOY_TO_FORGE = yes"
diff --git a/.yardopts b/.yardopts
deleted file mode 100644
index 29c933bcf15d56c2583bbfafabc88093ffa1da68..0000000000000000000000000000000000000000
--- a/.yardopts
+++ /dev/null
@@ -1 +0,0 @@
---markup markdown
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
deleted file mode 100644
index 2c179eb44baa690449648ba61fdaecba146b9d2b..0000000000000000000000000000000000000000
--- a/CONTRIBUTING.md
+++ /dev/null
@@ -1,8 +0,0 @@
-# How to contribute
-
-Please report bugs and feature request using [GitHub issue
-tracker](https://github.com/camptocamp/puppet-postfix/issues).
-
-For pull requests, it is very much appreciated to check your Puppet manifest
-with [puppet-lint](https://github.com/rodjek/puppet-lint) to follow the recommended Puppet style guidelines from the
-[Puppet Labs style guide](http://docs.puppetlabs.com/guides/style_guide.html).
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..e3cf307f14a0f2412a186a1268dfb2b02e0021db
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,24 @@
+# MANAGED BY MODULESYNC
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
+
+FROM ruby:2.7
+
+WORKDIR /opt/puppet
+
+# https://github.com/puppetlabs/puppet/blob/06ad255754a38f22fb3a22c7c4f1e2ce453d01cb/lib/puppet/provider/service/runit.rb#L39
+RUN mkdir -p /etc/sv
+
+ARG PUPPET_VERSION="~> 6.0"
+ARG PARALLEL_TEST_PROCESSORS=4
+
+# Cache gems
+COPY Gemfile .
+RUN bundle install --without system_tests development release --path=${BUNDLE_PATH:-vendor/bundle}
+
+COPY . .
+
+RUN bundle install
+RUN bundle exec rake release_checks
+
+# Container should not saved
+RUN exit 1
diff --git a/Gemfile b/Gemfile
index 22208c5ea862292c780994e577d10641d0b3e90f..36ea20aeff669d1080eb09732bbf788576de9e01 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,85 +1,36 @@
-source ENV['GEM_SOURCE'] || 'https://rubygems.org'
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
 
-def location_for(place_or_version, fake_version = nil)
-  git_url_regex = %r{\A(?<url>(https?|git)[:@][^#]*)(#(?<branch>.*))?}
-  file_url_regex = %r{\Afile:\/\/(?<path>.*)}
+source ENV['GEM_SOURCE'] || "https://rubygems.org"
 
-  if place_or_version && (git_url = place_or_version.match(git_url_regex))
-    [fake_version, { git: git_url[:url], branch: git_url[:branch], require: false }].compact
-  elsif place_or_version && (file_url = place_or_version.match(file_url_regex))
-    ['>= 0', { path: File.expand_path(file_url[:path]), require: false }]
-  else
-    [place_or_version, { require: false }]
-  end
+group :test do
+  gem 'voxpupuli-test', '~> 2.5',   :require => false
+  gem 'coveralls',                  :require => false
+  gem 'simplecov-console',          :require => false
+  gem 'puppet_metadata', '~> 1.0',  :require => false
 end
 
-ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments
-minor_version = ruby_version_segments[0..1].join('.')
-
 group :development do
-  gem "fast_gettext", '1.1.0',                                   require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.1.0')
-  gem "fast_gettext",                                            require: false if Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.1.0')
-  gem "json_pure", '<= 2.0.1',                                   require: false if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.0.0')
-  gem "json", '= 1.8.1',                                         require: false if Gem::Version.new(RUBY_VERSION.dup) == Gem::Version.new('2.1.9')
-  gem "json", '= 2.0.4',                                         require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
-  gem "json", '= 2.1.0',                                         require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup))
-  gem "rb-readline", '= 0.5.5',                                  require: false, platforms: [:mswin, :mingw, :x64_mingw]
-  gem "puppet-module-posix-default-r#{minor_version}", '~> 0.3', require: false, platforms: [:ruby]
-  gem "puppet-module-posix-dev-r#{minor_version}", '~> 0.3',     require: false, platforms: [:ruby]
-  gem "puppet-module-win-default-r#{minor_version}", '~> 0.3',   require: false, platforms: [:mswin, :mingw, :x64_mingw]
-  gem "puppet-module-win-dev-r#{minor_version}", '~> 0.3',       require: false, platforms: [:mswin, :mingw, :x64_mingw]
-  gem "ruby-augeas",                                             require: false
-  gem "github_changelog_generator",                              require: false
+  gem 'guard-rake',               :require => false
+  gem 'overcommit', '>= 0.39.1',  :require => false
+  gem 'ruby-augeas',              :require => false
 end
+
 group :system_tests do
-  gem 'beaker',                                       require: false
-  gem 'beaker-docker',                                require: false
-  gem 'beaker-hostgenerator',                         require: false
-  gem 'beaker-module_install_helper',                 require: false
-  gem 'beaker-pe',                                    require: false
-  gem 'beaker-puppet_install_helper',                 require: false
-  gem 'beaker-rspec',                                 require: false
-  gem 'beaker-task_helper',                           require: false
-  gem "puppet-module-posix-system-r#{minor_version}", require: false
+  gem 'voxpupuli-acceptance', '~> 1.0',                :require => false
+  gem 'puppet-module-posix-system-r#{minor_version}',  :require => false
 end
 
-puppet_version = ENV['PUPPET_GEM_VERSION']
-facter_version = ENV['FACTER_GEM_VERSION']
-hiera_version = ENV['HIERA_GEM_VERSION']
-
-gems = {}
-
-gems['puppet'] = location_for(puppet_version)
-
-# If facter or hiera versions have been specified via the environment
-# variables
-
-gems['facter'] = location_for(facter_version) if facter_version
-gems['hiera'] = location_for(hiera_version) if hiera_version
-
-if Gem.win_platform? && puppet_version =~ %r{^(file:///|git://)}
-  # If we're using a Puppet gem on Windows which handles its own win32-xxx gem
-  # dependencies (>= 3.5.0), set the maximum versions (see PUP-6445).
-  gems['win32-dir'] =      ['<= 0.4.9', require: false]
-  gems['win32-eventlog'] = ['<= 0.6.5', require: false]
-  gems['win32-process'] =  ['<= 0.7.5', require: false]
-  gems['win32-security'] = ['<= 0.2.5', require: false]
-  gems['win32-service'] =  ['0.8.8', require: false]
+group :release do
+  gem 'github_changelog_generator', '>= 1.16.1',  :require => false if RUBY_VERSION >= '2.5'
+  gem 'voxpupuli-release', '>= 1.0.2',            :require => false
+  gem 'puppet-strings', '>= 2.2',                 :require => false
 end
 
-gems.each do |gem_name, gem_params|
-  gem gem_name, *gem_params
-end
+gem 'rake', :require => false
+gem 'facter', ENV['FACTER_GEM_VERSION'], :require => false, :groups => [:test]
 
-# Evaluate Gemfile.local and ~/.gemfile if they exist
-extra_gemfiles = [
-  "#{__FILE__}.local",
-  File.join(Dir.home, '.gemfile'),
-]
+puppetversion = ENV['PUPPET_VERSION'] || '>= 6.0'
+gem 'puppet', puppetversion, :require => false, :groups => [:test]
 
-extra_gemfiles.each do |gemfile|
-  if File.file?(gemfile) && File.readable?(gemfile)
-    eval(File.read(gemfile), binding)
-  end
-end
 # vim: syntax=ruby
diff --git a/Rakefile b/Rakefile
index e1d5f7bdc5b298d607c4fe8de34e5703b00e7cbd..80b799d63793359c75533c8b51fdce078c78ae79 100644
--- a/Rakefile
+++ b/Rakefile
@@ -1,86 +1,72 @@
-require 'puppet_litmus/rake_tasks' if Bundler.rubygems.find_name('puppet_litmus').any?
-require 'puppetlabs_spec_helper/rake_tasks'
-require 'puppet-syntax/tasks/puppet-syntax'
-require 'puppet_blacksmith/rake_tasks' if Bundler.rubygems.find_name('puppet-blacksmith').any?
-require 'github_changelog_generator/task' if Bundler.rubygems.find_name('github_changelog_generator').any?
-require 'puppet-strings/tasks' if Bundler.rubygems.find_name('puppet-strings').any?
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
 
-def changelog_user
-  return unless Rake.application.top_level_tasks.include? "changelog"
-  returnVal = nil || JSON.load(File.read('metadata.json'))['author']
-  raise "unable to find the changelog_user in .sync.yml, or the author in metadata.json" if returnVal.nil?
-  puts "GitHubChangelogGenerator user:#{returnVal}"
-  returnVal
+# Attempt to load voxupuli-test (which pulls in puppetlabs_spec_helper),
+# otherwise attempt to load it directly.
+begin
+  require 'voxpupuli/test/rake'
+rescue LoadError
+  begin
+    require 'puppetlabs_spec_helper/rake_tasks'
+  rescue LoadError
+  end
 end
 
-def changelog_project
-  return unless Rake.application.top_level_tasks.include? "changelog"
+# load optional tasks for acceptance
+# only available if gem group releases is installed
+begin
+  require 'voxpupuli/acceptance/rake'
+rescue LoadError
+end
 
-  returnVal = nil
-  returnVal ||= begin
-    metadata_source = JSON.load(File.read('metadata.json'))['source']
-    metadata_source_match = metadata_source && metadata_source.match(%r{.*\/([^\/]*?)(?:\.git)?\Z})
+# load optional tasks for releases
+# only available if gem group releases is installed
+begin
+  require 'voxpupuli/release/rake_tasks'
+rescue LoadError
+end
 
-    metadata_source_match && metadata_source_match[1]
+desc "Run main 'test' task and report merged results to coveralls"
+task test_with_coveralls: [:test] do
+  if Dir.exist?(File.expand_path('../lib', __FILE__))
+    require 'coveralls/rake/task'
+    Coveralls::RakeTask.new
+    Rake::Task['coveralls:push'].invoke
+  else
+    puts 'Skipping reporting to coveralls.  Module has no lib dir'
   end
-
-  raise "unable to find the changelog_project in .sync.yml or calculate it from the source in metadata.json" if returnVal.nil?
-
-  puts "GitHubChangelogGenerator project:#{returnVal}"
-  returnVal
 end
 
-def changelog_future_release
-  return unless Rake.application.top_level_tasks.include? "changelog"
-  returnVal = "%s" % JSON.load(File.read('metadata.json'))['version']
-  raise "unable to find the future_release (version) in metadata.json" if returnVal.nil?
-  puts "GitHubChangelogGenerator future_release:#{returnVal}"
-  returnVal
+desc 'Generate REFERENCE.md'
+task :reference, [:debug, :backtrace] do |t, args|
+  patterns = ''
+  Rake::Task['strings:generate:reference'].invoke(patterns, args[:debug], args[:backtrace])
 end
 
-PuppetLint.configuration.send('disable_relative')
-
-if Bundler.rubygems.find_name('github_changelog_generator').any?
+begin
+  require 'github_changelog_generator/task'
+  require 'puppet_blacksmith'
   GitHubChangelogGenerator::RakeTask.new :changelog do |config|
-    raise "Set CHANGELOG_GITHUB_TOKEN environment variable eg 'export CHANGELOG_GITHUB_TOKEN=valid_token_here'" if Rake.application.top_level_tasks.include? "changelog" and ENV['CHANGELOG_GITHUB_TOKEN'].nil?
-    config.user = "#{changelog_user}"
-    config.project = "#{changelog_project}"
-    config.future_release = "#{changelog_future_release}"
-    config.exclude_labels = ['maintenance']
-    config.header = "# Change log\n\nAll notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org)."
-    config.add_pr_wo_labels = true
-    config.issues = false
-    config.merge_prefix = "### UNCATEGORIZED PRS; GO LABEL THEM"
-    config.configure_sections = {
-      "Changed" => {
-        "prefix" => "### Changed",
-        "labels" => ["backwards-incompatible"],
-      },
-      "Added" => {
-        "prefix" => "### Added",
-        "labels" => ["feature", "enhancement"],
-      },
-      "Fixed" => {
-        "prefix" => "### Fixed",
-        "labels" => ["bugfix"],
-      },
-    }
+    metadata = Blacksmith::Modulefile.new
+    config.future_release = "v#{metadata.version}" if metadata.version =~ /^\d+\.\d+.\d+$/
+    config.header = "# Changelog\n\nAll notable changes to this project will be documented in this file.\nEach new release typically also includes the latest modulesync defaults.\nThese should not affect the functionality of the module."
+    config.exclude_labels = %w{duplicate question invalid wontfix wont-fix modulesync skip-changelog}
+    config.user = 'voxpupuli'
+    config.project = metadata.metadata['name']
   end
-else
-  desc 'Generate a Changelog from GitHub'
-  task :changelog do
-    raise <<EOM
-The changelog tasks depends on unreleased features of the github_changelog_generator gem.
-Please manually add it to your .sync.yml for now, and run `pdk update`:
----
-Gemfile:
-  optional:
-    ':development':
-      - gem: 'github_changelog_generator'
-        git: 'https://github.com/skywinder/github-changelog-generator'
-        ref: '20ee04ba1234e9e83eb2ffb5056e23d641c7a018'
-        condition: "Gem::Version.new(RUBY_VERSION.dup) >= Gem::Version.new('2.2.2')"
-EOM
+
+  # Workaround for https://github.com/github-changelog-generator/github-changelog-generator/issues/715
+  require 'rbconfig'
+  if RbConfig::CONFIG['host_os'] =~ /linux/
+    task :changelog do
+      puts 'Fixing line endings...'
+      changelog_file = File.join(__dir__, 'CHANGELOG.md')
+      changelog_txt = File.read(changelog_file)
+      new_contents = changelog_txt.gsub(%r{\r\n}, "\n")
+      File.open(changelog_file, "w") {|file| file.puts new_contents }
+    end
   end
-end
 
+rescue LoadError
+end
+# vim: syntax=ruby
diff --git a/spec/acceptance/nodesets/centos-7.yml b/spec/acceptance/nodesets/centos-7.yml
deleted file mode 100644
index a8fa4686b7b3eebc0760602a61f607b66d1977b8..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/centos-7.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-HOSTS:
-  centos-7-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: el-7-x86_64
-    hypervisor : docker
-    image: centos:7
-    docker_preserve_image: true
-    docker_cmd: '["/usr/sbin/init"]'
-    docker_image_commands:
-      - 'yum install -y crontabs tar wget iproute'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/debian-6.yml b/spec/acceptance/nodesets/debian-6.yml
deleted file mode 100644
index d7b0275628cabb852f0483435c5fceca1f27fc90..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/debian-6.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-HOSTS:
-  debian-6-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: debian-6-amd64
-    hypervisor : docker
-    image: debian/eol:squeeze
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y cron locales-all net-tools wget'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/debian-7.yml b/spec/acceptance/nodesets/debian-7.yml
deleted file mode 100644
index 9591ea778ae983fe007777e4940a2d4fae29a717..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/debian-7.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-HOSTS:
-  debian-7-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: debian-7-amd64
-    hypervisor : docker
-    image: debian:7
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y cron locales-all net-tools wget'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/debian-8.yml b/spec/acceptance/nodesets/debian-8.yml
deleted file mode 100644
index 5fb24c61734669d767c27b7273543ac936058950..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/debian-8.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-HOSTS:
-  debian-8-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: debian-8-amd64
-    hypervisor : docker
-    image: debian:8
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y cron locales-all net-tools wget'
-      - 'rm -f /usr/sbin/policy-rc.d'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/debian-9.yml b/spec/acceptance/nodesets/debian-9.yml
deleted file mode 100644
index f1c6571eabc452f6d31a43262ed999a1550d13f5..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/debian-9.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-HOSTS:
-  debian-9-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: debian-9-amd64
-    hypervisor : docker
-    image: debian:9
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y cron locales-all net-tools systemd-sysv wget'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/ubuntu-12.04.yml b/spec/acceptance/nodesets/ubuntu-12.04.yml
deleted file mode 100644
index 594e17719daf85d0a54edf41b02c161269a9153e..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/ubuntu-12.04.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-HOSTS:
-  ubuntu-1204-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: ubuntu-12.04-amd64
-    hypervisor : docker
-    image: ubuntu:12.04
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y net-tools wget'
-      - 'locale-gen en_US.UTF-8'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/ubuntu-14.04.yml b/spec/acceptance/nodesets/ubuntu-14.04.yml
deleted file mode 100644
index 2b293c99abf7d960668ba520f1f3f0381f3a49e5..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/ubuntu-14.04.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-HOSTS:
-  ubuntu-1404-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: ubuntu-14.04-amd64
-    hypervisor : docker
-    image: ubuntu:14.04
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'rm /usr/sbin/policy-rc.d'
-      - 'rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl'
-      - 'apt-get install -y net-tools wget'
-      - 'locale-gen en_US.UTF-8'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/ubuntu-14.10.yml b/spec/acceptance/nodesets/ubuntu-14.10.yml
deleted file mode 100644
index 7ce09b2a84864ab4ce7ead3b7b2db6807331649d..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/ubuntu-14.10.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-HOSTS:
-  ubuntu-1410-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: ubuntu-14.10-amd64
-    hypervisor : docker
-    image: ubuntu:14.10
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'rm /usr/sbin/policy-rc.d'
-      - 'rm /sbin/initctl; dpkg-divert --rename --remove /sbin/initctl'
-      - 'apt-get install -y net-tools wget'
-      - 'locale-gen en_US.UTF-8'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/ubuntu-15.04.yml b/spec/acceptance/nodesets/ubuntu-15.04.yml
deleted file mode 100644
index 329f3319e7431899230f892b58b5b7419cb88ced..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/ubuntu-15.04.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-HOSTS:
-  ubuntu-1504-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: ubuntu-15.04-amd64
-    hypervisor : docker
-    image: ubuntu:15.04
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y net-tools wget'
-      - 'locale-gen en_US.UTF-8'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/ubuntu-15.10.yml b/spec/acceptance/nodesets/ubuntu-15.10.yml
deleted file mode 100644
index 487795a3fda7d1641a3ea43ebd8004c8fdf2d725..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/ubuntu-15.10.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-HOSTS:
-  ubuntu-1510-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: ubuntu-15.10-amd64
-    hypervisor : docker
-    image: ubuntu:15.10
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y net-tools wget'
-      - 'locale-gen en_US.UTF-8'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/acceptance/nodesets/ubuntu-16.04.yml b/spec/acceptance/nodesets/ubuntu-16.04.yml
deleted file mode 100644
index 561ebd7c698a71bd1d13f8c9ff333f87988f0de1..0000000000000000000000000000000000000000
--- a/spec/acceptance/nodesets/ubuntu-16.04.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-HOSTS:
-  ubuntu-1604-x64:
-    default_apply_opts:
-      order: random
-      strict_variables:
-    platform: ubuntu-16.04-amd64
-    hypervisor : docker
-    image: ubuntu:16.04
-    docker_preserve_image: true
-    docker_cmd: '["/sbin/init"]'
-    docker_image_commands:
-      - 'apt-get install -y net-tools wget locales'
-      - 'locale-gen en_US.UTF-8'
-CONFIG:
-  type: aio
-  log_level: debug
diff --git a/spec/default_facts.yml b/spec/default_facts.yml
deleted file mode 100644
index f777abfc9905202e7ccf5b5fcc76b9b4c59a39fb..0000000000000000000000000000000000000000
--- a/spec/default_facts.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-# Use default_module_facts.yml for module specific facts.
-#
-# Facts specified here will override the values provided by rspec-puppet-facts.
----
-ipaddress: "172.16.254.254"
-ipaddress6: "FE80:0000:0000:0000:AAAA:AAAA:AAAA"
-is_pe: false
-macaddress: "AA:AA:AA:AA:AA:AA"
diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb
index feb5720447ecd6e0ea95c4e27d185aeb8d6b3534..fb5f0cbeab68b24ceba1fd1cb248607f2c481297 100644
--- a/spec/spec_helper.rb
+++ b/spec/spec_helper.rb
@@ -1,54 +1,17 @@
-require 'puppetlabs_spec_helper/module_spec_helper'
-require 'rspec-puppet-facts'
+# Managed by modulesync - DO NOT EDIT
+# https://voxpupuli.org/docs/updating-files-managed-with-modulesync/
 
-require 'spec_helper_local' if File.file?(File.join(File.dirname(__FILE__), 'spec_helper_local.rb'))
+# puppetlabs_spec_helper will set up coverage if the env variable is set.
+# We want to do this if lib exists and it hasn't been explicitly set.
+ENV['COVERAGE'] ||= 'yes' if Dir.exist?(File.expand_path('../../lib', __FILE__))
 
-include RspecPuppetFacts
+require 'voxpupuli/test/spec_helper'
 
-default_facts = {
-  puppetversion: Puppet.version,
-  facterversion: Facter.version,
-}
-
-default_fact_files = [
-  File.expand_path(File.join(File.dirname(__FILE__), 'default_facts.yml')),
-  File.expand_path(File.join(File.dirname(__FILE__), 'default_module_facts.yml')),
-]
-
-default_fact_files.each do |f|
-  next unless File.exist?(f) && File.readable?(f) && File.size?(f)
-
-  begin
-    default_facts.merge!(YAML.safe_load(File.read(f), [], [], true))
-  rescue => e
-    RSpec.configuration.reporter.message "WARNING: Unable to load #{f}: #{e}"
+if File.exist?(File.join(__dir__, 'default_module_facts.yml'))
+  facts = YAML.safe_load(File.read(File.join(__dir__, 'default_module_facts.yml')))
+  if facts
+    facts.each do |name, value|
+      add_custom_fact name.to_sym, value
+    end
   end
 end
-
-# read default_facts and merge them over what is provided by facterdb
-default_facts.each do |fact, value|
-  add_custom_fact fact, value
-end
-
-RSpec.configure do |c|
-  c.default_facts = default_facts
-  c.before :each do
-    # set to strictest setting for testing
-    # by default Puppet runs at warning level
-    Puppet.settings[:strict] = :warning
-  end
-  c.filter_run_excluding(bolt: true) unless ENV['GEM_BOLT']
-  c.after(:suite) do
-  end
-end
-
-# Ensures that a module is defined
-# @param module_name Name of the module
-def ensure_module_defined(module_name)
-  module_name.split('::').reduce(Object) do |last_module, next_module|
-    last_module.const_set(next_module, Module.new) unless last_module.const_defined?(next_module, false)
-    last_module.const_get(next_module, false)
-  end
-end
-
-# 'spec_overrides' from sync.yml will appear below this line