diff --git a/agent_based/cisco_asyncos_bandwidth.py b/agent_based/cisco_asyncos_bandwidth.py
index 0e4eccdae1cd211881f3db683720b610bf908992..4d739945661637de6bec45abec10d2f3e7dc64c8 100644
--- a/agent_based/cisco_asyncos_bandwidth.py
+++ b/agent_based/cisco_asyncos_bandwidth.py
@@ -9,8 +9,10 @@
 #
 # only use full for Cisco WSA appliances
 #
+# 2023-03-06: fixed: IndexError in parse function
+#
 
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -36,13 +38,16 @@ class CiscoAsyncosBandwidth(NamedTuple):
     bandwidth_day: int
 
 
-# [[['0', '0', '247']]]
-def parse_cisco_asyncos_bandwidth(string_table: List[StringTable]) -> CiscoAsyncosBandwidth:
-    return CiscoAsyncosBandwidth(
-        bandwidth_now=int(string_table[0][0][0]),
-        bandwidth_hour=int(string_table[0][0][1]),
-        bandwidth_day = int(string_table[0][0][2]),
-    )
+# [['0', '0', '247']]
+def parse_cisco_asyncos_bandwidth(string_table: StringTable) -> Optional[CiscoAsyncosBandwidth]:
+    try:
+        return CiscoAsyncosBandwidth(
+            bandwidth_now=int(string_table[0][0]),
+            bandwidth_hour=int(string_table[0][1]),
+            bandwidth_day = int(string_table[0][2]),
+        )
+    except IndexError:
+        return
 
 
 def discovery_cisco_asyncos_bandwidth(section: CiscoAsyncosBandwidth) -> DiscoveryResult:
@@ -82,16 +87,14 @@ def check_cisco_asyncos_bandwidth(params, section: CiscoAsyncosBandwidth) -> Che
 register.snmp_section(
     name='cisco_asyncos_bandwidth',
     parse_function=parse_cisco_asyncos_bandwidth,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.2.3.7.4',  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentBandWTotPerf
             oids=[
                 '1',  # cacheBwidthTotalNow
                 '3',  # cacheBwidthTotal1hrMean
                 '5',  # cacheBwidthTotal1dayMean
             ]
-        ),
-    ],
+    ),
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_cache.py b/agent_based/cisco_asyncos_cache.py
index dda48c618bf15b2ccd3d0c762141d4233e3d0dfd..bf535717efeeeb0d4f265621c5b4bb5f07de8fe1 100644
--- a/agent_based/cisco_asyncos_cache.py
+++ b/agent_based/cisco_asyncos_cache.py
@@ -10,7 +10,7 @@
 # only use full for Cisco WSA appliances
 #
 
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -38,15 +38,18 @@ class CiscoAsyncosCache(NamedTuple):
     cache_total_resptime: int
 
 
-# [[['0', '0', '0', '0', '0']]]
-def parse_cisco_asyncos_cache(string_table: List[StringTable]) -> CiscoAsyncosCache:
-    return CiscoAsyncosCache(
-        cache_hits_now=int(string_table[0][0][0]),
-        cache_misses_now=int(string_table[0][0][1]),
-        cache_hit_resptime_now=int(string_table[0][0][2]),
-        cache_miss_resptime_now=int(string_table[0][0][3]),
-        cache_total_resptime=int(string_table[0][0][4]),
-    )
+# [['0', '0', '0', '0', '0']]
+def parse_cisco_asyncos_cache(string_table: StringTable) -> Optional[CiscoAsyncosCache]:
+    try:
+        return CiscoAsyncosCache(
+           cache_hits_now=int(string_table[0][0]),
+           cache_misses_now=int(string_table[0][1]),
+           cache_hit_resptime_now=int(string_table[0][2]),
+           cache_miss_resptime_now=int(string_table[0][3]),
+           cache_total_resptime=int(string_table[0][4]),
+        )
+    except IndexError:
+        return
 
 
 def discovery_cisco_asyncos_cache(section: CiscoAsyncosCache) -> DiscoveryResult:
@@ -68,8 +71,7 @@ def check_cisco_asyncos_cache(params, section: CiscoAsyncosCache) -> CheckResult
 register.snmp_section(
     name='cisco_asyncos_cache',
     parse_function=parse_cisco_asyncos_cache,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.2.3.7',  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyRecentPerf
             oids=[
                 '5.1',  # cacheHitsNow
@@ -79,7 +81,6 @@ register.snmp_section(
                 '9.1',  # cacheTotalRespTimeNow
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_conn.py b/agent_based/cisco_asyncos_conn.py
index c5da832faa9414ee07134da35c505096afec5c9e..f5436cd60e0fb13855a5fec62ebb3f44005c09e9 100644
--- a/agent_based/cisco_asyncos_conn.py
+++ b/agent_based/cisco_asyncos_conn.py
@@ -9,7 +9,7 @@
 #
 # only use full for Cisco WSA appliances
 #
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -35,13 +35,16 @@ class CiscoAsyncosConn(NamedTuple):
     cacheClientMaxConns: int
 
 
-# [[['0', '5', '66277']]]
-def parse_cisco_asyncos_conn(string_table: List[StringTable]) -> CiscoAsyncosConn:
-    return CiscoAsyncosConn(
-        cacheClientIdleConns=int(string_table[0][0][0]),
-        cacheClientTotalConns=int(string_table[0][0][1]),
-        cacheClientMaxConns=int(string_table[0][0][2]),
-    )
+# [['0', '5', '66277']]
+def parse_cisco_asyncos_conn(string_table: StringTable) -> Optional[CiscoAsyncosConn]:
+    try:
+        return CiscoAsyncosConn(
+            cacheClientIdleConns=int(string_table[0][0]),
+            cacheClientTotalConns=int(string_table[0][1]),
+            cacheClientMaxConns=int(string_table[0][2]),
+        )
+    except IndexError:
+        return  
 
 
 def discovery_cisco_asyncos_conn(section: CiscoAsyncosConn) -> DiscoveryResult:
@@ -61,8 +64,7 @@ def check_cisco_asyncos_conn(params, section: CiscoAsyncosConn) -> CheckResult:
 register.snmp_section(
     name='cisco_asyncos_conn',
     parse_function=parse_cisco_asyncos_conn,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.2.3.2',  # ASYNCOSWEBSECURITYAPPLIANCE-MIB::proxyClientSidePerf
             oids=[
                 '7',  # cacheClientIdleConns
@@ -70,7 +72,6 @@ register.snmp_section(
                 '9',  # cacheClientMaxConns
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_dns.py b/agent_based/cisco_asyncos_dns.py
index 664d265cacb336a6cdee6964478d6a785b2254fa..534f79af3811fc2a7c0728a4d3546282d6e7d6dd 100644
--- a/agent_based/cisco_asyncos_dns.py
+++ b/agent_based/cisco_asyncos_dns.py
@@ -19,7 +19,7 @@
 # ASYNCOS-MAIL-MIB::pendingDNSRequests.0 = Gauge32: 0
 #
 #
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -44,12 +44,15 @@ class CiscoAsyncosDns(NamedTuple):
     pendingDNSRequests: int
 
 
-# [[['0', '0']]]
-def parse_cisco_asyncos_dns(string_table: List[StringTable]) -> CiscoAsyncosDns:
-    return CiscoAsyncosDns(
-        outstandingDNSRequests=int(string_table[0][0][0]),
-        pendingDNSRequests=int(string_table[0][0][1]),
-    )
+# [['0', '0']]
+def parse_cisco_asyncos_dns(string_table: StringTable) -> Optional[CiscoAsyncosDns]:
+    try:
+        return CiscoAsyncosDns(
+            outstandingDNSRequests=int(string_table[0][0]),
+            pendingDNSRequests=int(string_table[0][1]),
+        )
+    except IndexError:
+        return
 
 
 def discovery_cisco_asyncos_dns(section: CiscoAsyncosDns) -> DiscoveryResult:
@@ -68,15 +71,13 @@ def check_cisco_asyncos_dns(params, section: CiscoAsyncosDns) -> CheckResult:
 register.snmp_section(
     name='cisco_asyncos_dns',
     parse_function=parse_cisco_asyncos_dns,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
             oids=[
                 '15',  # outstandingDNSRequests
                 '16',  # pendingDNSRequests
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_messageage.py b/agent_based/cisco_asyncos_messageage.py
index d07894269f90a64dee1487525cc20b65eeb6d3d5..91383d7bf948143636414608c6dd257ac5f28606 100644
--- a/agent_based/cisco_asyncos_messageage.py
+++ b/agent_based/cisco_asyncos_messageage.py
@@ -17,7 +17,7 @@
 # ASYNCOS-MAIL-MIB::oldestMessageAge.0 = Gauge32: 259706
 #
 
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -41,11 +41,14 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
 class CiscoAsyncosMessageage(NamedTuple):
     messageage: int
 
-# [[['259297']]]
-def parse_cisco_asyncos_messageage(string_table: List[StringTable]) -> CiscoAsyncosMessageage:
-    return CiscoAsyncosMessageage(
-        messageage=int(string_table[0][0][0]),
-    )
+# [['259297']]
+def parse_cisco_asyncos_messageage(string_table: StringTable) -> Optional[CiscoAsyncosMessageage]:
+    try:
+        return CiscoAsyncosMessageage(
+            messageage=int(string_table[0][0]),
+        )
+    except IndexError:
+        return
 
 
 def discovery_cisco_asyncos_messageage(section: CiscoAsyncosMessageage) -> DiscoveryResult:
@@ -65,14 +68,12 @@ def check_cisco_asyncos_messageage(params, section: CiscoAsyncosMessageage) -> C
 register.snmp_section(
     name='cisco_asyncos_messageage',
     parse_function=parse_cisco_asyncos_messageage,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
             oids=[
                 '14',  # oldestMessageAge
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_queue.py b/agent_based/cisco_asyncos_queue.py
index 32a67a21f343a71a69fb0ff2ec7769f1002d1bc1..b4a7988b7fa40b412b82b19fc7d553b4b1340f8f 100644
--- a/agent_based/cisco_asyncos_queue.py
+++ b/agent_based/cisco_asyncos_queue.py
@@ -12,7 +12,7 @@
 # 2021-03-24: rewrite for CMK 2.0
 #
 
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -56,13 +56,16 @@ def get_cmk_state(st: str) -> State:
     return states.get(st, State.CRIT)
 
 
-# [[['1', '1']]]
-def parse_cisco_asyncos_messageage(string_table: List[StringTable]) -> CiscoAsyncosQueue:
-    return CiscoAsyncosQueue(
-        state=get_cmk_state(string_table[0][0][0]),
-        status_readable=get_status_readable(string_table[0][0][0]),
-        workQueueMessages=int(string_table[0][0][1])
-    )
+# [['1', '1']]
+def parse_cisco_asyncos_messageage(string_table: StringTable) -> Optional[CiscoAsyncosQueue]:
+    try:
+        return CiscoAsyncosQueue(
+            state=get_cmk_state(string_table[0][0]),
+            status_readable=get_status_readable(string_table[0][0]),
+            workQueueMessages=int(string_table[0][1])
+        )
+    except IndexError:
+        return
 
 
 def discovery_cisco_asyncos_queue(section: CiscoAsyncosQueue) -> DiscoveryResult:
@@ -82,15 +85,13 @@ def check_cisco_asyncos_queue(params, section: CiscoAsyncosQueue) -> CheckResult
 register.snmp_section(
     name='cisco_asyncos_queue',
     parse_function=parse_cisco_asyncos_messageage,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
             oids=[
                 '5',  # queueAvailabilityStatus
                 '11'  # workQueueMessages
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_resources.py b/agent_based/cisco_asyncos_resources.py
index 0f4cda0ba9c5f5ffa641fcc2318af5af468bde98..c6041a2d3abe8d0428103623c079085ade426925 100644
--- a/agent_based/cisco_asyncos_resources.py
+++ b/agent_based/cisco_asyncos_resources.py
@@ -17,7 +17,7 @@
 # ASYNCOS-MAIL-MIB::resourceConservationReason.0 = INTEGER: noResourceConservation(1)
 #
 #
-from typing import Mapping, List, NamedTuple
+from typing import Mapping, List, NamedTuple, Optional
 
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
@@ -62,11 +62,14 @@ class CiscoAsyncosResources(NamedTuple):
     status_readable: str
 
 
-def parse_cisco_asyncos_bandwidth(string_table: List[StringTable]) -> CiscoAsyncosResources:
-    return CiscoAsyncosResources(
-        state=get_cmk_state(string_table[0][0][0]),
-        status_readable=get_status_readable(string_table[0][0][0])
-    )
+def parse_cisco_asyncos_bandwidth(string_table: StringTable) -> Optional[CiscoAsyncosResources]:
+    try:
+        return CiscoAsyncosResources(
+            state=get_cmk_state(string_table[0][0]),
+            status_readable=get_status_readable(string_table[0][0])
+        )
+    except IndexError:
+        return
 
 
 def discovery_cisco_asyncos_resources(section: CiscoAsyncosResources) -> DiscoveryResult:
@@ -80,14 +83,12 @@ def check_cisco_asyncos_resources(section: CiscoAsyncosResources) -> CheckResult
 register.snmp_section(
     name='cisco_asyncos_resources',
     parse_function=parse_cisco_asyncos_bandwidth,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.1.1',  # ASYNCOS-MAIL-MIB
             oids=[
                 '6',  # resourceConservationReason
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/agent_based/cisco_asyncos_temp.py b/agent_based/cisco_asyncos_temp.py
index d2d0fe1862d19175b27378a1ea518925b667732b..bb38d10d341d2a051c2e0d097f6ea39eccb6efa5 100644
--- a/agent_based/cisco_asyncos_temp.py
+++ b/agent_based/cisco_asyncos_temp.py
@@ -36,6 +36,7 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     check_levels,
     SNMPTree,
     contains,
+    get_value_store,
 )
 
 from cmk.base.plugins.agent_based.utils.temperature import (
@@ -45,11 +46,11 @@ from cmk.base.plugins.agent_based.utils.temperature import (
 
 
 #
-# [[['22', 'FP_TEMP_SENSOR']]]
+# [['22', 'FP_TEMP_SENSOR']]
 #
-def parse_cisco_asyncos_temp(string_table: List[StringTable]) -> dict:
+def parse_cisco_asyncos_temp(string_table: StringTable) -> dict:
     sensors = {}
-    for sensor in string_table[0]:
+    for sensor in string_table:
         try:
             value, item = sensor
             item = item.replace('_', ' ')
@@ -70,6 +71,7 @@ def check_cisco_asyncos_temp(item, params: TempParamType, section) -> CheckResul
             section[item],
             params=params,
             unique_name='check_cisco_asyncos_temp.%s' % item,
+            value_store=get_value_store(),
         )
     except KeyError:
         pass
@@ -78,15 +80,13 @@ def check_cisco_asyncos_temp(item, params: TempParamType, section) -> CheckResul
 register.snmp_section(
     name='cisco_asyncos_temp',
     parse_function=parse_cisco_asyncos_temp,
-    fetch=[
-        SNMPTree(
+    fetch= SNMPTree(
             base='.1.3.6.1.4.1.15497.1.1.1.9.1',  # ASYNCOS-MAIL-MIB::temperatureEntry
             oids=[
                 '2',  # degreesCelsius
                 '3',  # temperatureName
             ]
         ),
-    ],
     detect=contains('.1.3.6.1.2.1.1.1.0', 'AsyncOS'),
 )
 
diff --git a/cisco_asyncos.mkp b/cisco_asyncos.mkp
index 3102a3f16c6c7ba54cb850112f5f2df6cb36ff9b..60bcf605212b7552bb0db41df2d304ff042462d5 100644
Binary files a/cisco_asyncos.mkp and b/cisco_asyncos.mkp differ
diff --git a/gui/wato/cisco_asyncos_feature_keys.py b/gui/wato/cisco_asyncos_feature_keys.py
new file mode 100644
index 0000000000000000000000000000000000000000..8b38a99ae5511dee47bc8a2adc4ed95a8b5d9df1
--- /dev/null
+++ b/gui/wato/cisco_asyncos_feature_keys.py
@@ -0,0 +1,50 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Integer,
+    TextAscii,
+    ListOfStrings,
+    Tuple,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_cisco_asyncos_feature_keys():
+    return Dictionary(elements=[
+        ('features_ignore',
+         ListOfStrings(
+             title=_('feature keys features to ignore'),
+             orientation='vertical',
+             allow_empty=False,
+             help=_('there will be no warning/critical if this features are expired'
+                    'Examples: McAfee, IronPort Email Encryption, Data Loss Prevention, etc.'),
+         )
+         ),
+        ('expire',
+         Tuple(
+             title=_('Levels for feature key expiration in days'),
+             elements=[
+                 Integer(title=_('Warning'), default_value=30, unit=_('days before expiration')),
+                 Integer(title=_('Critical'), default_value=7, unit=_('days before expiration')),
+             ])),
+    ])
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='cisco_asyncos_feature_keys',
+        group=RulespecGroupCheckParametersNetworking,
+        item_spec=lambda: TextAscii(title=_('Cisco AsyncOS feature keys'), ),
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_cisco_asyncos_feature_keys,
+        title=lambda: _('Cisco AsyncOS feature keys'),
+    ))
diff --git a/gui/wato/cisco_asyncos_license.py b/gui/wato/cisco_asyncos_license.py
new file mode 100644
index 0000000000000000000000000000000000000000..fb7cbcafd99b6ca5d8484d8aa96f7277a1bf053b
--- /dev/null
+++ b/gui/wato/cisco_asyncos_license.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Integer,
+    TextAscii,
+    ListOfStrings,
+    Tuple,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_cisco_asyncos_license():
+    return Dictionary(elements=[
+        ('features_ignore',
+         ListOfStrings(
+             title=_('License features to ignore'),
+             orientation='vertical',
+             allow_empty=False,
+             # valuespec=Integer(minvalue=1, maxvalue=99),
+             help=_('there will be no warning/critical if this features are expired'
+                    'Examples: McAfee, IronPort Email Encryption, Data Loss Prevention, etc.'),
+         )
+         ),
+        ('expire',
+         Tuple(
+             title=_('Levels for licence expiration in days'),
+             elements=[
+                 Integer(title=_('Warning'), default_value=30, unit=_('days before expiration')),
+                 Integer(title=_('Critical'), default_value=7, unit=_('days before expiration')),
+             ])),
+    ])
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='cisco_asyncos_license',
+        group=RulespecGroupCheckParametersNetworking,
+        item_spec=lambda: TextAscii(title=_('Cisco AsyncOS license'), ),
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_cisco_asyncos_license,
+        title=lambda: _('Cisco AsyncOS license'),
+    ))
diff --git a/gui/wato/cisco_asyncos_queue.py b/gui/wato/cisco_asyncos_queue.py
new file mode 100644
index 0000000000000000000000000000000000000000..66d0258affe07442c455d6cf439b270d22551ba3
--- /dev/null
+++ b/gui/wato/cisco_asyncos_queue.py
@@ -0,0 +1,41 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Integer,
+    TextAscii,
+    ListOfStrings,
+    Tuple,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_cisco_asyncos_queue():
+    return Dictionary(elements=[
+        ('levels',
+         Tuple(
+             title=_('Levels for nuber of messages in work queue'),
+             elements=[
+                 Integer(title=_('Warning'), default_value=50, unit=_('# of messages')),
+                 Integer(title=_('Critical'), default_value=100, unit=_('# of messages')),
+             ])),
+    ])
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='cisco_asyncos_queue',
+        group=RulespecGroupCheckParametersNetworking,
+        item_spec=lambda: TextAscii(title=_('Cisco AsyncOS queue'), ),
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_cisco_asyncos_queue,
+        title=lambda: _('Cisco AsyncOS queue'),
+    ))
diff --git a/gui/wato/cisco_asyncos_updates.py b/gui/wato/cisco_asyncos_updates.py
new file mode 100644
index 0000000000000000000000000000000000000000..4f25b4d3fd07d5edbaf559acbabcca4d62844867
--- /dev/null
+++ b/gui/wato/cisco_asyncos_updates.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+#
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    Integer,
+    TextAscii,
+    ListOfStrings,
+    Tuple,
+)
+
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersNetworking,
+)
+
+
+def _parameter_valuespec_cisco_asyncos_updates():
+    return Dictionary(elements=[
+        ('features_ignore',
+         ListOfStrings(
+             title=_('Update features to ignore'),
+             orientation='vertical',
+             help=_('there will be no warning/critical if this features are not updated'
+                    'Examples: geo_countries, timezones, etc.'),
+         )
+         ),
+        ('failedLevel',
+         Tuple(
+             title=_('Levels for failed attempts'),
+             elements=[
+                 Integer(title=_('Warning'), default_value=5, unit=_('# of failed attempts')),
+                 Integer(title=_('Critical'), default_value=10, unit=_('# of failed attempts')),
+             ])),
+    ])
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='cisco_asyncos_updates',
+        group=RulespecGroupCheckParametersNetworking,
+        item_spec=lambda: TextAscii(title=_('Cisco AsyncOS updates'), ),
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_cisco_asyncos_updates,
+        title=lambda: _('Cisco AsyncOS updates'),
+    ))
diff --git a/packages/cisco_asyncos b/packages/cisco_asyncos
index ab2cde272c85fd3623ae69b8801b9707546adc2e..40f791060a0f63ebc586317b40b1f7a2866f7bb9 100644
--- a/packages/cisco_asyncos
+++ b/packages/cisco_asyncos
@@ -39,14 +39,13 @@
                            'cisco_asyncos_resources.py',
                            'cisco_asyncos_feature_keys.py',
                            'cisco_asyncos_updates.py'],
-           'web': ['plugins/wato/cisco_asyncos_queue.py',
-                   'plugins/metrics/cisco_asyncos.py',
-                   'plugins/wato/cisco_asyncos_feature_keys.py',
-                   'plugins/wato/cisco_asyncos_updates.py']},
+           'gui': ['wato/cisco_asyncos_feature_keys.py',
+                   'wato/cisco_asyncos_license.py',
+                   'wato/cisco_asyncos_queue.py',
+                   'wato/cisco_asyncos_updates.py']},
  'name': 'cisco_asyncos',
- 'num_files': 19,
  'title': 'Cisco AsyncOS (IronPort) checks',
- 'version': '20210324_v0.2.0',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2.0.0p1',
+ 'version': '20230306.v0.3.0',
+ 'version.min_required': '2.1.0',
+ 'version.packaged': '2.1.0p22',
  'version.usable_until': None}
\ No newline at end of file