diff --git a/README.md b/README.md
index ab183306bc1820957fd3056e98c2f000388905bb..d9336c24d36bb5192f79a0aec3d257355169d20e 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+[PACKAGE]: ../../raw/master/mkp/ospfv3-0.4.0-20231221.mkp "ospfv3-0.4.0-20231221.mkp"
 # OSPFv3
 
 Monitors status of OSPFv3 enabled devices
diff --git a/agent_based/ospfv3_area.py b/agent_based/ospfv3_area.py
index 2117ba01aeb2ddd741105143a01bd1190d536357..5a42acda6d2daa051f2761812ad55ba63938f3bf 100644
--- a/agent_based/ospfv3_area.py
+++ b/agent_based/ospfv3_area.py
@@ -102,26 +102,26 @@ class OspfV3Area:
 def parse_ospfv3_area(string_table: StringTable) -> Dict[str, OspfV3Area]:
     areas = {}
     for area in string_table:
-        AreaId, AreaImportAsExtern, AreaSpfRuns, AreaBdrRtrCount, AreaAsBdrRtrCount, AreaScopeLsaCount, \
-        AreaScopeLsaCksumSum, AreaSummary, AreaStubMetric, AreaNssaTranslatorRole, AreaNssaTranslatorState, \
-        AreaNssaTranslatorStabInterval, AreaNssaTranslatorEvents, AreaStubMetricType, AreaTEEnabled, = area
-
-        areas[AreaId] = OspfV3Area(
-            AreaImportAsExtern=ospf_area_impotasextern(AreaImportAsExtern),
-            AreaSummary=ospf_area_summary(AreaSummary),
-            AreaSpfRuns=int(AreaSpfRuns),
-            AreaBdrRtrCount=int(AreaBdrRtrCount),
-            AreaAsBdrRtrCount=int(AreaAsBdrRtrCount),
-            AreaScopeLsaCount=int(AreaScopeLsaCount),
-            AreaScopeLsaCksumSum=int(AreaScopeLsaCksumSum),
-            AreaStubMetric=int(AreaStubMetric),
-            AreaNssaTranslatorRole=ospf_area_translatorrole(AreaNssaTranslatorRole),
-            AreaNssaTranslatorState=ospf_area_translatorrolestate(AreaNssaTranslatorState),
-            AreaNssaTranslatorStabInterval=int(AreaNssaTranslatorStabInterval),
-            AreaNssaTranslatorEvents=int(AreaNssaTranslatorEvents),
-            AreaStubMetricType=ospf_area_submetrictype(AreaStubMetricType),
-            AreaTEEnabled=ospf_area_teeenabled(AreaTEEnabled),
-            AreaType=get_area_type(AreaImportAsExtern, AreaSummary)
+        area_id, import_as_extern, spf_runs, bdr_rtr_count, as_bdr_rtr_count, scope_lsa_count, scope_lsa_cksum_sum, \
+            summary, stub_metric, nssa_translator_role, nssa_translator_state, nssa_translator_stab_interval, \
+            nssa_translator_events, stub_metric_type, te_enabled, = area
+
+        areas[area_id] = OspfV3Area(
+            AreaImportAsExtern=ospf_area_impotasextern(import_as_extern),
+            AreaSummary=ospf_area_summary(summary),
+            AreaSpfRuns=int(spf_runs),
+            AreaBdrRtrCount=int(bdr_rtr_count),
+            AreaAsBdrRtrCount=int(as_bdr_rtr_count),
+            AreaScopeLsaCount=int(scope_lsa_count),
+            AreaScopeLsaCksumSum=int(scope_lsa_cksum_sum),
+            AreaStubMetric=int(stub_metric),
+            AreaNssaTranslatorRole=ospf_area_translatorrole(nssa_translator_role),
+            AreaNssaTranslatorState=ospf_area_translatorrolestate(nssa_translator_state),
+            AreaNssaTranslatorStabInterval=int(nssa_translator_stab_interval),
+            AreaNssaTranslatorEvents=int(nssa_translator_events),
+            AreaStubMetricType=ospf_area_submetrictype(stub_metric_type),
+            AreaTEEnabled=ospf_area_teeenabled(te_enabled),
+            AreaType=get_area_type(import_as_extern, summary)
         )
     return areas
 
diff --git a/agent_based/ospfv3_general.py b/agent_based/ospfv3_general.py
index 7e790d807d824475ce53e0ef9c66f3bc5ad9a68a..c329191e8f192a18c10afa0d3efc12ea0be173b9 100644
--- a/agent_based/ospfv3_general.py
+++ b/agent_based/ospfv3_general.py
@@ -89,26 +89,26 @@ class OspfV3General:
 
 def parse_ospfv3_general(string_table: StringTable) -> Optional[OspfV3General]:
     try:
-        OID_END, RouterId, AdminStatus, VersionNumber, AreaBdrRtrStatus, ASBdrRtrStatus, AsScopeLsaCount, \
-        AsScopeLsaCksumSum, OriginateNewLsas, RxNewLsas, ExtLsaCount, ExtAreaLsdbLimit, \
-        ReferenceBandwidth, StubRouterSupport, StubRouterAdvertisement = string_table[0]
+        oid_end, router_id, admin_status, version_number, area_bdr_rtr_status, as_bdr_rtr_status, as_scope_lsa_count, \
+            as_scope_lsa_cksum_sum, originate_new_lsas, rx_new_lsas, ext_lsa_count, ext_area_lsdb_limit, \
+            reference_bandwidth, stub_router_support, stub_router_advertisement = string_table[0]
     except (ValueError, IndexError):
         return
 
     return OspfV3General(
-        RouterId=render_ipv4_neighbor_id(RouterId),
-        AdminStatus=ospf_admin_status(AdminStatus),
-        VersionNumber=int(VersionNumber),
-        AreaBdrRtrStatus=ospf_abr_asbr_status(AreaBdrRtrStatus),
-        ASBdrRtrStatus=ospf_abr_asbr_status(ASBdrRtrStatus),
-        AsScopeLsaCount=int(AsScopeLsaCount),
-        AsScopeLsaCksumSum=int(AsScopeLsaCksumSum),
-        RxNewLsas=int(RxNewLsas),
-        ExtLsaCount=int(ExtLsaCount),
-        ExtAreaLsdbLimit=int(ExtAreaLsdbLimit),
-        ReferenceBandwidth=int(ReferenceBandwidth),
-        StubRouterSupport=ospf_stub_router_support(StubRouterSupport),
-        StubRouterAdvertisement=ospf_stub_router_advertisement(StubRouterAdvertisement),
+        RouterId=render_ipv4_neighbor_id(router_id),
+        AdminStatus=ospf_admin_status(admin_status),
+        VersionNumber=int(version_number),
+        AreaBdrRtrStatus=ospf_abr_asbr_status(area_bdr_rtr_status),
+        ASBdrRtrStatus=ospf_abr_asbr_status(as_bdr_rtr_status),
+        AsScopeLsaCount=int(as_scope_lsa_count),
+        AsScopeLsaCksumSum=int(as_scope_lsa_cksum_sum),
+        RxNewLsas=int(rx_new_lsas),
+        ExtLsaCount=int(ext_lsa_count),
+        ExtAreaLsdbLimit=int(ext_area_lsdb_limit),
+        ReferenceBandwidth=int(reference_bandwidth),
+        StubRouterSupport=ospf_stub_router_support(stub_router_support),
+        StubRouterAdvertisement=ospf_stub_router_advertisement(stub_router_advertisement),
     )
 
 
diff --git a/agent_based/ospfv3_interface.py b/agent_based/ospfv3_interface.py
index 79b5d3801d09ea0aa1f7d0c045b1cdaeda3d0102..101ddc6ea9c331b67710f12c4123397aaa562428 100644
--- a/agent_based/ospfv3_interface.py
+++ b/agent_based/ospfv3_interface.py
@@ -11,6 +11,8 @@
 #
 # 2021-09-17: rewritten for CMK 2.0
 # 2021-10-02: added WATO options
+# 2023-12-21: replaced ifDescr by ifName
+#             fixed handling if non-matching ifIndex
 #
 # sample snmpwalk
 #
@@ -140,34 +142,32 @@ def parse_ospfv3_interface(string_table: List[StringTable]) -> Optional[Dict[str
     ospf_interfaces = {}
     interfaceinfo, interfaces = string_table
 
+    interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces}
+
     for ospf_interface in interfaceinfo:
-        OID_END, IfAreaId, IfType, IfAdminStatus, IfRtrPriority, IfHelloInterval, IfRtrDeadInterval, IfPollInterval, \
-        IfState, IfDesignatedRouter, IfBackupDesignatedRouter, IfEvents, IfMetricValue, IfLinkScopeLsaCount, \
-        IfLinkLsaCksumSum = ospf_interface
+        oid_end, area_id, if_type, admin_state, rtr_priority, hello_interval, rtr_dead_interval, poll_interval, \
+            if_state, designated_router, backup_designated_router, if_events, metric_value, link_scope_lsa_count, \
+            link_lsa_cksum_sum = ospf_interface
 
-        ospfIfIndex, ospfIfInstId = OID_END.split('.')
+        ospf_if_index, ospf_if_inst_id = oid_end.split('.')
 
-        LocalInterface = ''
-        for interface in interfaces:
-            ifIndex, ifName = interface
-            if ifIndex == ospfIfIndex:
-                LocalInterface = get_short_if_name(ifName)
+        local_interface = get_short_if_name(interfaces_by_index.get(ospf_if_index, ospf_if_index))
 
-        ospf_interfaces[LocalInterface] = OspfV3Interface(
-            IfAreaId=int(IfAreaId),
-            IfType=ospf_if_type(IfType),
-            IfAdminStatus=ospf_if_admin_status(IfAdminStatus),
-            IfRtrPriority=int(IfRtrPriority),
-            IfHelloInterval=int(IfHelloInterval),
-            IfRtrDeadInterval=int(IfRtrDeadInterval),
-            IfPollInterval=int(IfPollInterval),
-            IfState=ospf_if_state(IfState),
-            IfDesignatedRouter=render_ipv4_neighbor_id(IfDesignatedRouter),
-            IfBackupDesignatedRouter=render_ipv4_neighbor_id(IfBackupDesignatedRouter),
-            IfEvents=int(IfEvents),
-            IfMetricValue=int(IfMetricValue),
-            IfLinkScopeLsaCount=int(IfLinkScopeLsaCount),
-            IfLinkLsaCksumSum=int(IfLinkLsaCksumSum),
+        ospf_interfaces[local_interface] = OspfV3Interface(
+            IfAreaId=int(area_id),
+            IfType=ospf_if_type(if_type),
+            IfAdminStatus=ospf_if_admin_status(admin_state),
+            IfRtrPriority=int(rtr_priority),
+            IfHelloInterval=int(hello_interval),
+            IfRtrDeadInterval=int(rtr_dead_interval),
+            IfPollInterval=int(poll_interval),
+            IfState=ospf_if_state(if_state),
+            IfDesignatedRouter=render_ipv4_neighbor_id(designated_router),
+            IfBackupDesignatedRouter=render_ipv4_neighbor_id(backup_designated_router),
+            IfEvents=int(if_events),
+            IfMetricValue=int(metric_value),
+            IfLinkScopeLsaCount=int(link_scope_lsa_count),
+            IfLinkLsaCksumSum=int(link_lsa_cksum_sum),
         )
     return ospf_interfaces
 
@@ -235,10 +235,10 @@ register.snmp_section(
             ]
         ),
         SNMPTree(
-            base='.1.3.6.1.2.1.2.2.1',  # 
+            base='.1.3.6.1.2.1.31.1.1.1',  #
             oids=[
-                '1',  # ifIndex
-                '2',  # ifDescr
+                OIDEnd(),  # ifIndex
+                '1',  # ifName
             ]
         ),
     ],
diff --git a/agent_based/ospfv3_neighbor.py b/agent_based/ospfv3_neighbor.py
index 2f7c9b786e79ec468aa04de2e3f7626a3379a3ae..5aec8d910915abdf658bf5bb55a713db8533099c 100644
--- a/agent_based/ospfv3_neighbor.py
+++ b/agent_based/ospfv3_neighbor.py
@@ -11,6 +11,8 @@
 #
 # 2021-09-17: rewritten for CMK 2.0
 # 2021-10-02: added WATO options
+# 2023-12-21: replaced ifDescr by ifName
+#             fixed handling if non-matching ifIndex
 #
 # .1.3.6.1.2.1.191.1.9.1.4.1.0.50529054 = INTEGER: 2
 # .1.3.6.1.2.1.191.1.9.1.5.1.0.50529054 = Hex-STRING: FE 80 00 00 00 00 00 00 01 92 01 68 00 00 00 03
@@ -118,31 +120,29 @@ def parse_ospfv3_neighbor(string_table: List[StringTable]) -> Dict[str, OspfV3Ne
     neighbors = {}
     neighborinfo, interfaces = string_table
 
+    interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces}
+
     for neighbor in neighborinfo:
-        OID_END, nbrAddressType, nbrAddress, nbrOptions, nbrPriority, nbrState, nbrEvents, nbrLsRetransQLen, \
-        nbrHelloSuppressed, nbrRestartHelperStatus, nbrRestartHelperAge, nbrRestartHelperExitReason = neighbor
-
-        if nbrAddressType == '2':  # IPv6 address
-            nbrAddress = render_ipv6_address(nbrAddress)
-            nbrIfIndex, nbrIfInstId, nbrRtrId = OID_END.split('.')
-
-            nbrLocalInterface = ''
-            for interface in interfaces:
-                ifIndex, ifName = interface
-                if ifIndex == nbrIfIndex:
-                    nbrLocalInterface = get_short_if_name(ifName)
-
-            neighbors[f'{nbrAddress} on {nbrLocalInterface}'] = OspfV3Neighbor(
-                nbrRtrId=render_ipv4_neighbor_id(nbrRtrId),
-                nbrOptions=nbrOptions,
-                nbrPriority=int(nbrPriority),
-                nbrState=int(nbrState),
-                nbrEvents=int(nbrEvents),
-                nbrLsRetransQLen=int(nbrLsRetransQLen),
-                nbrHelloSuppressed=ospf_nbr_hellosuppressed(nbrHelloSuppressed),
-                nbrRestartHelperStatus=ospf_nbr_helperstatus(nbrRestartHelperStatus),
-                nbrRestartHelperAge=int(nbrRestartHelperAge),
-                nbrRestartHelperExitReason=ospf_nbr_helperexitreason(nbrRestartHelperExitReason),
+        oid_end, address_type, address, options, priority, state, events, ls_retrans_q_len, hello_suppressed, \
+            restart_helper_status, restart_helper_age, restart_helper_exit_reason = neighbor
+
+        if address_type == '2':  # IPv6 address
+            address = render_ipv6_address(address)
+            nbr_if_index, nbr_if_inst_id, nbr_rtr_id = oid_end.split('.')
+
+            nbr_local_interface = get_short_if_name(interfaces_by_index.get(nbr_if_index, nbr_if_index))
+
+            neighbors[f'{address} on {nbr_local_interface}'] = OspfV3Neighbor(
+                nbrRtrId=render_ipv4_neighbor_id(nbr_rtr_id),
+                nbrOptions=options,
+                nbrPriority=int(priority),
+                nbrState=int(state),
+                nbrEvents=int(events),
+                nbrLsRetransQLen=int(ls_retrans_q_len),
+                nbrHelloSuppressed=ospf_nbr_hellosuppressed(hello_suppressed),
+                nbrRestartHelperStatus=ospf_nbr_helperstatus(restart_helper_status),
+                nbrRestartHelperAge=int(restart_helper_age),
+                nbrRestartHelperExitReason=ospf_nbr_helperexitreason(restart_helper_exit_reason),
             )
     if neighbors:
         return neighbors
@@ -224,10 +224,10 @@ register.snmp_section(
             ]
         ),
         SNMPTree(
-            base='.1.3.6.1.2.1.2.2.1',  # 
+            base='.1.3.6.1.2.1.31.1.1.1',  #
             oids=[
-                '1',  # ifIndex
-                '2',  # ifDescr
+                OIDEnd(),  # ifIndex
+                '1',  # ifName
             ]
         ),
     ],
diff --git a/agent_based/ospfv3_virtuallink.py b/agent_based/ospfv3_virtuallink.py
index ae87d874cd185b60344e550faa8f4afb907abb47..f4335a75cdd14dcdbe7fe2af9a42c65e98887df4 100644
--- a/agent_based/ospfv3_virtuallink.py
+++ b/agent_based/ospfv3_virtuallink.py
@@ -11,6 +11,8 @@
 #
 # 2021-09-17: rewritten for CMK 2.0
 # 2021-10-02: added WATO options
+# 2023-12-21: replaced ifDescr by ifName
+#             fixed handling if non-matching ifIndex
 #
 # .1.3.6.1.2.1.191.1.11.1.3.3.50529054 = INTEGER: 0
 # .1.3.6.1.2.1.191.1.11.1.4.3.50529054 = Gauge32: 0
@@ -117,35 +119,32 @@ def parse_ospfv3_virtuallink(string_table: List[StringTable]) -> Dict[str, OspfV
     virtual_links = {}
     virtual_links_info, interfaces = string_table
 
+    interfaces_by_index = {if_index: if_name for if_index, if_name in interfaces}
+
     for virtual_link in virtual_links_info:
 
-        OID_END, VirtNbrIfIndex, VirtNbrIfInstId, VirtNbrAddressType, VirtNbrAddress, VirtNbrOptions, VirtNbrState, \
-        VirtNbrEvents, VirtNbrLsRetransQLen, VirtNbrHelloSuppressed, VirtNbrIfId, VirtNbrRestartHelperStatus, \
-        VirtNbrRestartHelperAge, VirtNbrRestartHelperExitReason, = virtual_link
-
-        if VirtNbrAddressType == '2':  # IPv6 address
-            VirtNbrAddress = render_ipv6_address(VirtNbrAddress)
-            VirtNbrArea, VirtNbrId = OID_END.split('.')
-
-            nbrLocalInterface = ''
-            for interface in interfaces:
-                ifIndex, ifName = interface
-                if ifIndex == VirtNbrIfIndex:
-                    nbrLocalInterface = get_short_if_name(ifName)
-
-            # virtual_links[f'{VirtNbrAddress} on {nbrLocalInterface}']= OspfV3VirtualLink(
-            virtual_links[VirtNbrAddress] = OspfV3VirtualLink(
-                VirtNbrId=render_ipv4_neighbor_id(VirtNbrId),
-                VirtNbrArea=int(VirtNbrArea),
-                VirtNbrOptions=VirtNbrOptions,
-                VirtNbrState=int(VirtNbrState),
-                VirtNbrEvents=int(VirtNbrEvents),
-                VirtNbrLsRetransQLen=int(VirtNbrLsRetransQLen),
-                VirtNbrHelloSuppressed=ospf_nbr_hellosuppressed(VirtNbrHelloSuppressed),
-                VirtNbrRestartHelperStatus=ospf_nbr_helperstatus(VirtNbrRestartHelperStatus),
-                VirtNbrRestartHelperAge=int(VirtNbrRestartHelperAge),
-                VirtNbrRestartHelperExitReason=ospf_nbr_helperexitreason(VirtNbrRestartHelperExitReason),
-                VitrNbrLocalInterface=nbrLocalInterface,
+        oid_end, if_index, if_inst_id, address_type, address, options, state, events, ls_retrans_q_len, \
+            hello_suppressed, if_id, restart_helper_status, restart_helper_age, \
+            restart_helper_exit_reason, = virtual_link
+
+        if address_type == '2':  # IPv6 address
+            address = render_ipv6_address(address)
+            area, nbr_id = oid_end.split('.')
+
+            nbr_local_interface = get_short_if_name(interfaces_by_index.get(if_index, if_index))
+
+            virtual_links[address] = OspfV3VirtualLink(
+                VirtNbrId=render_ipv4_neighbor_id(nbr_id),
+                VirtNbrArea=int(area),
+                VirtNbrOptions=options,
+                VirtNbrState=int(state),
+                VirtNbrEvents=int(events),
+                VirtNbrLsRetransQLen=int(ls_retrans_q_len),
+                VirtNbrHelloSuppressed=ospf_nbr_hellosuppressed(hello_suppressed),
+                VirtNbrRestartHelperStatus=ospf_nbr_helperstatus(restart_helper_status),
+                VirtNbrRestartHelperAge=int(restart_helper_age),
+                VirtNbrRestartHelperExitReason=ospf_nbr_helperexitreason(restart_helper_exit_reason),
+                VitrNbrLocalInterface=nbr_local_interface,
             )
     if virtual_links:
         return virtual_links
@@ -229,10 +228,10 @@ register.snmp_section(
             ]
         ),
         SNMPTree(
-            base='.1.3.6.1.2.1.2.2.1',  # 
+            base='.1.3.6.1.2.1.31.1.1.1',  #
             oids=[
-                '1',  # ifIndex
-                '2',  # ifDescr
+                OIDEnd(),  # ifIndex
+                '1',  # ifName
             ]
         ),
     ],
diff --git a/mkp/ospfv3-0.4.0-20231221.mkp b/mkp/ospfv3-0.4.0-20231221.mkp
new file mode 100644
index 0000000000000000000000000000000000000000..1367d5db1f99f564f170a7d0de7d422980dc1b08
Binary files /dev/null and b/mkp/ospfv3-0.4.0-20231221.mkp differ
diff --git a/packages/ospfv3 b/packages/ospfv3
index 8301b3111dcd1de9cea6d43e2dff38a3d92e7116..45f218f6be50dbafa6371e722da160473ff08fea 100644
--- a/packages/ospfv3
+++ b/packages/ospfv3
@@ -17,7 +17,7 @@
            'gui': ['metrics/ospfv3.py', 'wato/ospfv3.py']},
  'name': 'ospfv3',
  'title': 'Collection of OSPFv3 checks',
- 'version': '0.4.0-20230603',
+ 'version': '0.4.0-20231221',
  'version.min_required': '2.1.0b1',
- 'version.packaged': '2.1.0p21',
- 'version.usable_until': None}
\ No newline at end of file
+ 'version.packaged': '2.2.0p14',
+ 'version.usable_until': None}