diff --git a/config/test_echo.yml b/config/test_echo.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d53c1f37054ed25f461436ed6c30dc756f7c9dfb
--- /dev/null
+++ b/config/test_echo.yml
@@ -0,0 +1,13 @@
+# if your target device has a GUI, replace the whole shell command with notify-send "Hello world !"
+---
+- name: Print stuff to tty (plug your monitor in !)
+  hosts: all
+  become: true # becomes root
+  vars_prompt:
+        name: usr_msg
+        prompt: Message to print
+        private: no
+        default: "Hello world !"
+  tasks:
+    - name: say things to tty1 (connect a screen to see the result)
+      ansible.builtin.shell: echo "{{usr_msg}}" | sudo tee /dev/tty1 || /bin/true
diff --git a/docs/GPS_SETUP.md b/docs/GPS_SETUP.md
new file mode 100644
index 0000000000000000000000000000000000000000..81496a982b9499612192ee078ae10487ab2b1c05
--- /dev/null
+++ b/docs/GPS_SETUP.md
@@ -0,0 +1,100 @@
+# **Installing the sniffer manager**
+
+The sniffer manager consists of several configuration components. Each tool used will be discussed below to ensure the succesfull tool implementation.
+
+## **Hardware**
+
+### **Raspberry Pi**
+The sniffers use Raspbian Bullseye simplified version installed on the Raspberry Pi 4B. Raspberry PI allows the use of low-cost controllers to enable other functionalities such as GPS.
+
+### **Wireless interfaces**
+Each Raspberry Pi is equipped with external TP-Link TL-WN722N wireless interfaces which make available the monitor mode, required for the analysis of captured network traffic in the sniffer. 
+
+### **GPS module**
+Each Raspberry Pi is equipped with an [u-blox NEO 6M-0-001](https://content.u-blox.com/sites/default/files/products/documents/NEO-6_DataSheet_%28GPS.G6-HW-09005%29.pdf). This module has one timepulse PPS module, in addition to the stand-alone GPS receiver.
+
+<center>
+<figure>
+  <img src="https://gitlab.inria.fr/fmorlano/mitik_management/-/raw/main/Figures/gps_module.png" alt="gps_module"/>
+  <figcaption>Figure 1. GPS module.</figcaption>
+</figure>
+</center>
+
+## **Software**
+
+### **Ansible**
+
+The sniffer manager uses Ansible to configure all the sniffer parameters. This can be used remotely or locally. So, we use our own made Ansible-based tool to configure the sniffers with all the required parameters. Ansible is compatible with Linux distributions Mac OS and Windows. Currently, we use a Macbook as manager for our development.
+
+```
+# apt install ansible -y
+```
+
+To establish communication with the sniffers, an inventory is defined. Each sniffer is configured with a static IP. Besides that, the sniffers are organized in groups (super-sniffers).
+
+### **Time synchronization and GPS configuration**
+
+We consider to use time synchronization via GPS PPS (Pulse Per Second) signal. 
+
+Install **gpsd** for GPS decoding of both time and position; **pps-tools** to verify PPS signals from the GPS; and **chrony** to handle PPS signals. 
+```
+# apt install gpsd gpsd-clients pps-tools chrony
+```
+
+Install **pynmea2** for interpretation of messages provided by the GPS based on the NMEA 0183 [1]. NMEA format has different properties, depending on its sentence type and the properties in the message data. For this application, $GPGGA format is udes to extract latitude, longitude and datetime.
+```
+# pip3 install pynmea2
+```
+
+PPS configuration requires intruction definitions in _/boot/config.txt_. For NMEA data from the serial communication, it is necessary to enable UART communication and set the baud rate. 
+
+```
+# bash -c "echo 'dtoverlay=pps-gpio,gpiopin=18' >> /boot/config.txt"
+# bash -c "echo 'enable_uart=1' >> /boot/config.txt"
+# bash -c "echo 'init_uart_baud=9600' >> /boot/config.txt"
+```
+
+It is also necessary to add PPS in _/etc/modules_.
+```
+# bash -c "echo 'pps-gpio' >> /etc/modules
+```
+
+#### **Pin connections**
+
+| GPS   | Raspberry Pi    |
+| :---: |      :---:      |         
+| PPS   | Pin 12 (GPIO 18)|
+| VCC   | Pin 4           |
+| GND   | Pin 6           |
+| RX    | Pin 8           |
+| TX    | Pin 10          |
+
+<center>
+<figure>
+  <img src="https://gitlab.inria.fr/fmorlano/mitik_management/-/raw/main/Figures/gps_conn.png" alt="gps_connection"/>
+  <figcaption>Figure 2. Wire up GPS module to Raspberry Pi.</figcaption>
+</figure>
+</center>
+
+It is needed to make the UART serial port enabled:
+
+```
+# raspi-config nonint do_serial 2
+```
+Configuration of **gpsd** in _/etc/default/gpsd_ to connect before polling whatever GPS must be associated with it. This is used to provide reference clock information to ntpd or chronyd. Moreover, the device argument should be defined as /dev/ttyS0 to /dev/pps0 to monitor the serial data for PPS.
+
+```
+# Default settings for the gpsd init script and the hotplug wrapper.
+START_DAEMON="true"
+USBAUTO="true"
+DEVICES="/dev/ttyS0 /dev/pps0"
+GPSD_OPTIONS="-n"
+GPSD_SOCKET="/var/run/gpsd.sock"
+```
+
+Configuration of PPS as time reference for **chrony** server. 
+
+```
+# bash -c "echo 'refclock SHM 0 delay 0.200 refid NMEA' >> /etc/chrony/chrony.conf"
+# bash -c "echo 'refclock PPS /dev/pps0 refid PPS' >> /etc/chrony/chrony.conf"
+```
diff --git a/docs/PLAYBOOKS.md b/docs/PLAYBOOKS.md
new file mode 100644
index 0000000000000000000000000000000000000000..95e15bb78d98f30e943da69f81d4bd979af3e2b9
--- /dev/null
+++ b/docs/PLAYBOOKS.md
@@ -0,0 +1,100 @@
+# **Sniffers' configuration**
+
+Ansible[^1] involves a common set of concepts and tools for system automation. An inventory to define the hosts and groups of hosts participants that will be operated by the playbooks. Once the inventory has been defined, a set of playbooks have been programmed to perform tasks on the sniffers. The execution of the playbooks depends on the modules available in the Ansible platform. Finally, the system global interpreter is based on Python. 
+
+[^1]: https://www.ansible.com/
+
+The proposed topology is shown in Figure 1. One goal of using Ansible-based automation is to configure all sniffers simultaneously to guarantee that all nodes receive the same configuration, in addition to facilitating the manipulation of each device to be configured.
+
+<center>
+<figure>
+  <img src="https://gitlab.inria.fr/fmorlano/mitik_management/-/raw/main/Figures/mitik_topology.png" width="70%" height="70%" alt="mitik_topology"/>
+  <figcaption>Figure 1. Topology of Mitik project.</figcaption>
+</figure>
+</center>
+
+The sniffers' deployment require two roles to be developed. The first environment has been created to perform the installation and configuration tasks required on the hardware and the O.S.; the second environment executes the tasks necessary to start the sniffer according to the required parameters, in addition to synchronizing the data with the sniffer manager (Mitik laptop) and the Mitik server. Figure 3 shows the scenario to be automated by the Ansible management tool.
+
+<center>
+<figure>
+  <img src="https://gitlab.inria.fr/fmorlano/mitik_management/-/raw/main/Figures/ansible_implementation.png" width="70%" height="70%" alt="ansible_implementation"/>
+  <figcaption>Figure 3. Automating super-sniffers deployment.</figcaption>
+</figure>
+</center>
+
+## **Role 1. Hardware and software requirements**
+
+A modified version of Raspian has been provided by [1], as part of the experiments evaluating the performance of low-level libraries to capture network traffic in the sniffer. However, it is necessary to carry out additional configurations in the sniffer to add new functionalities on it.
+
+## **Sniffer manager**
+
+A sniffer manager is defined in a Mitik laptop (Macbook Pro). All the instructions executed in the sniffers are defined in the sniffer manager. To establish communication with the sniffers, an inventory with specific parameters is defined. Each sniffer is assigned a static IP. Besides that, sniffers are organized in groups (super-sniffers). _inventory_ shows the definition for each sniffer. Four groups (super-sniffers) are defined (ss1 to ss4), and each one contains five sniffers (sniffer#-ss#).
+
+In addition to the inventory, the sniffer manager sends all the instructions and configurations contained in the playbooks to be executed in each sniffer. 
+
+### **Authentication**
+
+SSH key-based is used as authentication method between the sniffer manager and the sniffers. It is indispensable for the secure exchange information and data between the entities (sniffer manager and sniffers), besides of the execution of specific functions that requires SSH authentication. To enable the SSH Key-based authentication setup between the sniffer manager and the sniffers, _playbook_SSH_Keygen_ generates the public key of each sniffer, and also copy their SSH public keys to the sniffer manager.
+
+### **Sniffer Identification**
+
+Since each sniffer uses the O.S. from [1], _playbook_hostname_ and _playbook_hosts_ to redefine the hostname and local DNS of each sniffer based on the _inventory_ file and the static IP defined there.
+
+### **GPS Synchronization**
+
+Each step described in [README](https://gitlab.inria.fr/fmorlano/mitik_management/-/blob/main/docs/Installation%20manual.md) is executed in _playboork_GPS_sync_. 
+
+### **Wireless Interfaces**
+
+To avoid randomness in the network interface names, the **Predictable network interface names** is disabled, and new udev rules are defined for assigning static interface names for each USB port. 
+```
+#
+# +---------------+
+# | wifi1 | wifi3 |
+# +-------+-------+
+# | wifi2 | wifi4 |
+# +---------------+ (RPI USB ports distribution)
+#
+# | wifi0 | (onboard wifi)
+#
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="sdio", ATTR{address}=="<MAC address onboard antenna>", KERNELS=="brcmfmac", NAME="wifi0"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.3",       NAME="wifi1"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.4",       NAME="wifi2"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.1",       NAME="wifi3"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1.2",       NAME="wifi4"
+```
+
+It is also defined a wireless network to connect each sniffer to the remote server through wifi0. These parameters are defined in _playbook_NIC_config_. It is worth noting that all wireless interfaces used to sniff must be connected in the same USB port for all sniffers.
+
+## **Role 2. Sniffer parameters**
+
+Unlike the single execution tasks of role 1, the tasks of role 2 can be executed multiple times, as long as they correspond to execution variables of the sniffer script. It is necessary to enter the online parameters to run the sniffer described in [1]. Host variables are defined in _playbook_scapy-sniffer_. Also, a timeout to stop sniffer execution has been added. By last, a job scheduling utility has been added to ensure that network time protocol set by Chrony is up to date for all sniffers. 
+
+To start the sniffers, following parameters must be defined:
+
+- Hour to start the experiment,
+- Minutes to start the experiment,
+- Runtime duration in seconds,
+- Wireless interface (by default, wifi1),
+- Packet capture filter (by default, probe-req, probe-resp, beacon),
+- Channel (by default, system),
+- Hash funtion (by default, MD5),
+- Hash pattern (by default, 15),
+- Folder destination.
+
+The capture filename structure produced by sniffers will have the next format: packet_capture_{sniffer_i-super-sniffer_id}-ts-{timestamp}-ch{channel}-gps{lat/lon}.pcap
+
+On the other hand, each single capture file from the sniffers is sent via SSH connection to the Mitik laptop or Mitik server to be analyzed in the **Trace handling engine** and the **Trace production engine**. The _playbook_data_transfer_ contains the instructions to send the data to the Mitik laptop or Mitik server. 
+
+# ------------------ **TODO** --------------------
+
+Tasks:
+
+- [x] UPLOAD FUNCTIONAL PLAYBOOKS OF THE FIRST TESTBED
+- [x] SPECIFY FEATURES OF EACH PLAYBOOK
+- [x] ORGANIZE FEATURES IN PLAYBOOKS BY TASK TYPE
+- [ ] CREATE MAIN.YML TO EXECUTE ALL THE PLAYBOOKS
+
+## **References**
+
+[1] Fernando Dias de Mello Silva, Abhishek Kumar Mishra, Aline Carneiro Viana, Nadjib Achir, Anne Fladenmuller, and Lu ́ıs Henrique M. K. Costa. Performance analysis of a privacy-preserving frame sniffer on a raspberry pi. In 6th Cyber Security in Networking Conference (CSNet), pages 1–7, October 2022.
diff --git a/figures/.gitkeep b/figures/.gitkeep
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/figures/ansible.png b/figures/ansible.png
new file mode 100644
index 0000000000000000000000000000000000000000..eb31a69b8cc39d0cb92d503a32ef7596198bc4ed
Binary files /dev/null and b/figures/ansible.png differ
diff --git a/figures/ansible_implementation.png b/figures/ansible_implementation.png
new file mode 100644
index 0000000000000000000000000000000000000000..084f432a8993ad16e8a9bacc3d1bf449c5a5d71e
Binary files /dev/null and b/figures/ansible_implementation.png differ
diff --git a/figures/architecture.png b/figures/architecture.png
new file mode 100644
index 0000000000000000000000000000000000000000..46ced84e82ea74069879669db44ab138497913b5
Binary files /dev/null and b/figures/architecture.png differ
diff --git a/figures/gps_conn.png b/figures/gps_conn.png
new file mode 100644
index 0000000000000000000000000000000000000000..8605ac77c3b86bd6b9ecfaab1f5febcc29e20c8f
Binary files /dev/null and b/figures/gps_conn.png differ
diff --git a/figures/gps_module.png b/figures/gps_module.png
new file mode 100644
index 0000000000000000000000000000000000000000..91e75c02210a2387f5651db08fe3c0a29590a461
Binary files /dev/null and b/figures/gps_module.png differ
diff --git a/figures/mitik_topology.png b/figures/mitik_topology.png
new file mode 100644
index 0000000000000000000000000000000000000000..fec1a1e3ba7f569fdcb2a522e780510fa6572e19
Binary files /dev/null and b/figures/mitik_topology.png differ
diff --git a/figures/module_1.png b/figures/module_1.png
new file mode 100644
index 0000000000000000000000000000000000000000..882049814bbb23dcff1aedaf08b27dbdaab21363
Binary files /dev/null and b/figures/module_1.png differ
diff --git a/figures/module_1_implementation.png b/figures/module_1_implementation.png
new file mode 100644
index 0000000000000000000000000000000000000000..cd9ec5180341b603ecf3456bbe3ef9b9899bf733
Binary files /dev/null and b/figures/module_1_implementation.png differ
diff --git a/figures/module_2.png b/figures/module_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..f1a49eb0ea3398631ceb664dfbb440f9265aa08e
Binary files /dev/null and b/figures/module_2.png differ
diff --git a/figures/module_3.png b/figures/module_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae3081fbfe51dd6c50fb8521614dea9966b0d977
Binary files /dev/null and b/figures/module_3.png differ
diff --git a/figures/randomized_MAC.png b/figures/randomized_MAC.png
new file mode 100644
index 0000000000000000000000000000000000000000..71833f72d881717f3732eee25480dc7f095013c0
Binary files /dev/null and b/figures/randomized_MAC.png differ
diff --git a/files/72-wlan-geo-dependent.rules b/files/72-wlan-geo-dependent.rules
new file mode 100644
index 0000000000000000000000000000000000000000..6ad4781dc0bc2f7ed5fa7b37cc6185eb4fbb3ab5
--- /dev/null
+++ b/files/72-wlan-geo-dependent.rules
@@ -0,0 +1,12 @@
+# wifi0
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="sdio", ATTRS{device}=="0x4345", ATTRS{vendor}=="0x02d0", NAME="wifi0"
+
+# +---------------+
+# | wifi5 | wifi7 |
+# +-------+-------+
+# | wifi6 | wifi8 |
+# +---------------+ (RPI physical USB ports distribution)
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="3-1",       NAME="wifi5"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-1",       NAME="wifi6"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="1-2",       NAME="wifi7"
+ACTION=="add", SUBSYSTEM=="net", SUBSYSTEMS=="usb",  KERNELS=="3-2",       NAME="wifi8"
diff --git a/files/chrony.conf b/files/chrony.conf
new file mode 100644
index 0000000000000000000000000000000000000000..64f64178663eb20894f67812657aae82c3c1499a
--- /dev/null
+++ b/files/chrony.conf
@@ -0,0 +1,33 @@
+# Welcome to the chrony configuration file. See chrony.conf(5) for more
+# information about usuable directives.
+pool 2.debian.pool.ntp.org iburst
+
+#Config file GPS time synchronization
+refclock SHM 0 delay 0.325 refid NMEA
+refclock PPS /dev/pps0 refid PPS
+
+
+# This directive specify the location of the file containing ID/key pairs for
+# NTP authentication.
+keyfile /etc/chrony/chrony.keys
+
+# This directive specify the file into which chronyd will store the rate
+# information.
+driftfile /var/lib/chrony/chrony.drift
+
+# Uncomment the following line to turn logging on.
+#log tracking measurements statistics
+
+# Log files location.
+logdir /var/log/chrony
+
+# Stop bad estimates upsetting machine clock.
+maxupdateskew 100.0
+
+# This directive enables kernel synchronisation (every 11 minutes) of the
+# real-time clock. Note that it can   ^`^yt be used along with the 'rtcfile' directive.
+rtcsync
+
+# Step the system clock instead of slewing it if the adjustment is larger than
+# one second, but only in the first three clock updates.
+makestep 1 3
diff --git a/files/gpsd b/files/gpsd
new file mode 100644
index 0000000000000000000000000000000000000000..1d160fc2e5ffbb9bd66d9fe13812a8c836075a51
--- /dev/null
+++ b/files/gpsd
@@ -0,0 +1,16 @@
+# Default settings for the gpsd init script and the hotplug wrapper.
+
+# Start the gpsd daemon automatically at boot time
+START_DAEMON="true"
+
+# Use USB hotplugging to add new USB devices automatically to the daemon
+USBAUTO="true"
+
+# Devices gpsd should collect to at boot time.
+# They need to be read/writeable, either by user gpsd or the group dialout.
+DEVICES="/dev/ttyAMA0 /dev/pps0"
+
+# Other options you want to pass to gpsd
+GPSD_OPTIONS="-n"
+
+GPSD_SOCKET="/var/run/gpsd.sock"
diff --git a/files/gpsd.socket b/files/gpsd.socket
new file mode 100644
index 0000000000000000000000000000000000000000..3ce5473fe61a1795d7a1cf082ea3a23f11054fe8
--- /dev/null
+++ b/files/gpsd.socket
@@ -0,0 +1,16 @@
+[Unit]
+Description=GPS (Global Positioning System) Daemon Sockets
+
+[Socket]
+ListenStream=/run/gpsd.sock
+ListenStream=[::1]:2947
+ListenStream=127.0.0.1:2947
+# To allow gpsd remote access, start gpsd with the -G option and
+# uncomment the next two lines:
+# ListenStream=[::]:2947
+# ListenStream=0.0.0.0:2947
+SocketMode=0600
+#BindIPv6Only=yes
+
+[Install]
+WantedBy=sockets.target
diff --git a/playbooks/microstask_GPS_setup.yml b/playbooks/microstask_GPS_setup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c52726092fdda7b8669d26dda39d138a7395edfd
--- /dev/null
+++ b/playbooks/microstask_GPS_setup.yml
@@ -0,0 +1,78 @@
+- hosts: sniffers
+  user: tribe
+  become: yes
+  become_user: root
+  tasks:
+
+   - name: Timezone config
+     command: sudo timedatectl set-timezone Europe/Paris
+
+   - name: Raspi-config serial_hw
+     shell: |
+         sudo raspi-config nonint do_serial_hw 0
+
+   - name: Install required packages
+     tags: sniffer-setup  config nodes
+     apt:
+      update_cache: true
+      pkg:
+         - gpsd #
+         - gpsd-clients
+         - pps-tools
+         - chrony
+
+   - name: systemctl enable gpsd
+     shell: |
+      sudo systemctl enable gpsd.socket
+      sudo systemctl enable gpsd
+      sudo systemctl restart gpsd
+      sudo systemctl enable chrony
+      sudo systemctl restart chrony
+
+   - name: Copy a new config gpsd device functionality
+     become: yes
+     become_user: root
+     blockinfile:
+      dest: /boot/firmware/config.txt
+      block: |
+        [all]
+        dtoverlay=disable-bt
+        dtoverlay=pps-gpio,gpiopin=18
+
+      # https://www.raspberrypi.com/documentation/computers/configuration.html#part3.5
+      # it is possible to set cnoditional parameters depending on device: https://www.raspberrypi.com/documentation/computers/config_txt.html#model-filters
+
+
+   # - name: Copy a new pps GPIO device in modules
+   #   blockinfile: |
+   #    dest=/etc/modules
+   #    content="pps-gpio"
+   # dtoverlay loads the module already
+
+   - name: gpsd port pointer
+     command: sudo gpsd /dev/ttyS0 -F /var/run/gpsd.sock
+     
+   - name: Copy a new config gpsd device functionality
+     copy:
+      src: ../files/gpsd
+      dest: /etc/default/gpsd
+
+   - name: Reconfigure gpsd
+     command: sudo dpkg-reconfigure gpsd
+
+   - name: Remove IPv6 bind
+     copy:
+      src: ../files/gpsd.socket
+      dest: /lib/systemd/system/gpsd.socket
+
+   # - name: ntp uninstall
+   #   command: sudo apt remove ntp -y
+ #   Network Time Protocol daemon/utilities (transitional package)
+ # This is a dummy transitional package to transition to NTPsec.
+ # It can be safely removed.
+
+   - name: chrony config file GPS time synchronization
+     copy:
+      src: ../files/chrony.conf
+      dest: /etc/chrony/chrony.conf
+
diff --git a/playbooks/microtask_getty_autologin_setup.yml b/playbooks/microtask_getty_autologin_setup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bde3b58adb66581cbbb7f717ea8108607eb92c35
--- /dev/null
+++ b/playbooks/microtask_getty_autologin_setup.yml
@@ -0,0 +1,12 @@
+- hosts:  s6
+  become: yes
+  become_user: root
+  tasks:
+    - name: Configure Getty Console Autologin
+      ansible.builtin.blockinfile:
+        path: /etc/systemd/system/getty@tty1.service.d/autologin.conf
+        block: |
+            [Service]
+            ExecStart=
+            ExecStart=-/sbin/agetty -o '-p -f -- \\u' --noclear --autologin {{ansible_ssh_user}} %I $TERM
+        create: yes
diff --git a/playbooks/microtask_hostname_update.yml b/playbooks/microtask_hostname_update.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c74016e928beabb4f34db0efbbccc9e7c1464bce
--- /dev/null
+++ b/playbooks/microtask_hostname_update.yml
@@ -0,0 +1,5 @@
+# This playbook sets the hostname of targets to group-device name (ss1-s1)
+- hosts: sniffers
+  tasks:
+   - name: set system hostname
+     shell: sudo hostnamectl set-hostname {{ group_names[1] | default(group_names[0]) }}-{{ inventory_hostname }}
diff --git a/playbooks/microtask_hosts_update.yml b/playbooks/microtask_hosts_update.yml
new file mode 100644
index 0000000000000000000000000000000000000000..85f88e2155faaae1c619da40caa52bd31aaf7509
--- /dev/null
+++ b/playbooks/microtask_hosts_update.yml
@@ -0,0 +1,24 @@
+# This update the hosts file of all nodes with local addresses of all nodes
+# 192.168.1.184 ss2-s1
+# 192.168.1.231 ss2-s2
+# 192.168.1.239 ss2-s3
+# 192.168.1.248 ss2-s4
+# 192.168.1.246 ss2-s5
+# 192.168.1.244 ss2-s6
+# It works when this line does not exist before; it also updates existing lines if necessary
+- name: host file update - Local DNS setup across all the nodes
+  gather_facts: yes
+  tags: etchosts device-update
+  become: yes
+  become_user: root
+  hosts: sniffers
+  tasks:
+
+    - name: Add IP address of all hosts to all hosts
+      lineinfile:
+            dest: "/etc/hosts"
+            regexp: '.*{{ item }}$'
+            line: "{{ hostvars[item].ansible_host }} {{ group_names[1] | default(group_names[0] | default('nogroup')) }}-{{item}}"
+            state: present
+      when: hostvars[item].ansible_host is defined
+      with_items: "{{ groups.sniffers }}"
diff --git a/playbooks/microtask_interfaces_monitor_mode_cron_setup.yml b/playbooks/microtask_interfaces_monitor_mode_cron_setup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e13f76682665162db2ec33e05a88e5856ab2e116
--- /dev/null
+++ b/playbooks/microtask_interfaces_monitor_mode_cron_setup.yml
@@ -0,0 +1,21 @@
+
+- name: Make cron set connected interfaces to monitor mode on reboot
+  hosts: sniffers
+  become: no
+  become_user: root
+  tasks:
+
+
+    - name: Copy setInterfacesToMonitorMode.sh to ~/setInterfacesToMonitorMode.sh
+      tags: device-setup nodes
+      copy:
+        src: "../files/setInterfacesToMonitorMode.sh"
+        dest: "~/setInterfacesToMonitorMode.sh"
+        mode: '0770'
+
+    - name: Crontab - set interfaces to monitor mode on reboot
+      ansible.builtin.cron:
+        name: "setInterfacesToMonitorMode.sh"
+        special_time: reboot
+        job: "~/setInterfacesToMonitorMode.sh"
+
diff --git a/playbooks/microtask_mitik_sens_update.yml b/playbooks/microtask_mitik_sens_update.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5085d087a0ef51b49fa48aabf66da0783ff7d998
--- /dev/null
+++ b/playbooks/microtask_mitik_sens_update.yml
@@ -0,0 +1,13 @@
+# Device configuration. Can be ran multiple times on one device
+
+
+- name: Clone and/or update sens repository
+  hosts: sniffers
+  become: yes
+  become_user: root
+  tasks:
+    - ansible.builtin.git:
+        repo: https://mitik-sens-mod:glpat-F9S1EPn2KKts_a8syNWu@gitlab.inria.fr/gfarhiri/mitik-sens-mod
+        dest: ./mitik-sens-mod
+        update: true
+        clone: true
diff --git a/playbooks/microtask_network_drivers_update.yml b/playbooks/microtask_network_drivers_update.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c51bd0b83b2ffb2ac14728cf92e5d96553b8c871
--- /dev/null
+++ b/playbooks/microtask_network_drivers_update.yml
@@ -0,0 +1,35 @@
+# Update drivers
+
+- name: Update the drivers for external adapters
+  hosts: sniffers
+  become: yes
+  become_user: root
+  tasks:
+    - name: Install required packages
+      tags: sniffer-setup  config nodes
+      apt:
+        pkg:
+          # required
+          - git # to clone rtl8188 repo
+          - bc # required to compile the rtl8188 driver
+        update_cache: yes
+
+    - name: Clone or update rtl8188eus repository if necessary
+      ansible.builtin.git:
+        repo: https://github.com/aircrack-ng/rtl8188eus/
+        dest: ./rtl8188eus
+        update: true
+        clone: true
+
+
+
+    - name: Build and install rtl8188eus module
+      tags: device-setup config nodes
+      ansible.builtin.shell: |
+        cd rtl8188eus
+        make && sudo make install
+        echo 'blacklist rtl8xxxu' | sudo tee -a '/etc/modprobe.d/realtek.conf'
+        sudo rmmod rtl8xxxu
+        sudo modprobe 8188eu
+
+
diff --git a/playbooks/microtask_networking_naming_scheme_udev_setup.yml b/playbooks/microtask_networking_naming_scheme_udev_setup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8945470ad89790df8027799e7d01c0dda97f0ffc
--- /dev/null
+++ b/playbooks/microtask_networking_naming_scheme_udev_setup.yml
@@ -0,0 +1,32 @@
+# Copies network interfaces naming scheme (based on physical usb location)
+- become: yes
+  hosts: sniffers
+  become_user: root
+  tags: nodes device-setup udev naming-scheme
+  tasks:
+
+    - name: Switch off predictable naming mechanism
+        command: ls -nfs /dev/null /etc/systemd/network/99-default.link
+
+    - name: Copy UDEV rules to set interface names based on physical USB positions
+        copy:
+        src: "../files/72-wlan-geo-dependent.rules"
+        dest: /etc/udev/rules.d/72-wlan-geo-dependent.rules
+
+
+    - name: Query current interface names
+      shell: "ip a | grep wlan"
+      register: any_wlans
+    - name: Query active connections
+      shell: "nmcli -t -f name,uuid con show --active | grep -v lo"
+      register: active_nmcon
+      when: any_wlans.rc == 0
+
+    - name: Clone current network to wifi0 interface
+      shell: |
+        nmcli connection clone {{active_nmcon.stdout_lines[0].split(':')[1]}} {{active_nmcon.stdout_lines[0].split(':')[0]}}_wifi0
+        nmcli con modify {{active_nmcon.stdout_lines[0].split(':')[0]}}_wifi0 connection.interface-name wifi0
+      # pw=$(nmcli d w show-password | grep Password|sed 's/Password: //g')
+      # ssid=$(nmcli d w show-password | grep SSID|sed 's/SSID: //g')
+      # nmcli con add type wifi con-name cloned-$(ssid) ifname wifi0 ssid $(ssid) pass
+      when: any_wlans.rc == 0
diff --git a/playbooks/microtask_networkmanager_un_manager_setup.yml b/playbooks/microtask_networkmanager_un_manager_setup.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d2b7258231dd2c8f65aec8b0102f19a36947551f
--- /dev/null
+++ b/playbooks/microtask_networkmanager_un_manager_setup.yml
@@ -0,0 +1,14 @@
+# Device configuration. Can be ran multiple times on one device
+
+
+- name: Setup NetworkManager to ignore wifi5..8
+  hosts: sniffers
+  become: yes
+  become_user: root
+  tasks:
+
+    - tags: device-setup network nodes
+      copy:
+        src: "../files/99-unmanaged-devices.conf"
+        dest: /etc/NetworkManager/conf.d/99-unmanaged-devices.conf
+
diff --git a/playbooks/microtask_reboot.yml b/playbooks/microtask_reboot.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c4ea582675efbcd1e50b2dd19bd2c81e0fbe1f36
--- /dev/null
+++ b/playbooks/microtask_reboot.yml
@@ -0,0 +1,18 @@
+
+- name: nodes reboot
+  hosts: s5
+  become: yes
+  become_user: root
+  vars_prompt:
+    - name: user_reboot
+      prompt: If this is your first configuration ever, it is advised to reboot. Reboot ? (y/n)
+      default: "n"
+      private: no
+
+
+  tasks:
+  - name: Perform reboot
+    ansible.builtin.reboot:
+        post_reboot_delay: 5
+    when: user_reboot == 'y'
+
diff --git a/playbooks/test_GPIO_status.yml b/playbooks/test_GPIO_status.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9bcb147423e2d589d28e6e0d2ebb57ae9b857e42
--- /dev/null
+++ b/playbooks/test_GPIO_status.yml
@@ -0,0 +1,24 @@
+- 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
new file mode 100644
index 0000000000000000000000000000000000000000..9deebda7aaeecb66d366650265856d156366bc31
--- /dev/null
+++ b/playbooks/test_config.yml
@@ -0,0 +1,19 @@
+- 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_interfaces_status.yml b/playbooks/test_interfaces_status.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6664c6a555af43576dea804cd7e7302c3ddc281a
--- /dev/null
+++ b/playbooks/test_interfaces_status.yml
@@ -0,0 +1,32 @@
+- hosts: all
+  gather_facts: true
+  become: yes
+  become_user: root
+
+  vars:
+    active_interfaces: "{{ ansible_interfaces | reject('==', 'lo') | reject('==', 'eth0') }}"
+
+    interfaces_list_raw: >-
+      {{
+        hostvars[inventory_hostname]
+        | dict2items
+        | selectattr('value.device', 'defined')
+        | selectattr('value.device', 'in', active_interfaces)
+        | map(attribute='value')
+      }}
+
+    interface_query: >-
+      [].[device, macaddress]
+
+    interfaces_formated_list: >-
+      {{ interfaces_list_raw | json_query(interface_query) | map('join', ': ') }}
+
+  tasks:
+#Interfaces status
+    - name: Interfaces connected
+      debug:
+        #var: interfaces_formated_list
+        msg: "Interfaces: {{ interfaces_formated_list }}"
+    
+
+    
diff --git a/playbooks/test_meta.yml b/playbooks/test_meta.yml
new file mode 100644
index 0000000000000000000000000000000000000000..03cea24c190f72ffa80a101e66faec662b8721de
--- /dev/null
+++ b/playbooks/test_meta.yml
@@ -0,0 +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
diff --git a/playbooks/test_systemctl_services.yml b/playbooks/test_systemctl_services.yml
new file mode 100644
index 0000000000000000000000000000000000000000..42859b0edaed332eb17dea764efcc7b8890983b6
--- /dev/null
+++ b/playbooks/test_systemctl_services.yml
@@ -0,0 +1,36 @@
+- hosts: sniffers
+  gather_facts: false
+
+
+  tasks:
+
+#Services status
+    - name: Check time sync service status
+      systemd:
+        name: "chronyd.service"
+      register: chrony_service
+
+    - name: Check gpsd_scoket status
+      systemd:
+        name: "gpsd.socket"
+      register: gpsd_socket
+
+    - name: Check gpsd_sservice status
+      systemd:
+        name: "gpsd.service"
+      register: gpsd_service
+
+    - name: Check networking status
+      systemd:
+        name: "networking.service"
+      register: networking_service
+
+    - name: Check NetworkManager
+      systemd:
+        name: "NetworkManager"
+      register: nm_service
+
+    - name: Service status
+      debug:
+        #var: gpsd_socket.status.ActiveState
+        msg: "chrony: {{ chrony_service.status.ActiveState }}, gpsd socket: {{ gpsd_socket.status.ActiveState }}, gpsd service: {{ gpsd_service.status.ActiveState }}, networking: {{ networking_service.status.ActiveState }}, NetworkManager: {{ nm_service.status.ActiveState }}"
diff --git a/playbooks/test_time.yml b/playbooks/test_time.yml
new file mode 100644
index 0000000000000000000000000000000000000000..fb2e007f90617f6eecb2a83b8e24ddcf93018bf3
--- /dev/null
+++ b/playbooks/test_time.yml
@@ -0,0 +1,13 @@
+- hosts: sniffers
+  #gather_facts: false
+  tasks:
+    - name: date
+      command: date
+      register: result_date
+
+    - name: Time verification
+      debug:
+        msg: "Date and time: {{ result_date.stdout }}"
+    
+
+