Repository: vacanza/holidays
Pull request #2671 (2025-06-22 21:04:01)

Add Libya holidays
<!--
  Thanks for contributing to holidays!
-->

## Proposed change

<!--
  Describe the big picture of your changes.
  Don't forget to link your PR to an existing issue if any.
-->

Add Libya holidays.

Fixes #1218.

## Type of change

<!--
  Type of change you want to introduce. Please, check one (1) box only!
  If your PR requires multiple boxes to be checked, most likely it needs to
  be split into multiple PRs.
-->

- [X] New country/market holidays support (thank you!)
- [ ] Supported country/market holidays update (calendar discrepancy fix, localization)
- [ ] Existing code/documentation/test/process quality improvement (best practice, cleanup, refactoring, optimization)
- [ ] Dependency update (version deprecation/pin/upgrade)
- [ ] Bugfix (non-breaking change which fixes an issue)
- [ ] Breaking change (a code change causing existing functionality to break)
- [ ] New feature (new `holidays` functionality in general)

## Checklist

<!--
  Put an `x` in the boxes that apply. You can change them after PR is created.
-->

- [X] I've followed the [contributing guidelines][contributing-guidelines]
- [X] I've successfully run `make check`, all checks and tests are green

<!--
  Thanks again for your contribution!
-->

[contributing-guidelines]: https://github.com/vacanza/holidays/blob/dev/CONTRIBUTING.md
[docs]: https://github.com/vacanza/holidays/tree/dev/docs/source


sonarqubecloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [5.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_duplicated_lines_density&view=list) (required ≤ 5%)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671)


kritibirda26: I am not familiar with the Arabic script and have copied most of the names from Wikipedia or other countries and hence, apologies in advance for the possible errors!
sonarqubecloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [5.5% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_duplicated_lines_density&view=list) (required ≤ 5%)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671)


sonarqubecloud[bot]: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [5.4% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_duplicated_lines_density&view=list) (required ≤ 5%)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671)


kritibirda26: Oh great, I'll check it out and update the implementation accordingly.
PPsyrius: > The earliest law with table of holidays is [Law No. 4 of 1987](https://lawsociety.ly/legislation/%d9%82%d8%a7%d9%86%d9%88%d9%86-%d8%b1%d9%82%d9%85-4-%d9%84%d8%b3%d9%86%d8%a9-1987-%d9%85-%d8%a8%d8%b4%d8%a3%d9%86-%d8%a7%d9%84%d8%b9%d8%b7%d9%84%d8%a7%d8%aa-%d8%a7%d9%84%d8%b1%d8%b3%d9%85%d9%8a%d8%a9/). I think we can start from there.

Yeah, I can't find the annexe part either for earlier declarations - Law No. 4 of 1987 works for now 👍 


sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2671&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2671&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2671&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [4.1% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671)


kritibirda26: The snapshots are still pending, I will add them once the code is reviewed.
sonarqubecloud[bot]: ## [![Quality Gate Passed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-passed-20px.png 'Quality Gate Passed')](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671) **Quality Gate passed**  
Issues  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 New issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2671&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/accepted-16px.png '') [0 Accepted issues](https://sonarcloud.io/project/issues?id=vacanza_python-holidays&pullRequest=2671&issueStatuses=ACCEPTED)

Measures  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=vacanza_python-holidays&pullRequest=2671&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [0.0% Coverage on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_coverage&view=list)  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/passed-16px.png '') [4.1% Duplication on New Code](https://sonarcloud.io/component_measures?id=vacanza_python-holidays&pullRequest=2671&metric=new_duplicated_lines_density&view=list)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=vacanza_python-holidays&pullRequest=2671)



Patch:
diff --git a/.github/workflows/ci-cd.yml b/.github/workflows/ci-cd.yml
index 430b8091..0ccaba4f 100644
--- a/.github/workflows/ci-cd.yml
+++ b/.github/workflows/ci-cd.yml
@@ -58,12 +58,12 @@ jobs:
         uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683
 
       - name: Initialize CodeQL
-        uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858
+        uses: github/codeql-action/init@181d5eefc20863364f96762470ba6f862bdef56b
         with:
           languages: python
 
       - name: Perform CodeQL Analysis
-        uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858
+        uses: github/codeql-action/analyze@181d5eefc20863364f96762470ba6f862bdef56b
         with:
           category: '/language:python'
 
diff --git a/README.md b/README.md
index c0e8c3be..ab205076 100644
--- a/README.md
+++ b/README.md
@@ -105,7 +105,7 @@ and detailed information.
 
 ## Available Countries
 
-We currently support 205 country codes. The standard way to refer to a country is by using its [ISO
+We currently support 206 country codes. The standard way to refer to a country is by using its [ISO
 3166-1 alpha-2 code](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes), the same used
 for domain names, and for a subdivision its [ISO 3166-2
 code](https://en.wikipedia.org/wiki/ISO_3166-2). Some countries have common or foreign names or
@@ -868,6 +868,13 @@ any) in brackets, available languages and additional holiday categories. All cou
 <td></td>
 </tr>
 <tr>
+<td>Libya</td>
+<td>LY</td>
+<td></td>
+<td><strong>ar</strong>, en_US</td>
+<td>WORKDAY</td>
+</tr>
+<tr>
 <td>Liechtenstein</td>
 <td>LI</td>
 <td></td>
diff --git a/holidays/countries/__init__.py b/holidays/countries/__init__.py
index 81df7e8e..b213e1f5 100644
--- a/holidays/countries/__init__.py
+++ b/holidays/countries/__init__.py
@@ -120,6 +120,7 @@ from holidays.countries.kyrgyzstan import Kyrgyzstan, KG, KGZ
 from holidays.countries.laos import Laos, LA, LAO
 from holidays.countries.latvia import Latvia, LV, LVA
 from holidays.countries.lesotho import Lesotho, LS, LSO
+from holidays.countries.libya import Libya, LY, LBY
 from holidays.countries.liechtenstein import Liechtenstein, LI, LIE
 from holidays.countries.lithuania import Lithuania, LT, LTU
 from holidays.countries.luxembourg import Luxembourg, LU, LUX
diff --git a/holidays/countries/aland_islands.py b/holidays/countries/aland_islands.py
index dc797930..63e30a9f 100644
--- a/holidays/countries/aland_islands.py
+++ b/holidays/countries/aland_islands.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import PUBLIC, UNOFFICIAL, WORKDAY
 from holidays.countries.finland import Finland
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysAX(Finland):
+class HolidaysAX(ChildEntity, Finland):
     """Åland Islands holidays.
 
     Alias of a Finnish subdivision that is also officially assigned
@@ -30,26 +30,10 @@ class HolidaysAX(Finland):
 
     country = "AX"
     parent_entity = Finland
-    default_language = "fi"
-    supported_languages = ("en_US", "fi", "sv_FI", "th", "uk")
-    supported_categories = (PUBLIC, UNOFFICIAL, WORKDAY)
-    subdivisions = ()  # Override Finland subdivisions.
-    subdivisions_aliases = {}  # Override Finland subdivisions aliases.
+    parent_entity_subdivision_code = "01"
     # Åland Islands got its autonomy on May 7th, 1920.
     start_year = 1921
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "01"
-        super()._populate_public_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "01"
-        super()._populate_unofficial_holidays()
-
-    def _populate_workday_holidays(self) -> None:
-        self.subdiv = "01"
-        super()._populate_workday_holidays()
-
 
 class AlandIslands(HolidaysAX):
     pass
diff --git a/holidays/countries/american_samoa.py b/holidays/countries/american_samoa.py
index 3d029572..a406ce73 100644
--- a/holidays/countries/american_samoa.py
+++ b/holidays/countries/american_samoa.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import GOVERNMENT, PUBLIC, UNOFFICIAL
 from holidays.countries.united_states import UnitedStates
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysAS(UnitedStates):
+class HolidaysAS(ChildEntity, UnitedStates):
     """American Samoa holidays.
 
     Alias of a US subdivision that is also officially assigned its own country code in ISO 3166-1.
@@ -23,24 +23,9 @@ class HolidaysAS(UnitedStates):
 
     country = "AS"
     parent_entity = UnitedStates
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
-    subdivisions = ()  # Override US subdivisions.
-    subdivisions_aliases = {}  # Override US subdivisions aliases.
     # Became a U.S. Territory since April 17th, 1900.
     start_year = 1901
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "AS"
-        super()._populate_public_holidays()
-
-    def _populate_government_holidays(self) -> None:
-        self.subdiv = "AS"
-        super()._populate_government_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "AS"
-        super()._populate_unofficial_holidays()
-
 
 class AmericanSamoa(HolidaysAS):
     pass
diff --git a/holidays/countries/french_guiana.py b/holidays/countries/french_guiana.py
index d31cd35f..feb4369c 100644
--- a/holidays/countries/french_guiana.py
+++ b/holidays/countries/french_guiana.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysGF(France):
+class HolidaysGF(ChildEntity, France):
     """French Guiana holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,10 @@ class HolidaysGF(France):
 
     country = "GF"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
+    parent_entity_subdivision_code = "973"
     # Cession from Portugal on May 30th, 1814.
     start_year = 1815
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "973"
-        super()._populate_public_holidays()
-
 
 class FrenchGuiana(HolidaysGF):
     pass
diff --git a/holidays/countries/french_polynesia.py b/holidays/countries/french_polynesia.py
index eb9d365b..fccd00c5 100644
--- a/holidays/countries/french_polynesia.py
+++ b/holidays/countries/french_polynesia.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysPF(France):
+class HolidaysPF(ChildEntity, France):
     """French Polynesia holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,9 @@ class HolidaysPF(France):
 
     country = "PF"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # Pōmare V abdicated and Tahiti became a French Colony on June 29th, 1880.
     start_year = 1881
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "PF"
-        super()._populate_public_holidays()
-
 
 class FrenchPolynesia(HolidaysPF):
     pass
diff --git a/holidays/countries/french_southern_territories.py b/holidays/countries/french_southern_territories.py
index 7dca29ce..59624d86 100644
--- a/holidays/countries/french_southern_territories.py
+++ b/holidays/countries/french_southern_territories.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysTF(France):
+class HolidaysTF(ChildEntity, France):
     """French Southern Territories holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -31,15 +32,9 @@ class HolidaysTF(France):
 
     country = "TF"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # This overseas territory was separated in 1955.
     start_year = 1956
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "TF"
-        super()._populate_public_holidays()
-
 
 class FrenchSouthernTerritories(HolidaysTF):
     pass
diff --git a/holidays/countries/guadeloupe.py b/holidays/countries/guadeloupe.py
index 6df00ffa..0bc9a1d3 100644
--- a/holidays/countries/guadeloupe.py
+++ b/holidays/countries/guadeloupe.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysGP(France):
+class HolidaysGP(ChildEntity, France):
     """Guadeloupe holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,10 @@ class HolidaysGP(France):
 
     country = "GP"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
+    parent_entity_subdivision_code = "971"
     # Cession from Sweden on May 30th, 1814.
     start_year = 1815
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "971"
-        super()._populate_public_holidays()
-
 
 class Guadeloupe(HolidaysGP):
     pass
diff --git a/holidays/countries/guam.py b/holidays/countries/guam.py
index 6421c66a..ca5c74b9 100644
--- a/holidays/countries/guam.py
+++ b/holidays/countries/guam.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import GOVERNMENT, PUBLIC, UNOFFICIAL
 from holidays.countries.united_states import UnitedStates
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysGU(UnitedStates):
+class HolidaysGU(ChildEntity, UnitedStates):
     """Guam holidays.
 
     Alias of a US subdivision that is also officially assigned its own country code in ISO 3166-1.
@@ -23,24 +23,9 @@ class HolidaysGU(UnitedStates):
 
     country = "GU"
     parent_entity = UnitedStates
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
-    subdivisions = ()  # Override US subdivisions.
-    subdivisions_aliases = {}  # Override US subdivisions aliases.
     # Became a U.S. Territory on April 11th, 1899.
     start_year = 1900
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "GU"
-        super()._populate_public_holidays()
-
-    def _populate_government_holidays(self) -> None:
-        self.subdiv = "GU"
-        super()._populate_government_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "GU"
-        super()._populate_unofficial_holidays()
-
 
 class Guam(HolidaysGU):
     pass
diff --git a/holidays/countries/hongkong.py b/holidays/countries/hongkong.py
index ca851f3e..b14582c5 100644
--- a/holidays/countries/hongkong.py
+++ b/holidays/countries/hongkong.py
@@ -34,7 +34,7 @@ from holidays.groups import (
     InternationalHolidays,
     StaticHolidays,
 )
-from holidays.mixins import PreferredDiscretionaryHolidays
+from holidays.mixins.preferred_discretionary_holidays import PreferredDiscretionaryHolidays
 from holidays.observed_holiday_base import (
     ObservedHolidayBase,
     SAT_SUN_TO_NEXT_WORKDAY,
diff --git a/holidays/countries/isle_of_man.py b/holidays/countries/isle_of_man.py
index 9b6c6093..e409e09d 100644
--- a/holidays/countries/isle_of_man.py
+++ b/holidays/countries/isle_of_man.py
@@ -21,6 +21,10 @@ class IsleOfMan(UnitedKingdom):
     """Isle Of Man holidays."""
 
     country = "IM"
+    # The Isle of Man (IM) is not a subdivision of the United Kingdom (GB)
+    # entity, so the `IsleOfMan` class does not inherit from the `ChildEntity`
+    # mixin. The `parent_entity` is specified below solely to maintain
+    # consistency in holiday name localization.
     parent_entity = UnitedKingdom
     subdivisions = ()  # Override UnitedKingdom subdivisions.
     subdivisions_aliases = {}  # Override UnitedKingdom subdivisions aliases.
diff --git a/holidays/countries/libya.py b/holidays/countries/libya.py
new file mode 100644
index 00000000..d9b398a0
--- /dev/null
+++ b/holidays/countries/libya.py
@@ -0,0 +1,227 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from gettext import gettext as tr
+
+from holidays.calendars import _CustomIslamicHolidays
+from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC
+from holidays.constants import PUBLIC, WORKDAY
+from holidays.groups import InternationalHolidays, IslamicHolidays, StaticHolidays
+from holidays.holiday_base import HolidayBase
+
+
+class Libya(HolidayBase, InternationalHolidays, IslamicHolidays, StaticHolidays):
+    """Libya holidays.
+
+    References:
+        * [Law No. 4 of 1987](https://web.archive.org/web/20250629084625/https://lawsociety.ly/legislation/قانون-رقم-4-لسنة-1987-م-بشأن-العطلات-الرسمية/)
+        * [Law No. 5 of 2012](https://web.archive.org/web/20250629084558/https://lawsociety.ly/legislation/القانون-رقم-5-لسنة-2012-م-بشأن-العطلات-الرسم/)
+        * [National Environmental Sanitation Day](https://web.archive.org/web/20250629084547/https://lawsociety.ly/legislation/قرار-رقم-414-لسنة-2021-م-باعتبار-يوم-14-أغسطس-يو/)
+    """
+
+    country = "LY"
+    default_language = "ar"
+    # %s (estimated).
+    estimated_label = tr("%s (المقدرة)")
+    start_year = 1988
+    supported_categories = (PUBLIC, WORKDAY)
+    supported_languages = ("ar", "en_US")
+
+    def __init__(self, *args, islamic_show_estimated: bool = True, **kwargs):
+        """
+        Args:
+            islamic_show_estimated:
+                Whether to add "estimated" label to Islamic holidays name
+                if holiday date is estimated.
+        """
+        InternationalHolidays.__init__(self)
+        IslamicHolidays.__init__(
+            self, cls=LibyaIslamicHolidays, show_estimated=islamic_show_estimated
+        )
+        StaticHolidays.__init__(self, cls=LibyaStaticHolidays)
+        super().__init__(*args, **kwargs)
+
+    def _populate_public_holidays(self):
+        if self._year <= 2011:
+            # People's Authority Day.
+            self._add_holiday_mar_2(tr("عید إعلان سلطة الشعب"))
+
+            # American Forces Evacuation Day.
+            self._add_holiday_jun_11(tr("عيد إجلاء القوات الأمريكية"))
+
+            # Glorious July Revolution Day.
+            self._add_holiday_jul_23(tr("عيد ثورة يوليو المجيدة"))
+
+            # Great Al-Fateh Revolution Day.
+            self._add_holiday_sep_1(tr("عيد الفاتح العظيم"))
+        else:
+            # Anniversary of the February 17 Revolution.
+            self._add_holiday_feb_17(tr("ثورة 17 فبراير"))
+
+            # Labor Day.
+            self._add_labor_day(tr("عيد العمال"))
+
+            if self._year >= 2022:
+                # National Environmental Sanitation Day.
+                self._add_holiday_aug_14(tr("يوم وطني للإصحاح البيئي"))
+
+            # Martyrs' Day.
+            self._add_holiday_sep_16(tr("يوم الشهيد"))
+
+            # Liberation Day.
+            self._add_holiday_oct_23(tr("يوم التحرير"))
+
+            # Independence Day.
+            self._add_holiday_dec_24(tr("عيد الاستقلال"))
+
+            # Islamic New Year.
+            self._add_islamic_new_year_day(tr("عيد رأس السنة الهجرية"))
+
+        # Prophet's Birthday.
+        self._add_mawlid_day(tr("ذكرى المولد النبوي الشريف"))
+
+        # Eid al-Fitr.
+        name = tr("عيد الفطر")
+        self._add_eid_al_fitr_day(name)
+        self._add_eid_al_fitr_day_two(name)
+        self._add_eid_al_fitr_day_three(name)
+
+        # Day of Arafah.
+        self._add_arafah_day(tr("يوم عرفة"))
+
+        # Eid al-Adha.
+        name = tr("عيد الأضحى")
+        self._add_eid_al_adha_day(name)
+        self._add_eid_al_adha_day_two(name)
+        self._add_eid_al_adha_day_three(name)
+
+    def _populate_workday_holidays(self):
+        if self._year <= 2011:
+            # Syrian Revolution Day.
+            self._add_holiday_mar_8(tr("عيد ثورة سوريا"))
+
+            # Anniversary of the Arab League.
+            self._add_holiday_mar_22(tr("ذكرى إنشاء الجامعة العربية"))
+
+            # British Forces Evacuation Day.
+            self._add_holiday_mar_28(tr("عيد إجلاء القوات البريطانية"))
+
+            # Italian Forces Evacuation Day.
+            self._add_holiday_oct_7(tr("عيد إجلاء الطليان"))
+
+            # Islamic New Year.
+            self._add_islamic_new_year_day(tr("عيد رأس السنة الهجرية"))
+
+            # Ashura.
+            self._add_ashura_day(tr("عاشوراء"))
+
+            # Isra and Mi'raj.
+            self._add_isra_and_miraj_day(tr("ذكرى الإسراء والمعراج"))
+
+            # Night of Forgiveness.
+            self._add_imam_mahdi_birthday_day(tr("ليلة النصف من شعبان"))
+
+
+class LY(Libya):
+    pass
+
+
+class LBY(Libya):
+    pass
+
+
+class LibyaIslamicHolidays(_CustomIslamicHolidays):
+    # https://web.archive.org/web/20240908234803/https://www.timeanddate.com/holidays/libya/eid-al-adha
+    # https://web.archive.org/web/20250629084537/https://lawsociety.ly/legislation/قرار-رقم-773-لسنة-2017-م-بشأن-تحديد-عطلة-عيد-ال/
+    EID_AL_ADHA_DATES = {
+        2012: (OCT, 26),
+        2013: (OCT, 15),
+        2014: (OCT, 5),
+        2015: (SEP, 23),
+        2016: (SEP, 11),
+        2017: (SEP, 1),
+        2018: (AUG, 22),
+        2019: (AUG, 11),
+        2020: (JUL, 31),
+        2021: (JUL, 20),
+        2022: (JUL, 9),
+        2023: (JUN, 28),
+        2024: (JUN, 16),
+        2025: (JUN, 6),
+    }
+
+    # https://web.archive.org/web/20241012125707/https://www.timeanddate.com/holidays/libya/eid-al-fitr
+    EID_AL_FITR_DATES = {
+        2012: (AUG, 19),
+        2013: (AUG, 8),
+        2014: (JUL, 29),
+        2015: (JUL, 18),
+        2016: (JUL, 7),
+        2017: (JUN, 26),
+        2018: (JUN, 15),
+        2019: (JUN, 4),
+        2020: (MAY, 24),
+        2021: (MAY, 13),
+        2022: (MAY, 2),
+        2023: (APR, 21),
+        2024: (APR, 10),
+        2025: (MAR, 31),
+    }
+
+    # https://web.archive.org/web/20250418094505/https://www.timeanddate.com/holidays/libya/muharram-new-year
+    HIJRI_NEW_YEAR_DATES = {
+        2012: (NOV, 15),
+        2013: (NOV, 5),
+        2014: (OCT, 25),
+        2015: (OCT, 15),
+        2016: (OCT, 3),
+        2017: (SEP, 22),
+        2018: (SEP, 12),
+        2019: (AUG, 31),
+        2020: (AUG, 20),
+        2021: (AUG, 10),
+        2022: (JUL, 30),
+        2023: (JUL, 19),
+        2024: (JUL, 7),
+        2025: (JUN, 26),
+    }
+
+    # https://web.archive.org/web/20241213175353/https://www.timeanddate.com/holidays/libya/prophet-birthday
+    # https://web.archive.org/web/20250629084607/https://lawsociety.ly/legislation/قرار-رقم-1299-لسنة-2019-م-بشأن-عطلة-ذكرى-المولد/
+    MAWLID_DATES = {
+        2012: (FEB, 5),
+        2013: (JAN, 24),
+        2014: (JAN, 14),
+        2015: ((JAN, 3), (DEC, 23)),
+        2016: (DEC, 12),
+        2017: (DEC, 1),
+        2018: (NOV, 21),
+        2019: (NOV, 9),
+        2020: (OCT, 29),
+        2021: (OCT, 19),
+        2022: (OCT, 8),
+        2023: (SEP, 27),
+        2024: (SEP, 15),
+    }
+
+
+class LibyaStaticHolidays:
+    """Libya special holidays.
+
+    References:
+        * <https://web.archive.org/web/20250629084721/https://lawsociety.ly/legislation/قرار-رقم-555-لسنة-2023-م-بمنح-إجازة-رسمية/>
+    """
+
+    special_public_holidays = {
+        # Public Holiday.
+        2023: (DEC, 10, tr("عطلة رسمية"))
+    }
diff --git a/holidays/countries/martinique.py b/holidays/countries/martinique.py
index 1c838429..a0415a6a 100644
--- a/holidays/countries/martinique.py
+++ b/holidays/countries/martinique.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysMQ(France):
+class HolidaysMQ(ChildEntity, France):
     """Martinique holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,10 @@ class HolidaysMQ(France):
 
     country = "MQ"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
+    parent_entity_subdivision_code = "972"
     # Cession from the UK on May 30th, 1814.
     start_year = 1815
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "972"
-        super()._populate_public_holidays()
-
 
 class Martinique(HolidaysMQ):
     pass
diff --git a/holidays/countries/mayotte.py b/holidays/countries/mayotte.py
index 5b4aad78..32b3ce9f 100644
--- a/holidays/countries/mayotte.py
+++ b/holidays/countries/mayotte.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysYT(France):
+class HolidaysYT(ChildEntity, France):
     """Mayotte holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,10 @@ class HolidaysYT(France):
 
     country = "YT"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
+    parent_entity_subdivision_code = "976"
     # Sold to France on April 25th, 1841.
     start_year = 1842
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "976"
-        super()._populate_public_holidays()
-
 
 class Mayotte(HolidaysYT):
     pass
diff --git a/holidays/countries/new_caledonia.py b/holidays/countries/new_caledonia.py
index f54bb532..f79794cd 100644
--- a/holidays/countries/new_caledonia.py
+++ b/holidays/countries/new_caledonia.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysNC(France):
+class HolidaysNC(ChildEntity, France):
     """New Caledonia holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,9 @@ class HolidaysNC(France):
 
     country = "NC"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # France took formal possession of New Caledonia on September 24th, 1853.
     start_year = 1854
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "NC"
-        super()._populate_public_holidays()
-
 
 class NewCaledonia(HolidaysNC):
     pass
diff --git a/holidays/countries/northern_mariana_islands.py b/holidays/countries/northern_mariana_islands.py
index ecad8d8d..2c3a5dab 100644
--- a/holidays/countries/northern_mariana_islands.py
+++ b/holidays/countries/northern_mariana_islands.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import GOVERNMENT, PUBLIC, UNOFFICIAL
 from holidays.countries.united_states import UnitedStates
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysMP(UnitedStates):
+class HolidaysMP(ChildEntity, UnitedStates):
     """Northern Mariana Islands (the) holidays.
 
     Alias of a US subdivision that is also officially assigned its own country code in ISO 3166-1.
@@ -23,24 +23,9 @@ class HolidaysMP(UnitedStates):
 
     country = "MP"
     parent_entity = UnitedStates
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
-    subdivisions = ()  # Override US subdivisions.
-    subdivisions_aliases = {}  # Override US subdivisions aliases.
     # UNSC Resolution 21 on April 2nd, 1947.
     start_year = 1948
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "MP"
-        super()._populate_public_holidays()
-
-    def _populate_government_holidays(self) -> None:
-        self.subdiv = "MP"
-        super()._populate_government_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "MP"
-        super()._populate_unofficial_holidays()
-
 
 class NorthernMarianaIslands(HolidaysMP):
     pass
diff --git a/holidays/countries/puerto_rico.py b/holidays/countries/puerto_rico.py
index cdbed556..32a624cd 100644
--- a/holidays/countries/puerto_rico.py
+++ b/holidays/countries/puerto_rico.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import GOVERNMENT, PUBLIC, UNOFFICIAL
 from holidays.countries.united_states import UnitedStates
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysPR(UnitedStates):
+class HolidaysPR(ChildEntity, UnitedStates):
     """Puerto Rico holidays.
 
     Alias of a US subdivision that is also officially assigned its own country code in ISO 3166-1.
@@ -23,24 +23,9 @@ class HolidaysPR(UnitedStates):
 
     country = "PR"
     parent_entity = UnitedStates
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
-    subdivisions = ()  # Override US subdivisions.
-    subdivisions_aliases = {}  # Override US subdivisions aliases.
     # Became a U.S. Territory on April 11th, 1899.
     start_year = 1900
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "PR"
-        super()._populate_public_holidays()
-
-    def _populate_government_holidays(self) -> None:
-        self.subdiv = "PR"
-        super()._populate_government_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "PR"
-        super()._populate_unofficial_holidays()
-
 
 class PuertoRico(HolidaysPR):
     pass
diff --git a/holidays/countries/reunion.py b/holidays/countries/reunion.py
index a3e82db7..8d43ae4c 100644
--- a/holidays/countries/reunion.py
+++ b/holidays/countries/reunion.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysRE(France):
+class HolidaysRE(ChildEntity, France):
     """Réunion holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,10 @@ class HolidaysRE(France):
 
     country = "RE"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
+    parent_entity_subdivision_code = "974"
     # Cession from the UK on May 30th, 1814.
     start_year = 1815
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "974"
-        super()._populate_public_holidays()
-
 
 class Reunion(HolidaysRE):
     pass
diff --git a/holidays/countries/saint_barthelemy.py b/holidays/countries/saint_barthelemy.py
index 69e4a0ca..34618753 100644
--- a/holidays/countries/saint_barthelemy.py
+++ b/holidays/countries/saint_barthelemy.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysBL(France):
+class HolidaysBL(ChildEntity, France):
     """Saint Barthélemy holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,9 @@ class HolidaysBL(France):
 
     country = "BL"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # Cession from Guadeloupe on July 15th, 2007.
     start_year = 2008
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "BL"
-        super()._populate_public_holidays()
-
 
 class SaintBarthelemy(HolidaysBL):
     pass
diff --git a/holidays/countries/saint_martin.py b/holidays/countries/saint_martin.py
index c9afdd96..1f351a5a 100644
--- a/holidays/countries/saint_martin.py
+++ b/holidays/countries/saint_martin.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysMF(France):
+class HolidaysMF(ChildEntity, France):
     """Saint Martin holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,9 @@ class HolidaysMF(France):
 
     country = "MF"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # Cession from Guadeloupe on July 15th, 2007.
     start_year = 2008
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "MF"
-        super()._populate_public_holidays()
-
 
 class SaintMartin(HolidaysMF):
     pass
diff --git a/holidays/countries/saint_pierre_and_miquelon.py b/holidays/countries/saint_pierre_and_miquelon.py
index 35f099be..cd647fae 100644
--- a/holidays/countries/saint_pierre_and_miquelon.py
+++ b/holidays/countries/saint_pierre_and_miquelon.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysPM(France):
+class HolidaysPM(ChildEntity, France):
     """Saint Pierre and Miquelon holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,9 @@ class HolidaysPM(France):
 
     country = "PM"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # Cession from the UK on May 30th, 1814.
     start_year = 1815
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "PM"
-        super()._populate_public_holidays()
-
 
 class SaintPierreAndMiquelon(HolidaysPM):
     pass
diff --git a/holidays/countries/svalbard_and_jan_mayen.py b/holidays/countries/svalbard_and_jan_mayen.py
index 559926d8..4298899d 100644
--- a/holidays/countries/svalbard_and_jan_mayen.py
+++ b/holidays/countries/svalbard_and_jan_mayen.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.norway import Norway
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysSJ(Norway):
+class HolidaysSJ(ChildEntity, Norway):
     """Svalbard and Jan Mayen holidays.
 
     Alias of Norwegian subdivisions that are also officially assigned
@@ -25,12 +26,7 @@ class HolidaysSJ(Norway):
 
     country = "SJ"
     parent_entity = Norway
-    subdivisions = ()  # Override Norway subdivisions.
-    subdivisions_aliases = {}  # Override Norway subdivisions aliases.
-
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "21"
-        super()._populate_public_holidays()
+    parent_entity_subdivision_code = "21"
 
 
 class SvalbardAndJanMayen(HolidaysSJ):
diff --git a/holidays/countries/turks_and_caicos_islands.py b/holidays/countries/turks_and_caicos_islands.py
index 5e542d94..2a25d96b 100644
--- a/holidays/countries/turks_and_caicos_islands.py
+++ b/holidays/countries/turks_and_caicos_islands.py
@@ -36,7 +36,7 @@ class TurksAndCaicosIslands(ObservedHolidayBase, ChristianHolidays, Internationa
         * [2021](https://www.facebook.com/pressofficetcig/photos/a.349345645161128/3511371698958491/?type=3)
         * [2022](https://www.facebook.com/pressofficetcig/photos/a.349345645161128/4515540038541647/?type=3)
         * [2023](https://web.archive.org/web/20250608202452/https://www.facebook.com/photo/?fbid=557741379734203&set=a.363028765872133)
-        * [2025](https://www.facebook.com/photo/?fbid=1019082573584944&set=a.353200576839817)
+        * [2025](https://web.archive.org/web/20250608202433/https://www.facebook.com/photo/?fbid=1019082573584944&set=a.353200576839817)
         * [Destination TCI](https://web.archive.org/web/20250429024708/https://destinationtci.tc/turks-and-caicos-islands-public-holidays/)
         * [Time and Date](https://web.archive.org/web/20250429024853/https://www.timeanddate.com/holidays/turks-and-caicos-islands/)
     """
diff --git a/holidays/countries/united_states_minor_outlying_islands.py b/holidays/countries/united_states_minor_outlying_islands.py
index 094f433c..abb1c4e1 100644
--- a/holidays/countries/united_states_minor_outlying_islands.py
+++ b/holidays/countries/united_states_minor_outlying_islands.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import GOVERNMENT, PUBLIC, UNOFFICIAL
 from holidays.countries.united_states import UnitedStates
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysUM(UnitedStates):
+class HolidaysUM(ChildEntity, UnitedStates):
     """United States Minor Outlying Islands holidays.
 
     Alias of a US subdivision that is also officially assigned its own country code in ISO 3166-1.
@@ -23,24 +23,9 @@ class HolidaysUM(UnitedStates):
 
     country = "UM"
     parent_entity = UnitedStates
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
-    subdivisions = ()  # Override US subdivisions.
-    subdivisions_aliases = {}  # Override US subdivisions aliases.
     # The first islands were claimed via Guano Islands Act on August 18th, 1856.
     start_year = 1857
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "UM"
-        super()._populate_public_holidays()
-
-    def _populate_government_holidays(self) -> None:
-        self.subdiv = "UM"
-        super()._populate_government_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "UM"
-        super()._populate_unofficial_holidays()
-
 
 class UnitedStatesMinorOutlyingIslands(HolidaysUM):
     pass
diff --git a/holidays/countries/united_states_virgin_islands.py b/holidays/countries/united_states_virgin_islands.py
index 55fd03f8..cd48cebd 100644
--- a/holidays/countries/united_states_virgin_islands.py
+++ b/holidays/countries/united_states_virgin_islands.py
@@ -10,11 +10,11 @@
 #  Website: https://github.com/vacanza/holidays
 #  License: MIT (see LICENSE file)
 
-from holidays.constants import GOVERNMENT, PUBLIC, UNOFFICIAL
 from holidays.countries.united_states import UnitedStates
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysVI(UnitedStates):
+class HolidaysVI(ChildEntity, UnitedStates):
     """United States Virgin Islands (the) holidays.
 
     Alias of a US subdivision that is also officially assigned its own country code in ISO 3166-1.
@@ -23,24 +23,9 @@ class HolidaysVI(UnitedStates):
 
     country = "VI"
     parent_entity = UnitedStates
-    supported_categories = (GOVERNMENT, PUBLIC, UNOFFICIAL)
-    subdivisions = ()  # Override US subdivisions.
-    subdivisions_aliases = {}  # Override US subdivisions aliases.
     # Became a U.S. Territory since March 31st, 1917.
     start_year = 1918
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "VI"
-        super()._populate_public_holidays()
-
-    def _populate_government_holidays(self) -> None:
-        self.subdiv = "VI"
-        super()._populate_government_holidays()
-
-    def _populate_unofficial_holidays(self) -> None:
-        self.subdiv = "VI"
-        super()._populate_unofficial_holidays()
-
 
 class UnitedStatesVirginIslands(HolidaysVI):
     pass
diff --git a/holidays/countries/wallis_and_futuna.py b/holidays/countries/wallis_and_futuna.py
index efa4fa48..24dd1c62 100644
--- a/holidays/countries/wallis_and_futuna.py
+++ b/holidays/countries/wallis_and_futuna.py
@@ -11,9 +11,10 @@
 #  License: MIT (see LICENSE file)
 
 from holidays.countries.france import France
+from holidays.mixins.child_entity import ChildEntity
 
 
-class HolidaysWF(France):
+class HolidaysWF(ChildEntity, France):
     """Wallis and Futuna holidays.
 
     Alias of a French subdivision that is also officially assigned
@@ -26,15 +27,9 @@ class HolidaysWF(France):
 
     country = "WF"
     parent_entity = France
-    subdivisions = ()  # Override France subdivisions.
-    subdivisions_aliases = {}  # Override France subdivisions aliases.
     # Separation from French Caledonia on July 29th, 1961.
     start_year = 1962
 
-    def _populate_public_holidays(self) -> None:
-        self.subdiv = "WF"
-        super()._populate_public_holidays()
-
 
 class WallisAndFutuna(HolidaysWF):
     pass
diff --git a/holidays/holiday_base.py b/holidays/holiday_base.py
index bb2b102d..c9463bb8 100644
--- a/holidays/holiday_base.py
+++ b/holidays/holiday_base.py
@@ -348,11 +348,16 @@ class HolidayBase(dict[date, str]):
             if isinstance(subdiv, int):
                 subdiv = str(subdiv)
 
-            subdivisions_aliases = tuple(sorted(self.subdivisions_aliases))
+            subdivision_aliases = tuple(self.subdivisions_aliases)
+            supported_subdivisions = set(
+                self.subdivisions
+                + subdivision_aliases
+                + self._deprecated_subdivisions
+                + (self.parent_entity.subdivisions if self.parent_entity else ())
+            )
+
             # Unsupported subdivisions.
-            if not isinstance(self, HolidaySum) and subdiv not in (
-                self.subdivisions + subdivisions_aliases + self._deprecated_subdivisions
-            ):
+            if not isinstance(self, HolidaySum) and subdiv not in supported_subdivisions:
                 raise NotImplementedError(
                     f"Entity `{self._entity_code}` does not have subdivision {subdiv}"
                 )
@@ -371,7 +376,7 @@ class HolidayBase(dict[date, str]):
                     "Dec, 1 2023. The list of supported subdivisions: "
                     f"{', '.join(sorted(self.subdivisions))}; "
                     "the list of supported subdivisions aliases: "
-                    f"{', '.join(subdivisions_aliases)}.",
+                    f"{', '.join(sorted(subdivision_aliases))}.",
                     DeprecationWarning,
                 )
 
diff --git a/holidays/locale/ar/LC_MESSAGES/LY.po b/holidays/locale/ar/LC_MESSAGES/LY.po
new file mode 100644
index 00000000..d9924938
--- /dev/null
+++ b/holidays/locale/ar/LC_MESSAGES/LY.po
@@ -0,0 +1,124 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# Libya holidays.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.76\n"
+"POT-Creation-Date: 2025-06-23 01:55+0530\n"
+"PO-Revision-Date: 2025-06-23 01:55+0530\n"
+"Last-Translator: Kriti Birda <workwithkritibirda@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: ar\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Source-Language: ar\n"
+
+#. %s (estimated).
+#, c-format
+msgid "%s (المقدرة)"
+msgstr ""
+
+#. People's Authority Day.
+msgid "عید إعلان سلطة الشعب"
+msgstr ""
+
+#. American Forces Evacuation Day.
+msgid "عيد إجلاء القوات الأمريكية"
+msgstr ""
+
+#. Glorious July Revolution Day.
+msgid "عيد ثورة يوليو المجيدة"
+msgstr ""
+
+#. Great Al-Fateh Revolution Day.
+msgid "عيد الفاتح العظيم"
+msgstr ""
+
+#. Anniversary of the February 17 Revolution.
+msgid "ثورة 17 فبراير"
+msgstr ""
+
+#. Labor Day.
+msgid "عيد العمال"
+msgstr ""
+
+#. National Environmental Sanitation Day.
+msgid "يوم وطني للإصحاح البيئي"
+msgstr ""
+
+#. Martyrs' Day.
+msgid "يوم الشهيد"
+msgstr ""
+
+#. Liberation Day.
+msgid "يوم التحرير"
+msgstr ""
+
+#. Independence Day.
+msgid "عيد الاستقلال"
+msgstr ""
+
+#. Islamic New Year.
+msgid "عيد رأس السنة الهجرية"
+msgstr ""
+
+#. Prophet's Birthday.
+msgid "ذكرى المولد النبوي الشريف"
+msgstr ""
+
+#. Eid al-Fitr.
+msgid "عيد الفطر"
+msgstr ""
+
+#. Day of Arafah.
+msgid "يوم عرفة"
+msgstr ""
+
+#. Eid al-Adha.
+msgid "عيد الأضحى"
+msgstr ""
+
+#. Syrian Revolution Day.
+msgid "عيد ثورة سوريا"
+msgstr ""
+
+#. Anniversary of the Arab League.
+msgid "ذكرى إنشاء الجامعة العربية"
+msgstr ""
+
+#. British Forces Evacuation Day.
+msgid "عيد إجلاء القوات البريطانية"
+msgstr ""
+
+#. Italian Forces Evacuation Day.
+msgid "عيد إجلاء الطليان"
+msgstr ""
+
+#. Ashura.
+msgid "عاشوراء"
+msgstr ""
+
+#. Isra and Mi'raj.
+msgid "ذكرى الإسراء والمعراج"
+msgstr ""
+
+#. Night of Forgiveness.
+msgid "ليلة النصف من شعبان"
+msgstr ""
+
+#. Public Holiday.
+msgid "عطلة رسمية"
+msgstr ""
diff --git a/holidays/locale/en_US/LC_MESSAGES/LY.po b/holidays/locale/en_US/LC_MESSAGES/LY.po
new file mode 100644
index 00000000..e016874b
--- /dev/null
+++ b/holidays/locale/en_US/LC_MESSAGES/LY.po
@@ -0,0 +1,124 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+#
+# Libya holidays en_US localization.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Holidays 0.76\n"
+"POT-Creation-Date: 2025-06-23 01:55+0530\n"
+"PO-Revision-Date: 2025-06-23 01:55+0530\n"
+"Last-Translator: Kriti Birda <workwithkritibirda@gmail.com>\n"
+"Language-Team: Holidays Localization Team\n"
+"Language: en_US\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Generated-By: Lingva 5.0.6\n"
+"X-Source-Language: ar\n"
+
+#. %s (estimated).
+#, c-format
+msgid "%s (المقدرة)"
+msgstr "%s (estimated)"
+
+#. People's Authority Day.
+msgid "عید إعلان سلطة الشعب"
+msgstr "People's Authority Day"
+
+#. American Forces Evacuation Day.
+msgid "عيد إجلاء القوات الأمريكية"
+msgstr "American Forces Evacuation Day"
+
+#. Glorious July Revolution Day.
+msgid "عيد ثورة يوليو المجيدة"
+msgstr "Glorious July Revolution Day"
+
+#. Great Al-Fateh Revolution Day.
+msgid "عيد الفاتح العظيم"
+msgstr "Great Al-Fateh Revolution Day"
+
+#. Anniversary of the February 17 Revolution.
+msgid "ثورة 17 فبراير"
+msgstr "Anniversary of the February 17 Revolution"
+
+#. Labor Day.
+msgid "عيد العمال"
+msgstr "Labor Day"
+
+#. National Environmental Sanitation Day.
+msgid "يوم وطني للإصحاح البيئي"
+msgstr "National Environmental Sanitation Day"
+
+#. Martyrs' Day.
+msgid "يوم الشهيد"
+msgstr "Martyrs' Day"
+
+#. Liberation Day.
+msgid "يوم التحرير"
+msgstr "Liberation Day"
+
+#. Independence Day.
+msgid "عيد الاستقلال"
+msgstr "Independence Day"
+
+#. Islamic New Year.
+msgid "عيد رأس السنة الهجرية"
+msgstr "Islamic New Year"
+
+#. Prophet's Birthday.
+msgid "ذكرى المولد النبوي الشريف"
+msgstr "Prophet's Birthday"
+
+#. Eid al-Fitr.
+msgid "عيد الفطر"
+msgstr "Eid al-Fitr"
+
+#. Day of Arafah.
+msgid "يوم عرفة"
+msgstr "Day of Arafah"
+
+#. Eid al-Adha.
+msgid "عيد الأضحى"
+msgstr "Eid al-Adha"
+
+#. Syrian Revolution Day.
+msgid "عيد ثورة سوريا"
+msgstr "Syrian Revolution Day"
+
+#. Anniversary of the Arab League.
+msgid "ذكرى إنشاء الجامعة العربية"
+msgstr "Anniversary of the Arab League"
+
+#. British Forces Evacuation Day.
+msgid "عيد إجلاء القوات البريطانية"
+msgstr "British Forces Evacuation Day"
+
+#. Italian Forces Evacuation Day.
+msgid "عيد إجلاء الطليان"
+msgstr "Italian Forces Evacuation Day"
+
+#. Ashura.
+msgid "عاشوراء"
+msgstr "Ashura"
+
+#. Isra and Mi'raj.
+msgid "ذكرى الإسراء والمعراج"
+msgstr "Isra and Mi'raj"
+
+#. Night of Forgiveness.
+msgid "ليلة النصف من شعبان"
+msgstr "Night of Forgiveness"
+
+#. Public Holiday.
+msgid "عطلة رسمية"
+msgstr "Public Holiday"
diff --git a/holidays/mixins/__init__.py b/holidays/mixins/__init__.py
new file mode 100644
index 00000000..e86bf258
--- /dev/null
+++ b/holidays/mixins/__init__.py
@@ -0,0 +1,18 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+# ruff: noqa: F401
+
+"""Mixins for the holidays package."""
+
+from holidays.mixins.child_entity import ChildEntity
+from holidays.mixins.preferred_discretionary_holidays import PreferredDiscretionaryHolidays
diff --git a/holidays/mixins/child_entity.py b/holidays/mixins/child_entity.py
new file mode 100644
index 00000000..7298e6ec
--- /dev/null
+++ b/holidays/mixins/child_entity.py
@@ -0,0 +1,43 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+
+from typing import Optional
+
+from holidays.holiday_base import HolidayBase
+
+
+class ChildEntity:
+    """A mixin for child entities that inherit from a parent entity."""
+
+    parent_entity: type[HolidayBase]
+    """The parent entity class."""
+
+    parent_entity_subdivision_code: Optional[str] = None
+    """The parent entity's corresponding ISO 3166-2 subdivision code."""
+
+    subdivisions: tuple[str, ...] = ()
+    """Override parent subdivisions."""
+
+    subdivisions_aliases: dict[str, str] = {}
+    """Override parent subdivisions aliases."""
+
+    def __init__(self, *args, **kwargs):
+        """Initialize the child entity using its country code.
+
+        A child entity always has its own country code that is different from
+        the parent entity's country code but (in majority of cases) is a
+        subdivision of the parent entity. For setting specific subdivision code
+        value use `parent_entity_subdivision_code`.
+        """
+        kwargs["subdiv"] = self.parent_entity_subdivision_code or self.country
+        super().__init__(*args, **kwargs)
diff --git a/holidays/mixins.py b/holidays/mixins/preferred_discretionary_holidays.py
similarity index 100%
rename from holidays/mixins.py
rename to holidays/mixins/preferred_discretionary_holidays.py
diff --git a/holidays/registry.py b/holidays/registry.py
index 967e503d..8456babc 100644
--- a/holidays/registry.py
+++ b/holidays/registry.py
@@ -123,6 +123,7 @@ COUNTRIES: RegistryDict = {
     "laos": ("Laos", "LA", "LAO"),
     "latvia": ("Latvia", "LV", "LVA"),
     "lesotho": ("Lesotho", "LS", "LSO"),
+    "libya": ("Libya", "LY", "LBY"),
     "liechtenstein": ("Liechtenstein", "LI", "LIE"),
     "lithuania": ("Lithuania", "LT", "LTU"),
     "luxembourg": ("Luxembourg", "LU", "LUX"),
diff --git a/requirements/build.txt b/requirements/build.txt
index a8e458ac..bc389995 100644
--- a/requirements/build.txt
+++ b/requirements/build.txt
@@ -1,3 +1,3 @@
 build==1.2.2.post1
-cyclonedx-bom==6.1.1
+cyclonedx-bom==6.1.2
 polib==1.2.0
diff --git a/requirements/dev.txt b/requirements/dev.txt
index 5a10cdf4..b89b03da 100644
--- a/requirements/dev.txt
+++ b/requirements/dev.txt
@@ -8,7 +8,7 @@ lingva==5.0.6
 pre-commit==4.2.0
 pygithub==2.6.1
 requests==2.32.4
-ruff==0.12.0
+ruff==0.12.1
 tox==4.27.0
 urllib3>=2.2.2 # not directly required, pinned by Snyk to avoid a vulnerability
 zipp>=3.19.1 # not directly required, pinned by Snyk to avoid a vulnerability


Test patch:
diff --git a/requirements/tests.txt b/requirements/tests.txt
index f92dc70c..0c4f5967 100644
--- a/requirements/tests.txt
+++ b/requirements/tests.txt
@@ -7,6 +7,6 @@ numpy==2.2.6; python_version == '3.10'
 numpy==2.3.0; python_version >= '3.11'
 polib==1.2.0
 pytest-cov==6.2.1
-pytest-xdist==3.7.0
+pytest-xdist==3.8.0
 pytest==8.4.1
 zipp>=3.19.1; python_version < '3.10' # not directly required, pinned by Snyk to avoid a vulnerability
diff --git a/tests/countries/test_american_samoa.py b/tests/countries/test_american_samoa.py
index 8bd71256..11af4fe3 100644
--- a/tests/countries/test_american_samoa.py
+++ b/tests/countries/test_american_samoa.py
@@ -12,7 +12,6 @@
 
 from unittest import TestCase
 
-from holidays.constants import GOVERNMENT, UNOFFICIAL
 from holidays.countries.american_samoa import HolidaysAS, AmericanSamoa, AS, ASM
 from tests.common import CommonCountryTests
 
@@ -36,30 +35,6 @@ class TestAS(CommonCountryTests, TestCase):
         self.assertHolidayName("Manu'a Islands Cession Day", "2016-07-16")
         self.assertHolidayName("White Sunday", "2016-10-09")
 
-    def test_government_holidays(self):
-        self.assertHolidays(
-            HolidaysAS(categories=GOVERNMENT, years=2024),
-            ("2024-01-01", "New Year's Day"),
-            ("2024-01-15", "Birthday of Martin Luther King, Jr."),
-            ("2024-02-19", "Washington's Birthday"),
-            ("2024-05-27", "Memorial Day"),
-            ("2024-06-19", "Juneteenth National Independence Day"),
-            ("2024-07-04", "Independence Day"),
-            ("2024-09-02", "Labor Day"),
-            ("2024-10-14", "Columbus Day"),
-            ("2024-11-11", "Veterans Day"),
-            ("2024-11-28", "Thanksgiving Day"),
-            ("2024-12-25", "Christmas Day"),
-        )
-
-    def test_unofficial_holidays(self):
-        self.assertHolidays(
-            HolidaysAS(categories=UNOFFICIAL, years=2024),
-            ("2024-02-14", "Valentine's Day"),
-            ("2024-03-17", "Saint Patrick's Day"),
-            ("2024-10-31", "Halloween"),
-        )
-
     def test_l10n_default(self):
         self.assertLocalizedHolidays(
             ("2022-01-01", "New Year's Day"),
diff --git a/tests/countries/test_guam.py b/tests/countries/test_guam.py
index 694cab88..cb3fbf21 100644
--- a/tests/countries/test_guam.py
+++ b/tests/countries/test_guam.py
@@ -12,7 +12,6 @@
 
 from unittest import TestCase
 
-from holidays.constants import GOVERNMENT, UNOFFICIAL
 from holidays.countries.guam import HolidaysGU, Guam, GU, GUM
 from tests.common import CommonCountryTests
 
@@ -37,30 +36,6 @@ class TestGU(CommonCountryTests, TestCase):
         self.assertHolidayName("All Souls' Day", "2016-11-02")
         self.assertHolidayName("Lady of Camarin Day", "2016-12-08")
 
-    def test_government_holidays(self):
-        self.assertHolidays(
-            HolidaysGU(categories=GOVERNMENT, years=2024),
-            ("2024-01-01", "New Year's Day"),
-            ("2024-01-15", "Birthday of Martin Luther King, Jr."),
-            ("2024-02-19", "Washington's Birthday"),
-            ("2024-05-27", "Memorial Day"),
-            ("2024-06-19", "Juneteenth National Independence Day"),
-            ("2024-07-04", "Independence Day"),
-            ("2024-09-02", "Labor Day"),
-            ("2024-10-14", "Columbus Day"),
-            ("2024-11-11", "Veterans Day"),
-            ("2024-11-28", "Thanksgiving Day"),
-            ("2024-12-25", "Christmas Day"),
-        )
-
-    def test_unofficial_holidays(self):
-        self.assertHolidays(
-            HolidaysGU(categories=UNOFFICIAL, years=2024),
-            ("2024-02-14", "Valentine's Day"),
-            ("2024-03-17", "Saint Patrick's Day"),
-            ("2024-10-31", "Halloween"),
-        )
-
     def test_l10n_default(self):
         self.assertLocalizedHolidays(
             ("2022-01-01", "New Year's Day"),
diff --git a/tests/countries/test_libya.py b/tests/countries/test_libya.py
new file mode 100644
index 00000000..88b6e318
--- /dev/null
+++ b/tests/countries/test_libya.py
@@ -0,0 +1,293 @@
+#  holidays
+#  --------
+#  A fast, efficient Python library for generating country, province and state
+#  specific sets of holidays on the fly. It aims to make determining whether a
+#  specific date is a holiday as fast and flexible as possible.
+#
+#  Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file)
+#           dr-prodigy <dr.prodigy.github@gmail.com> (c) 2017-2023
+#           ryanss <ryanssdev@icloud.com> (c) 2014-2017
+#  Website: https://github.com/vacanza/holidays
+#  License: MIT (see LICENSE file)
+
+from unittest import TestCase
+
+from holidays.constants import WORKDAY
+from holidays.countries.libya import Libya, LY, LBY
+from tests.common import CommonCountryTests
+
+
+class TestLibya(CommonCountryTests, TestCase):
+    @classmethod
+    def setUpClass(cls):
+        years = range(1988, 2050)
+        super().setUpClass(Libya, years=years)
+        cls.workday_holidays = Libya(years=years, categories=WORKDAY, islamic_show_estimated=False)
+        cls.no_estimated_holidays = Libya(years=years, islamic_show_estimated=False)
+
+    def test_country_aliases(self):
+        self.assertAliases(Libya, LY, LBY)
+
+    def test_no_holidays(self):
+        self.assertNoHolidays(Libya(years=1987))
+
+    def test_special_holidays(self):
+        self.assertHolidayName("عطلة رسمية", "2023-12-10")
+
+    def test_peoples_authority_day(self):
+        name = "عید إعلان سلطة الشعب"
+        self.assertHolidayName(name, (f"{year}-03-02" for year in range(1988, 2012)))
+        self.assertNoHolidayName(name, range(2012, 2050))
+
+    def test_american_forces_evacuation_day(self):
+        name = "عيد إجلاء القوات الأمريكية"
+        self.assertHolidayName(name, (f"{year}-06-11" for year in range(1988, 2012)))
+        self.assertNoHolidayName(name, range(2012, 2050))
+
+    def test_glorious_july_revolution_day(self):
+        name = "عيد ثورة يوليو المجيدة"
+        self.assertHolidayName(name, (f"{year}-07-23" for year in range(1988, 2012)))
+        self.assertNoHolidayName(name, range(2012, 2050))
+
+    def test_great_al_fateh_day(self):
+        name = "عيد الفاتح العظيم"
+        self.assertHolidayName(name, (f"{year}-09-01" for year in range(1988, 2012)))
+        self.assertNoHolidayName(name, range(2012, 2050))
+
+    def test_anniversary_of_the_february_17_revolution(self):
+        name = "ثورة 17 فبراير"
+        self.assertHolidayName(name, (f"{year}-02-17" for year in range(2012, 2050)))
+        self.assertNoHolidayName(name, range(1988, 2012))
+
+    def test_labor_day(self):
+        name = "عيد العمال"
+        self.assertHolidayName(name, (f"{year}-05-01" for year in range(2012, 2050)))
+        self.assertNoHolidayName(name, range(1988, 2012))
+
+    def test_national_environmental_sanitation_day(self):
+        name = "يوم وطني للإصحاح البيئي"
+        self.assertHolidayName(name, (f"{year}-08-14" for year in range(2022, 2050)))
+        self.assertNoHolidayName(name, range(1988, 2022))
+
+    def test_martyrs_day(self):
+        name = "يوم الشهيد"
+        self.assertHolidayName(name, (f"{year}-09-16" for year in range(2012, 2050)))
+        self.assertNoHolidayName(name, range(1988, 2012))
+
+    def test_liberation_day(self):
+        name = "يوم التحرير"
+        self.assertHolidayName(name, (f"{year}-10-23" for year in range(2012, 2050)))
+        self.assertNoHolidayName(name, range(1988, 2012))
+
+    def test_independence_day(self):
+        name = "عيد الاستقلال"
+        self.assertHolidayName(name, (f"{year}-12-24" for year in range(2012, 2050)))
+        self.assertNoHolidayName(name, range(1988, 2012))
+
+    def test_islamic_new_year(self):
+        name = "عيد رأس السنة الهجرية"
+        self.assertHolidayName(
+            name,
+            "2021-08-10",
+            "2022-07-30",
+            "2023-07-19",
+            "2024-07-07",
+            "2025-06-26",
+        )
+        self.assertHolidayName(name, self.no_estimated_holidays, range(2012, 2050))
+        self.assertNoHolidayName(name, self.no_estimated_holidays, range(1988, 2012))
+        self.assertHolidayName(name, self.workday_holidays, range(1988, 2012))
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_prophets_birthday(self):
+        name = "ذكرى المولد النبوي الشريف"
+        self.assertHolidayName(
+            name,
+            "2020-10-29",
+            "2021-10-19",
+            "2022-10-08",
+            "2023-09-27",
+            "2024-09-15",
+        )
+        self.assertHolidayName(name, self.no_estimated_holidays, range(1988, 2050))
+
+    def test_eid_al_fitr(self):
+        name = "عيد الفطر"
+        self.assertHolidayName(
+            name,
+            "2023-04-21",
+            "2023-04-22",
+            "2023-04-23",
+            "2024-04-10",
+            "2024-04-11",
+            "2024-04-12",
+            "2025-03-31",
+            "2025-04-01",
+            "2025-04-02",
+        )
+        self.assertHolidayName(name, self.no_estimated_holidays, range(1988, 2050))
+
+    def test_day_of_arafah(self):
+        name = "يوم عرفة"
+        self.assertHolidayName(
+            name,
+            "2020-07-30",
+            "2021-07-19",
+            "2022-07-08",
+            "2023-06-27",
+            "2024-06-15",
+            "2025-06-05",
+        )
+        self.assertHolidayName(name, self.no_estimated_holidays, range(1988, 2050))
+
+    def test_eid_al_adha(self):
+        name = "عيد الأضحى"
+        self.assertHolidayName(
+            name,
+            "2023-06-28",
+            "2023-06-29",
+            "2023-06-30",
+            "2024-06-16",
+            "2024-06-17",
+            "2024-06-18",
+            "2025-06-06",
+            "2025-06-07",
+            "2025-06-08",
+        )
+        self.assertHolidayName(name, self.no_estimated_holidays, range(1988, 2050))
+
+    def test_syrian_revolution_day(self):
+        name = "عيد ثورة سوريا"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-03-08" for year in range(1988, 2012))
+        )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_anniversary_of_arab_league(self):
+        name = "ذكرى إنشاء الجامعة العربية"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-03-22" for year in range(1988, 2012))
+        )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_british_forces_evacuation_day(self):
+        name = "عيد إجلاء القوات البريطانية"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-03-28" for year in range(1988, 2012))
+        )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_italian_forces_evacuation_day(self):
+        name = "عيد إجلاء الطليان"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name, self.workday_holidays, (f"{year}-10-07" for year in range(1988, 2012))
+        )
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_ashura_day(self):
+        name = "عاشوراء"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name,
+            self.workday_holidays,
+            "1988-08-22",
+            "1989-08-11",
+            "1990-08-01",
+            "2010-12-16",
+            "2011-12-05",
+        )
+        self.assertHolidayName(name, self.workday_holidays, range(1988, 2012))
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_isra_and_miraj_day(self):
+        name = "ذكرى الإسراء والمعراج"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name,
+            self.workday_holidays,
+            "1988-03-15",
+            "1989-03-05",
+            "1990-02-22",
+            "2010-07-09",
+            "2011-06-29",
+        )
+        self.assertHolidayName(name, self.workday_holidays, range(1988, 2012))
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_night_of_forgiveness(self):
+        name = "ليلة النصف من شعبان"
+        self.assertNoHolidayName(name)
+        self.assertHolidayName(
+            name,
+            self.workday_holidays,
+            "1988-04-02",
+            "1989-03-22",
+            "1990-03-12",
+            "2010-07-27",
+            "2011-07-16",
+        )
+        self.assertHolidayName(name, self.workday_holidays, range(1988, 2012))
+        self.assertNoHolidayName(name, self.workday_holidays, range(2012, 2050))
+
+    def test_2024(self):
+        self.assertHolidays(
+            Libya(years=2024),
+            ("2024-02-17", "ثورة 17 فبراير"),
+            ("2024-04-10", "عيد الفطر"),
+            ("2024-04-11", "عيد الفطر"),
+            ("2024-04-12", "عيد الفطر"),
+            ("2024-05-01", "عيد العمال"),
+            ("2024-06-15", "يوم عرفة"),
+            ("2024-06-16", "عيد الأضحى"),
+            ("2024-06-17", "عيد الأضحى"),
+            ("2024-06-18", "عيد الأضحى"),
+            ("2024-07-07", "عيد رأس السنة الهجرية"),
+            ("2024-08-14", "يوم وطني للإصحاح البيئي"),
+            ("2024-09-15", "ذكرى المولد النبوي الشريف"),
+            ("2024-09-16", "يوم الشهيد"),
+            ("2024-10-23", "يوم التحرير"),
+            ("2024-12-24", "عيد الاستقلال"),
+        )
+
+    def test_l10n_default(self):
+        self.assertLocalizedHolidays(
+            ("2025-02-17", "ثورة 17 فبراير"),
+            ("2025-03-31", "عيد الفطر"),
+            ("2025-04-01", "عيد الفطر"),
+            ("2025-04-02", "عيد الفطر"),
+            ("2025-05-01", "عيد العمال"),
+            ("2025-06-05", "يوم عرفة"),
+            ("2025-06-06", "عيد الأضحى"),
+            ("2025-06-07", "عيد الأضحى"),
+            ("2025-06-08", "عيد الأضحى"),
+            ("2025-06-26", "عيد رأس السنة الهجرية"),
+            ("2025-08-14", "يوم وطني للإصحاح البيئي"),
+            ("2025-09-04", "ذكرى المولد النبوي الشريف (المقدرة)"),
+            ("2025-09-16", "يوم الشهيد"),
+            ("2025-10-23", "يوم التحرير"),
+            ("2025-12-24", "عيد الاستقلال"),
+        )
+
+    def test_l10n_en_us(self):
+        self.assertLocalizedHolidays(
+            "en_US",
+            ("2025-02-17", "Anniversary of the February 17 Revolution"),
+            ("2025-03-31", "Eid al-Fitr"),
+            ("2025-04-01", "Eid al-Fitr"),
+            ("2025-04-02", "Eid al-Fitr"),
+            ("2025-05-01", "Labor Day"),
+            ("2025-06-05", "Day of Arafah"),
+            ("2025-06-06", "Eid al-Adha"),
+            ("2025-06-07", "Eid al-Adha"),
+            ("2025-06-08", "Eid al-Adha"),
+            ("2025-06-26", "Islamic New Year"),
+            ("2025-08-14", "National Environmental Sanitation Day"),
+            ("2025-09-04", "Prophet's Birthday (estimated)"),
+            ("2025-09-16", "Martyrs' Day"),
+            ("2025-10-23", "Liberation Day"),
+            ("2025-12-24", "Independence Day"),
+        )
diff --git a/tests/countries/test_northern_mariana_islands.py b/tests/countries/test_northern_mariana_islands.py
index 84af04f7..dee6951c 100644
--- a/tests/countries/test_northern_mariana_islands.py
+++ b/tests/countries/test_northern_mariana_islands.py
@@ -12,7 +12,6 @@
 
 from unittest import TestCase
 
-from holidays.constants import GOVERNMENT, UNOFFICIAL
 from holidays.countries.northern_mariana_islands import HolidaysMP, NorthernMarianaIslands, MP, MNP
 from tests.common import CommonCountryTests
 
@@ -38,30 +37,6 @@ class TestMP(CommonCountryTests, TestCase):
         self.assertHolidayName("Election Day", "2016-11-08")
         self.assertHolidayName("Constitution Day", "2016-12-08")
 
-    def test_government_holidays(self):
-        self.assertHolidays(
-            HolidaysMP(categories=GOVERNMENT, years=2024),
-            ("2024-01-01", "New Year's Day"),
-            ("2024-01-15", "Birthday of Martin Luther King, Jr."),
-            ("2024-02-19", "Washington's Birthday"),
-            ("2024-05-27", "Memorial Day"),
-            ("2024-06-19", "Juneteenth National Independence Day"),
-            ("2024-07-04", "Independence Day"),
-            ("2024-09-02", "Labor Day"),
-            ("2024-10-14", "Columbus Day"),
-            ("2024-11-11", "Veterans Day"),
-            ("2024-11-28", "Thanksgiving Day"),
-            ("2024-12-25", "Christmas Day"),
-        )
-
-    def test_unofficial_holidays(self):
-        self.assertHolidays(
-            HolidaysMP(categories=UNOFFICIAL, years=2024),
-            ("2024-02-14", "Valentine's Day"),
-            ("2024-03-17", "Saint Patrick's Day"),
-            ("2024-10-31", "Halloween"),
-        )
-
     def test_l10n_default(self):
         self.assertLocalizedHolidays(
             ("2022-01-01", "New Year's Day"),
diff --git a/tests/countries/test_puerto_rico.py b/tests/countries/test_puerto_rico.py
index 185349b8..0b8f2bbe 100644
--- a/tests/countries/test_puerto_rico.py
+++ b/tests/countries/test_puerto_rico.py
@@ -12,7 +12,6 @@
 
 from unittest import TestCase
 
-from holidays.constants import GOVERNMENT, UNOFFICIAL
 from holidays.countries.puerto_rico import HolidaysPR, PuertoRico, PR, PRI
 from tests.common import CommonCountryTests
 
@@ -38,30 +37,6 @@ class TestPR(CommonCountryTests, TestCase):
         self.assertHolidayName("Constitution Day", "2016-07-25")
         self.assertHolidayName("Discovery Day", "2016-11-19")
 
-    def test_government_holidays(self):
-        self.assertHolidays(
-            HolidaysPR(categories=GOVERNMENT, years=2024),
-            ("2024-01-01", "New Year's Day"),
-            ("2024-01-15", "Birthday of Martin Luther King, Jr."),
-            ("2024-02-19", "Washington's Birthday"),
-            ("2024-05-27", "Memorial Day"),
-            ("2024-06-19", "Juneteenth National Independence Day"),
-            ("2024-07-04", "Independence Day"),
-            ("2024-09-02", "Labor Day"),
-            ("2024-10-14", "Columbus Day"),
-            ("2024-11-11", "Veterans Day"),
-            ("2024-11-28", "Thanksgiving Day"),
-            ("2024-12-25", "Christmas Day"),
-        )
-
-    def test_unofficial_holidays(self):
-        self.assertHolidays(
-            HolidaysPR(categories=UNOFFICIAL, years=2024),
-            ("2024-02-14", "Valentine's Day"),
-            ("2024-03-17", "Saint Patrick's Day"),
-            ("2024-10-31", "Halloween"),
-        )
-
     def test_l10n_default(self):
         self.assertLocalizedHolidays(
             ("2022-01-01", "New Year's Day"),
diff --git a/tests/countries/test_united_states_minor_outlying_islands.py b/tests/countries/test_united_states_minor_outlying_islands.py
index f039b953..9d71ee62 100644
--- a/tests/countries/test_united_states_minor_outlying_islands.py
+++ b/tests/countries/test_united_states_minor_outlying_islands.py
@@ -12,7 +12,6 @@
 
 from unittest import TestCase
 
-from holidays.constants import GOVERNMENT, UNOFFICIAL
 from holidays.countries.united_states_minor_outlying_islands import (
     HolidaysUM,
     UnitedStatesMinorOutlyingIslands,
@@ -48,30 +47,6 @@ class TestUM(CommonCountryTests, TestCase):
             ("2024-12-25", "Christmas Day"),
         )
 
-    def test_government_holidays(self):
-        self.assertHolidays(
-            HolidaysUM(categories=GOVERNMENT, years=2024),
-            ("2024-01-01", "New Year's Day"),
-            ("2024-01-15", "Birthday of Martin Luther King, Jr."),
-            ("2024-02-19", "Washington's Birthday"),
-            ("2024-05-27", "Memorial Day"),
-            ("2024-06-19", "Juneteenth National Independence Day"),
-            ("2024-07-04", "Independence Day"),
-            ("2024-09-02", "Labor Day"),
-            ("2024-10-14", "Columbus Day"),
-            ("2024-11-11", "Veterans Day"),
-            ("2024-11-28", "Thanksgiving Day"),
-            ("2024-12-25", "Christmas Day"),
-        )
-
-    def test_unofficial_holidays(self):
-        self.assertHolidays(
-            HolidaysUM(categories=UNOFFICIAL, years=2024),
-            ("2024-02-14", "Valentine's Day"),
-            ("2024-03-17", "Saint Patrick's Day"),
-            ("2024-10-31", "Halloween"),
-        )
-
     def test_l10n_default(self):
         self.assertLocalizedHolidays(
             ("2022-01-01", "New Year's Day"),
diff --git a/tests/countries/test_united_states_virgin_islands.py b/tests/countries/test_united_states_virgin_islands.py
index 8ffbb3b9..89cf4b7f 100644
--- a/tests/countries/test_united_states_virgin_islands.py
+++ b/tests/countries/test_united_states_virgin_islands.py
@@ -12,7 +12,6 @@
 
 from unittest import TestCase
 
-from holidays.constants import GOVERNMENT, UNOFFICIAL
 from holidays.countries.united_states_virgin_islands import (
     HolidaysVI,
     UnitedStatesVirginIslands,
@@ -47,30 +46,6 @@ class TestVI(CommonCountryTests, TestCase):
         self.assertHolidayName("Liberty Day", "2016-11-01")
         self.assertHolidayName("Christmas Second Day", "2016-12-26")
 
-    def test_government_holidays(self):
-        self.assertHolidays(
-            HolidaysVI(categories=GOVERNMENT, years=2024),
-            ("2024-01-01", "New Year's Day"),
-            ("2024-01-15", "Birthday of Martin Luther King, Jr."),
-            ("2024-02-19", "Washington's Birthday"),
-            ("2024-05-27", "Memorial Day"),
-            ("2024-06-19", "Juneteenth National Independence Day"),
-            ("2024-07-04", "Independence Day"),
-            ("2024-09-02", "Labor Day"),
-            ("2024-10-14", "Columbus Day"),
-            ("2024-11-11", "Veterans Day"),
-            ("2024-11-28", "Thanksgiving Day"),
-            ("2024-12-25", "Christmas Day"),
-        )
-
-    def test_unofficial_holidays(self):
-        self.assertHolidays(
-            HolidaysVI(categories=UNOFFICIAL, years=2024),
-            ("2024-02-14", "Valentine's Day"),
-            ("2024-03-17", "Saint Patrick's Day"),
-            ("2024-10-31", "Halloween"),
-        )
-
     def test_l10n_default(self):
         self.assertLocalizedHolidays(
             ("2022-01-01", "New Year's Day"),
diff --git a/tests/test_ical.py b/tests/test_ical.py
index b29ef015..5481836c 100644
--- a/tests/test_ical.py
+++ b/tests/test_ical.py
@@ -45,8 +45,8 @@ class TestIcalExporter(TestCase):
         self.exporter.generate = MagicMock(return_value=b"BEGIN:VCALENDAR...END:VCALENDAR")
         self.id_holidays = country_holidays("ID", years=2000, language="en_US")
         self.jp_holidays = country_holidays("JP", years=2000, language="ja")
-        self.th_holidays = country_holidays("TH", years=2024)
-        self.us_holidays = country_holidays("US", years=2024)
+        self.th_holidays = country_holidays("TH", years=2024, language="th")
+        self.us_holidays = country_holidays("US", years=2024, language="en_US")
         self.id_exporter = ICalExporter(self.id_holidays)
         self.jp_exporter = ICalExporter(self.jp_holidays)
         self.th_exporter = ICalExporter(self.th_holidays)
@@ -250,7 +250,7 @@ class TestIcalExporter(TestCase):
     def test_single_holiday_multiple_date_continuous_overlap(self):
         # "День міжнародної солідарності трудящих" x2
         # but 2005-05-01 got "Великдень (Пасха)" as well.
-        ua_holidays = country_holidays("UA", years=2005)
+        ua_holidays = country_holidays("UA", years=2005, language="uk")
         output = ICalExporter(ua_holidays).generate()
 
         labor_day_count = output.count("SUMMARY:День міжнародної солідарності трудя\r\n щих\r\n")