diff --git a/agent_based/checkpoint_asg_chassis.py b/agent_based/checkpoint_asg_chassis.py
index 3295b0f16153b5a5f95d05a5ad2fffac6f095a62..919ac7db0f7d2ba88d8ae676acb0701195f755c7 100644
--- a/agent_based/checkpoint_asg_chassis.py
+++ b/agent_based/checkpoint_asg_chassis.py
@@ -12,8 +12,7 @@
 # 2021-02-25: rewrite for CMK 2.x
 #             added warning/critical is chassis grade not equeal maxGrade
 # 2021-09-10: rewrite parse function
-#
-# ToDo: add warning if SGM/Chassis is missing compared to inventory time
+# 2021-09-11: added WATO, cleanup
 #
 # sample snmpwalk 
 # .1.3.6.1.4.1.2620.1.48.28.1.0 = STRING: "Multi"
@@ -48,25 +47,24 @@
 # .1.3.6.1.4.1.2620.1.48.28.5.1.5.2.0 = STRING: "N/A"
 # .1.3.6.1.4.1.2620.1.48.28.5.1.5.3.0 = STRING: "N/A"
 #
-# sample info
+# sample string_table
 # [
 #  [
-#   [u'Multi', u'Primary Up', u'Enabled', u'Enabled']
+#   ['Multi', 'Primary Up', 'Enabled', 'Enabled']
 #  ],
 #  [
-#   [u'1', u'ACTIVE', u'34', u'34', u'N/A'],
-#   [u'2', u'STANDBY', u'28', u'28', u'N/A']
+#   ['1', 'ACTIVE', '34', '34', 'N/A'],
+#   ['2', 'STANDBY', '28', '28', 'N/A']
 #  ],
 #  [
-#   [u'1_01', u'ACTIVE'],
-#   [u'1_02', u'ACTIVE'],
-#   [u'2_01', u'ACTIVE']
+#   ['1_01', 'ACTIVE'],
+#   ['1_02', 'ACTIVE'],
+#   ['2_01', 'ACTIVE']
 #  ]
 # ]
 #
-from pprint import pprint
 
-from typing import Mapping, Dict, List, Tuple, NamedTuple, Optional
+from typing import List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -117,55 +115,74 @@ def parse_checkpoint_asg_chassis(string_table: List[StringTable]) -> Optional[Ch
     try:
         return CheckPointASGChassis(
             info=CheckPointASGChassisInfo(*string_table[0][0]),
-            chassis=string_table[1],
-            sgms=string_table[2]
+            chassis=[CheckPointASGChassisParams(*chassis) for chassis in string_table[1]],
+            sgms=[CheckPointASGChassisSgms(*sgm) for sgm in string_table[2]]
         )
     except (TypeError, IndexError):
         pass
 
 
 def discovery_checkpoint_asg_chassis(section: CheckPointASGChassis) -> DiscoveryResult:
-    yield Service(parameters={'inv_chassis_parms': section.chassis})
+    yield Service(parameters={
+        'discovery_chassis': len(section.chassis),
+        'discovery_sgms': len(section.sgms),
+    })
 
 
 def check_checkpoint_asg_chassis(params, section: CheckPointASGChassis) -> CheckResult:
-    details = ''
-    details += '\nTo verify this output use the "asg monitor" CLI command on the Check Point SMO,\n'
-    details += '\nChassis Mode: %s' % section.info.mode
-    details += '\nH/A Mode: %s' % section.info.hamode
-    details += '\nSync to active: %s' % section.info.synctoactive
-    details += '\nSync to standby: %s' % section.info.synctostandby
+    notice = ''
+    notice += '\nTo verify this output use the "asg monitor" CLI command on the Check Point SMO,\n'
+    notice += f'\nChassis Mode: {section.info.mode}'
+    notice += f'\nH/A Mode: {section.info.hamode}'
+    notice += f'\nSync to active: {section.info.synctoactive}'
+    notice += f'\nSync to standby: {section.info.synctostandby}'
 
-    inv_chassis_parms = params['inv_chassis_parms']
+    yield Result(state=State.OK, notice=notice)
 
     for chassis in section.chassis:
-        chassis = CheckPointASGChassisParams(*chassis)
-
         if chassis.uniqueip != 'N/A':
-            details += '\nChassis %s unique IP: %s' % (chassis.id, chassis.uniqueip)
-
-        for inv_chassis in inv_chassis_parms:
-            inv_chassis = CheckPointASGChassisParams(*inv_chassis)
-            if chassis.id == inv_chassis.id:
-                yield_text = 'Chassis %s: %s, grade: %s/%s' % (chassis.id, chassis.status, chassis.grade, chassis.maxgrade)
-                if not chassis.status.lower() in ['active', 'standby'] or chassis.grade != chassis.maxgrade:
-                    yield Result(state=State.CRIT, summary=yield_text)
-                elif (chassis.status != inv_chassis.status) or (chassis.grade != inv_chassis.grade) or (chassis.maxgrade != inv_chassis.maxgrade):
-                    yield Result(state=State.WARN, notice=yield_text + ' (expected: %s, grade: %s/%s)' % (inv_chassis.status, inv_chassis.grade, inv_chassis.maxgrade))
-                else:
-                    yield Result(state=State.OK, summary=yield_text)
+            yield Result(state=State.OK, notice=f'\nChassis {chassis.id} unique IP: {chassis.uniqueip}')
+
+        if not chassis.status.lower() in ['active', 'standby']:
+            yield Result(
+                state=State(params['state_chassis_not_active_standby']),
+                summary=f'Chassis {chassis.id}: {chassis.status}'
+            )
+        elif chassis.id == params['desired_chassis_active'] and chassis.status.lower() != 'active':
+            yield Result(
+                state=State(params['state_chassis_not_desired_active']),
+                notice=f'Chassis {chassis.id}: {chassis.status} should be active'
+            )
+        else:
+            yield Result(state=State.OK, summary=f'Chassis {chassis.id}: {chassis.status}')
+
+        summary = f'grade: {chassis.grade}/{chassis.maxgrade}'
+        details = f'Chassis {chassis.id} grade: {chassis.grade}/{chassis.maxgrade}'
+        if chassis.grade != chassis.maxgrade:
+            yield Result(state=State(params['state_chassis_not_max_grade']), summary=summary, details=details)
+        else:
+            yield Result(state=State.OK, summary=summary, details=details)
+
+    if len(section.chassis) != params['discovery_chassis']:
+        yield Result(
+            state=State(params['state_chassis_number_changed']),
+            notice=f'Number of chassis changed ({len(section.chassis)}/{params["discovery_chassis"]}'
+        )
 
     active_sgms = 0
-    for asgSgm in section.sgms:
-        asgSgm = CheckPointASGChassisSgms(*asgSgm)
-        if asgSgm.status.lower() == 'active':
+    for sgm in section.sgms:
+        if sgm.status.lower() == 'active':
             active_sgms += 1
         else:
-            yield Result(state=State.CRIT, notice='SGM %s state: %s' % (asgSgm.id, asgSgm.status))
+            yield Result(state=State(params['state_sgm_not_active']), notice=f'SGM {sgm.id} state: {sgm.status}')
 
-    yield Result(state=State.OK,
-                 summary='%d/%d SGMs active' % (active_sgms, len(section.sgms)),
-                 details=details)
+    yield Result(state=State.OK, summary=f'{active_sgms}/{len(section.sgms)} SGMs active')
+
+    if len(section.sgms) != params['discovery_sgms']:
+        yield Result(
+            state=State(params['state_sgms_number_changed']),
+            notice=f'Number of SGMs changed ({len(section.sgms)}/{params["state_sgms_number_changed"]}'
+        )
 
 
 register.snmp_section(
@@ -213,5 +230,14 @@ register.check_plugin(
     service_name='ASG Chassis',
     discovery_function=discovery_checkpoint_asg_chassis,
     check_function=check_checkpoint_asg_chassis,
-    check_default_parameters={},
-)
\ No newline at end of file
+    check_default_parameters={
+        'state_chassis_number_changed': 2,
+        'desired_chassis_active': '1',
+        'state_chassis_not_desired_active': 1,
+        'state_chassis_not_active_standby': 2,
+        'state_chassis_not_max_grade': 2,
+        'state_sgm_not_active': 2,
+        'state_sgms_number_changed': 2,
+    },
+    check_ruleset_name='checkpoint_asg_chassis',
+)
diff --git a/checkpoint_asg_chassis.mkp b/checkpoint_asg_chassis.mkp
index a2106c38776678c9d46049dedfdde96fa06e9c70..8f4289ccd901f69457f4758bf2883f3e4e4028b0 100644
Binary files a/checkpoint_asg_chassis.mkp and b/checkpoint_asg_chassis.mkp differ
diff --git a/packages/checkpoint_asg_chassis b/packages/checkpoint_asg_chassis
index 1fde3a6d0fe3674f289a75a2e1bae4f3f263ea1c..0cff4721417c1758d94ce272e0687385873f380d 100644
--- a/packages/checkpoint_asg_chassis
+++ b/packages/checkpoint_asg_chassis
@@ -3,11 +3,12 @@
                 'monitor)\n',
  'download_url': 'http://thl-cmk.hopto.org/',
  'files': {'agent_based': ['checkpoint_asg_chassis.py'],
-           'checkman': ['checkpoint_asg_chassis']},
+           'checkman': ['checkpoint_asg_chassis'],
+           'web': ['plugins/wato/checkpoint_asg_chassis.py']},
  'name': 'checkpoint_asg_chassis',
- 'num_files': 2,
+ 'num_files': 3,
  'title': 'Check Point Maestro SMO ASG Chassis',
- 'version': '20210225.v0.2',
+ 'version': '20210911.v0.3',
  'version.min_required': '2.0.0b8',
  'version.packaged': '2021.07.14',
  'version.usable_until': None}
\ No newline at end of file
diff --git a/web/plugins/wato/checkpoint_asg_chassis.py b/web/plugins/wato/checkpoint_asg_chassis.py
new file mode 100644
index 0000000000000000000000000000000000000000..70dea0e4d610cd9c40302d6be339078ee8f4ff25
--- /dev/null
+++ b/web/plugins/wato/checkpoint_asg_chassis.py
@@ -0,0 +1,81 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    TextAscii,
+    DropdownChoice,
+    MonitoringState,
+    Transform,
+)
+
+from cmk.gui.plugins.wato import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_checkpoint_asg_chassis():
+    return Transform(
+        Dictionary(elements=[
+            ('desired_chassis_active',
+             DropdownChoice(
+                 title=_('Desired active chassis'),
+                 help=_('Select witch chassis should be active'),
+                 sorted=True,
+                 default_value='1',
+                 choices=[
+                     ('1', _('Chassis ID 1')),
+                     ('2', _('Chassis ID 2')),
+                 ],
+             )),
+            ('state_chassis_not_desired_active',
+             MonitoringState(
+                 default_value=1,
+                 title=_('State if desired chassis not active'),
+                 help=_('Monitoring state if the desired chassis not active'),
+             )),
+            ('state_chassis_number_changed',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if number of chassis has changed'),
+                 help=_('Monitoring state if number of chassis differs from discovery time'),
+             )),
+            ('state_chassis_not_active_standby',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if chassis not active/standby'),
+                 help=_('Monitoring state if the chassis not active or standby'),
+             )),
+            ('state_chassis_not_max_grade',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if chassis is not optimal'),
+                 help=_('Monitoring state if the chassis grade is less than max grade'),
+             )),
+            ('state_sgm_not_active',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if SGM is not active'),
+                 help=_('Monitoring state if the SGM state is not active'),
+             )),
+            ('state_sgms_number_changed',
+             MonitoringState(
+                 default_value=2,
+                 title=_('State if number of SGMs has canged'),
+                 help=_('Monitoring state if number of SGMs differs from discovery time'),
+             )),
+        ]))
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='checkpoint_asg_chassis',
+        group=RulespecGroupCheckParametersNetworking,
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_checkpoint_asg_chassis,
+        title=lambda: _('Check Point ASG Monitor'),
+    ))