diff --git a/playbooks/test_GPIO_GPS_PPS_status.yml b/playbooks/test_GPIO_GPS_PPS_status.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fa271f05b72073bbc86692e458f598f350e8d2e5
--- /dev/null
+++ b/playbooks/test_GPIO_GPS_PPS_status.yml
@@ -0,0 +1,118 @@
+- hosts: sniffers
+  gather_facts: false
+  become: yes
+  become_user: root
+  any_errors_fatal: true
+
+
+  tasks:
+
+#GPIO status
+    - name: GPIO status test
+      shell: pinctrl get 18 |  awk -F" " '{print $9}'
+      register: result
+
+
+    - name: test if GPS module disabled
+      set_fact:
+        falg_failed_gpio_off: "GPS module is disabled"
+      when: result.stdout != 'input'
+
+
+    # when something is connected, running this prevents gpsd from using that data which forces a reboot
+    - name: try to get data from the GPIO pins (disabled)
+      shell: |
+        gpioPresenceTest=$(mktemp  /tmp/test-XXXXXX.gpio)
+        if [ $(type gpsmon >/dev/null; echo $?) != 0 ]; then
+        echo 3
+        fi
+        timeout 1.2 bash -c 'while true; do sudo gpioget 4 15; done' >> $gpioPresenceTest
+        if [ $(cat $gpioPresenceTest | sort | uniq | wc -l) != 2 ]; then
+        echo 2
+        fi
+        echo 0 
+      register: _gpiotest
+      failed_when: false
+      when: false
+      no_log: true
+      # sudo gpiomon 4 15 is too brutal and prevents further communication. 
+      # gpioget 4 15 is the same. idk what to do
+
+
+    - name: interpret gpio reception failure (disabled)
+      fail:
+        msg: >-
+          {% if _gpiotest.rc == 2 %}
+          no output from GPIO was found. did you plug in the gps correctly ?
+          {% elif _gpiotest.rc == 3 %}
+          the command gpsmon does not exist. Is gpsd properly installed?
+          {% else %}
+          Unexpected return code: {{ _gpiotest.rc }}. Check stderr: {{_gpiotest}}
+          {% endif %}
+      when: false and _gpiotest.rc != 0 
+      ignore_errors: true
+
+
+
+
+    - name: check pps reception
+      shell: |
+          ppsPresenceTest=$(mktemp  /tmp/test-XXXXXX.pps)
+          if [ $(type ppstest >/dev/null; echo $?) != 0 ]; then
+          exit 3
+          fi
+          timeout 2.2s sudo ppstest /dev/pps0 > $ppsPresenceTest
+          if [ $(cat $ppsPresenceTest | wc -l) -lt 4 ]; then
+          exit 2
+          fi
+          exit 0 
+      register: _ppscheck
+      ignore_errors: true
+      no_log: true
+      failed_when: false
+
+    - name: interpret pps reception failure
+      fail:
+        msg: >-
+          {% if _ppscheck.rc == 2 %}
+          no output from PPS was found 
+          {% elif _ppscheck.rc == 3 %}
+          the command ppstest does not exist. Is pps properly installed?
+          {% else %}
+          Unexpected return code: {{ _ppscheck.rc }}, check stderr:  {{ _ppscheck }}
+          {% endif %}
+      when: _ppscheck.rc != 0
+      ignore_errors: true
+
+
+    - name: check gps position reception
+      shell: |
+        if [ $(type gpspipe >/dev/null; echo $?) != 0 ]; then
+        exit 3
+        fi
+        if [ $(timeout 1.2s gpspipe --nmea -n 10 >/dev/null ; echo $?) != 0 ]; then
+        exit 2
+        fi
+        exit 0 
+      register: _gpscheck
+      failed_when: false
+      no_log: true
+      ignore_errors: true
+
+    - name: interpret gps reception failure
+      fail:
+        msg: >-
+          {% if _gpscheck.rc == 2 %}
+          no position from GPS was found. Either wait a minute, or reboot the device
+          {% elif _gpscheck.rc == 3 %}
+          the command gpspipe does not exist. Is gpsd properly installed?
+          {% else %}
+          Unexpected return code: {{ _gpscheck.rc }}, check stderr:  {{ _gpscheck }}
+          {% endif %}
+      when: _gpscheck.rc != 0
+      ignore_errors: true
+
+    - name: stop if fails encountered
+      fail: 
+        msg: GPIO components and gps seem badly configured; see previous errors for this device !
+      when: _gpiotest.rc | default(0) != 0  or _gpscheck.rc != 0 or _ppscheck.rc != 0 
diff --git a/playbooks/test_GPIO_status.yml b/playbooks/test_GPIO_status.yml
deleted file mode 100644
index 9bcb147423e2d589d28e6e0d2ebb57ae9b857e42..0000000000000000000000000000000000000000
--- a/playbooks/test_GPIO_status.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-- hosts: sniffers
-  gather_facts: false
-  become: yes
-  become_user: root
-
-  tasks:
-
-#GPIO status
-    - name: GPIO status test
-      shell: pinctrl get 18 |  awk -F" " '{print $9}'
-      register: result
-
-    - name: GPS module enabled
-      debug:
-        msg: "GPS module is enabled"
-      when: result.stdout == 'input'
-
-    - name: GPS module disabled
-      debug:
-        msg: "GPS module is disabled"
-      when: result.stdout != 'input'
-    
-
-    
diff --git a/playbooks/test_config.yml b/playbooks/test_config.yml
deleted file mode 100644
index 9deebda7aaeecb66d366650265856d156366bc31..0000000000000000000000000000000000000000
--- a/playbooks/test_config.yml
+++ /dev/null
@@ -1,19 +0,0 @@
-- hosts: sniffers
-  name: Check configuration
-  #gather_facts: false
-  tasks:
-    - name: date
-      command: date
-      register: result_date
-
-    - name: Time verification
-      debug:
-        msg: "Date and time: {{ result_date.stdout }}"
-
-
-
-    - ansible.builtin.git:
-        repo: https://mitik-sens-mod:glpat-F9S1EPn2KKts_a8syNWu@gitlab.inria.fr/gfarhiri/mitik-sens-mod
-        dest: ./mitik-sens-mod
-        update: false
-        clone: false
diff --git a/playbooks/test_config_files.yml b/playbooks/test_config_files.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b7624bbaa5f73a73ea11c83ea8d5f47d31bbe3b4
--- /dev/null
+++ b/playbooks/test_config_files.yml
@@ -0,0 +1,49 @@
+- hosts: sniffers
+  name: Check remote config files
+  #gather_facts: false
+  gather_facts: no
+  vars:
+    file_combinations:
+      - local_file: "../files/99-unmanaged-devices.conf"
+        remote_file: "/etc/NetworkManager/conf.d/99-unmanaged-devices.conf"
+      - local_file: "../files/72-wlan-geo-dependent.rules"
+        remote_file: "/etc/udev/rules.d/72-wlan-geo-dependent.rules"
+      - local_file: "../files/gpsd"
+        remote_file: "/etc/default/gpsd"
+      - local_file: "../files/gpsd.socket"
+        remote_file: "/lib/systemd/system/gpsd.socket"
+      - local_file: "../files/chrony.conf"
+        remote_file: "/etc/chrony/chrony.conf"
+      - local_file: "../files/positionGetter.sh"
+        remote_file: "/home/{{ansible_ssh_user}}/positionGetter.sh"
+  tasks:
+    - name: Get SHA256 checksum for each remote file
+      stat:
+        path: "{{ item.remote_file }}"
+        checksum_algorithm: sha256
+      register: remote_file_checksums
+      loop: "{{ file_combinations }}"
+
+    - name: Get SHA256 checksum for each local file
+      stat:
+        follow: true
+        path: "{{ item.local_file | realpath }}"
+        checksum_algorithm: sha256
+      register: local_file_checksums
+      delegate_to: localhost
+      loop: "{{ file_combinations }}"
+
+
+    - debug:
+        var: item
+      loop: "{{ local_file_checksums.results | zip(remote_file_checksums.results) | list }}"
+
+    - name: Compare local and remote files
+      fail:
+        msg: "Local and remote files are different"
+      when: item[0].stat.checksum != item[1].stat.checksum
+      loop: "{{ local_file_checksums.results | zip(remote_file_checksums.results) | list }}"
+      loop_control:
+        label: "{{ item[0].item }}"
+      delegate_to: localhost
+
diff --git a/playbooks/test_interfaces_status.yml b/playbooks/test_interfaces_status.yml
index ed168a237c74c448a46e8612d138d7b63a30ca13..1e8a52f9be1522ef30ecf3b6bb54c84e9810e753 100644
--- a/playbooks/test_interfaces_status.yml
+++ b/playbooks/test_interfaces_status.yml
@@ -3,9 +3,10 @@
   become: yes
   become_user: root
 
+
   vars:
     active_interfaces: "{{ ansible_interfaces | select('match', '^(wifi)[0-9]+') }}"
-# this si not compatible with having multiple sniffers nichknamed the same...
+
     interfaces_list_raw: >-
       {{
         hostvars[inventory_hostname]
@@ -15,21 +16,55 @@
         | map(attribute='value')
       }}
 
-# removed macaddress
+    # removed macaddress
     interface_query: >-
       [].[device, module, type]
 
-    interfaces_formated_list: >-
-      {{ interfaces_list_raw | json_query(interface_query) | map('join', ', ') }}
+    interfaces_unformated_list: >-
+      {{ interfaces_list_raw | json_query(interface_query)  }}
 
   tasks:
-#Interfaces status
-    # - debug:
-    #     msg: "{{hostvars}}"
+    # Interfaces status
     - name: Interfaces connected
       debug:
-        #var: interfaces_formated_list
-        msg: "{{ interfaces_formated_list }}"
-    
+        msg: "{{ interfaces_unformated_list | map('join', ', ') }}"
+    - name: warn about wlan devices (should be wifi)
+      debug:
+        msg: "device has interfaces named wlanX; this is unusual"
+      when: interfaces_unformated_list | flatten | select('search', '^wlan.+') | length != 0
+
+    # Set the length of the first host's interface list
+    - name: Set length of the first host's interface list
+      set_fact:
+        first_host_interface_length: "{{ interfaces_unformated_list | length }}"
+      when: inventory_hostname == groups['all'][0]
+
+    # Propagate the length to all hosts
+    - name: Propagate first host's interface length to all hosts
+      set_fact:
+        first_host_interface_length: "{{ hostvars[groups['all'][0]].first_host_interface_length }}"
+      when: inventory_hostname != groups['all'][0]
+
+    # Check if the lists are of the same length
+    - name: set failed flag if the number of interfaces is not the same across nodes
+      fail:
+        msg: "The number of interfaces is not the same across hosts."
+      when: interfaces_unformated_list | length != first_host_interface_length | int
+      ignore_errors: yes
+
+    # Check if any interface that is not wifi0 has a type other than unknown
+    - name: set failed flag if non-wifi0 interfaces have a type other than unknown (this means no monitor mode)
+      fail:
+        msg: "wifiX interfaces found in non-monitor mode !!"
+      when: interfaces_unformated_list | selectattr(2, 'ne', 'unknown') | selectattr(0, 'ne', 'wifi0') | list | length > 0
+      ignore_errors: yes
+
+    - name: failure, stop the playbook
+      fail: 
+        msg: interfaces tests failed. check the two previous tasks !
+      when: interfaces_unformated_list | selectattr(2, 'ne', 'unknown') | selectattr(0, 'ne', 'wifi0') | list | length > 0 or interfaces_unformated_list | length != first_host_interface_length | int
+      any_errors_fatal: true
+
 
-    
+    - debug:
+        msg: "Interfaces seem to be fine !"
diff --git a/playbooks/test_meta.yml b/playbooks/test_meta.yml
index 4767124537394d66b7837287859e5608be063223..05cba7642983aac73f03d41dfbb361c9073b53a5 100644
--- a/playbooks/test_meta.yml
+++ b/playbooks/test_meta.yml
@@ -1,4 +1,4 @@
 # - import_playbook: test_interfaces_status.yml
 # - import_playbook: test_GPIO_status.yml
 - import_playbook: test_systemctl_services.yml
-# - import_playbook: test_time.yml
+- import_playbook: test_time.yml
diff --git a/playbooks/test_systemctl_services.yml b/playbooks/test_systemctl_services.yml
index aa45828f5ca6d905c05a7f8745edc533473d4b65..ca180aba5d3a318e475f6d25d31974e6bb559509 100644
--- a/playbooks/test_systemctl_services.yml
+++ b/playbooks/test_systemctl_services.yml
@@ -45,8 +45,6 @@
       fail: 
         msg: "{{ansible_hostname}} failed systemctl checks"
       when: "not service_statuses is subset(expected_statuses)"
-      ignore_errors: false
-      register: _failures
 
     - debug:
         msg: "systemctl and systemd seem to be fine !"