diff --git a/CHANGELOG b/CHANGELOG
index 248ffb511aa60577951f9ba611e6bf3d462d6bbb..d21df1514f9c1daf80d6f81975f35656f4830e0f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,3 +9,6 @@
 2021-04-29: rename from checkpoint_soft_raid in to checkpoint_raid
 2021-08-10: rewritten for CMK 2.0            
 2022-11-30: WATO: fixed CheckParameterRulespecWithoutItem (from CheckParameterRulespecWithItem)
+2023-04-23: refactoring
+            moved wato file to ~/local/lib/check_mk/gui/plugins/wato
+            moved rule set from networking to hardware
diff --git a/agent_based/checkpoint_raid.py b/agent_based/checkpoint_raid.py
index 3208552f2f21c86b2ed17732c39346d14e58f482..60244032ed4d9ca37a9ce2c140612d8444753eb0 100644
--- a/agent_based/checkpoint_raid.py
+++ b/agent_based/checkpoint_raid.py
@@ -18,6 +18,7 @@
 #             but only 6 Disks are in the default hardware
 # 2021-04-29: rename from checkpoint_soft_raid in to checkpoint_raid
 # 2021-08-10: rewritten for CMK 2.0
+# 2023-04-23: refactoring
 #
 # sample snmpwalk (one volume / two disks)
 #
@@ -57,21 +58,19 @@
 #
 # sample info
 #
-# [[[u'1', u'0', u'2', u'2', u'1952448512', u'0', u'1', u'931']],
-#  [[u'1', u'0', u'0', u'0', u'ATA     ', u'ST1000NM0033-9ZM', u'SN04', u'1953525168', u'0', u'0', u'100', u'931'],
-#   [u'2', u'0', u'1', u'1', u'ATA     ', u'ST1000NM0033-9ZM', u'SN04', u'1953525168', u'0', u'0', u'100', u'931']]]
+# [[['1', '0', '2', '2', '1952448512', '0', '1', '931']],
+#  [['1', '0', '0', '0', 'ATA     ', 'ST1000NM0033-9ZM', 'SN04', '1953525168', '0', '0', '100', '931'],
+#   ['2', '0', '1', '1', 'ATA     ', 'ST1000NM0033-9ZM', 'SN04', '1953525168', '0', '0', '100', '931']]]
 #
 #
 
 from dataclasses import dataclass
 from typing import List, Dict
-
 from cmk.base.plugins.agent_based.agent_based_api.v1.type_defs import (
     DiscoveryResult,
     CheckResult,
     StringTable,
 )
-
 from cmk.base.plugins.agent_based.agent_based_api.v1 import (
     register,
     Service,
@@ -87,28 +86,28 @@ from cmk.base.plugins.agent_based.agent_based_api.v1 import (
 
 @dataclass
 class RaidDisk:
-    diskindex: int
-    diskvolumeid: str
-    diskid: int
-    diskvendor: str
-    diskproductid: str
-    diskrevision: str
-    diskmaxlba: int
-    diskstate: int
-    diskflags: str
-    disksyncstate: int
-    disksize: int
+    index: int
+    volume_id: str
+    disk_id: int
+    vendor: str
+    product_id: str
+    revision: str
+    max_lba: int
+    state: int
+    flags: str
+    sync_state: int
+    size: int
 
 
 @dataclass
 class RaidVolume:
-    volumeindex: int
-    volumetype: str
-    numofdisksonraid: int
-    volumemaxlba: int
-    volumestate: int
-    volumeflags: str
-    volumesize: int
+    index: int
+    type: str
+    num_of_disks_on_raid: int
+    max_lba: int
+    state: int
+    flags: str
+    size: int
     disks: List[RaidDisk]
    
 
@@ -201,41 +200,40 @@ def parse_checkpoint_raid(string_table: List[StringTable]) -> Dict[str, RaidVolu
     disks = []
 
     for disk in raw_disks:
-        diskindex, diskvolumeid, diskid, disknumber, diskvendor, diskproductid, diskrevision, diskmaxlba, diskstate, \
-            diskflags, disksyncstate, disksize = disk
+        index, volume_id, disk_id, number, vendor, product_id, revision, max_lba, state, flags, sync_state, size = disk
 
-        if diskindex.isdigit():
+        if index.isdigit():
             disks.append(RaidDisk(
-                diskindex=int(diskindex),
-                diskvolumeid=diskvolumeid,
-                diskid=int(disknumber),
-                diskvendor=diskvendor,
-                diskproductid=diskproductid,
-                diskrevision=diskrevision,
-                diskmaxlba=int(diskmaxlba),
-                diskstate=int(diskstate),
-                diskflags=_get_flags(diskflags, _raid_disk_flags),
-                disksyncstate=int(disksyncstate),
-                disksize=int(disksize)
+                index=int(index),
+                volume_id=volume_id.strip(),
+                disk_id=int(number),
+                vendor=vendor.strip(),
+                product_id=product_id.strip(),
+                revision=revision.strip(),
+                max_lba=int(max_lba),
+                state=int(state),
+                flags=_get_flags(flags, _raid_disk_flags),
+                sync_state=int(sync_state),
+                size=int(size)
             ))
 
     for volume in raw_volumes:
-        volumeindex, volumeid, volumetype, numofdisksonraid, volumemaxlba, volumestate, volumeflags, volumesize = volume
-
-        if volumeindex.isdigit():
-            volumes[volumeid] = RaidVolume(
-                volumeindex=int(volumeindex),
-                volumetype=_raid_volume_type.get(int(volumetype), f'unknown ({volumetype}'),
-                numofdisksonraid=int(numofdisksonraid),
-                volumemaxlba=int(volumemaxlba),
-                volumestate=int(volumestate),
-                volumeflags=_get_flags(volumeflags, _raid_volume_flags),
-                volumesize=int(volumesize),
+        index, volume_id, _type, num_of_disks_on_raid, max_lba, state, flags, size = volume
+
+        if index.isdigit():
+            volumes[volume_id] = RaidVolume(
+                index=int(index),
+                type=_raid_volume_type.get(int(_type), f'unknown ({_type}'),
+                num_of_disks_on_raid=int(num_of_disks_on_raid),
+                max_lba=int(max_lba),
+                state=int(state),
+                flags=_get_flags(flags, _raid_volume_flags),
+                size=int(size),
                 disks=[]
             )
             for disk in disks:
-                if disk.diskvolumeid == volumeid:
-                    volumes[volumeid].disks.append(disk)
+                if disk.volume_id == volume_id:
+                    volumes[volume_id].disks.append(disk)
 
     return volumes
 
@@ -254,52 +252,51 @@ def check_checkpoint_raid(item, params, section: Dict[str, RaidVolume]) -> Check
         yield Result(state=State.CRIT, summary='Volume not found in SNMP Data')
         return
 
-    # volume infos
+    # volume info
 
     details = ''
-    details += f'Volume Type: {volume.volumetype}, '
-    details += f'# of Disks: {volume.numofdisksonraid}, '
-    details += f'Size: {volume.volumesize}GB, '
-    details += f'max LBA: {volume.volumemaxlba}, '
-    details += f'Flags: {volume.volumeflags}'
+    details += f'Volume Type: {volume.type}, '
+    details += f'# of Disks: {volume.num_of_disks_on_raid}, '
+    details += f'Size: {volume.size}GB, '
+    details += f'max LBA: {volume.max_lba}, '
+    details += f'Flags: {volume.flags}'
 
     summary = ''
-    summary += f'{volume.volumetype}, '
-    summary += f'{volume.numofdisksonraid} disks, '
-    summary += f'{volume.volumesize}GB, '
-    summary += f'State: {_raid_volume_state.get(volume.volumestate)}'
+    summary += f'{volume.type}, '
+    summary += f'{volume.num_of_disks_on_raid} disks, '
+    summary += f'{volume.size}GB, '
+    summary += f'State: {_raid_volume_state.get(volume.state)}'
 
-    if volume.volumestate != 0:
+    if volume.state != 0:
         yield Result(state=State.CRIT, summary=summary, details=details)
     else:
         yield Result(state=State.OK, summary=summary, details=details)
 
-    # disk infos
+    # disk info
     disks = volume.disks
     disks_in_array = 0
     disks_online = 0
     disks_ignored = 0
     for disk in disks:
-        diskid = disk.diskid
-        if not str(diskid) in ignore_disks:
+        if str(disk.disk_id) not in ignore_disks:
             disks_in_array += 1
-            syncstate = disk.disksyncstate
+            syncstate = disk.sync_state
             details = ''
-            details += f'Disk ID: {diskid}, '
-            details += f'State: {_raid_disk_state.get(disk.diskstate)}, '
+            details += f'Disk ID: {disk.disk_id}, '
+            details += f'State: {_raid_disk_state.get(disk.state)}, '
             details += f'Sync: {syncstate}%, '
-            details += f'Size: {disk.disksize}GB, '
-            if disk.diskmaxlba > 0:
-                details += f'max LBA: {disk.diskmaxlba}, '
-            if disk.diskvendor != 'UNKNOWN':
-                details += f'Vendor: {disk.diskvendor}, '
-            details += f'Product ID: {disk.diskproductid}, '
-            if disk.diskrevision != '':
-                details += f'Revision: {disk.diskrevision}, '
-            details += f'Flags: {disk.diskflags}'
-            if disk.diskstate != 0:
+            details += f'Size: {disk.size}GB, '
+            if disk.max_lba > 0:
+                details += f'max LBA: {disk.max_lba}, '
+            if disk.vendor != 'UNKNOWN':
+                details += f'Vendor: {disk.vendor}, '
+            details += f'Product ID: {disk.product_id}, '
+            if disk.revision != '':
+                details += f'Revision: {disk.revision}, '
+            details += f'Flags: {disk.flags}'
+            if disk.state != 0:
                 yield Result(state=State.CRIT,
-                             notice=f'Disk ID: {diskid}, state: {_raid_disk_state.get(disk.diskstate)}',
+                             notice=f'Disk ID: {disk.disk_id}, state: {_raid_disk_state.get(disk.state)}',
                              details=details)
             else:
                 yield Result(state=State.OK, notice=details,
diff --git a/checkpoint_raid.mkp b/checkpoint_raid.mkp
index 2f91b54a32afecadceafd6a0df09d1425942ebdd..ccd9616e9527e761c260ba99eebd4a1e0d57923b 100644
Binary files a/checkpoint_raid.mkp and b/checkpoint_raid.mkp differ
diff --git a/gui/wato/checkpoint_raid.py b/gui/wato/checkpoint_raid.py
new file mode 100644
index 0000000000000000000000000000000000000000..3c575226c378d50d227c903ef7536676db86a6b6
--- /dev/null
+++ b/gui/wato/checkpoint_raid.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+# -*- coding: utf-8 -*-
+#
+# License: GNU General Public License v2
+#
+# Author: thl-cmk[at]outlook[dot]com
+# URL   : https://thl-cmk.hopto.org
+# Date  : 2020-11-10
+#
+# Check_MK checkpoint_raid WATO plugin
+#
+# 2023-04-23: moved wato file to ~/local/lib/check_mk/gui/plugins/wato
+#             moved rule set from networking to hardware
+
+from cmk.gui.i18n import _
+from cmk.gui.valuespec import (
+    Dictionary,
+    TextAscii,
+    TextUnicode,
+)
+from cmk.gui.plugins.wato.utils import (
+    CheckParameterRulespecWithItem,
+    rulespec_registry,
+    RulespecGroupCheckParametersHardware,
+)
+
+
+def _parameter_valuespec_checkpoint_raid():
+    return Dictionary(
+        help=_(''),
+        elements=[
+            ('ignore_disks',
+             TextUnicode(
+                 title=_('list of comma separated disk IDs to ignore'),
+                 help=_('This is useful for RAID Arrays with missing disks, like on the Smart-1 5150. There the '
+                        'array is configured for 12 Disk but in the default Hardware are only 6 Disks.'),
+                 allow_empty=False,
+             )),
+        ],
+    )
+
+
+rulespec_registry.register(
+    CheckParameterRulespecWithItem(
+        check_group_name='checkpoint_raid',
+        group=RulespecGroupCheckParametersHardware,
+        item_spec=lambda: TextAscii(title=_('RAID ID'), ),
+        match_type='dict',
+        parameter_valuespec=_parameter_valuespec_checkpoint_raid,
+        title=lambda: _('Check Point RAID'),
+    ))
diff --git a/packages/checkpoint_raid b/packages/checkpoint_raid
index b29eb9f464d24d443a7f09c260a835375b44f6da..1665477c8a5db38225aadb35aa9251728cc41daa 100644
--- a/packages/checkpoint_raid
+++ b/packages/checkpoint_raid
@@ -2,12 +2,10 @@
  'description': 'monitor Check Point appliance RAID arrays\n',
  'download_url': 'https://thl-cmk.hopto.org',
  'files': {'agent_based': ['checkpoint_raid.py'],
-           'checkman': ['checkpoint_raid'],
-           'web': ['plugins/wato/checkpoint_raid.py']},
+           'gui': ['wato/checkpoint_raid.py']},
  'name': 'checkpoint_raid',
- 'num_files': 3,
  'title': 'Check Point appliance RAID',
- 'version': '20221130.v0.4a',
- 'version.min_required': '2.0.0',
- 'version.packaged': '2021.09.20',
+ 'version': '1.0.0-20230422',
+ 'version.min_required': '2.1.0b1',
+ 'version.packaged': '2.1.0p21',
  'version.usable_until': None}
\ No newline at end of file