diff --git a/quasar-wayland.cabal b/quasar-wayland.cabal
index 555283e80e4fc53012e8060177aef5939fbaf512..2acb8c1f0ada5ffeb70dd0e337da8ea85225b03b 100644
--- a/quasar-wayland.cabal
+++ b/quasar-wayland.cabal
@@ -87,11 +87,12 @@ library
     Quasar.Wayland.Connection
     Quasar.Wayland.Display
     Quasar.Wayland.Protocol
-    Quasar.Wayland.Protocol.Core
     Quasar.Wayland.Protocol.Display
     Quasar.Wayland.Protocol.Generated
     Quasar.Wayland.Protocol.TH
     Quasar.Wayland.Registry
+  other-modules:
+    Quasar.Wayland.Protocol.Core
   build-depends:
     base >=4.7 && <5,
     binary,
diff --git a/src/Quasar/Wayland/Client.hs b/src/Quasar/Wayland/Client.hs
index 8ecd959620f372c7e3342c2fbc06a8b3e3bb7dd0..9401c948c619ce1616422caab65076aaddcf659e 100644
--- a/src/Quasar/Wayland/Client.hs
+++ b/src/Quasar/Wayland/Client.hs
@@ -14,8 +14,6 @@ import Quasar.Prelude
 import Quasar.Wayland.Connection
 import Quasar.Wayland.Display
 import Quasar.Wayland.Protocol
-import Quasar.Wayland.Protocol.Core
-import Quasar.Wayland.Protocol.Generated
 import System.Environment (getEnv, lookupEnv)
 import System.FilePath ((</>), isRelative)
 import Text.Read (readEither)
diff --git a/src/Quasar/Wayland/Connection.hs b/src/Quasar/Wayland/Connection.hs
index 3baae689b4356f535d46d343287121a2ac5cca88..5b5f1dbf10a75e302ad3c332b68eb151b996a9e7 100644
--- a/src/Quasar/Wayland/Connection.hs
+++ b/src/Quasar/Wayland/Connection.hs
@@ -13,7 +13,7 @@ import Network.Socket.ByteString qualified as Socket
 import Network.Socket.ByteString.Lazy qualified as SocketL
 import Quasar
 import Quasar.Prelude
-import Quasar.Wayland.Protocol.Core
+import Quasar.Wayland.Protocol
 
 
 data WaylandConnection s = WaylandConnection {
diff --git a/src/Quasar/Wayland/Display.hs b/src/Quasar/Wayland/Display.hs
index 5c2fbb5b5e407d0592e015c7a69afdfdb1cd069a..7130da200922e71776771de371b6d3ccff651e7f 100644
--- a/src/Quasar/Wayland/Display.hs
+++ b/src/Quasar/Wayland/Display.hs
@@ -8,7 +8,7 @@ import Control.Monad.Catch
 import Data.ByteString.UTF8 qualified as BS
 import Data.HashMap.Strict qualified as HM
 import Quasar.Prelude
-import Quasar.Wayland.Protocol.Core
+import Quasar.Wayland.Protocol
 import Quasar.Wayland.Protocol.Display
 import Quasar.Wayland.Protocol.Generated
 import Quasar.Wayland.Registry
diff --git a/src/Quasar/Wayland/Protocol.hs b/src/Quasar/Wayland/Protocol.hs
index e0b431ced7d93c6f358d23ac11c184a3505f325c..1d6aceacd12e49e623d8426425ad29361fd597f3 100644
--- a/src/Quasar/Wayland/Protocol.hs
+++ b/src/Quasar/Wayland/Protocol.hs
@@ -1,2 +1,45 @@
 module Quasar.Wayland.Protocol (
+  -- * Wayland wire protocol
+  -- | This module exports everything required to implement Wayland interfaces generated by
+  -- 'Quasar.Wayland.Protocol.TH'.
+
+  -- ** Wire types
+  ObjectId,
+  GenericObjectId,
+  NewId(..),
+  Fixed(..),
+
+  -- ** Classes for generated interfaces
+  IsInterface(Request, Event, InterfaceName, interfaceName),
+  Side(..),
+  IsSide(Up, Down),
+  IsInterfaceSide,
+
+  -- ** Protocol execution
+  ProtocolHandle,
+  initializeProtocol,
+  feedInput,
+  takeOutbox,
+  setException,
+
+  -- ** Low-level protocol interaction
+  ProtocolM,
+  runProtocolM,
+  Object,
+  newObject,
+  sendMessage,
+
+  Callback(..),
+  internalFnCallback,
+  traceCallback,
+  ignoreMessage,
+
+  -- * Protocol exceptions
+  CallbackFailed(..),
+  ParserFailed(..),
+  ProtocolException(..),
+  MaximumIdReached(..),
+  ServerError(..),
 ) where
+
+import Quasar.Wayland.Protocol.Core
diff --git a/src/Quasar/Wayland/Protocol/Core.hs b/src/Quasar/Wayland/Protocol/Core.hs
index 496545617dcc0cac7e5842e06f3d251e8c3a912c..739ef224a0f363025f2bb917d1a12f3e304b6472 100644
--- a/src/Quasar/Wayland/Protocol/Core.hs
+++ b/src/Quasar/Wayland/Protocol/Core.hs
@@ -3,10 +3,10 @@
 module Quasar.Wayland.Protocol.Core (
   ObjectId,
   GenericObjectId,
-  NewId(..),
+  NewId,
   Opcode,
   ArgumentType(..),
-  Fixed,
+  Fixed(..),
   IsSide(..),
   Side(..),
   IsInterface(..),
diff --git a/src/Quasar/Wayland/Registry.hs b/src/Quasar/Wayland/Registry.hs
index 0e47877f482fdf77176db037b0ec063818d56703..23555aa9dd3d8e8763965fde3947273bde1b0965 100644
--- a/src/Quasar/Wayland/Registry.hs
+++ b/src/Quasar/Wayland/Registry.hs
@@ -11,7 +11,7 @@ import Data.ByteString.UTF8 qualified as BS
 import Data.HashMap.Strict qualified as HM
 import Data.Tuple (swap)
 import Quasar.Prelude
-import Quasar.Wayland.Protocol.Core
+import Quasar.Wayland.Protocol
 import Quasar.Wayland.Protocol.Generated
 
 data ClientRegistry = ClientRegistry {