diff -Nur observium.orig/includes/definitions/mibs.inc.php observium/includes/definitions/mibs.inc.php
--- observium.orig/includes/definitions/mibs.inc.php	2018-01-23 17:06:40.872093672 +0000
+++ observium/includes/definitions/mibs.inc.php	2018-01-23 17:13:12.884093672 +0000
@@ -5614,6 +5614,35 @@
 $config['mibs'][$mib]['states']['mseries-port-status-state'][7] = array('name' => 'cd', 'event' => 'alert');
 $config['mibs'][$mib]['states']['mseries-port-status-state'][8] = array('name' => 'ncd', 'event' => 'alert');
 
+$mib = 'FSFMT-PSEUDO-MIB';
+$config['mibs'][$mib]['enable'] = 1;
+$config['mibs'][$mib]['mib_dir'] = '';
+$config['mibs'][$mib]['descr'] = '';
+
+$config['mibs'][$mib]['states']['fsfmt-alarm-state'][0] = array ('name' => 'alarm', 'event' => 'alert');
+$config['mibs'][$mib]['states']['fsfmt-alarm-state'][1] = array ('name' => 'normal', 'event' => 'ok');
+
+$config['mibs'][$mib]['states']['fsfmt-xcvr-state'][0] = array ('name' => 'off', 'event' => 'ignore');
+$config['mibs'][$mib]['states']['fsfmt-xcvr-state'][1] = array ('name' => 'on', 'event' => 'ok');
+
+$config['mibs'][$mib]['states']['fsfmt-xcvrworkmode-state'][1] = array ('name' => 'normal', 'event' => 'ok');
+$config['mibs'][$mib]['states']['fsfmt-xcvrworkmode-state'][3] = array ('name' => 'loopback', 'event' => 'alert');
+
+$config['mibs'][$mib]['states']['fsfmt-edfaworkmode-state'][1] = array ('name' => 'ACC', 'event' => 'ok');
+$config['mibs'][$mib]['states']['fsfmt-edfaworkmode-state'][2] = array ('name' => 'APC', 'event' => 'ok');
+$config['mibs'][$mib]['states']['fsfmt-edfaworkmode-state'][3] = array ('name' => 'AGC', 'event' => 'ok');
+
+$config['mibs'][$mib]['states']['fsfmt-offon-state'][0] = array ('name' => 'off', 'event' => 'alert');
+$config['mibs'][$mib]['states']['fsfmt-offon-state'][1] = array ('name' => 'on', 'event' => 'ok');
+
+$config['mibs'][$mib]['states']['fsfmt-onoff-state'][0] = array ('name' => 'on', 'event' => 'ok');
+$config['mibs'][$mib]['states']['fsfmt-onoff-state'][1] = array ('name' => 'off', 'event' => 'alert');
+
+$config['mibs'][$mib]['states']['fsfmt-xcvrtxpc-state'][0] = array ('name' => 'off', 'event' => 'ok');
+$config['mibs'][$mib]['states']['fsfmt-xcvrtxpc-state'][1] = array ('name' => 'on', 'event' => 'ok');
+$config['mibs'][$mib]['states']['fsfmt-xcvrtxpc-state'][2] = array ('name' => 'auto', 'event' => 'ok');
+
+
 $mib = 'NAS-MIB';
 $config['mibs'][$mib]['enable'] = 1;
 $config['mibs'][$mib]['mib_dir'] = ''; // d-link, qnap. Totally different!
diff -Nur observium.orig/includes/definitions/os.inc.php observium/includes/definitions/os.inc.php
--- observium.orig/includes/definitions/os.inc.php	2018-01-23 17:06:40.876093672 +0000
+++ observium/includes/definitions/os.inc.php	2018-01-23 17:13:12.892093672 +0000
@@ -6299,6 +6299,16 @@
 $config['os'][$os]['mibs'][]                = "MSERIES-PORT-MIB";
 $config['os'][$os]['graphs'][]              = "device_bits";
 
+// fs.com FMT
+
+$os = 'fsfmt';
+$config['os'][$os]['vendor']                = 'fs.com';
+$config['os'][$os]['text']                  = 'FS FMT';
+$config['os'][$os]['type']                  = 'network';
+$config['os'][$os]['icon']                  = 'fs.com';
+$config['os'][$os]['mibs'][]                = "FSFMT-PSEUDO-MIB";
+
+
 // FiberRoad
 $os = "fiberroad-mc";
 $config['os'][$os]['text']                  = "FiberRoad Media Converter";
diff -Nur observium.orig/includes/discovery/os/fsfmt.inc.php observium/includes/discovery/os/fsfmt.inc.php
--- observium.orig/includes/discovery/os/fsfmt.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ observium/includes/discovery/os/fsfmt.inc.php	2018-01-23 17:13:12.896093672 +0000
@@ -0,0 +1,11 @@
+<?php
+
+if ($os) { return; }
+
+// Duck typing is the only reasonable way to tell this particular SNMP agent.
+if ($sysDescr == 'GLCY SNMP' && '' != snmp_get_oid($device, 'enterprises.40989.10.16.20.13.0'))
+{
+  $os = 'fsfmt';
+}
+
+// EOF
diff -Nur observium.orig/includes/discovery/sensors/fsfmt-pseudo-mib.inc.php observium/includes/discovery/sensors/fsfmt-pseudo-mib.inc.php
--- observium.orig/includes/discovery/sensors/fsfmt-pseudo-mib.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ observium/includes/discovery/sensors/fsfmt-pseudo-mib.inc.php	2018-01-23 17:13:12.896093672 +0000
@@ -0,0 +1,342 @@
+<?php
+
+/*
+
+This file maps the following MIBs into a single virtual MIB:
+
+OAP-NMU.my
+OAP-C1-EDFA.my
+OAP-C2-EDFA.my
+OAP-C3-EDFA.my
+OAP-C4-EDFA.my
+OAP-C5-EDFA.my
+OAP-C6-EDFA.my
+OAP-C7-EDFA.my
+OAP-C8-EDFA.my
+OAP-C9-EDFA.my
+OAP-C10-EDFA.my
+OAP-C11-EDFA.my
+OAP-C12-EDFA.my
+OAP-C13-EDFA.my
+OAP-C14-EDFA.my
+OAP-C15-EDFA.my
+OAP-C16-EDFA.my
+OAP-C1-OEO.my
+OAP-C2-OEO.my
+OAP-C3-OEO.my
+OAP-C4-OEO.my
+OAP-C5-OEO.my
+OAP-C6-OEO.my
+OAP-C7-OEO.my
+OAP-C8-OEO.my
+OAP-C9-OEO.my
+OAP-C10-OEO.my
+OAP-C11-OEO.my
+OAP-C12-OEO.my
+OAP-C13-OEO.my
+OAP-C14-OEO.my
+OAP-C15-OEO.my
+OAP-C16-OEO.my
+
+*/
+
+$edfa_sensor_map = array
+(
+  8 => array // vWorkMode
+  (
+    'sensor_descr' => 'Work Mode',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-edfaworkmode-state',
+  ),
+  9 => array // vPUMPSwitch
+  (
+    'sensor_descr' => 'Pump Switch',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-onoff-state',
+  ),
+  16 => array // vInputPowerState
+  (
+    'sensor_descr' => 'Input Power Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  17 => array // vOutputPowerState
+  (
+    'sensor_descr' => 'Output Power Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  18 => array // vModuleTemperatureState
+  (
+    'sensor_descr' => 'Module Temperature Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  19 => array // vPUMPTemperatureState
+  (
+    'sensor_descr' => 'Pump Temperature Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  20 => array // vPUMPCurrentState
+  (
+    'sensor_descr' => 'Pump Current Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  21 => array // vGainOrOutputPower
+  (
+    'sensor_descr' => 'Target Gain',
+    'sensor_class' => 'dbm',
+    'scale' => 0.01,
+  ),
+  22 => array // vModuleTemperature
+  (
+    'sensor_descr' => 'Module',
+    'sensor_class' => 'temperature',
+    'scale' => 0.01,
+  ),
+  23 => array // vModuleVoltage
+  (
+    'sensor_descr' => 'Module',
+    'sensor_class' => 'voltage',
+    'scale' => 0.01,
+  ),
+  24 => array // vPUMPPower
+  (
+    'sensor_descr' => 'Pump Power',
+    'sensor_class' => 'dbm',
+    'scale' => 0.01,
+  ),
+  25 => array // vPUMPTemperature
+  (
+    'sensor_descr' => 'Pump',
+    'sensor_class' => 'temperature',
+    'scale' => 0.01,
+  ),
+  26 => array // vPUMPCurrent
+  (
+    'sensor_descr' => 'Pump',
+    'sensor_class' => 'current',
+    'scale' => 0.00001,
+  ),
+  27 => array // vTECCurrent
+  (
+    'sensor_descr' => 'Refrigeration',
+    'sensor_class' => 'current',
+    'scale' => 0.00001,
+  ),
+  28 => array // vInput
+  (
+    'sensor_descr' => 'Input',
+    'sensor_class' => 'dbm',
+    'scale' => 0.01,
+  ),
+  29 => array // vOutput
+  (
+    'sensor_descr' => 'Output',
+    'sensor_class' => 'dbm',
+    'scale' => 0.01,
+  ),
+);
+
+$oeo_port_map = array
+(
+  11 => 'A1',
+  12 => 'A2',
+  13 => 'B1',
+  14 => 'B2',
+  15 => 'C1',
+  16 => 'C2',
+  17 => 'D1',
+  18 => 'D2',
+);
+
+$oeo_sensor_map = array
+(
+  1 => array // State
+  (
+    'sensor_descr' => '',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-xcvr-state',
+  ),
+  2 => array // WorkMode
+  (
+    'sensor_descr' => 'Work Mode',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-xcvrworkmode-state',
+  ),
+  3 => array // TxPowerControl
+  (
+    'sensor_descr' => 'Tx Power Control',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-xcvrtxpc-state',
+  ),
+  4 => array // TxPower
+  (
+    'sensor_descr' => 'Tx',
+    'sensor_class' => 'dbm',
+    'scale' => 0.01,
+  ),
+  5 => array // RxPower
+  (
+    'sensor_descr' => 'Rx',
+    'sensor_class' => 'dbm',
+    'scale' => 0.01,
+  ),
+  9 => array // ModeTemperature
+  (
+    'sensor_descr' => '',
+    'sensor_class' => 'temperature',
+    'scale' => 0.01,
+  ),
+  10 => array // TxPowerAlarm
+  (
+    'sensor_descr' => 'Tx Power Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  11 => array // RxPowerAlarm
+  (
+    'sensor_descr' => 'Rx Power Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+  12 => array // ModeTemperatureAlarm
+  (
+    'sensor_descr' => 'Temperature Alarm',
+    'sensor_class' => 'state',
+    'sensor_type' => 'fsfmt-alarm-state',
+  ),
+);
+
+// For the management module sensors preserve their indices because there is
+// only one NMU per device.
+$nmu_sensor_list = array
+(
+  10 => 'Fan', // OAP-NMU::fanState
+  11 => 'PSU 1', // OAP-NMU::power1State
+  12 => 'PSU 2', // OAP-NMU::power2State
+);
+
+foreach ($nmu_sensor_list as $index => $sensor_descr)
+{
+  $oid = "enterprises.40989.10.16.20.{$index}.0";
+  $value = snmp_get_oid($device, $oid);
+  discover_sensor($valid['sensor'], 'state', $device, $oid, $index, 'fsfmt-offon-state', $sensor_descr, 1, $value);
+}
+
+
+// For the worker module sensors map the indices because they are not unique
+// because the manufacturer had defined a MIB for every combination of module
+// type and slot number.
+for ($slot_no = 1; $slot_no <= 16; $slot_no++)
+{
+  $pfx = "enterprises.40989.10.16.{$slot_no}";
+  if (snmp_get_oid($device, "{$pfx}.1.2.0") == 'EDFA')
+  {
+    foreach ($edfa_sensor_map as $index => $sensor)
+    {
+      $pseudo_index = 1000 * $slot_no + $index;
+      $oid = "{$pfx}.1.{$index}.0";
+      $value = snmp_get_oid($device, $oid);
+      if (array_key_exists('scale', $sensor))
+      {
+        $scale = $sensor['scale'];
+      }
+      else
+      {
+        $scale = 1;
+      }
+      if (array_key_exists('sensor_type', $sensor))
+      {
+        $sensor_type = $sensor['sensor_type'];
+      }
+      else
+      {
+        $sensor_type = 'fsfmt-pseudo';
+      }
+      $descr = "Slot {$slot_no} EDFA";
+      if ($sensor['sensor_descr'] != '')
+      {
+        $descr .= ' ' . $sensor['sensor_descr'];
+      }
+      switch ($index)
+      {
+/*
+      // This is currently useless as the device has it hardcoded to -55~70.
+      case 22: // vModuleTemperature
+        $options = array
+        (
+          'limit_high' => $scale * snmp_get_oid($device, "{$pfx}.1.12.0"), // vModuleTemperatureUpperLimit
+          'limit_low' => $scale * snmp_get_oid($device, "{$pfx}.1.13.0"), // vModuleTemperatureLowerLimit
+        );
+        break;
+*/
+      case 25: // vPUMPTemperature
+        $options = array
+        (
+          'limit_high' => $scale * snmp_get_oid($device, "{$pfx}.1.14.0"), // vPUMPTemperatureUpperLimit
+          'limit_low' => $scale * snmp_get_oid($device, "{$pfx}.1.15.0"), // vPUMPTemperatureLowerLimit
+        );
+        break;
+      case 28: // vInput
+        $options = array
+        (
+          'limit_low' => $scale * snmp_get_oid($device, "{$pfx}.1.10.0"), // vInputPowerALM
+        );
+        break;
+      case 29: // vOutput
+        $options = array
+        (
+          'limit_low' => $scale * snmp_get_oid($device, "{$pfx}.1.11.0"), // vOutputPowerALM
+        );
+        break;
+      default:
+        $options = array();
+      }
+      discover_sensor($valid['sensor'], $sensor['sensor_class'], $device, $oid, $pseudo_index, $sensor_type, $descr, $scale, $value, $options);
+    } // foreach $edfa_sensor_map
+  } // if EDFA
+  elseif (snmp_get_oid($device, "{$pfx}.2.2.0") == 'OEO')
+  {
+    foreach ($oeo_port_map as $port_index => $port_name)
+    {
+      foreach ($oeo_sensor_map as $obj_index => $sensor)
+      {
+        $pseudo_index = 1000 * $slot_no + 100 * ($port_index - 10) + $obj_index;
+        $oid = "{$pfx}.2.{$port_index}.{$obj_index}.0";
+        $value = snmp_get_oid ($device, $oid);
+        if (array_key_exists('scale', $sensor))
+        {
+          $scale = $sensor['scale'];
+        }
+        else
+        {
+          $scale = 1;
+        }
+        if (array_key_exists('sensor_type', $sensor))
+        {
+          $sensor_type = $sensor['sensor_type'];
+        }
+        else
+        {
+          $sensor_type = 'fsfmt-pseudo';
+        }
+        $descr = "Slot {$slot_no} OEO Port {$port_name}";
+        if ($sensor['sensor_descr'] != '')
+        {
+          $descr .= ' ' . $sensor['sensor_descr'];
+        }
+        discover_sensor($valid['sensor'], $sensor['sensor_class'], $device, $oid, $pseudo_index, $sensor_type, $descr, $scale, $value);
+        // When the port state is off (0) all the other objects for that port are missing.
+        if ($obj_index == 1 && $value == 0)
+        {
+          break;
+        }
+      } // foreach $oeo_sensor_map
+    } // foreach $oeo_port_map
+  } // if OEO
+} // for each slot number
+
+// EOF
diff -Nur observium.orig/includes/polling/os/fsfmt.inc.php observium/includes/polling/os/fsfmt.inc.php
--- observium.orig/includes/polling/os/fsfmt.inc.php	1970-01-01 01:00:00.000000000 +0100
+++ observium/includes/polling/os/fsfmt.inc.php	2018-01-23 17:13:12.896093672 +0000
@@ -0,0 +1,13 @@
+<?php
+
+if ($poll_device['sysDescr'] == 'GLCY SNMP')
+{
+  // OAP-NMU::softwareVersion.0
+  $version = snmp_get_oid($device, 'enterprises.40989.10.16.20.13.0');
+  // OAP-NMU::serialNumber.0
+  $serial = snmp_get_oid($device, 'enterprises.40989.10.16.20.15.0');
+  // OAP-NMU::deviceType.0
+  $hardware = snmp_get_oid($device, 'enterprises.40989.10.16.20.1.0');
+}
+
+// EOF
