diff --git a/Control/Monad/Royal.hs b/Control/Monad/Royal.hs
new file mode 100644
--- /dev/null
+++ b/Control/Monad/Royal.hs
@@ -0,0 +1,61 @@
+{-# LANGUAGE UndecidableInstances,FlexibleInstances,MultiParamTypeClasses #-}
+module Control.Monad.Royal where
+{-
+
+Royal Monads (or relative polymonads) generalize monads, polymonads _and_ relative monads.
+
+Therefore Royal Monads (captalize to emphasise royalness) are the king of monads! 
+
+The ultimate abstraction! 
+
+Ditch your boring old (relative) (poly) monad, and start programming
+with the king of monads! 
+
+Bow before the ultimate generality of the Royal Monad, infidels!
+-}
+
+class RoyalReturn m r where
+  royalReturn :: r a -> m a
+
+class (RoyalReturn m r, RoyalReturn n r, RoyalReturn p r) => 
+     RoyalMonad m n p r where
+  royalBind   :: m a -> (r a -> n a) -> p a
+  -- laws:
+  -- royalBind m royalReturn = m
+  -- royalBind (royalReturn x) f = f x 
+  -- royalBind m (\x -> royalBind (f x) g) = royalBind (royalBind m f) g
+
+
+
+
+class RoyalReturn m r => RelMonad m r where
+  relativeBind :: m a -> (r a -> m b) -> m b
+  -- laws:
+  -- relativeBind m royalReturn = m
+  -- relativeBind (royalReturn x) f = f x 
+  -- relativeBind m (\x -> relativeBind (f x) g) = relativeBind (relativeBind m f) g
+
+class NonRoyalReturn m where
+  rreturn :: a -> m a
+
+class (NonRoyalReturn m, NonRoyalReturn n, NonRoyalReturn p) =>
+    PolyMonad m n p where
+  polyBind :: m a -> (a -> n b) -> p b
+  -- laws:
+  -- polyBind m rreturn = m
+  -- polyBind (rreturn x) f = f x 
+  -- polyBind m (\x -> polyBind (f x) g) = polyBind (polyBind m f) g
+
+newtype Id a = Id { fromId :: a} 
+
+instance NonRoyalReturn m => RoyalReturn m Id where
+  royalReturn (Id x) = rreturn x
+
+instance PolyMonad m n p => RoyalMonad m n p Id where
+  royalBind m f = polyBind m (f . Id)
+
+instance Monad m => NonRoyalReturn m where
+  rreturn = return
+
+instance Monad m => RoyalMonad m m m Id where
+  royalBind m f = m >>= (f . Id)
diff --git a/RoyalMonad.cabal b/RoyalMonad.cabal
new file mode 100644
--- /dev/null
+++ b/RoyalMonad.cabal
@@ -0,0 +1,20 @@
+Name:                RoyalMonad
+Version:             1000.0
+Synopsis:	     All hail the Royal Monad!
+Description:         All hail the Royal Monad!
+License:             BSD3
+Author:              Atze van der Ploeg
+Maintainer:          atzeus@gmail.com
+Homepage:            https://github.com/atzeus/RoyalMonad
+Build-Type:          Simple
+Cabal-Version:       >=1.6
+Category:            Control
+Tested-With:         GHC==7.10.1
+Library
+  Build-Depends: base >= 2 && < 10
+  Exposed-modules: Control.Monad.Royal
+  Extensions:	  UndecidableInstances,FlexibleInstances,MultiParamTypeClasses
+
+source-repository head
+    type:     git
+    location: https://github.com/atzeus/RoyalMonad
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
