diff -ruN -x .svn -x mibs observium/config.php.default observium-sap-patch/config.php.default
--- observium/config.php.default	2026-02-16 14:44:40.809342862 +0100
+++ observium-sap-patch/config.php.default	2026-02-16 17:58:48.831410501 +0100
@@ -35,4 +35,8 @@
 #$config['email']['default']        = "user@your-domain";
 #$config['email']['from']           = "Observium <observium@your-domain>";
 
+$config['os']['timos']['mibs'][] 			  = "TIMETRA-SAP-MIB";
+$config['mibs']['TIMETRA-SAP-MIB']['mib_dir'] 		  = "nokia";
+$config['mibs']['TIMETRA-SAP-MIB']['descr'] 		  = "Nokia/ALU SROS SAP MIB Module";
+$config['mibs']['TIMETRA-SAP-MIB']['identity_num']	  = ".1.3.6.1.4.1.6527.3.1.2.4.3";
 // End config.php
diff -ruN -x .svn -x mibs observium/html/includes/graphs/port/sros_sap_stat.inc.php observium-sap-patch/html/includes/graphs/port/sros_sap_stat.inc.php
--- observium/html/includes/graphs/port/sros_sap_stat.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ observium-sap-patch/html/includes/graphs/port/sros_sap_stat.inc.php	2026-02-16 16:40:00.557233141 +0100
@@ -0,0 +1,69 @@
+<?php
+/**
+ * Observium
+ *
+ *   This file is part of Observium.
+ *
+ * @package    observium
+ * @subpackage graphs
+ * @copyright  (C) 2006-2013 Adam Armstrong, (C) 2013-2019 Observium Limited
+ *
+ */
+
+
+$stats['bits'] = array('sapFwdInOcts'   => 'Fwd In Traffic',
+                       'sapFwdOutOcts'  => 'Fwd Out Traffic',
+                       'sapDropInOcts'  => 'Drop In Traffic',
+                       'sapDropOutOcts' => 'Drop Out Traffic',
+                );
+
+$stats['pkts'] = array(
+                'sapFwdInPkts' => 'Fwd In PPs',
+                'sapFwdOutPkts' => 'Fwd Out PPs',
+                'sapDroInPkts' => 'Drop In PPs',
+                'sapDroOutPkts' => 'Drop Out PPs'
+                );
+
+
+$sap    = $vars['sap'];
+$metric = $vars['metric'];
+//$dir    = $vars['dir'];
+
+$rrd_filename = $config['rrd_dir'].'/'.$device['hostname'].'/'.'port-'.get_port_rrdindex($port).'-'.$sap.'-sros_sap_stat.rrd';
+
+$i=0;
+foreach ($stats[$metric] as $stat => $descr)
+{
+  $i++;
+  $rrd_list[$i]['filename'] = $rrd_filename;
+  $rrd_list[$i]['descr'] = $descr;
+  $rrd_list[$i]['ds'] = $stat;
+  if (strpos($stat, "Out") !== FALSE)
+  {
+    $rrd_list[$i]['invert'] = TRUE;
+    if (strpos($stat, "Fwd") !== FALSE) 
+    {
+      $rrd_list[$i]['colour'] = $config['graph_colours']['blues'][$i];
+    }
+  }
+  if (strpos($stat, "Dro") !== FALSE)
+  {
+    $rrd_list[$i]['colour'] = $config['graph_colours']['reds'][$i];
+  }
+}
+
+if($metric == 'bits')
+{
+  $colours = 'greens';
+  $unit_text = 'Bits/sec';
+  $multiplier = 8;
+} else {
+  $colours = 'purples';
+  $unit_text = 'Pkts/sec';
+}
+
+$scale_min = "0";
+$nototal = 1;
+
+//include($config['html_dir']."/includes/graphs/generic_multi.inc.php");
+include($config['html_dir']."/includes/graphs/generic_multi.inc.php");
diff -ruN -x .svn -x mibs observium/html/pages/device/port/sros_sap_stat.inc.php observium-sap-patch/html/pages/device/port/sros_sap_stat.inc.php
--- observium/html/pages/device/port/sros_sap_stat.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ observium-sap-patch/html/pages/device/port/sros_sap_stat.inc.php	2026-02-16 17:02:25.095145464 +0100
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Observium Network Management and Monitoring System
+ * Copyright (C) 2006-2015, Adam Armstrong - http://www.observium.org
+ *
+ * @package    observium
+ * @subpackage webui
+ * @author     Adam Armstrong <adama@observium.org>
+ * @copyright  (C) 2006-2013 Adam Armstrong, (C) 2013-2019 Observium Limited
+ *
+ */
+
+echo generate_box_open();
+
+?>
+
+<table class="table table-striped  table-condensed">
+
+<?php
+
+//if($vars['subview'] == 'detail')
+{
+
+  //foreach(array('ingress','egress') AS $dir)
+  {
+    $saps = json_decode(get_entity_attrib('port', $port['port_id'], 'sros_sap_stat'));
+    foreach($saps as $sap)
+    {
+      $saptext = "";
+      if(is_object($sap)) {
+	$saptext = $sap->desc;
+	$sapid = $sap->qt;
+      }
+      $saplabel = $sapid;
+      if($saplabel > 4096) {
+        $saplabel = ($sapid % 65536).".".(int)($sapid/65536);
+      }
+      if($saplabel === 0) {
+	$saplabel = "Untag";
+      }
+      $label =  '802.1q '.$saplabel." / $saptext";
+
+      echo('<tr><td>');
+      echo('<h3>'.ucfirst($dir).' '.$label.'</h3>');
+      foreach(array('bits'/*, 'pkts'*/) as $metric)
+      {
+        $graph_array['type']   = "port_sros_sap_stat";
+	$graph_array['sap']  = $sapid;
+	$graph_array['metric'] = $metric;
+
+        $graph_array['id'] = $port['port_id'];
+        #print_graph_row_port($graph_array, $port);
+        print_graph_row($graph_array);
+        unset($graph_array['sap']);
+        unset($graph_array['metric']);
+      }
+      echo('</td></tr>');
+    }
+  }
+}
+
+?>
+
+</table>
+
+<?php
+
diff -ruN -x .svn -x mibs observium/html/pages/device/port.inc.php observium-sap-patch/html/pages/device/port.inc.php
--- observium/html/pages/device/port.inc.php	2026-02-16 14:43:42.167338359 +0100
+++ observium-sap-patch/html/pages/device/port.inc.php	2026-02-16 16:40:00.557233141 +0100
@@ -91,6 +91,10 @@
     $navbar['options']['jnx_cos_queues']['text'] = 'CoS Queues';
 }
 
+if (isset($port_attribs['sros_sap_stat'])) {
+   $navbar['options']['sros_sap_stat']['text']    = 'SAP Stats';
+}
+
 if (isset($port_attribs['sros_egress_queues']) || isset($port_attribs['sros_ingress_queues'])) {
     $navbar['options']['sros_queues']['text'] = 'CoS Queues';
 }
diff -ruN -x .svn -x mibs observium/includes/defaults.inc.php observium-sap-patch/includes/defaults.inc.php
--- observium/includes/defaults.inc.php	2026-02-16 14:43:46.851498491 +0100
+++ observium-sap-patch/includes/defaults.inc.php	2026-02-16 16:40:00.561233278 +0100
@@ -1312,6 +1312,7 @@
 $config['enable_ports_jnx_cos_qstat']      = 1; // Enable graphing of CoS queues per-port.
 $config['enable_ports_sros_egress_qstat']  = 1; // Enable graphing of egress queues per-port.
 $config['enable_ports_sros_ingress_qstat'] = 1; // Enable graphing of ingress queues per-port.
+$config['enable_ports_sros_sap_stat']	   = 1; // Enable graphing of SAP stats per-port.
 $config['enable_ports_64bit']              = 1; // Prefer 64bit counters.
 $config['enable_ports_separate_walk']      = 0; // Walk separate IF-MIB tables instead global ifEntry, ifXEntry
 
diff -ruN -x .svn -x mibs observium/includes/definitions/rrdtypes.inc.php observium-sap-patch/includes/definitions/rrdtypes.inc.php
--- observium/includes/definitions/rrdtypes.inc.php	2026-02-16 14:43:48.499554832 +0100
+++ observium-sap-patch/includes/definitions/rrdtypes.inc.php	2026-02-16 16:40:00.561233278 +0100
@@ -1019,3 +1019,21 @@
 require $config['install_dir'] . '/includes/include-dir.inc.php';
 
 // EOF
+$config['rrd_types']['port-sros_sap_stat'] = array(
+	'file'  =>      'port-%index%-sros_sap_stat.rrd',
+	'ds'    =>      array(
+		'sapFwdInOcts' => array(
+			'type'  =>      'COUNTER',
+			'max'   =>      1000000000000),
+		'sapFwdOutOcts' => array(
+			'type'  =>      'COUNTER',
+			'max'   =>      1000000000000),
+		'sapDropInOcts' => array(
+			'type'  =>      'COUNTER',
+			'max'   =>      1000000000000),
+		'sapDropOutOcts' => array(
+			'type'  =>      'COUNTER',
+			'max'   =>      1000000000000),
+		),
+	);
+
diff -ruN -x .svn -x mibs observium/includes/polling/ports/timetra-sap-mib.inc.php observium-sap-patch/includes/polling/ports/timetra-sap-mib.inc.php
--- observium/includes/polling/ports/timetra-sap-mib.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ observium-sap-patch/includes/polling/ports/timetra-sap-mib.inc.php	2026-02-16 16:40:00.565233414 +0100
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * Observium
+ *
+ *   This file is part of Observium.
+ *
+ * @package    observium
+ * @subpackage poller
+ * @copyright  (C) 2006-2013 Adam Armstrong, (C) 2013-2019 Observium Limited
+ *
+ */
+
+// TIMETRA-SAP-MIB SAP Stats
+
+$port_module = 'sros_sap_stat';
+
+//print_r($ports_modules);
+
+if ($ports_modules[$port_module] && $port_stats_count)
+{
+
+    echo("TIMETRA-SAP-MIB SAP Stats ");
+    $sapstat_oids  = array('sapBaseStatsIngAggregateOffOcts',
+			   'sapBaseStatsEgrAggregateFwdOcts',
+	   		   'sapBaseStatsIngAggregateDropOcts',
+			   'sapBaseStatsEgrAggregateDropOcts',
+			   'sapDescription');
+    if ($device["hardware"] == "7250 IXR") {
+	    $sapstat_oids  = array('sapBaseStatsIngressPchipOfferedHiPrioOctets',
+				   'sapBaseStatsEgressQchipForwardedInProfOctets',
+				   'sapBaseStatsIngressPchipDroppedOctets',
+				   'sapBaseStatsEgressQchipDroppedInProfOctets	',
+				   'sapDescription');
+    }
+
+    $sapstats = snmpwalk_cache_oid($device, array_shift($sapstat_oids), array(), "TIMETRA-SAP-MIB");
+    //print_vars($sapstats);
+
+    $process_port_functions[$port_module] = $GLOBALS['snmp_status'];
+
+    if ($GLOBALS['snmp_status'])
+    {
+
+      foreach ($sapstat_oids as $oid)
+      {
+        $sapstats = snmpwalk_cache_oid($device, $oid, $sapstats, "TIMETRA-SAP-MIB");
+      }
+
+      foreach($sapstats as $sapstat_index => $sapstat)
+      {
+        list($sapstat_servid, $sapstat_ifindex, $sapstat_vlan) = explode('.', $sapstat_index);
+	$port_stats[$sapstat_ifindex]['sros_sap_stat'][/*$sapstat_servid.'-'.*/$sapstat_vlan] = $sapstat;
+      }
+
+      unset($sapstats);
+    }
+
+    //print_vars($port_stats);
+
+}
+
+
+// Additional db fields for update
+//$process_port_db[$port_module][] = 'ifDuplex'; // this field used in main data fields
+
+// EOF
+
diff -ruN -x .svn -x mibs observium/includes/polling/ports/timetra-sap-mib.lib.php observium-sap-patch/includes/polling/ports/timetra-sap-mib.lib.php
--- observium/includes/polling/ports/timetra-sap-mib.lib.php	1970-01-01 01:00:00.000000000 +0100
+++ observium-sap-patch/includes/polling/ports/timetra-sap-mib.lib.php	2026-02-16 16:40:00.565233414 +0100
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * Observium
+ *
+ *   This file is part of Observium.
+ *
+ * @package    observium
+ * @subpackage poller
+ * @copyright  (C) 2006-2013 Adam Armstrong, (C) 2013-2019 Observium Limited
+ *
+ */
+
+// TIMETRA-MIB-MIB functions
+
+// Per-port SAP Statistics
+
+function process_port_sros_sap_stat(&$this_port, $device, $port)
+{
+
+  if(isset($this_port['sros_sap_stat']) && count($this_port['sros_sap_stat']))
+  {
+
+    $saps = array();
+
+    foreach($this_port['sros_sap_stat'] as $sap_index => $sap_stats)
+    {
+
+      print_r("Process : ".$port['ifName']." / $sap_index\n");
+      //print_vars($port);
+      print_vars($sap_stats);
+      $sapstat_map  = array();
+
+      if ($device["hardware"] == "7250 IXR") {
+        $sapstat_map  = array('sapFwdInOcts'    => $sap_stats['sapBaseStatsIngressPchipOfferedHiPrioOctets'],
+                              'sapFwdOutOcts'   => $sap_stats['sapBaseStatsEgressQchipForwardedInProfOctets'],
+                              'sapDropInOcts'   => $sap_stats['sapBaseStatsIngressPchipDroppedOctets'],
+                              'sapDropOutOcts'  => $sap_stats['sapBaseStatsEgressQchipDroppedInProfOctets'],
+                             );
+      } else {
+      	$sapstat_map  = array('sapFwdInOcts'    => $sap_stats['sapBaseStatsIngAggregateOffOcts'],
+                            'sapFwdOutOcts'   => $sap_stats['sapBaseStatsEgrAggregateFwdOcts'],
+                            'sapDropInOcts'   => $sap_stats['sapBaseStatsIngAggregateDropOcts'],
+                            'sapDropOutOcts'  => $sap_stats['sapBaseStatsEgrAggregateDropOcts']
+                            );
+      }
+      rrdtool_update_ng($device, 'port-sros_sap_stat', $sapstat_map, get_port_rrdindex($port).'-'.$sap_index);
+
+      $saps[] = array("qt"=>$sap_index, "desc"=>$sap_stats["sapDescription"]);
+
+    }
+
+    set_entity_attrib('port', $port['port_id'], 'sros_sap_stat', json_encode($saps));
+  }
+
+  // FIXME -- remove attrib if it doesn't exist.
+}
+
+// Per-port SAP Statistics
+
