diff --git a/geant/gap_ansible/roles/iptrunk_checks/tasks/check_optical_levels.yaml b/geant/gap_ansible/roles/iptrunk_checks/tasks/check_optical_levels.yaml
index b4b83f5c7bb081faab189f77afdcd2f8df702c9b..c6b85f77aef277864b8840f05158ba381bf1042d 100644
--- a/geant/gap_ansible/roles/iptrunk_checks/tasks/check_optical_levels.yaml
+++ b/geant/gap_ansible/roles/iptrunk_checks/tasks/check_optical_levels.yaml
@@ -5,28 +5,46 @@
     - name: Run Juniper Optical info
       junipernetworks.junos.junos_command:
         commands:
-          # - show interfaces diagnostics optics {{ item.interface_name }} | no-more
-          - show interfaces terse {{ item.interface_name }}
-        # display: json
+          - "show interfaces diagnostics optics {{ ae_member.interface_name }}"
+        display: json
       register: optical_status
 
-    - name: Show optical levels on Juniper interface "{{ item.interface_name }}"
-      ansible.builtin.debug:
-        msg: "{{ optical_status }}"
+    - name: Set variable for lanes
+      ansible.builtin.set_fact:
+        lanes: "{{ lanes | default([]) }}"
+
+    - name: Populate the lanes data for "{{ ae_member.interface_name }}"
+      ansible.builtin.set_fact:
+        lanes: "{{ lanes + [{
+          'lane_id': iface_opt_lane['lane-index'][0]['data'],
+          'laser_current': iface_opt_lane['laser-bias-current'][0]['data'],
+          'laser_tx_mw': iface_opt_lane['laser-output-power'][0]['data'],
+          'laser_tx_dbm': iface_opt_lane['laser-output-power-dbm'][0]['data'],
+          'laser_rx_mw': iface_opt_lane['laser-rx-optical-power'][0]['data'],
+          'laser_rx_dbm': iface_opt_lane['laser-rx-optical-power-dbm'][0]['data'] }] }}"
+
+      vars:
+        obj: "{{ optical_status.stdout_lines[0]['interface-information'][0]['physical-interface'][0]['optics-diagnostics'][0] }}"
+      loop: "{{ obj['optics-diagnostics-lane-values'] }}"
+      loop_control:
+        loop_var: iface_opt_lane
+
+    - name: Set variable for the PHY interface
+      ansible.builtin.set_fact:
+        ae_result: "{{ ae_result | combine({item.key: item.value}) }}"
+      with_items:
+        - { key: "{{ ae_member.interface_name }}", value: "{{ lanes }}" }
 
-    - name: Write output to the file
-      ansible.builtin.blockinfile:
-        path: "{{ opt_checks_file }}"
-        marker: "# {mark} --- {{ check | uppper }} check on {{ inventory_hostname }} for {{ item.interface_name }} ---"
-        append_newline: true
-        block: "{{ optical_status }}"
+    - name: Empty lanes variable for the next cycle
+      ansible.builtin.set_fact:
+        lanes: []
 
-- name: Get Nokia optical levels on port "{{ item.interface_name }}"
+- name: Get Nokia optical levels on port "{{ ae_member.interface_name }}"
   when: local_side.iptrunk_side_node.vendor == "nokia"
   block:
     - name: Prepare the connector var
       ansible.builtin.set_fact:
-        connector: "{{ item.interface_name | regex_search('[1-9]/[1-9]/c[1-9]+') }}"
+        connector: "{{ ae_member.interface_name | regex_search('[1-9]/[1-9]/c[1-9]+') }}"
 
     - name: Run Nokia show command
       ansible.netcommon.netconf_rpc:
@@ -35,13 +53,26 @@
         content: |
             <global-operations xmlns="urn:nokia.com:sros:ns:yang:sr:oper-global">
               <md-cli-raw-command>
-              <md-cli-input-line>show port {{ connector }} optical | match "Lane ID" pre-lines 1 post-lines 5</md-cli-input-line>
+              <md-cli-input-line>show port {{ connector }} optical</md-cli-input-line>
               </md-cli-raw-command>
             </global-operations>
         display: json
-      register: output
+      register: out
+
+    - name: Parse SROS port optical output
+      ansible.utils.cli_parse:
+        text: "{{out.output['rpc-reply']['nokiaoper:results']['nokiaoper:md-cli-output-block'].split('\n')}}"
+        parser:
+          name: ansible.netcommon.native
+          template_path: templates/sros_show_port_optical.yaml
+        set_fact: lanes
 
-    - name: Show optical levels on Nokia port "{{ item.interface_name }}"
-      ansible.builtin.debug:
-        # msg: "{{ output }}"
-        msg: "{{out.output['rpc-reply']['nokiaoper:results']['nokiaoper:md-cli-output-block'].split('\n')}}"
+    - name: Set variable for the PHY interface
+      ansible.builtin.set_fact:
+        ae_result: "{{ ae_result | combine({item.key: item.value}) }}"
+      with_items:
+        - { key: "{{ ae_member.interface_name }}", value: "{{ lanes }}" }
+
+    - name: Empty lanes variable for the next cycle
+      ansible.builtin.set_fact:
+        lanes: []
diff --git a/geant/gap_ansible/roles/iptrunk_checks/tasks/diff_optical_results.yaml b/geant/gap_ansible/roles/iptrunk_checks/tasks/diff_optical_results.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..3d42a9e2967532f98bd4476d564b1e7283ad224e
--- /dev/null
+++ b/geant/gap_ansible/roles/iptrunk_checks/tasks/diff_optical_results.yaml
@@ -0,0 +1,27 @@
+---
+- name: Set the PRE file var name
+  ansible.builtin.set_fact:
+    pre_file_name: "{{ opt_checks_dir }}/PRE_{{ inventory_hostname }}.yaml"
+
+- name: Set the PRE file var name
+  ansible.builtin.set_fact:
+    post_file_name: "{{ opt_checks_dir }}/POST_{{ inventory_hostname }}.yaml"
+
+- name: Check if PRE file exists
+  ansible.builtin.stat:
+    path: "{{ pre_file_name }}"
+  register: pre_file_stat
+
+- name: Check if POST file exists
+  ansible.builtin.stat:
+    path: "{{ post_file_name }}"
+  register: post_file_stat
+
+- name: Compare PRE and POST
+  when: >-
+    pre_file_stat is defined
+    and
+    post_file_stat is defined
+  ansible.utils.fact_diff:
+    before: "{{ lookup('ansible.builtin.file', 'pre_file_name') }}"
+    after: "{{ lookup('ansible.builtin.file', 'post_file_name') }}"
diff --git a/geant/gap_ansible/roles/iptrunk_checks/tasks/main.yml b/geant/gap_ansible/roles/iptrunk_checks/tasks/main.yml
index 48646bfa1893c7980f6f83999a8a20ee46322aa8..5dbcbc8e3da2ad03a444bafdaf72fd9ff19a3b56 100644
--- a/geant/gap_ansible/roles/iptrunk_checks/tasks/main.yml
+++ b/geant/gap_ansible/roles/iptrunk_checks/tasks/main.yml
@@ -51,10 +51,15 @@
   ansible.builtin.set_fact:
     opt_checks_dir: "/var/tmp/ansible_trunk_checks_{{ trunks[0].id }}"
 
-- name: Set the optical checks results file name
-  when: check == "optical_pre" or check == "optical_post"
+- name: Set the optical checks results file name for PRE
+  when: check == "optical_pre"
+  ansible.builtin.set_fact:
+    opt_checks_file: "{{ opt_checks_dir }}/PRE_{{ inventory_hostname }}.yaml"
+
+- name: Set the optical checks results file name for POST
+  when: check == "optical_post"
   ansible.builtin.set_fact:
-    opt_checks_file: "{{ opt_checks_dir }}/checks_{{ process_id }}.txt"
+    opt_checks_file: "{{ opt_checks_dir }}/POST_{{ inventory_hostname }}.yaml"
 
 - name: Create a folder for the optical check results
   when: check == "optical_pre" or check == "optical_post"
@@ -72,7 +77,29 @@
     mode: '0644'
   delegate_to: localhost
 
+- name: Create var for the result storage
+  when: check == "optical_pre" or check == "optical_post"
+  ansible.builtin.set_fact:
+    ae_result: "{{ ae_result | default({}) }}"
+
 - name: Check optical levels
   when: check == "optical_pre" or check == "optical_post"
   ansible.builtin.include_tasks: check_optical_levels.yaml
   loop: "{{ local_side.iptrunk_side_ae_members }}"
+  loop_control:
+    loop_var: ae_member
+
+- name: Write result to the "{{ opt_checks_file}}" file
+  when: check == "optical_pre" or check == "optical_post"
+  ansible.builtin.copy:
+    content: "{{ ae_result | to_nice_yaml }}"
+    dest: "{{ opt_checks_file }}"
+
+- name: Display "{{ check | upper }}" check results for "{{ inventory_hostname }}"
+  when: check == "optical_pre" or check == "optical_post"
+  ansible.builtin.debug:
+    msg: "{{ ae_result }}"
+
+- name: Produce the diff of optical check results on the "remaining" side
+  when: check == "optical_post"
+  ansible.builtin.include_tasks: diff_optical_results.yaml
diff --git a/geant/gap_ansible/roles/iptrunk_checks/templates/sros_show_port_optical.yaml b/geant/gap_ansible/roles/iptrunk_checks/templates/sros_show_port_optical.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..a8754bacaab086246e7edbc9d6fd89159e763684
--- /dev/null
+++ b/geant/gap_ansible/roles/iptrunk_checks/templates/sros_show_port_optical.yaml
@@ -0,0 +1,8 @@
+---
+- example: "    1              -              73.2              1.67              1.43"
+  getval: '\s+(?P<lane_id>\d)\s+-\s+(?P<tx_bias_ma>\d+(\.\d+)?)\s+(?P<tx_power_dbm>\d+(\.\d+)?)\s+(?P<rx_power_dbm>\d+(\.\d+)?)'
+  result:
+    "Lane {{ lane_id }}":
+      TX_bias_mA: "{{ tx_bias_ma }}"
+      TX_power_dBm: "{{ tx_power_dbm }}"
+      rx_power_dBm: "{{ rx_power_dbm }}"