diff --git a/doc/source/index.rst b/doc/source/index.rst
index 7777879f8..f4781d903 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -87,8 +87,8 @@ The inventory is a dictionary (JSON object), containing at least the following
 fields:
 
 ``cpu``
-    CPU information: ``model_name``, ``frequency``, ``count`` and
-    ``architecture``.
+    CPU information: ``model_name``, ``frequency``, ``count``,
+    ``architecture`` and ``flags``.
 
 ``memory``
     RAM information: ``total`` (total size in bytes), ``physical_mb``
diff --git a/ironic_python_agent/hardware.py b/ironic_python_agent/hardware.py
index 7ad335e2a..0e1eda091 100644
--- a/ironic_python_agent/hardware.py
+++ b/ironic_python_agent/hardware.py
@@ -195,13 +195,16 @@ class NetworkInterface(encoding.SerializableComparable):
 
 
 class CPU(encoding.SerializableComparable):
-    serializable_fields = ('model_name', 'frequency', 'count', 'architecture')
+    serializable_fields = ('model_name', 'frequency', 'count', 'architecture',
+                           'flags')
 
-    def __init__(self, model_name, frequency, count, architecture):
+    def __init__(self, model_name, frequency, count, architecture,
+                 flags=None):
         self.model_name = model_name
         self.frequency = frequency
         self.count = count
         self.architecture = architecture
+        self.flags = flags or []
 
 
 class Memory(encoding.SerializableComparable):
@@ -471,11 +474,25 @@ class GenericHardwareManager(HardwareManager):
         # Current CPU frequency can be different from maximum one on modern
         # processors
         freq = cpu_info.get('cpu max mhz', cpu_info.get('cpu mhz'))
+
+        flags = []
+        out = utils.try_execute('grep', '-Em1', '^flags', '/proc/cpuinfo')
+        if out:
+            try:
+                # Example output (much longer for a real system):
+                # flags           : fpu vme de pse
+                flags = out[0].strip().split(':', 1)[1].strip().split()
+            except (IndexError, ValueError):
+                LOG.warning('Malformed CPU flags information: %s', out)
+        else:
+            LOG.warning('Failed to get CPU flags')
+
         return CPU(model_name=cpu_info.get('model name'),
                    frequency=freq,
                    # this includes hyperthreading cores
                    count=int(cpu_info.get('cpu(s)')),
-                   architecture=cpu_info.get('architecture'))
+                   architecture=cpu_info.get('architecture'),
+                   flags=flags)
 
     def get_memory(self):
         # psutil returns a long, so we force it to an int
diff --git a/ironic_python_agent/tests/unit/test_hardware.py b/ironic_python_agent/tests/unit/test_hardware.py
index 43d30fe67..a05bdbd71 100644
--- a/ironic_python_agent/tests/unit/test_hardware.py
+++ b/ironic_python_agent/tests/unit/test_hardware.py
@@ -226,6 +226,11 @@ L3 cache:              15360K
 NUMA node0 CPU(s):     0-11
 """
 
+# NOTE(dtanstur): flags list stripped down for sanity reasons
+CPUINFO_FLAGS_OUTPUT = """
+flags           : fpu vme de pse
+"""
+
 
 class FakeHardwareManager(hardware.GenericHardwareManager):
     def __init__(self, hardware_support):
@@ -449,7 +454,10 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
 
     @mock.patch.object(utils, 'execute')
     def test_get_cpus(self, mocked_execute):
-        mocked_execute.return_value = LSCPU_OUTPUT, ''
+        mocked_execute.side_effect = [
+            (LSCPU_OUTPUT, ''),
+            (CPUINFO_FLAGS_OUTPUT, '')
+        ]
 
         cpus = self.hardware.get_cpus()
         self.assertEqual('Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz',
@@ -457,10 +465,14 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
         self.assertEqual('2400.0000', cpus.frequency)
         self.assertEqual(4, cpus.count)
         self.assertEqual('x86_64', cpus.architecture)
+        self.assertEqual(['fpu', 'vme', 'de', 'pse'], cpus.flags)
 
     @mock.patch.object(utils, 'execute')
     def test_get_cpus2(self, mocked_execute):
-        mocked_execute.return_value = LSCPU_OUTPUT_NO_MAX_MHZ, ''
+        mocked_execute.side_effect = [
+            (LSCPU_OUTPUT_NO_MAX_MHZ, ''),
+            (CPUINFO_FLAGS_OUTPUT, '')
+        ]
 
         cpus = self.hardware.get_cpus()
         self.assertEqual('Intel(R) Xeon(R) CPU E5-1650 v3 @ 3.50GHz',
@@ -468,6 +480,37 @@ class TestGenericHardwareManager(test_base.BaseTestCase):
         self.assertEqual('1794.433', cpus.frequency)
         self.assertEqual(12, cpus.count)
         self.assertEqual('x86_64', cpus.architecture)
+        self.assertEqual(['fpu', 'vme', 'de', 'pse'], cpus.flags)
+
+    @mock.patch.object(utils, 'execute')
+    def test_get_cpus_no_flags(self, mocked_execute):
+        mocked_execute.side_effect = [
+            (LSCPU_OUTPUT, ''),
+            processutils.ProcessExecutionError()
+        ]
+
+        cpus = self.hardware.get_cpus()
+        self.assertEqual('Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz',
+                         cpus.model_name)
+        self.assertEqual('2400.0000', cpus.frequency)
+        self.assertEqual(4, cpus.count)
+        self.assertEqual('x86_64', cpus.architecture)
+        self.assertEqual([], cpus.flags)
+
+    @mock.patch.object(utils, 'execute')
+    def test_get_cpus_illegal_flags(self, mocked_execute):
+        mocked_execute.side_effect = [
+            (LSCPU_OUTPUT, ''),
+            ('I am not a flag', '')
+        ]
+
+        cpus = self.hardware.get_cpus()
+        self.assertEqual('Intel(R) Xeon(R) CPU E5-2609 0 @ 2.40GHz',
+                         cpus.model_name)
+        self.assertEqual('2400.0000', cpus.frequency)
+        self.assertEqual(4, cpus.count)
+        self.assertEqual('x86_64', cpus.architecture)
+        self.assertEqual([], cpus.flags)
 
     @mock.patch('psutil.version_info', (2, 0))
     @mock.patch('psutil.phymem_usage', autospec=True)
diff --git a/ironic_python_agent/tests/unit/test_ironic_api_client.py b/ironic_python_agent/tests/unit/test_ironic_api_client.py
index 2e3defe38..7d79a6e7c 100644
--- a/ironic_python_agent/tests/unit/test_ironic_api_client.py
+++ b/ironic_python_agent/tests/unit/test_ironic_api_client.py
@@ -176,7 +176,8 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase):
                 u'model_name': u'Awesome Jay CPU x10 9001',
                 u'frequency': u'9001',
                 u'count': u'10',
-                u'architecture': u'ARMv9'
+                u'architecture': u'ARMv9',
+                u'flags': [],
             },
             u'disks': [
                 {
@@ -313,7 +314,8 @@ class TestBaseIronicPythonAgent(test_base.BaseTestCase):
                 u'model_name': u'Awesome Jay CPU x10 9001',
                 u'frequency': u'9001',
                 u'count': u'10',
-                u'architecture': u'ARMv9'
+                u'architecture': u'ARMv9',
+                u'flags': [],
             },
             u'disks': [
                 {
diff --git a/releasenotes/notes/cpu-flags-e3cec7e5cba069ef.yaml b/releasenotes/notes/cpu-flags-e3cec7e5cba069ef.yaml
new file mode 100644
index 000000000..586616afb
--- /dev/null
+++ b/releasenotes/notes/cpu-flags-e3cec7e5cba069ef.yaml
@@ -0,0 +1,3 @@
+---
+features:
+  - Return CPU flags with the CPU inventory.