diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -205,3 +205,8 @@
 Chatting about features is a key part of Eve's development; come join us in
 the [Chat Room](https://gitter.im/eve-framework/Lobby) to discuss features or 
 improvements!
+
+Related Works
+=============
+
+- [Emulating traditional imperative event loops with functional paradigms](./paper/functional-event-loops.pdf)
diff --git a/eve.cabal b/eve.cabal
--- a/eve.cabal
+++ b/eve.cabal
@@ -1,5 +1,5 @@
 name:                eve
-version:             0.1.8
+version:             0.1.9.0
 synopsis: An extensible event framework
 description: An extensible event-driven application framework in haskell for building embarassingly modular software.
 homepage:            https://github.com/ChrisPenner/eve#readme
diff --git a/src/Eve/Internal/Actions.hs b/src/Eve/Internal/Actions.hs
--- a/src/Eve/Internal/Actions.hs
+++ b/src/Eve/Internal/Actions.hs
@@ -27,6 +27,7 @@
 import Control.Lens
 import Data.Typeable
 import Data.Default
+import Data.Semigroup
 
 -- | An 'App' has the same base and zoomed values.
 type AppT s m a = ActionT s s m a
@@ -42,13 +43,16 @@
   { getAction :: FreeT (AppF base m) (StateT zoomed m) a
   } deriving (Functor, Applicative, Monad, MonadIO, MonadState zoomed)
 
-instance (Monoid a, Monad m) => Monoid (ActionT base zoomed m a) where
-  mempty = return mempty
-  a `mappend` b = do
+instance (Semigroup a,Monad m) => Semigroup (ActionT base zoomed m a) where
+  a <> b = do
     a' <- a
     b' <- b
-    return $ a' `mappend` b'
+    return $ a' <> b'
 
+instance (Monoid a, Monad m) => Monoid (ActionT base zoomed m a) where
+  mempty = return mempty
+  mappend = (<>)
+
 instance Monad n => MonadFree (AppF base n) (ActionT base zoomed n) where
   wrap (RunApp act) = join . ActionT . liftF . RunApp $ act
 
@@ -68,10 +72,10 @@
 instance Monad m => Zoom (ActionT base s m) (ActionT base t m) s t where
   zoom l (ActionT action) = ActionT $ zoom l action
 
--- | This runs an `Action MyState a` over the MyState which is
+-- | This runs an @'Action' MyState a@ over the MyState which is
 -- stored in the currently focused state and returns the result.
--- Use 'runActionOver' if you'd like to specify a particular MyState
--- which is accessed by a Lens or Traversal.
+-- Use 'runActionOver' if you'd like to specify a particular @MyState@
+-- which is accessed by a 'Lens' or 'Traversal'.
 runAction :: (HasStates t, Functor (Zoomed m c), Default s, Typeable s, Zoom m n s t) => m c -> n c
 runAction = zoom stateLens
 
diff --git a/src/Eve/Internal/AppState.hs b/src/Eve/Internal/AppState.hs
--- a/src/Eve/Internal/AppState.hs
+++ b/src/Eve/Internal/AppState.hs
@@ -71,7 +71,9 @@
 -- 'runAction'. For example an 'Action' which operates over a String somewhere in your app state
 -- would be written as:
 --
--- > alterString :: 'Action' String ()
+-- @
+-- alterString :: 'Action' String ()
+-- @
 type Action state a = ActionT AppState state IO a
 
 -- | A more general version of 'App' which lets you specify the underlying monad.
