diff --git a/companion.py b/companion.py
index 7702d046..6c71080a 100644
--- a/companion.py
+++ b/companion.py
@@ -589,6 +589,10 @@ class Session(object):
             # logger.trace('timestamp not in data, adding from response headers')
             data['timestamp'] = time.strftime('%Y-%m-%dT%H:%M:%SZ', parsedate(r.headers['Date']))  # type: ignore
 
+        # Update Odyssey Suit data
+        if endpoint == URL_QUERY:
+            self.suit_update(data)
+
         return data
 
     def profile(self) -> CAPIData:
@@ -632,6 +636,25 @@ class Session(object):
 
         return data
 
+    def suit_update(self, data: CAPIData) -> None:
+        """
+        Update monitor.state suit data.
+
+        :param data: CAPI data to extra suit data from.
+        """
+        if (current_suit := data.get('suit')) is None:
+            # Probably no Odyssey on the account, so point attempting more.
+            return
+
+        monitor.state['SuitCurrent'] = current_suit
+        monitor.state['Suits'] = data.get('suits')
+
+        if (suit_loadouts := data.get('loadouts')) is None:
+            logger.warning('CAPI data had "suit" but no (suit) "loadouts"')
+
+        monitor.state['SuitLoadoutCurrent'] = data.get('loadout')
+        monitor.state['SuitLoadouts'] = suit_loadouts
+
     def close(self) -> None:
         """Close CAPI authorization session."""
         self.state = Session.STATE_INIT
diff --git a/edmc_data.py b/edmc_data.py
index 1d51d185..61c72bd2 100644
--- a/edmc_data.py
+++ b/edmc_data.py
@@ -23,6 +23,11 @@ companion_category_map = {
     'NonMarketable':  False,  # Don't appear in the in-game market so don't report
 }
 
+# Map suit symbol names to English localised names
+companion_suit_type_map = {
+    'TacticalSuit_Class1':      'Dominator Suit',
+}
+
 # Map Coriolis's names to names displayed in the in-game shipyard.
 coriolis_ship_map = {
     'Cobra Mk III': 'Cobra MkIII',
diff --git a/monitor.py b/monitor.py
index 5aa9838a..7d2e14b3 100644
--- a/monitor.py
+++ b/monitor.py
@@ -114,42 +114,46 @@ class EDLogs(FileSystemEventHandler):  # type: ignore # See below
         # Cmdr state shared with EDSM and plugins
         # If you change anything here update PLUGINS.md documentation!
         self.state: Dict = {
-            'Captain':      None,  # On a crew
-            'Cargo':        defaultdict(int),
-            'Credits':      None,
-            'FID':          None,  # Frontier Cmdr ID
-            'Horizons':     None,  # Does this user have Horizons?
-            'Loan':         None,
-            'Raw':          defaultdict(int),
-            'Manufactured': defaultdict(int),
-            'Encoded':      defaultdict(int),
-            'Engineers':    {},
-            'Rank':         {},
-            'Reputation':   {},
-            'Statistics':   {},
-            'Role':         None,  # Crew role - None, Idle, FireCon, FighterCon
-            'Friends':      set(),  # Online friends
-            'ShipID':       None,
-            'ShipIdent':    None,
-            'ShipName':     None,
-            'ShipType':     None,
-            'HullValue':    None,
-            'ModulesValue': None,
-            'Rebuy':        None,
-            'Modules':      None,
-            'CargoJSON':    None,  # The raw data from the last time cargo.json was read
-            'Route':        None,  # Last plotted route from Route.json file
-            'OnFoot':       False,  # Whether we think you're on-foot
-            'Component':    defaultdict(int),      # Odyssey Components in Ship Locker
-            'Item':         defaultdict(int),      # Odyssey Items in Ship Locker
-            'Consumable':   defaultdict(int),      # Odyssey Consumables in Ship Locker
-            'Data':         defaultdict(int),      # Odyssey Data in Ship Locker
+            'Captain':            None,  # On a crew
+            'Cargo':              defaultdict(int),
+            'Credits':            None,
+            'FID':                None,  # Frontier Cmdr ID
+            'Horizons':           None,  # Does this user have Horizons?
+            'Loan':               None,
+            'Raw':                defaultdict(int),
+            'Manufactured':       defaultdict(int),
+            'Encoded':            defaultdict(int),
+            'Engineers':          {},
+            'Rank':               {},
+            'Reputation':         {},
+            'Statistics':         {},
+            'Role':               None,  # Crew role - None, Idle, FireCon, FighterCon
+            'Friends':            set(),  # Online friends
+            'ShipID':             None,
+            'ShipIdent':          None,
+            'ShipName':           None,
+            'ShipType':           None,
+            'HullValue':          None,
+            'ModulesValue':       None,
+            'Rebuy':              None,
+            'Modules':            None,
+            'CargoJSON':          None,  # The raw data from the last time cargo.json was read
+            'Route':              None,  # Last plotted route from Route.json file
+            'OnFoot':             False,  # Whether we think you're on-foot
+            'Component':          defaultdict(int),      # Odyssey Components in Ship Locker
+            'Item':               defaultdict(int),      # Odyssey Items in Ship Locker
+            'Consumable':         defaultdict(int),      # Odyssey Consumables in Ship Locker
+            'Data':               defaultdict(int),      # Odyssey Data in Ship Locker
             'BackPack':     {                      # Odyssey BackPack contents
-                'Component':  defaultdict(int),    # BackPack Components
-                'Consumable': defaultdict(int),    # BackPack Consumables
-                'Item':       defaultdict(int),    # BackPack Items
-                'Data':         defaultdict(int),  # Backpack Data
+                'Component':      defaultdict(int),    # BackPack Components
+                'Consumable':     defaultdict(int),    # BackPack Consumables
+                'Item':           defaultdict(int),    # BackPack Items
+                'Data':           defaultdict(int),  # Backpack Data
             },
+            'SuitCurrent':        None,
+            'Suits':              None,
+            'SuitLoadoutCurrent': None,
+            'SuitLoadouts':       None,
         }
 
     def start(self, root: 'tkinter.Tk') -> bool:  # noqa: CCR001