diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..39c3d7d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+SOURCES/kdump-0c2bb28.tar.gz
+SOURCES/network-d5891d4.tar.gz
+SOURCES/postfix-0.1.tar.gz
+SOURCES/selinux-6cd1ec8.tar.gz
+SOURCES/timesync-924650d.tar.gz
diff --git a/.rhel-system-roles.metadata b/.rhel-system-roles.metadata
new file mode 100644
index 0000000..4a8398a
--- /dev/null
+++ b/.rhel-system-roles.metadata
@@ -0,0 +1,5 @@
+36b200d1c6a8d1cb1ea87e3e9aa8c4f6bbd8155d SOURCES/kdump-0c2bb28.tar.gz
+530aaa9302d90c278b9e1c8d8513e516494e3380 SOURCES/network-d5891d4.tar.gz
+66c82331f4ac9598c506c3999965b4d07dbfe49d SOURCES/postfix-0.1.tar.gz
+246383bd6823533ed3a51a0501b75e38ba852908 SOURCES/selinux-6cd1ec8.tar.gz
+ffd2a706e4e3007684aa9874c8457ad5c8920050 SOURCES/timesync-924650d.tar.gz
diff --git a/SOURCES/kdump-tier1-tags.diff b/SOURCES/kdump-tier1-tags.diff
new file mode 100644
index 0000000..e3c9fde
--- /dev/null
+++ b/SOURCES/kdump-tier1-tags.diff
@@ -0,0 +1,100 @@
+diff --git a/tests/commonvars.yml b/tests/commonvars.yml
+new file mode 100644
+index 0000000..2cd3566
+--- /dev/null
++++ b/tests/commonvars.yml
+@@ -0,0 +1,2 @@
++restore_services:
++  - kdump
+diff --git a/tests/get_services_state.yml b/tests/get_services_state.yml
+new file mode 100644
+index 0000000..4fe5d36
+--- /dev/null
++++ b/tests/get_services_state.yml
+@@ -0,0 +1,4 @@
++- name: Get initial state of services
++  tags: tests::cleanup
++  service_facts:
++  register: initial_state
+diff --git a/tests/restore_services_state.yml b/tests/restore_services_state.yml
+new file mode 100644
+index 0000000..2035dfc
+--- /dev/null
++++ b/tests/restore_services_state.yml
+@@ -0,0 +1,22 @@
++- block:
++    - name: load common vars
++      include_vars:
++        file: commonvars.yml
++
++    - name: Get final state of services
++      service_facts:
++      register: final_state
++
++    - name: Restore state of services
++      service:
++        name: "{{ item }}"
++        state: "{{ 'started' if
++                   initial_state.ansible_facts.services[sname]['state']
++                   == 'running' else 'stopped' }}"
++      when:
++         - sname in final_state.ansible_facts.services
++         - sname in initial_state.ansible_facts.services
++      vars:
++        sname: "{{ item + '.service' }}"
++      with_items: "{{ restore_services }}"
++  tags: tests::cleanup
+diff --git a/tests/tests_default.yml b/tests/tests_default.yml
+index 4c93830..60d7967 100644
+--- a/tests/tests_default.yml
++++ b/tests/tests_default.yml
+@@ -1,6 +1,18 @@
+ 
+ - name: Ensure that the rule runs with default parameters
++  tags:
++    - 'tests::tier1'
+   hosts: all
+ 
+   roles:
+     - kdump
++
++  pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
++  post_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_default_wrapper.yml b/tests/tests_default_wrapper.yml
+index 2763fbd..617acb3 100644
+--- a/tests/tests_default_wrapper.yml
++++ b/tests/tests_default_wrapper.yml
+@@ -1,6 +1,9 @@
+ ---
+ - name: Create static inventory from hostvars
+   hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::slow'
+   tasks:
+     - name: create temporary file
+       tempfile:
+@@ -17,10 +20,16 @@
+ 
+ 
+ - name: Run tests_default.yml normally
++  tags:
++    - 'tests::tier1'
++    - 'tests::slow'
+   import_playbook: tests_default.yml
+ 
+ - name: Run tests_default.yml in check_mode
+   hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::slow'
+   tasks:
+     - name: Run ansible-playbook with tests_default.yml in check mode
+       command: ansible-playbook -vvv -i {{ tempinventory.path }} --check tests_default.yml
diff --git a/SOURCES/md2html.sh b/SOURCES/md2html.sh
new file mode 100644
index 0000000..d062eb9
--- /dev/null
+++ b/SOURCES/md2html.sh
@@ -0,0 +1,6 @@
+for file in "$@"; do
+	pandoc -f markdown_github "${file}" -t asciidoc -o "${file%.md}.tmp.adoc" ||exit $?
+	touch -r "${file}" "${file%.md}.tmp.adoc" ||exit $?
+	TZ=UTC asciidoc -o "${file%.md}.html" -a footer-style=none -a toc2 -a source-highlighter=highlight "${file%.md}.tmp.adoc" ||exit $?
+	rm "${file%.md}.tmp.adoc"
+done
diff --git a/SOURCES/network-permissions.diff b/SOURCES/network-permissions.diff
new file mode 100644
index 0000000..05068ff
--- /dev/null
+++ b/SOURCES/network-permissions.diff
@@ -0,0 +1,6 @@
+diff --git a/library/network_connections.py b/library/network_connections.py
+old mode 100755
+new mode 100644
+diff --git a/tests/unit/test_network_connections.py b/tests/unit/test_network_connections.py
+old mode 100755
+new mode 100644
diff --git a/SOURCES/network-tier1-tags.diff b/SOURCES/network-tier1-tags.diff
new file mode 100644
index 0000000..50c1571
--- /dev/null
+++ b/SOURCES/network-tier1-tags.diff
@@ -0,0 +1,551 @@
+diff --git a/tests/commonvars.yml b/tests/commonvars.yml
+new file mode 100644
+index 0000000..50452f7
+--- /dev/null
++++ b/tests/commonvars.yml
+@@ -0,0 +1,2 @@
++restore_services:
++  - NetworkManager
+diff --git a/tests/get_services_state.yml b/tests/get_services_state.yml
+new file mode 100644
+index 0000000..4fe5d36
+--- /dev/null
++++ b/tests/get_services_state.yml
+@@ -0,0 +1,4 @@
++- name: Get initial state of services
++  tags: tests::cleanup
++  service_facts:
++  register: initial_state
+diff --git a/tests/playbooks/tests_states.yml b/tests/playbooks/tests_states.yml
+index 7a1e207..3c1f65d 100644
+--- a/tests/playbooks/tests_states.yml
++++ b/tests/playbooks/tests_states.yml
+@@ -1,6 +1,8 @@
+ # SPDX-License-Identifier: BSD-3-Clause
+ ---
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+   vars:
+     interface: statebr
+     profile: "{{ interface }}"
+@@ -22,6 +24,8 @@
+             ip:
+               dhcp4: false
+               auto6: false
++      tags:
++        - 'tests::net::bridge'
+     - include_tasks: tasks/assert-device_present.yml
+     - include_tasks: tasks/assert-profile_present.yml
+ 
+@@ -47,3 +51,28 @@
+             state: down
+     - include_tasks: tasks/assert-device_absent.yml
+     - include_tasks: tasks/assert-profile_absent.yml
++
++  pre_tasks:
++    - name: Save host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: "../save_state.yml"
++
++  post_tasks:
++    - name: Remove test profile
++      tags:
++        - 'tests::cleanup'
++        - 'tests::tier1::cleanup'
++        - 'tests::net::bridge::cleanup'
++      import_role:
++        name: linux-system-roles.network
++      vars:
++        network_connections:
++          - name: statebr
++            state: down
++            persistent_state: absent
++
++    - name: Restore host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: "../restore_state.yml"
+diff --git a/tests/playbooks/tests_vlan_mtu.yml b/tests/playbooks/tests_vlan_mtu.yml
+index ae0322e..bf6e518 100644
+--- a/tests/playbooks/tests_vlan_mtu.yml
++++ b/tests/playbooks/tests_vlan_mtu.yml
+@@ -1,6 +1,8 @@
+ # SPDX-License-Identifier: BSD-3-Clause
+ ---
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+   vars:
+     type: veth
+     interface: lsr101
+@@ -10,6 +12,8 @@
+     - include_tasks: tasks/manage-test-interface.yml
+       vars:
+         state: present
++      tags:
++        - 'tests::net::veth'
+     - include_tasks: tasks/assert-device_present.yml
+     - name: "TEST: I can configure the MTU for a vlan interface without autoconnect."
+       debug:
+@@ -37,6 +41,8 @@
+             ip:
+               dhcp4: false
+               auto6: false
++      tags:
++        - 'tests::net::reconf'
+     - include_tasks: tasks/assert-device_present.yml
+       vars:
+         interface: "{{ vlan_interface }}"
+@@ -61,6 +67,26 @@
+             persistent_state: absent
+             state: down
+       ignore_errors: true
++      tags:
++        - 'tests::cleanup'
++        - 'tests::tier1::cleanup'
++        - 'tests::net::veth::cleanup'
+     - include_tasks: tasks/manage-test-interface.yml
+       vars:
+         state: absent
++      tags:
++        - 'tests::cleanup'
++        - 'tests::tier1::cleanup'
++        - 'tests::net::veth::cleanup'
++
++  pre_tasks:
++    - name: Save host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: "../save_state.yml"
++
++  post_tasks:
++    - name: Restore host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: "../restore_state.yml"
+diff --git a/tests/restore_services_state.yml b/tests/restore_services_state.yml
+new file mode 100644
+index 0000000..2035dfc
+--- /dev/null
++++ b/tests/restore_services_state.yml
+@@ -0,0 +1,22 @@
++- block:
++    - name: load common vars
++      include_vars:
++        file: commonvars.yml
++
++    - name: Get final state of services
++      service_facts:
++      register: final_state
++
++    - name: Restore state of services
++      service:
++        name: "{{ item }}"
++        state: "{{ 'started' if
++                   initial_state.ansible_facts.services[sname]['state']
++                   == 'running' else 'stopped' }}"
++      when:
++         - sname in final_state.ansible_facts.services
++         - sname in initial_state.ansible_facts.services
++      vars:
++        sname: "{{ item + '.service' }}"
++      with_items: "{{ restore_services }}"
++  tags: tests::cleanup
+diff --git a/tests/restore_state.yml b/tests/restore_state.yml
+new file mode 100644
+index 0000000..f4e3d5f
+--- /dev/null
++++ b/tests/restore_state.yml
+@@ -0,0 +1,24 @@
++---
++- name: Remove /etc/sysconfig/network if there was no one
++  tags:
++    - 'tests::cleanup'
++  file:
++    path: /etc/sysconfig/network
++    state: absent
++  when:
++    - etc_sysconfig_network_stat is defined
++    - not etc_sysconfig_network_stat.stat.exists
++
++- name: Restore services
++  import_tasks: restore_services_state.yml
++
++- name: reload NetworkManager
++  tags:
++    - 'tests::cleanup'
++  command: nmcli connection reload
++  when:
++    - sname in final_state.ansible_facts.services
++    - sname in initial_state.ansible_facts.services
++    - final_state.ansible_facts.services[sname]['state'] == 'running'
++  vars:
++    sname: NetworkManager.service
+diff --git a/tests/save_state.yml b/tests/save_state.yml
+new file mode 100644
+index 0000000..5690aed
+--- /dev/null
++++ b/tests/save_state.yml
+@@ -0,0 +1,11 @@
++---
++- name: Get services state
++  import_tasks: get_services_state.yml
++
++- name: Investigate /etc/sysconfig/network presence
++  tags:
++    - 'tests::cleanup'
++  stat:
++    path: /etc/sysconfig/network
++  register: etc_sysconfig_network_stat
++  ignore_errors: yes
+diff --git a/tests/tests_bridge.yml b/tests/tests_bridge.yml
+index 9ead308..394d392 100644
+--- a/tests/tests_bridge.yml
++++ b/tests/tests_bridge.yml
+@@ -1,7 +1,17 @@
+ # SPDX-License-Identifier: BSD-3-Clause
+ ---
++- name: Save host state
++  hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::tier1::cleanup'
++  tasks:
++    - import_tasks: save_state.yml
++
+ - name: Test configuring bridges
+   hosts: all
++  tags:
++    - 'tests::tier1'
+   vars:
+     interface: LSR-TST-br31
+ 
+@@ -14,6 +24,9 @@
+ 
+ - name: Add test bridge
+   hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::net::bridge'
+   vars:
+     network_connections:
+       - name: "{{ interface }}"
+@@ -27,24 +40,40 @@
+     - linux-system-roles.network
+ 
+ - import_playbook: run-tasks.yml
++  tags:
++    - 'tests::tier1'
+   vars:
+     task: tasks/assert-device_present.yml
+ 
+ - import_playbook: run-tasks.yml
++  tags:
++    - 'tests::tier1'
+   vars:
+     profile: "{{ interface }}"
+     task: tasks/assert-profile_present.yml
+ 
+ - import_playbook: down-profile.yml
++  tags:
++    - 'tests::tier1'
++    - 'tests::cleanup'
++    - 'tests::tier1::cleanup'
++    - 'tests::net::bridge::cleanup'
+   vars:
+     profile: "{{ interface }}"
+ # FIXME: assert profile/device down
+ 
+ - import_playbook: remove-profile.yml
++  tags:
++    - 'tests::tier1'
++    - 'tests::cleanup'
++    - 'tests::tier1::cleanup'
++    - 'tests::net::bridge::cleanup'
+   vars:
+     profile: "{{ interface }}"
+ 
+ - import_playbook: run-tasks.yml
++  tags:
++    - 'tests::tier1'
+   vars:
+     profile: "{{ interface }}"
+     task: tasks/assert-profile_absent.yml
+@@ -53,3 +82,22 @@
+ #- import_playbook: run-tasks.yml
+ #  vars:
+ #    task: tasks/assert-device_absent.yml
++
++- name: Remove test bridge
++  hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::cleanup'
++    - 'tests::tier1::cleanup'
++    - 'tests::net::bridge::cleanup'
++  tasks:
++    - command: 'ip link delete "{{ interface }}"'
++      ignore_errors: yes
++
++- name: Restore host state
++  hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::tier1::cleanup'
++  tasks:
++    - import_tasks: restore_state.yml
+diff --git a/tests/tests_bridge_other_provider.yml b/tests/tests_bridge_other_provider.yml
+index e5a4ad7..4d1d2dd 100644
+--- a/tests/tests_bridge_other_provider.yml
++++ b/tests/tests_bridge_other_provider.yml
+@@ -1,6 +1,8 @@
+ ---
+ - hosts: all
+   name: Run playbook 'tests_bridge.yml' with non-default provider
++  tags:
++    - 'tests::tier1'
+   tasks:
+   - name: Get service facts
+     service_facts: null
+diff --git a/tests/tests_default.yml b/tests/tests_default.yml
+index fda6ed5..0ce3ab9 100644
+--- a/tests/tests_default.yml
++++ b/tests/tests_default.yml
+@@ -2,5 +2,19 @@
+ ---
+ - name: Test executing the role with default parameters
+   hosts: all
++  tags:
++    - 'tests::tier1'
+   roles:
+     - linux-system-roles.network
++
++  pre_tasks:
++    - name: Save host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: save_state.yml
++
++  post_tasks:
++    - name: Restore host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: restore_state.yml
+diff --git a/tests/tests_default_other_provider.yml b/tests/tests_default_other_provider.yml
+index 697bc57..0c70dac 100644
+--- a/tests/tests_default_other_provider.yml
++++ b/tests/tests_default_other_provider.yml
+@@ -1,6 +1,8 @@
+ ---
+ - hosts: all
+   name: Run playbook 'tests_default.yml' with non-default provider
++  tags:
++    - 'tests::tier1'
+   tasks:
+   - name: Get service facts
+     service_facts: null
+diff --git a/tests/tests_ethernet.yml b/tests/tests_ethernet.yml
+index 25f117d..c85f853 100644
+--- a/tests/tests_ethernet.yml
++++ b/tests/tests_ethernet.yml
+@@ -1,6 +1,16 @@
+ # SPDX-License-Identifier: BSD-3-Clause
+ ---
++- name: Save host state
++  hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::tier1::cleanup'
++  tasks:
++    - import_tasks: save_state.yml
++
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - debug:
+         msg: Inside ethernet tests
+@@ -9,6 +19,9 @@
+ 
+ - name: Test configuring ethernet devices
+   hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::net::veth'
+   vars:
+     type: veth
+     interface: lsr27
+@@ -18,6 +31,7 @@
+       set_fact:
+         type: "{{ type }}"
+         interface: "{{ interface }}"
++#        cacheable: yes
+     - include_tasks: tasks/show-interfaces.yml
+     - include_tasks: tasks/manage-test-interface.yml
+       vars:
+@@ -26,6 +40,9 @@
+ 
+ - name: Test static interface up
+   hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::net::reconf'
+   vars:
+     network_connections:
+       - name: "{{ interface }}"
+@@ -39,6 +56,8 @@
+     - linux-system-roles.network
+ 
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - debug:
+         var: network_provider
+@@ -46,17 +65,38 @@
+ # FIXME: assert profile present
+ # FIXME: assert profile/device up + IP address
+ - import_playbook: down-profile.yml
++  tags:
++    - 'tests::tier1'
++    - 'tests::cleanup'
++    - 'tests::tier1::cleanup'
+   vars:
+     profile: "{{ interface }}"
+ # FIXME: assert profile/device down
+ - import_playbook: remove-profile.yml
++  tags:
++    - 'tests::tier1'
++    - 'tests::cleanup'
++    - 'tests::tier1::cleanup'
+   vars:
+     profile: "{{ interface }}"
+ # FIXME: assert profile away
+ - name: Remove interfaces
+   hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::cleanup'
++    - 'tests::tier1::cleanup'
++    - 'tests::net::veth::cleanup'
+   tasks:
+     - include_tasks: tasks/manage-test-interface.yml
+       vars:
+         state: absent
+     - include_tasks: tasks/assert-device_absent.yml
++
++- name: Restore host state
++  hosts: all
++  tags:
++    - 'tests::tier1'
++    - 'tests::tier1::cleanup'
++  tasks:
++    - import_tasks: restore_state.yml
+diff --git a/tests/tests_ethernet_other_provider.yml b/tests/tests_ethernet_other_provider.yml
+index 456b052..5a5dbb0 100644
+--- a/tests/tests_ethernet_other_provider.yml
++++ b/tests/tests_ethernet_other_provider.yml
+@@ -1,6 +1,8 @@
+ ---
+ - hosts: all
+   name: Run playbook 'tests_ethernet.yml' with non-default provider
++  tags:
++    - 'tests::tier1'
+   tasks:
+   - name: Get service facts
+     service_facts: null
+diff --git a/tests/tests_helpers-and-asserts.yml b/tests/tests_helpers-and-asserts.yml
+index 36f02c2..b44599a 100644
+--- a/tests/tests_helpers-and-asserts.yml
++++ b/tests/tests_helpers-and-asserts.yml
+@@ -2,6 +2,8 @@
+ ---
+ - name: Check that creating and removing test devices and assertions work
+   hosts: all
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - name: test veth interface management
+       include_tasks: tasks/create-and-remove-interface.yml
+@@ -15,6 +17,18 @@
+         type: dummy
+         interface: dummy1298
+ 
++  pre_tasks:
++    - name: Save host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: save_state.yml
++
++  post_tasks:
++    - name: Restore host state
++      tags:
++        - 'tests::tier1::cleanup'
++      import_tasks: restore_state.yml
++
+ # FIXME: when: does not seem to work with include_tasks, therefore this cannot be safely tested for now
+ #    - name: test tap interfaces
+ #      include_tasks: tasks/create-and-remove-interface.yml
+diff --git a/tests/tests_states.yml b/tests/tests_states.yml
+index eff3436..46cfe87 100644
+--- a/tests/tests_states.yml
++++ b/tests/tests_states.yml
+@@ -1,6 +1,8 @@
+ ---
+ # empty playbook to gather facts for import_playbook when clause
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+ 
+ # workaround for: https://github.com/ansible/ansible/issues/27973
+ # There is no way in Ansible to abort a playbook hosts with specific OS
+diff --git a/tests/tests_unit.yml b/tests/tests_unit.yml
+index c6ea4ef..8d56cf4 100644
+--- a/tests/tests_unit.yml
++++ b/tests/tests_unit.yml
+@@ -2,6 +2,8 @@
+ ---
+ - hosts: all
+   name: Setup for test running
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - name: Install EPEL on enterprise Linux for python2-mock
+       command: yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-{{ ansible_distribution_major_version }}.noarch.rpm
+@@ -27,6 +29,8 @@
+ 
+ - hosts: all
+   name: execute python unit tests
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - name: Copy python modules
+       copy:
+diff --git a/tests/tests_vlan_mtu_initscripts.yml b/tests/tests_vlan_mtu_initscripts.yml
+index a57db4b..d3a48c7 100644
+--- a/tests/tests_vlan_mtu_initscripts.yml
++++ b/tests/tests_vlan_mtu_initscripts.yml
+@@ -1,6 +1,8 @@
+ ---
+ # set network provider and gather facts
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - name: Set network provider to 'initscripts'
+       set_fact:
+diff --git a/tests/tests_vlan_mtu_nm.yml b/tests/tests_vlan_mtu_nm.yml
+index d830817..68b61b5 100644
+--- a/tests/tests_vlan_mtu_nm.yml
++++ b/tests/tests_vlan_mtu_nm.yml
+@@ -1,6 +1,8 @@
+ ---
+ # set network provider and gather facts
+ - hosts: all
++  tags:
++    - 'tests::tier1'
+   tasks:
+     - name: Set network provider to 'nm'
+       set_fact:
diff --git a/SOURCES/rhel-system-roles-kdump-pr22.diff b/SOURCES/rhel-system-roles-kdump-pr22.diff
new file mode 100644
index 0000000..d7d2796
--- /dev/null
+++ b/SOURCES/rhel-system-roles-kdump-pr22.diff
@@ -0,0 +1,80 @@
+diff --git a/tasks/ssh.yml b/tasks/ssh.yml
+index 1a4e858..b05d01a 100644
+--- a/tasks/ssh.yml
++++ b/tasks/ssh.yml
+@@ -18,3 +18,15 @@
+     key: "{{ keydata.content|b64decode }}"
+     state: present
+   delegate_to: "{{ kdump_ssh_server }}"
++
++- name: Fetch the servers public key
++  slurp:
++    src: /etc/ssh/ssh_host_rsa_key.pub
++  register: serverpubkey
++  delegate_to: "{{ kdump_ssh_server }}"
++
++- name: Add the servers public key to known_hosts on managed node
++  known_hosts:
++    key: "{{ kdump_ssh_server_location }} {{ serverpubkey.content | b64decode }}"
++    name: "{{ kdump_ssh_server_location }}"
++    path: /etc/ssh/ssh_known_hosts
+diff --git a/templates/kdump.conf.j2 b/templates/kdump.conf.j2
+index bf24210..504ff34 100644
+--- a/templates/kdump.conf.j2
++++ b/templates/kdump.conf.j2
+@@ -1,12 +1,17 @@
+ # {{ ansible_managed }}
+ 
+ {% if kdump_target %}
+-{{ kdump_target.type }} {{ kdump_target.location }}
+-{% endif %}
++{% if kdump_target.type == "ssh" %}
++ssh {{ kdump_target.location | d(kdump_ssh_user ~ '@' ~ kdump_ssh_server) }}
+ 
+-{% if kdump_target and kdump_target.type == "ssh" and kdump_sshkey != '/root/.ssh/kdump_id_rsa' %}
++{% if kdump_sshkey != '/root/.ssh/kdump_id_rsa' %}
+ sshkey {{ kdump_sshkey }}
+ {% endif %}
++{% else %}
++{{ kdump_target.type }} {{ kdump_target.location  }}
++
++{% endif %}
++{% endif %}
+ 
+ path {{ kdump_path }}
+ {% if kdump_core_collector %}
+diff --git a/tests/tests_ssh.yml b/tests/tests_ssh.yml
+index 679148e..14a59d9 100644
+--- a/tests/tests_ssh.yml
++++ b/tests/tests_ssh.yml
+@@ -6,6 +6,11 @@
+     # known and ansible is supposed to be configured to be able to
+     # connect to it (via inventory).
+     kdump_ssh_server_outside: localhost
++    kdump_ssh_source: "{{ ansible_env['SSH_CONNECTION'].split()[0] }}"
++
++    # this is the address at which the ssh dump server can be reached
++    # from the managed host. Dumps will be uploaded there.
++    kdump_ssh_server_inside: "{{ kdump_ssh_source if kdump_ssh_source in hostvars[kdump_ssh_server_outside]['ansible_all_ipv4_addresses'] + hostvars[kdump_ssh_server_outside]['ansible_all_ipv6_addresses']  else hostvars[kdump_ssh_server_outside]['ansible_default_ipv4']['address'] }}"
+ 
+   tasks:
+     - name: gather facts from {{ kdump_ssh_server_outside }}
+@@ -25,8 +30,5 @@
+           type: ssh
+           # This is the ssh dump server address visible from inside
+           # the machine being configured. Dumps are to be copied
+-          # there. We make here the assumption that this machine is
+-          # being run as a VM and the dump server is the VM host
+-          # (i.e. for ansible this is localhost). From the VM its
+-          # address is then identical to the default route.
+-          location: "{{ kdump_ssh_user }}@{{ ansible_default_ipv4.gateway }}"
++          # there.
++          location: "{{ kdump_ssh_user }}@{{ kdump_ssh_server_inside }}"
+diff --git a/vars/main.yml b/vars/main.yml
+new file mode 100644
+index 0000000..34d2d62
+--- /dev/null
++++ b/vars/main.yml
+@@ -0,0 +1,2 @@
++# determine the managed node facing ssh server address
++kdump_ssh_server_location: "{{ kdump_target.location | regex_replace('.*@(.*)$', '\\1') if kdump_target.location is defined else kdump_ssh_server }}"
diff --git a/SOURCES/rhel-system-roles-network-pr121.diff b/SOURCES/rhel-system-roles-network-pr121.diff
new file mode 100644
index 0000000..8f28404
--- /dev/null
+++ b/SOURCES/rhel-system-roles-network-pr121.diff
@@ -0,0 +1,62 @@
+diff --git a/library/network_connections.py b/library/network_connections.py
+index 39e81e8..6fa5e2f 100644
+--- a/library/network_connections.py
++++ b/library/network_connections.py
+@@ -1369,6 +1369,13 @@ class NMUtil:
+             finally:
+                 ac.handler_disconnect(ac_id)
+ 
++    def reapply(self, device, connection=None):
++        version_id = 0
++        flags = 0
++        return Util.call_async_method(
++            device, "reapply", [connection, version_id, flags]
++        )
++
+ 
+ ###############################################################################
+ 
+@@ -2088,6 +2095,9 @@ class Cmd_nm(Cmd):
+         )
+         self.connections_data_set_changed(idx)
+         if self.check_mode == CheckMode.REAL_RUN:
++            if self._try_reapply(idx, con):
++                return
++
+             try:
+                 ac = self.nmutil.connection_activate(con)
+             except MyError as e:
+@@ -2102,6 +2112,33 @@ class Cmd_nm(Cmd):
+             except MyError as e:
+                 self.log_error(idx, "up connection failed while waiting: %s" % (e))
+ 
++    def _try_reapply(self, idx, con):
++        """ Try to reapply a connection
++
++        If there is exactly one active connection with the same UUID activated
++        on exactly one device, ask the device to reapply the connection.
++
++        :returns: `True`, when the connection was reapplied, `False` otherwise
++        :rtype: bool
++        """
++        NM = Util.NM()
++
++        acons = list(self.nmutil.active_connection_list(connections=[con]))
++        if len(acons) != 1:
++            return False
++
++        active_connection = acons[0]
++        if active_connection.get_state() == NM.ActiveConnectionState.ACTIVATED:
++            devices = active_connection.get_devices()
++            if len(devices) == 1:
++                try:
++                    self.nmutil.reapply(devices[0])
++                    self.log_info(idx, "connection reapplied")
++                    return True
++                except MyError as error:
++                    self.log_info(idx, "connection reapply failed: %s" % (error))
++        return False
++
+     def run_action_down(self, idx):
+         connection = self.connections[idx]
+ 
diff --git a/SOURCES/rhel-system-roles-network-prefix.diff b/SOURCES/rhel-system-roles-network-prefix.diff
new file mode 100644
index 0000000..ccecc77
--- /dev/null
+++ b/SOURCES/rhel-system-roles-network-prefix.diff
@@ -0,0 +1,83 @@
+diff --git a/examples/bond-with-vlan.yml b/examples/bond-with-vlan.yml
+index 2e6be23..3b7a6dc 100644
+--- a/examples/bond-with-vlan.yml
++++ b/examples/bond-with-vlan.yml
+@@ -35,4 +35,4 @@
+             - "192.0.2.{{ network_iphost }}/24"
+ 
+   roles:
+-    - linux-system-roles.network
++    - rhel-system-roles.network
+diff --git a/examples/bridge-with-vlan.yml b/examples/bridge-with-vlan.yml
+index 037ff8e..83c586d 100644
+--- a/examples/bridge-with-vlan.yml
++++ b/examples/bridge-with-vlan.yml
+@@ -33,4 +33,4 @@
+             - "192.0.2.{{ network_iphost }}/24"
+ 
+   roles:
+-    - linux-system-roles.network
++    - rhel-system-roles.network
+diff --git a/examples/eth-simple-auto.yml b/examples/eth-simple-auto.yml
+index 0ba168a..e4c4a54 100644
+--- a/examples/eth-simple-auto.yml
++++ b/examples/eth-simple-auto.yml
+@@ -15,4 +15,4 @@
+         mtu: 1450
+ 
+   roles:
+-    - linux-system-roles.network
++    - rhel-system-roles.network
+diff --git a/examples/eth-with-vlan.yml b/examples/eth-with-vlan.yml
+--- a/examples/eth-with-vlan.yml	2018-08-21 20:47:38.000000000 +0200
++++ b/examples/eth-with-vlan.yml	2018-11-06 22:29:14.591770335 +0100
+@@ -26,4 +26,4 @@
+             - "192.0.2.{{ network_iphost }}/24"
+ 
+   roles:
+-    - linux-system-roles.network
++    - rhel-system-roles.network
+diff --git a/examples/infiniband.yml b/examples/infiniband.yml
+--- a/examples/infiniband.yml	2018-08-21 20:47:38.000000000 +0200
++++ b/examples/infiniband.yml	2018-11-06 22:29:14.591770335 +0100
+@@ -23,4 +23,4 @@
+             - 198.51.100.133/30
+ 
+   roles:
+-    - linux-system-roles.network
++    - rhel-system-roles.network
+diff --git a/examples/macvlan.yml b/examples/macvlan.yml
+--- a/examples/macvlan.yml
++++ b/examples/macvlan.yml
+@@ -26,4 +26,4 @@
+             - 192.168.1.1/24
+ 
+   roles:
+-    - linux-system-roles.network
++    - rhel-system-roles.network
+diff --git a/examples/ethtool-features-default.yml b/examples/ethtool-features-default.yml
+index 78965e6..3cdd731 100644
+--- a/examples/ethtool-features-default.yml
++++ b/examples/ethtool-features-default.yml
+@@ -3,7 +3,7 @@
+ - hosts: all
+   tasks:
+     - include_role:
+-        name: linux-system-roles.network
++        name: rhel-system-roles.network
+       vars:
+         network_connections:
+           - name: "{{ network_interface_name1 }}"
+diff --git a/examples/ethtool-features.yml b/examples/ethtool-features.yml
+index d8842c2..b32ad0b 100644
+--- a/examples/ethtool-features.yml
++++ b/examples/ethtool-features.yml
+@@ -3,7 +3,7 @@
+ - hosts: all
+   tasks:
+     - include_role:
+-        name: linux-system-roles.network
++        name: rhel-system-roles.network
+       vars:
+         network_connections:
+           - name: "{{ network_interface_name1 }}"
diff --git a/SOURCES/rhel-system-roles-postfix-pr5.diff b/SOURCES/rhel-system-roles-postfix-pr5.diff
new file mode 100644
index 0000000..4da6f48
--- /dev/null
+++ b/SOURCES/rhel-system-roles-postfix-pr5.diff
@@ -0,0 +1,40 @@
+diff --git a/README.md b/README.md
+index 5950215..df64284 100644
+--- a/README.md
++++ b/README.md
+@@ -17,7 +17,7 @@ Example Playbook
+ 
+ Install and enable postfix. Configure "relay_domains=$mydestination" and
+ 
+-```
++```yaml
+ ---
+ - hosts: all
+   vars:
+@@ -31,7 +31,7 @@ Install and enable postfix. Configure "relay_domains=$mydestination" and
+ Install and enable postfix. Do not run 'postfix check' before restarting
+ postfix:
+ 
+-```
++```yaml
+ ---
+ - hosts: all
+   vars:
+@@ -43,7 +43,7 @@ postfix:
+ Install and enable postfix. Do single backup of main.cf (older backup will be
+ rewritten) and configure "relay_host=example.com":
+ 
+-```
++```yaml
+ ---
+ - hosts: all
+   vars:
+@@ -58,7 +58,7 @@ Install and enable postfix. Do timestamped backup of main.cf and
+ configure "relay_host=example.com" (if postfix_backup_multiple is
+ set to true postfix_backup is ignored):
+ 
+-```
++```yaml
+ ---
+ - hosts: all
+   vars:
diff --git a/SOURCES/rhel-system-roles-postfix-prefix.diff b/SOURCES/rhel-system-roles-postfix-prefix.diff
new file mode 100644
index 0000000..65ab2a1
--- /dev/null
+++ b/SOURCES/rhel-system-roles-postfix-prefix.diff
@@ -0,0 +1,40 @@
+diff --git a/README.md b/README.md
+index 5950215..a59d72f 100644
+--- a/README.md
++++ b/README.md
+@@ -25,7 +25,7 @@ Install and enable postfix. Configure "relay_domains=$mydestination" and
+       relay_domains: "$mydestination"
+       relay_host: "example.com"
+   roles:
+-    - postfix
++    - linux-system-roles.postfix
+ ```
+ 
+ Install and enable postfix. Do not run 'postfix check' before restarting
+@@ -37,7 +37,7 @@ postfix:
+   vars:
+     postfix_check: false
+   roles:
+-    - postfix
++    - linux-system-roles.postfix
+ ```
+ 
+ Install and enable postfix. Do single backup of main.cf (older backup will be
+@@ -51,7 +51,7 @@ rewritten) and configure "relay_host=example.com":
+       relay_host: "example.com"
+     postfix_backup: true
+   roles:
+-    - postfix
++    - linux-system-roles.postfix
+ ```
+ 
+ Install and enable postfix. Do timestamped backup of main.cf and
+@@ -66,7 +66,7 @@ set to true postfix_backup is ignored):
+       relay_host: "example.com"
+     postfix_backup_multiple: true
+   roles:
+-    - postfix
++    - linux-system-roles.postfix
+ ```
+ 
+ 
diff --git a/SOURCES/rhel-system-roles-selinux-prefix.diff b/SOURCES/rhel-system-roles-selinux-prefix.diff
new file mode 100644
index 0000000..7e80daa
--- /dev/null
+++ b/SOURCES/rhel-system-roles-selinux-prefix.diff
@@ -0,0 +1,32 @@
+diff --git a/README.md b/README.md
+index a0385b0..6efc62d 100644
+--- a/README.md
++++ b/README.md
+@@ -42,7 +42,7 @@ This role can be configured using variab
+ vars:
+   [ see below ]
+ roles:
+-  - role: linux-system-roles.selinux
++  - role: rhel-system-roles.selinux
+     become: true
+ ```
+ 
+diff --git a/selinux-playbook.yml b/selinux-playbook.yml
+index 78d3953..b2348d5 100644
+--- a/selinux-playbook.yml
++++ b/selinux-playbook.yml
+@@ -31,7 +31,7 @@
+     - name: execute the role and catch errors
+       block:
+         - include_role:
+-            name: linux-system-roles.selinux
++            name: rhel-system-roles.selinux
+       rescue:
+         # Fail if failed for a different reason than selinux_reboot_required.
+         - name: handle errors
+@@ -52,4 +52,4 @@
+ 
+         - name: reapply the role
+           include_role:
+-            name: linux-system-roles.selinux
++            name: rhel-system-roles.selinux
diff --git a/SOURCES/rhel-system-roles-timesync-prefix.diff b/SOURCES/rhel-system-roles-timesync-prefix.diff
new file mode 100644
index 0000000..6fe1889
--- /dev/null
+++ b/SOURCES/rhel-system-roles-timesync-prefix.diff
@@ -0,0 +1,46 @@
+diff -up timesync-1.0.0/README.md.orig timesync-1.0.0/README.md
+--- timesync-1.0.0/README.md.orig	2018-08-21 11:46:41.000000000 +0200
++++ timesync-1.0.0/README.md	2018-11-06 22:29:14.586770442 +0100
+@@ -82,7 +82,7 @@ Install and configure ntp to synchronize
+       - hostname: baz.example.com
+         iburst: yes
+   roles:
+-    - linux-system-roles.timesync
++    - rhel-system-roles.timesync
+ ```
+ 
+ Install and configure linuxptp to synchronize the system clock with a
+@@ -95,7 +95,7 @@ grandmaster in PTP domain number 0, whic
+       - number: 0
+         interfaces: [ eth0 ]
+   roles:
+-    - linux-system-roles.timesync
++    - rhel-system-roles.timesync
+ ```
+ 
+ Install and configure chrony and linuxptp to synchronize the system clock with
+@@ -122,5 +122,5 @@ synchronization:
+         transport: UDPv4
+         delay: 0.000010
+   roles:
+-    - linux-system-roles.timesync
++    - rhel-system-roles.timesync
+ ```
+diff -up timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/multiple-ntp-servers.yml.orig timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/multiple-ntp-servers.yml
+--- timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/multiple-ntp-servers.yml.orig	2019-06-03 18:03:18.081868584 +0200
++++ timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/multiple-ntp-servers.yml	2019-06-03 18:03:26.718704991 +0200
+@@ -11,4 +11,4 @@
+       - hostname: 3.pool.ntp.org
+         iburst: yes
+   roles:
+-    - linux-system-roles.timesync
++    - rhel-system-roles.timesync
+diff -up timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/single-pool.yml.orig timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/single-pool.yml
+--- timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/single-pool.yml.orig	2019-06-03 16:36:40.000000000 +0200
++++ timesync-85b90feedee2a5b3148fd3f72b229b44ec597682/examples/single-pool.yml	2019-06-03 18:03:36.721515519 +0200
+@@ -6,4 +6,4 @@
+         pool: yes
+         iburst: yes
+   roles:
+-    - linux-system-roles.timesync
++    - rhel-system-roles.timesync
diff --git a/SOURCES/selinux-tier1-tags.diff b/SOURCES/selinux-tier1-tags.diff
new file mode 100644
index 0000000..a5bdf86
--- /dev/null
+++ b/SOURCES/selinux-tier1-tags.diff
@@ -0,0 +1,176 @@
+diff --git a/tests/set_selinux_variables.yml b/tests/set_selinux_variables.yml
+index f294101..7571066 100644
+--- a/tests/set_selinux_variables.yml
++++ b/tests/set_selinux_variables.yml
+@@ -1,4 +1,12 @@
+ ---
++- name: Install SELinux tool semanage on Fedora
++  package:
++    name:
++      - policycoreutils-python-utils
++    state: present
++  when: ansible_distribution == "Fedora" or
++    ( ansible_distribution_major_version > "7" and
++      ( ansible_distribution == "CentOS" or ansible_distribution == "RedHat" ))
+ - name: Get local modifications - boolean
+   command: /usr/sbin/semanage boolean -l -n -C
+   register: selinux_role_boolean
+diff --git a/tests/tests_boolean.yml b/tests/tests_boolean.yml
+index 47eafc0..ca85922 100644
+--- a/tests/tests_boolean.yml
++++ b/tests/tests_boolean.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Check if selinux role sets SELinux booleans
++  tags: [ 'tests::tier1', 'tests::expfail' ]
+   hosts: all
+   become: true
+ 
+@@ -12,7 +13,7 @@
+         selinux_booleans:
+           - { name: 'samba_enable_home_dirs', state: 'on', persistent: 'yes' }
+ 
+-    - include: set_selinux_variables.yml
++    - import_tasks: set_selinux_variables.yml
+     - name: save state after initial changes and before other changes
+       set_fact:
+         boolean_before: "{{ selinux_role_boolean.stdout_lines }}"
+diff --git a/tests/tests_default.yml b/tests/tests_default.yml
+index a837c73..25bf39d 100644
+--- a/tests/tests_default.yml
++++ b/tests/tests_default.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Ensure that the role runs with default parameters
++  tags: tests::tier1
+   hosts: all
+ 
+   roles:
+diff --git a/tests/tests_default_vars.yml b/tests/tests_default_vars.yml
+index b6a6b5a..7cd321d 100644
+--- a/tests/tests_default_vars.yml
++++ b/tests/tests_default_vars.yml
+@@ -1,4 +1,5 @@
+ - name: Ensure that the role declares all paremeters in defaults
++  tags: tests::tier1
+   hosts: all
+ 
+   roles:
+diff --git a/tests/tests_fcontext.yml b/tests/tests_fcontext.yml
+index 0a411fb..f4a3923 100644
+--- a/tests/tests_fcontext.yml
++++ b/tests/tests_fcontext.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Check if selinux role sets SELinux fcontext mappings
++  tags: tests::tier1
+   hosts: all
+   become: true
+ 
+@@ -13,7 +14,7 @@
+         selinux_fcontexts:
+           - { target: '/tmp/test_dir1(/.*)?', setype: 'user_home_dir_t', ftype: 'd' }
+ 
+-    - include: set_selinux_variables.yml
++    - import_tasks: set_selinux_variables.yml
+     - name: save state after initial changes and before other changes
+       set_fact:
+         fcontext_before: "{{ selinux_role_fcontext.stdout }}"
+diff --git a/tests/tests_login.yml b/tests/tests_login.yml
+index efa826d..e4f55ca 100644
+--- a/tests/tests_login.yml
++++ b/tests/tests_login.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Check if selinux role sets SELinux login mappings
++  tags: tests::tier1
+   hosts: all
+   become: true
+ 
+@@ -18,7 +19,7 @@
+           - { login: 'sar-user', seuser: 'staff_u', serange: 's0-s0:c0.c1023', state: 'present' }
+ 
+ 
+-    - include: set_selinux_variables.yml
++    - import_tasks: set_selinux_variables.yml
+     - name: save state after initial changes and before other changes
+       set_fact:
+         login_before: "{{ selinux_role_login.stdout }}"
+diff --git a/tests/tests_port.yml b/tests/tests_port.yml
+index 446f79d..03276b5 100644
+--- a/tests/tests_port.yml
++++ b/tests/tests_port.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Check if selinux role sets SELinux port mapping
++  tags: tests::tier1
+   hosts: all
+   become: true
+ 
+@@ -29,7 +30,7 @@
+         selinux_ports:
+           - { ports: '22022', proto: 'tcp', setype: 'ssh_port_t', state: 'present' }
+ 
+-    - include: set_selinux_variables.yml
++    - import_tasks: set_selinux_variables.yml
+     - name: save state after other changes
+       set_fact:
+         port_after: "{{ selinux_role_port.stdout }}"
+diff --git a/tests/tests_selinux_disabled.yml b/tests/tests_selinux_disabled.yml
+index afd23e4..d30de2b 100644
+--- a/tests/tests_selinux_disabled.yml
++++ b/tests/tests_selinux_disabled.yml
+@@ -18,7 +19,9 @@
+         name:
+           - policycoreutils-python-utils
+         state: present
+-      when: ansible_distribution == "Fedora"
++      when: ansible_distribution == "Fedora" or
++        ( ansible_distribution_major_version > "7" and
++          ( ansible_distribution == "CentOS" or ansible_distribution == "RedHat" ))
+ 
+     - name: Add a Linux System Roles SELinux User
+       user:
+@@ -67,17 +71,28 @@
+       assert:
+         that: "{{ ansible_selinux.config_mode == 'enforcing' }}"
+         msg: "SELinux config mode should be enforcing instead of {{ ansible_selinux.config_mode }}"
+-    - name: Restore original /etc/selinux/config
+-      copy:
+-        remote_src: true
+-        dest: /etc/selinux/config
+-        src: /etc/selinux/config.test_selinux_disabled
+-    - name: Remove /etc/selinux/config backup
+-      file:
+-        path: /etc/selinux/config.test_selinux_disabled
+-        state: absent
+-    - name: Remove Linux System Roles SELinux User
+-      user:
+-        name: sar-user
+-        remove: yes
+-        state: absent
++
++    - name: Cleanup
++      tags: [ 'tests::cleanup' ]
++      block:
++        - name: Restore original /etc/selinux/config
++          copy:
++            remote_src: true
++            dest: /etc/selinux/config
++            src: /etc/selinux/config.test_selinux_disabled
++
++        - name: Remove /etc/selinux/config backup
++          file:
++            path: /etc/selinux/config.test_selinux_disabled
++            state: absent
++
++        - name: Remove Linux System Roles SELinux User
++          user:
++            name: sar-user
++            remove: yes
++            state: absent
++
++        - import_role:
++            name: selinux
++          vars:
++            selinux_all_purge: true
diff --git a/SOURCES/timesync-tier1-tags.diff b/SOURCES/timesync-tier1-tags.diff
new file mode 100644
index 0000000..4d7c80c
--- /dev/null
+++ b/SOURCES/timesync-tier1-tags.diff
@@ -0,0 +1,404 @@
+diff --git a/tests/get_services_state.yml b/tests/get_services_state.yml
+new file mode 100644
+index 0000000..4fe5d36
+--- /dev/null
++++ b/tests/get_services_state.yml
+@@ -0,0 +1,4 @@
++- name: Get initial state of services
++  tags: tests::cleanup
++  service_facts:
++  register: initial_state
+diff --git a/tests/restore_services_state.yml b/tests/restore_services_state.yml
+new file mode 100644
+index 0000000..3d48975
+--- /dev/null
++++ b/tests/restore_services_state.yml
+@@ -0,0 +1,19 @@
++- name: Get final state of services
++  tags: tests::cleanup
++  service_facts:
++  register: final_state
++
++- name: Restore state of services
++  tags: tests::cleanup
++  service:
++    name: "{{ item }}"
++    state: "{{ 'started' if initial_state.ansible_facts.services[item + '.service']['state'] == 'running' else 'stopped' }}"
++  when:
++     - item + '.service' in final_state.ansible_facts.services
++     - item + '.service' in initial_state.ansible_facts.services
++  with_items:
++    - chronyd
++    - ntpd
++    - ptp4l
++    - phc2sys
++    - timemaster
+diff --git a/tests/tests_default.yml b/tests/tests_default.yml
+index 856ebe5..fb298c9 100644
+--- a/tests/tests_default.yml
++++ b/tests/tests_default.yml
+@@ -1,6 +1,17 @@
+ 
+ - name: Ensure that the role runs with default parameters
++  tags: tests::tier1
+   hosts: all
+ 
+   roles:
+     - linux-system-roles.timesync
++
++  pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
++  post_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_default_vars.yml b/tests/tests_default_vars.yml
+index 366a9f5..df989a5 100644
+--- a/tests/tests_default_vars.yml
++++ b/tests/tests_default_vars.yml
+@@ -1,5 +1,6 @@
+ ---
+ - name: Ensure that the role declares all parameters in defaults
++  tags: tests::tier1
+   hosts: all
+ 
+   tasks:
+diff --git a/tests/tests_default_wrapper.yml b/tests/tests_default_wrapper.yml
+index a768f4c..b0c0ab3 100644
+--- a/tests/tests_default_wrapper.yml
++++ b/tests/tests_default_wrapper.yml
+@@ -1,5 +1,8 @@
+ ---
+ - name: Create static inventory from hostvars
++  tags:
++    - 'tests::tier1'
++    - 'tests::slow'
+   hosts: all
+   tasks:
+     - name: create temporary file
+@@ -17,9 +20,15 @@
+ 
+ 
+ - name: Run tests_default.yml normally
++  tags:
++    - 'tests::tier1'
++    - 'tests::slow'
+   import_playbook: tests_default.yml
+ 
+ - name: Run tests_default.yml in check_mode
++  tags:
++    - 'tests::tier1'
++    - 'tests::slow'
+   hosts: all
+   tasks:
+     - name: Run ansible-playbook with tests_default.yml in check mode
+diff --git a/tests/tests_ntp.yml b/tests/tests_ntp.yml
+index e4b1b5e..446f1dc 100644
+--- a/tests/tests_ntp.yml
++++ b/tests/tests_ntp.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure time synchronization with NTP servers
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -18,6 +19,11 @@
+   roles:
+     - linux-system-roles.timesync
+ 
++  pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+   tasks:
+     - meta: flush_handlers
+ 
+@@ -35,3 +41,8 @@
+           - "'172.16.123.1' in sources.stdout"
+           - "'172.16.123.2' in sources.stdout"
+           - "'172.16.123.3' in sources.stdout"
++
++  post_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_provider1.yml b/tests/tests_ntp_provider1.yml
+index 08ecab9..9fe0db3 100644
+--- a/tests/tests_ntp_provider1.yml
++++ b/tests/tests_ntp_provider1.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure NTP with default provider
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -8,6 +9,10 @@
+     - linux-system-roles.timesync
+ 
+   pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+     - name: Remove NTP providers
+       package: name={{ item }} state=absent
+       with_items:
+@@ -27,3 +32,7 @@
+       assert:
+         that:
+           - "'172.16.123.1' in sources.stdout"
++
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_provider2.yml b/tests/tests_ntp_provider2.yml
+index 5476ae4..e0d5c96 100644
+--- a/tests/tests_ntp_provider2.yml
++++ b/tests/tests_ntp_provider2.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure NTP with chrony as current provider
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -8,6 +9,10 @@
+     - linux-system-roles.timesync
+ 
+   pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+     - name: Remove ntp
+       package: name=ntp state=absent
+ 
+@@ -29,3 +34,7 @@
+ 
+     - name: Check chronyd service
+       shell: chronyc -n tracking
++
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_provider3.yml b/tests/tests_ntp_provider3.yml
+index 44ca101..d440a64 100644
+--- a/tests/tests_ntp_provider3.yml
++++ b/tests/tests_ntp_provider3.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure NTP with ntp as current provider
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -8,6 +9,10 @@
+     - linux-system-roles.timesync
+ 
+   pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+     - name: Remove chrony
+       package: name=chrony state=absent
+ 
+@@ -29,3 +34,7 @@
+ 
+     - name: Check ntpd service
+       shell: ntpq -c rv | grep 'associd=0'
++
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_provider4.yml b/tests/tests_ntp_provider4.yml
+index 8b452b8..8bccba0 100644
+--- a/tests/tests_ntp_provider4.yml
++++ b/tests/tests_ntp_provider4.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure NTP with chrony as specified provider
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -9,6 +10,10 @@
+     - linux-system-roles.timesync
+ 
+   pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+     - name: Install chrony
+       package: name=chrony state=present
+       register: package_install
+@@ -27,3 +32,7 @@
+ 
+     - name: Check chronyd service
+       shell: chronyc -n tracking
++
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_provider5.yml b/tests/tests_ntp_provider5.yml
+index 1740164..98a054f 100644
+--- a/tests/tests_ntp_provider5.yml
++++ b/tests/tests_ntp_provider5.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure NTP with ntp as specified provider
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -9,6 +10,10 @@
+     - linux-system-roles.timesync
+ 
+   pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+     - name: Install ntp
+       package: name=ntp state=present
+       register: package_install
+@@ -27,3 +32,7 @@
+ 
+     - name: Check ntpd service
+       shell: ntpq -c rv | grep 'associd=0'
++
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_provider6.yml b/tests/tests_ntp_provider6.yml
+index 21a2039..fb41824 100644
+--- a/tests/tests_ntp_provider6.yml
++++ b/tests/tests_ntp_provider6.yml
+@@ -1,11 +1,16 @@
+ 
+ - name: Configure NTP with OS release non-default provider and then change it to the default provider
++  tags: tests::tier1
+   hosts: all
+   vars:
+     is_ntp_default: "ansible_distribution in ['RedHat', 'CentOS'] and ansible_distribution_version is version('7.0', '<')"
+     both_avail: true
+ 
+   tasks:
++  - name: Import tasks
++    tags: tests::tier1::cleanup
++    import_tasks: get_services_state.yml
++
+   - name: Check for availability of both NTP providers
+     package: name={{ item }} state=present
+     register: package_install
+@@ -71,3 +76,7 @@
+     shell: chronyc -n tracking
+     when:
+       - not is_ntp_default
++
++  - name: Import tasks
++    tags: tests::tier1::cleanup
++    import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ntp_ptp.yml b/tests/tests_ntp_ptp.yml
+index cab706f..7f4cdfc 100644
+--- a/tests/tests_ntp_ptp.yml
++++ b/tests/tests_ntp_ptp.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure time synchronization with NTP servers and PTP domains
++  tags: tests::tier1
+   hosts: all
+   vars:
+     timesync_ntp_servers:
+@@ -22,6 +23,11 @@
+   roles:
+     - linux-system-roles.timesync
+ 
++  pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+   tasks:
+     - meta: flush_handlers
+ 
+@@ -48,3 +54,8 @@
+               - "'PTP1' in sources.stdout"
+ 
+       when: "'SOF_TIMESTAMPING_TX_' in ethtool.stdout"
++
++  post_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ptp_multi.yml b/tests/tests_ptp_multi.yml
+index d52d439..936e467 100644
+--- a/tests/tests_ptp_multi.yml
++++ b/tests/tests_ptp_multi.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure time synchronization with multiple PTP domains
++  tags: [ 'tests::tier1', 'tests::expfail' ]
+   hosts: all
+   vars:
+     timesync_ptp_domains:
+@@ -16,6 +17,11 @@
+   roles:
+     - linux-system-roles.timesync
+ 
++  pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+   tasks:
+     - meta: flush_handlers
+ 
+@@ -58,3 +64,8 @@
+               - "'domainNumber 1' in pmc.stdout"
+ 
+       when: "'SOF_TIMESTAMPING_TX_' in ethtool.stdout"
++
++  post_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
+diff --git a/tests/tests_ptp_single.yml b/tests/tests_ptp_single.yml
+index 74da310..36d141e 100644
+--- a/tests/tests_ptp_single.yml
++++ b/tests/tests_ptp_single.yml
+@@ -1,5 +1,6 @@
+ 
+ - name: Configure time synchronization with single PTP domain
++  tags: [ 'tests::tier1', 'tests::expfail' ]
+   hosts: all
+   vars:
+     timesync_ptp_domains:
+@@ -8,6 +9,11 @@
+   roles:
+     - linux-system-roles.timesync
+ 
++  pre_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: get_services_state.yml
++
+   tasks:
+     - meta: flush_handlers
+ 
+@@ -31,3 +37,8 @@
+               - "'domainNumber 3' in pmc.stdout"
+ 
+       when: "'SOF_TIMESTAMPING_TX_' in ethtool.stdout"
++
++  post_tasks:
++    - name: Import tasks
++      tags: tests::tier1::cleanup
++      import_tasks: restore_services_state.yml
diff --git a/SPECS/rhel-system-roles.spec b/SPECS/rhel-system-roles.spec
new file mode 100644
index 0000000..302d307
--- /dev/null
+++ b/SPECS/rhel-system-roles.spec
@@ -0,0 +1,398 @@
+%if 0%{?rhel}
+Name: rhel-system-roles
+%else
+Name: linux-system-roles
+%endif
+Summary: Set of interfaces for unified system management
+Version: 1.0
+Release: 7%{?dist}
+
+#Group: Development/Libraries
+License: GPLv3+ and MIT and BSD
+%if 0%{?rhel}
+%global rolealtprefix linux-system-roles.
+%endif
+%global roleprefix %{name}.
+
+# For each role, call either defcommit() or deftag(). The other macros
+# (%%id and %%shortid) can be then used in the same way in both cases.
+# This way  the rest of the spec file des not need to know whether we are
+# dealing with a tag or a commit.
+%define defcommit() %{expand:%%global id%{1} %{2}
+%%global shortid%{1} %%(c=%%{id%{1}}; echo ${c:0:7})
+}
+
+%define deftag() %{expand:%%global id%{1} %{2}
+%%global shortid%{1} %{2}
+}
+
+%defcommit 0 0c2bb286bbc1b73d728226924e0010c0fa1ce30a
+%global rolename0 kdump
+#%%deftag 0 1.0.0
+
+#%%defcommit 1 43eec5668425d295dce3801216c19b1916df1f9b
+%global rolename1 postfix
+%deftag 1 0.1
+
+%defcommit 2 6cd1ec8fdebdb92a789b14e5a44fe77f0a3d8ecd
+%global rolename2 selinux
+#%%deftag 2 1.0.0
+
+%defcommit 3 924650d0cd4117f73a7f0413ab745a8632bc5cec
+%global rolename3 timesync
+#%%deftag 3 1.0.0
+
+%defcommit 5 d5891d43a2ddc8cb6278958a6ad19524dcbf72ff
+%global rolename5 network
+#%%deftag 5 1.0.0
+
+Source: https://github.com/linux-system-roles/%{rolename0}/archive/%{id0}.tar.gz#/%{rolename0}-%{shortid0}.tar.gz
+Source1: https://github.com/linux-system-roles/%{rolename1}/archive/%{id1}.tar.gz#/%{rolename1}-%{shortid1}.tar.gz
+Source2: https://github.com/linux-system-roles/%{rolename2}/archive/%{id2}.tar.gz#/%{rolename2}-%{shortid2}.tar.gz
+Source3: https://github.com/linux-system-roles/%{rolename3}/archive/%{id3}.tar.gz#/%{rolename3}-%{shortid3}.tar.gz
+Source5: https://github.com/linux-system-roles/%{rolename5}/archive/%{id5}.tar.gz#/%{rolename5}-%{shortid5}.tar.gz
+
+Source8: md2html.sh
+
+%if "%{roleprefix}" != "linux-system-roles."
+Patch1: rhel-system-roles-%{rolename1}-prefix.diff
+Patch2: rhel-system-roles-%{rolename2}-prefix.diff
+Patch3: rhel-system-roles-%{rolename3}-prefix.diff
+Patch5: rhel-system-roles-%{rolename5}-prefix.diff
+%endif
+
+Patch11: rhel-system-roles-postfix-pr5.diff
+Patch101: rhel-system-roles-kdump-pr22.diff
+
+Patch102: kdump-tier1-tags.diff
+
+Patch21: selinux-tier1-tags.diff
+
+Patch31: timesync-tier1-tags.diff
+
+Patch52: network-permissions.diff
+Patch53: network-tier1-tags.diff
+Patch54: rhel-system-roles-network-pr121.diff
+
+Url: https://github.com/linux-system-roles/
+BuildArch: noarch
+
+BuildRequires: asciidoc
+BuildRequires: pandoc
+BuildRequires: highlight
+
+Requires: python3-jmespath
+
+Obsoletes: rhel-system-roles-techpreview < 1.0-3
+
+# We need to put %%description within the if block to avoid empty
+# lines showing up.
+%if 0%{?rhel}
+%description
+Collection of Ansible roles and modules that provide a stable and
+consistent configuration interface for managing multiple versions
+of Red Hat Enterprise Linux.
+%else
+%description
+Collection of Ansible roles and modules that provide a stable and
+consistent configuration interface for managing multiple versions
+of Fedora, Red Hat Enterprise Linux & CentOS.
+%endif
+
+%prep
+%setup -qc -a1 -a2 -a3 -a5
+cd %{rolename0}-%{id0}
+%patch101 -p1
+%patch102 -p1
+cd ..
+cd %{rolename1}-%{id1}
+%if "%{roleprefix}" != "linux-system-roles."
+%patch1 -p1
+%endif
+%patch11 -p1
+cd ..
+cd %{rolename2}-%{id2}
+%if "%{roleprefix}" != "linux-system-roles."
+%patch2 -p1
+%endif
+%patch21 -p1
+cd ..
+cd %{rolename3}-%{id3}
+%if "%{roleprefix}" != "linux-system-roles."
+%patch3 -p1
+%endif
+%patch31 -p1
+cd ..
+cd %{rolename5}-%{id5}
+%if "%{roleprefix}" != "linux-system-roles."
+%patch5 -p1
+%endif
+%patch52 -p1
+%patch53 -p1
+%patch54 -p1
+cd ..
+
+%build
+sh %{SOURCE8} \
+%{rolename0}-%{id0}/README.md \
+%{rolename1}-%{id1}/README.md \
+%{rolename2}-%{id2}/README.md \
+%{rolename3}-%{id3}/README.md \
+%{rolename5}-%{id5}/README.md
+
+%install
+mkdir -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles
+
+cp -pR %{rolename0}-%{id0}      $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}%{rolename0}
+cp -pR %{rolename1}-%{id1}      $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}%{rolename1}
+cp -pR %{rolename2}-%{id2}      $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}%{rolename2}
+cp -pR %{rolename3}-%{id3}      $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}%{rolename3}
+cp -pR %{rolename5}-%{id5}      $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}%{rolename5}
+
+%if 0%{?rolealtprefix:1}
+ln -s    %{roleprefix}%{rolename0}   $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{rolealtprefix}%{rolename0}
+ln -s    %{roleprefix}%{rolename1}   $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{rolealtprefix}%{rolename1}
+ln -s    %{roleprefix}%{rolename2}   $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{rolealtprefix}%{rolename2}
+ln -s    %{roleprefix}%{rolename3}   $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{rolealtprefix}%{rolename3}
+ln -s    %{roleprefix}%{rolename5}   $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{rolealtprefix}%{rolename5}
+%endif
+
+mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/kdump
+mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/postfix
+mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/selinux
+mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/timesync
+mkdir -p $RPM_BUILD_ROOT%{_pkgdocdir}/network
+
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}kdump/README.md \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}kdump/README.html \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}kdump/COPYING \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/kdump
+
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}postfix/README.md \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}postfix/README.html \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}postfix/COPYING \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/postfix
+
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}selinux/README.md \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}selinux/README.html \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}selinux/COPYING \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/selinux
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}selinux/selinux-playbook.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/selinux/example-selinux-playbook.yml
+
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}timesync/README.md \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}timesync/README.html \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}timesync/COPYING \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/timesync
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}timesync/examples/multiple-ntp-servers.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/timesync/example-timesync-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}timesync/examples/single-pool.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/timesync/example-timesync-pool-playbook.yml
+
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/README.md \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/README.html \
+    $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/LICENSE \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/bond-with-vlan.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-bond-with-vlan-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/bridge-with-vlan.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-bridge-with-vlan-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/eth-simple-auto.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-eth-simple-auto-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/eth-with-vlan.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-eth-with-vlan-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/infiniband.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-infiniband-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/macvlan.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-macvlan-playbook.yml
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/remove-profile.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-remove-profile-playbook.yml
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/remove-profile.yml
+cp -p $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/down-profile.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-down-profile-playbook.yml
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/down-profile.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/inventory \
+   $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-inventory
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/ethtool-features.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-ethtool-features-playbook.yml
+mv $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/ethtool-features-default.yml \
+    $RPM_BUILD_ROOT%{_pkgdocdir}/network/example-ethtool-features-default-playbook.yml
+ 
+
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}*/semaphore
+rm -r $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}*/molecule
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}*/.travis.yml
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}*/.ansible-lint
+
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/.gitignore
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/tests/.gitignore
+rm $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples/roles
+rmdir $RPM_BUILD_ROOT%{_datadir}/ansible/roles/%{roleprefix}network/examples
+
+%files
+%dir %{_datadir}/ansible
+%dir %{_datadir}/ansible/roles
+%if 0%{?rolealtprefix:1}
+%{_datadir}/ansible/roles/%{rolealtprefix}kdump
+%{_datadir}/ansible/roles/%{rolealtprefix}postfix
+%{_datadir}/ansible/roles/%{rolealtprefix}selinux
+%{_datadir}/ansible/roles/%{rolealtprefix}timesync
+%{_datadir}/ansible/roles/%{rolealtprefix}network
+%endif
+%{_datadir}/ansible/roles/%{roleprefix}kdump
+%{_datadir}/ansible/roles/%{roleprefix}postfix
+%{_datadir}/ansible/roles/%{roleprefix}selinux
+%{_datadir}/ansible/roles/%{roleprefix}timesync
+%{_datadir}/ansible/roles/%{roleprefix}network
+%doc %{_pkgdocdir}/*/example-*-playbook.yml
+%doc %{_pkgdocdir}/network/example-inventory
+%doc %{_pkgdocdir}/*/README.md
+%doc %{_pkgdocdir}/*/README.html
+%doc %{_datadir}/ansible/roles/%{roleprefix}kdump/README.md
+%doc %{_datadir}/ansible/roles/%{roleprefix}postfix/README.md
+%doc %{_datadir}/ansible/roles/%{roleprefix}selinux/README.md
+%doc %{_datadir}/ansible/roles/%{roleprefix}timesync/README.md
+%doc %{_datadir}/ansible/roles/%{roleprefix}network/README.md
+%doc %{_datadir}/ansible/roles/%{roleprefix}kdump/README.html
+%doc %{_datadir}/ansible/roles/%{roleprefix}postfix/README.html
+%doc %{_datadir}/ansible/roles/%{roleprefix}selinux/README.html
+%doc %{_datadir}/ansible/roles/%{roleprefix}timesync/README.html
+%doc %{_datadir}/ansible/roles/%{roleprefix}network/README.html
+
+
+%license %{_pkgdocdir}/*/COPYING
+%license %{_pkgdocdir}/*/LICENSE
+%license %{_datadir}/ansible/roles/%{roleprefix}kdump/COPYING
+%license %{_datadir}/ansible/roles/%{roleprefix}postfix/COPYING
+%license %{_datadir}/ansible/roles/%{roleprefix}selinux/COPYING
+%license %{_datadir}/ansible/roles/%{roleprefix}timesync/COPYING
+%license %{_datadir}/ansible/roles/%{roleprefix}network/LICENSE
+
+%changelog
+* Thu Jun 13 2019 Pavel Cahyna <pcahyna@redhat.com> - 1.0-7
+- Update tests for the network role
+- Fix typo in a test for the timesync role
+- Tag tests suitable for Tier1 testing
+- Rebase the network role to add support for device features (PR#115,
+  rhbz#1696703) and atomic changes (PR#119, rhbz#1695161)
+- network: apply upstream PR#121: allow modifying interface attributes
+  without disrupting services (rhbz#1695157)
+
+* Wed May 29 2019 Pavel Cahyna <pcahyna@redhat.com> - 1.0-6
+- Rebase the selinux role, fixes typo in tests, uncovered by Ansible 2.7,
+  (rhbz#1677743) and lists all input variables in defaults
+  to make Satellite aware of them (rhbz#1674004, PR#43)
+- Rebase the kdump role to fix check mode problems: rhbz#1685904
+- Rebase the timesync role: fixes check mode problems (rhbz#1685904)
+  and lists all input variables in defaults (rhbz#1674004)
+- Rebase the network role: keeps the interface up for state: up
+  if persistent_state is absent and solves problems with defining
+  VLAN and MACVLAN interface types (issue #19) (rhbz#1685902)
+
+* Sat Jan 12 2019 Pavel Cahyna <pcahyna@redhat.com> - 1.0-5
+- spec file improvement: Unify the source macros with deftag() and defcommit()
+- Update to upstream released versions and drop unnecessary patches.
+- Unify the spec file with Fedora (no functional changes intended).
+- Misc spec file comments fixes (by Mike DePaulo)
+- Fix rpmlint error by escaping a previous changelog entry with a macro (by Mike DePaulo)
+- Comply with Fedora guidelines by always using "cp -p" in %%install (by Mike DePaulo)
+- Rebase network role - doc improvements, Fedora 29 and Ansible 2.7 support
+- Regenerate network role patch to apply without offset
+- Rebase kdump role to fix a forgotten edit, rhbz#1645633
+- Update timesync examples: add var prefix (rhbz#1642152), correct role prefix
+- Add Obsoletes for the -techpreview subpackage
+- Add warnings to role READMEs and other doc updates, rhbz#1616018
+- network: split the state setting into state and persistent_state, rhbz#1616014
+- depend on python-jmespath as Ansible will not ship it, rhbz#1660559
+
+* Tue Aug 14 2018 Pavel Cahyna <pcahyna@redhat.com> - 1.0-4
+- Format the READMEs as html, by vdolezal, with changes to use highlight
+  (source-highlight does not understand YAML)
+
+* Thu Aug  9 2018 Pavel Cahyna <pcahyna@redhat.com> - 1.0-3
+- Rebase the network role to the last revision (d866422).
+  Many improvements to tests, introduces autodetection of the current provider
+  and defaults to using profile name as interface name.
+- Rebase the selinux, timesync and kdump roles to their 1.0rc1 versions.
+  Many changes to the role interfaces to make them more consistent
+  and conforming to Ansible best practices.
+- Update the description.
+
+* Fri May 11 2018 Pavel Cahyna <pcahyna@redhat.com> - 0.6-4
+- Fix complaints about /usr/bin/python during RPM build by making the affected scripts non-exec
+- Fix merge botch
+
+* Mon Mar 19 2018 Troy Dawson <tdawson@redhat.com> - 0.6-3.1
+- Use -a (after cd) instead of -b (before cd) in %setup
+
+* Wed Mar 14 2018 Pavel Cahyna <pcahyna@redhat.com> - 0.6-3
+- Minor corrections of the previous change by Till Maas.
+
+* Fri Mar  9 2018 Pavel Cahyna <pcahyna@redhat.com> - 0.6-2
+- Document network role options: static routes, ethernet, dns
+  Upstream PR#36, bz1550128, documents bz1487747 and bz1478576
+
+* Tue Jan 30 2018 Pavel Cahyna <pcahyna@redhat.com> - 0.6-1
+- Drop hard dependency on ansible (#1525655), patch from Yaakov Selkowitz
+- Update the network role to version 0.4, solves bz#1487747, bz#1478576
+
+* Tue Dec 19 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.5-3
+- kdump: fix the wrong conditional for ssh checking and improve test (PR#10)
+
+* Tue Nov 07 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.5-2
+- kdump: add ssh support. upstream PR#9, rhbz1478707
+
+* Tue Oct 03 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.5-1
+- SELinux: fix policy reload when SELinux is disabled on CentOS/RHEL 6
+  (bz#1493574)
+- network: update to b856c7481bf5274d419f71fb62029ea0044b3ec1 :
+  makes the network role idempotent (bz#1476053) and fixes manual
+  network provider selection (bz#1485074).
+
+* Mon Aug 28 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.4-1
+- network: update to b9b6f0a7969e400d8d6ba0ac97f69593aa1e8fa5:
+  ensure that state:absent followed by state:up works (bz#1478910), and change
+  the example IP adresses to the IANA-assigned ones.
+- SELinux: fix the case when SELinux is disabled (bz#1479546).
+
+* Tue Aug 8 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.3-2
+- We can't change directories to symlinks (rpm bug #447156) so keep the old
+  names and create the new names as symlinks.
+
+* Tue Aug 8 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.3-1
+- Change the prefix to linux-system-roles., keeping compatibility
+  symlinks.
+- Update the network role to dace7654feb7b5629ded0734c598e087c2713265:
+  adds InfiniBand support and other fixes.
+- Drop a patch included upstream.
+
+* Mon Jun 26 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.2-2
+- Leave a copy of README and COPYING in every role's directory, as suggested by T. Bowling.
+- Move the network example inventory to the documentation directory together.
+  with the example playbooks and delete the now empty "examples" directory.
+- Use proper reserved (by RFC 7042) MAC addresses in the network examples.
+
+* Tue Jun 6 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.2-1
+- Update the networking role to version 0.2 (#1459203)
+- Version every role and the package separately. They live in separate repos
+  and upstream release tags are not coordinated.
+
+* Mon May 22 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.1-2
+- Prefix the roles in examples and documentation with rhel-system-roles.
+
+* Thu May 18 2017 Pavel Cahyna <pcahyna@redhat.com> - 0.1-1
+- Update to 0.1 (first upstream release).
+- Remove the tuned role, it is not ready yet.
+- Move the example playbooks to /usr/share/doc/rhel-system-roles/$SUBSYSTEM
+  directly to get rid of an extra directory.
+- Depend on ansible.
+
+* Thu May 4 2017  Pavel Cahyna <pcahyna@redhat.com> - 0-0.1.20170504
+- Initial release.
+- kdump r. fe8bb81966b60fa8979f3816a12b0c7120d71140
+- postfix r. 43eec5668425d295dce3801216c19b1916df1f9b
+- selinux r. 1e4a21f929455e5e76dda0b12867abaa63795ae7
+- timesync r. 33a1a8c349de10d6281ed83d4c791e9177d7a141
+- tuned r. 2e8bb068b9815bc84287e9b6dc6177295ffdf38b
+- network r. 03ff040df78a14409a0d89eba1235b8f3e50a750
+