diff --git a/PowerDNS/API/Zones.hs b/PowerDNS/API/Zones.hs
--- a/PowerDNS/API/Zones.hs
+++ b/PowerDNS/API/Zones.hs
@@ -27,13 +27,15 @@
 where
 
 import           Data.Char (toUpper)
+import           Data.Coerce (coerce)
 import           Data.Data (Data)
 import           Data.Word (Word32)
 
 import           Control.DeepSeq (NFData)
 import           Data.Aeson (FromJSON(..), ToJSON(..), allNullaryToStringTag,
-                             defaultOptions, fieldLabelModifier, constructorTagModifier,
-                             genericParseJSON, genericToJSON, omitNothingFields)
+                             constructorTagModifier, defaultOptions,
+                             fieldLabelModifier, genericParseJSON,
+                             genericToJSON, omitNothingFields)
 import qualified Data.Text as T
 import           Data.Time.Clock.POSIX (POSIXTime)
 import           Servant.API
@@ -88,6 +90,9 @@
 
 -- | Zone according to [PowerDNS Documentation](https://doc.powerdns.com/authoritative/http-api/zone.html#zone).
 -- All fields are optional because the PowerDNS API differs on which fields are required depending on the endpoint.
+--
+-- Note that the 'Eq' instance is up to limited case-sensitivity on 'zone_name' and equivalently contained rrset names
+-- as per [RFC4343](https://datatracker.ietf.org/doc/html/rfc4343)
 data Zone = Zone
   { zone_id :: Maybe T.Text
   , zone_name :: Maybe T.Text
@@ -111,8 +116,33 @@
   , zone_nameservers :: Maybe [T.Text]
   , zone_master_tsig_key_ids :: Maybe [T.Text]
   , zone_slave_tsig_key_ids :: Maybe [T.Text]
-  } deriving (Eq, Ord, Show, Generic, NFData, Data, Empty)
+  } deriving (Ord, Show, Generic, NFData, Data, Empty)
 
+instance Eq Zone where
+  l == r
+    = zone_id l == zone_id r
+   && (coerce (zone_name l) :: Maybe CI) == (coerce (zone_name r) :: Maybe CI)
+   && zone_type l == zone_type r
+   && zone_url l == zone_url r
+   && zone_kind l == zone_kind r
+   && zone_rrsets l == zone_rrsets r
+   && zone_serial l == zone_serial r
+   && zone_notified_serial l == zone_notified_serial r
+   && zone_edited_serial l == zone_edited_serial r
+   && zone_masters l == zone_masters r
+   && zone_dnssec l == zone_dnssec r
+   && zone_nsec3param l == zone_nsec3param r
+   && zone_nsec3narrow l == zone_nsec3narrow r
+   && zone_presigned l == zone_presigned r
+   && zone_soa_edit l == zone_soa_edit r
+   && zone_soa_edit_api l == zone_soa_edit_api r
+   && zone_api_rectify l == zone_api_rectify r
+   && zone_zone l == zone_zone r
+   && zone_account l == zone_account r
+   && zone_nameservers l == zone_nameservers r
+   && zone_master_tsig_key_ids l == zone_master_tsig_key_ids r
+   && zone_slave_tsig_key_ids l == zone_slave_tsig_key_ids r
+
 instance ToJSON Zone where
   toJSON = genericToJSON defaultOptions { fieldLabelModifier = strip "zone_"}
 
@@ -142,7 +172,43 @@
 
 ----------------------------------------------------------------------------------------
 
+newtype CI = CI T.Text
+
+instance Eq CI where
+  CI l == CI r = T.map caseFold l == T.map caseFold r
+    where
+        caseFold x = case x of
+            'A' -> 'a'
+            'B' -> 'b'
+            'C' -> 'c'
+            'D' -> 'd'
+            'E' -> 'e'
+            'F' -> 'f'
+            'G' -> 'g'
+            'H' -> 'h'
+            'I' -> 'i'
+            'J' -> 'j'
+            'K' -> 'k'
+            'L' -> 'l'
+            'M' -> 'm'
+            'N' -> 'n'
+            'O' -> 'o'
+            'P' -> 'p'
+            'Q' -> 'q'
+            'R' -> 'r'
+            'S' -> 's'
+            'T' -> 't'
+            'U' -> 'u'
+            'V' -> 'v'
+            'W' -> 'w'
+            'X' -> 'x'
+            'Y' -> 'y'
+            'Z' -> 'z'
+            _   -> x
+
 -- | RRSet according to [PowerDNS Documentation](https://doc.powerdns.com/authoritative/http-api/zone.html#rrset).
+--
+-- Note that the 'Eq' instance is up to limited case-sensitivity on 'rrset_name' as per [RFC4343](https://datatracker.ietf.org/doc/html/rfc4343)
 data RRSet = RRSet
   { rrset_name :: T.Text
   , rrset_type :: RecordType
@@ -150,7 +216,16 @@
   , rrset_changetype :: Maybe ChangeType
   , rrset_records :: Maybe [Record]
   , rrset_comments :: Maybe [Comment]
-  } deriving (Eq, Ord, Show, Generic, NFData, Data)
+  } deriving (Ord, Show, Generic, NFData, Data)
+
+instance Eq RRSet where
+  l == r =
+     (coerce (rrset_name l) :: CI) == (coerce (rrset_name r) :: CI)
+   && rrset_type l == rrset_type r
+   && rrset_ttl l == rrset_ttl r
+   && rrset_changetype l == rrset_changetype r
+   && rrset_records l == rrset_records r
+   && rrset_comments l == rrset_comments r
 
 instance ToJSON RRSet where
   toJSON = genericToJSON defaultOptions { fieldLabelModifier = strip "rrset_"
diff --git a/powerdns.cabal b/powerdns.cabal
--- a/powerdns.cabal
+++ b/powerdns.cabal
@@ -1,6 +1,6 @@
 cabal-version:      >=1.10
 name:               powerdns
-version:            0.2.1
+version:            0.2.2
 license:            BSD3
 license-file:       LICENSE
 copyright:          (c) 2021 Victor Nawothnig
diff --git a/spec/Spec.hs b/spec/Spec.hs
--- a/spec/Spec.hs
+++ b/spec/Spec.hs
@@ -20,7 +20,7 @@
 
 {-# NOINLINE baseUrl #-}
 baseUrl :: BaseUrl
-baseUrl = unsafePerformIO (parseBaseUrl "pdns:8081")
+baseUrl = unsafePerformIO (parseBaseUrl "localhost:8081")
 
 envNoAuth :: ClientEnv
 envNoAuth = mkClientEnv mgr baseUrl
@@ -32,7 +32,8 @@
 main = defaultMain tree
 
 tree :: TestTree
-tree = testGroup "All specs" [ versionSpec
+tree = testGroup "All specs" [ otherSpecs
+                             , versionSpec
                              , authSpecs
                              , zoneSpecs
                              ]
@@ -44,6 +45,26 @@
 runOk c = do
   r <- run c
   assertRight "ClientM result" r
+
+otherSpecs :: TestTree
+otherSpecs = testGroup "Case-sensitivity"
+    [ testCase "RRSet does case-insensitive comparison on ASCII codepoints" $
+        assertEqual "" (RRSet "Foo." A 0 Nothing Nothing Nothing)
+                       (RRSet "foo." A 0 Nothing Nothing Nothing)
+
+    , testCase "RRSet does case-sensitive comparison on non-ASCII codepoints" $
+       assertBool "" ((RRSet "\335." A 0 Nothing Nothing Nothing) /=
+                      (RRSet "\375." A 0 Nothing Nothing Nothing))
+
+    , testCase "Zone does case-insensitive comparison on ASCII codepoints" $
+        assertEqual "" (empty { zone_name = Just "Foo." })
+                       (empty { zone_name = Just "foo." })
+
+    , testCase "Zone does case-sensitive comparison on non-ASCII codepoints" $
+        assertBool "" ((empty { zone_name = Just "\335." }) /=
+                       (empty { zone_name = Just "\375." }))
+
+    ]
 
 versionSpec :: TestTree
 versionSpec = testCase "Verifies API version" $ do
