diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright Alexandre Moreno (c) 2018
+Copyright Alexandre Moreno (c) 2019-2021
 
 All rights reserved.
 
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,4 +1,5 @@
-# line-bot-sdk [![Build Status](https://travis-ci.org/moleike/line-bot-sdk.svg?branch=master)](https://travis-ci.org/moleike/line-bot-sdk)
+# line-bot-sdk [![Build Actions](https://github.com/moleike/line-bot-sdk/workflows/build/badge.svg)](https://github.com/moleike/line-bot-sdk/actions)
+
 
 Servant library for building LINE chatbots. 
 
diff --git a/line-bot-sdk.cabal b/line-bot-sdk.cabal
--- a/line-bot-sdk.cabal
+++ b/line-bot-sdk.cabal
@@ -1,18 +1,18 @@
 name:                line-bot-sdk
-version:             0.7.0
+version:             0.7.1
 synopsis:            Haskell SDK for LINE Messaging API
 homepage:            https://github.com/moleike/line-bot-sdk#readme
 bug-reports:         https://github.com/moleike/line-bot-sdk/issues
 license:             BSD3
+x-license:           BSD-3-Clause
 license-file:        LICENSE
 author:              Alexandre Moreno
 maintainer:          Alexandre Moreno <alexmorenocano@gmail.com>
-stability:           experimental
-copyright:           (c) 2018 Alexandre Moreno
+copyright:           (c) Alexandre Moreno, 2019-2021
 category:            Network, Web
 build-type:          Simple
-extra-source-files:  README.md
-cabal-version:       >=1.10
+extra-doc-files:     README.md
+cabal-version:       >=1.18
 description:
   A Servant library for building LINE chatbots. This package is composed
   of the following modules:
@@ -111,6 +111,8 @@
     deepseq
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   default-language:    Haskell2010
+  build-tool-depends: hspec-discover:hspec-discover
+
 
 source-repository head
   type:     git
diff --git a/src/Line/Bot/Client.hs b/src/Line/Bot/Client.hs
--- a/src/Line/Bot/Client.hs
+++ b/src/Line/Bot/Client.hs
@@ -12,8 +12,8 @@
 
 -- |
 -- Module      : Line.Bot.Client
--- Copyright   : (c) Alexandre Moreno, 2019
--- License     : BSD3
+-- Copyright   : (c) Alexandre Moreno, 2019-2021
+-- License     : BSD-3-Clause
 -- Maintainer  : alexmorenocano@gmail.com
 -- Stability   : experimental
 
diff --git a/src/Line/Bot/Internal/Endpoints.hs b/src/Line/Bot/Internal/Endpoints.hs
--- a/src/Line/Bot/Internal/Endpoints.hs
+++ b/src/Line/Bot/Internal/Endpoints.hs
@@ -6,10 +6,11 @@
 {-# LANGUAGE TypeFamilies          #-}
 {-# LANGUAGE TypeOperators         #-}
 {-# LANGUAGE UndecidableInstances  #-}
+
 -- |
 -- Module      : Line.Bot.Internal.Endpoints
--- Copyright   : (c) Alexandre Moreno, 2019
--- License     : BSD3
+-- Copyright   : (c) Alexandre Moreno, 2019-2021
+-- License     : BSD-3-Clause
 -- Maintainer  : alexmorenocano@gmail.com
 -- Stability   : experimental
 
diff --git a/src/Line/Bot/Types.hs b/src/Line/Bot/Types.hs
--- a/src/Line/Bot/Types.hs
+++ b/src/Line/Bot/Types.hs
@@ -14,10 +14,11 @@
 {-# LANGUAGE OverloadedStrings         #-}
 {-# LANGUAGE RecordWildCards           #-}
 {-# LANGUAGE StandaloneDeriving        #-}
+
 -- |
 -- Module      : Line.Bot.Types
--- Copyright   : (c) Alexandre Moreno, 2019
--- License     : BSD3
+-- Copyright   : (c) Alexandre Moreno, 2019-2021
+-- License     : BSD-3-Clause
 -- Maintainer  : alexmorenocano@gmail.com
 -- Stability   : experimental
 
diff --git a/src/Line/Bot/Webhook.hs b/src/Line/Bot/Webhook.hs
--- a/src/Line/Bot/Webhook.hs
+++ b/src/Line/Bot/Webhook.hs
@@ -15,8 +15,8 @@
 
 -- |
 -- Module      : Line.Bot.Webhook
--- Copyright   : (c) Alexandre Moreno, 2019
--- License     : BSD3
+-- Copyright   : (c) Alexandre Moreno, 2019-2021
+-- License     : BSD-3-Clause
 -- Maintainer  : alexmorenocano@gmail.com
 -- Stability   : experimental
 
diff --git a/src/Line/Bot/Webhook/Events.hs b/src/Line/Bot/Webhook/Events.hs
--- a/src/Line/Bot/Webhook/Events.hs
+++ b/src/Line/Bot/Webhook/Events.hs
@@ -12,8 +12,8 @@
 
 -- |
 -- Module      : Line.Bot.Webhook.Events
--- Copyright   : (c) Alexandre Moreno, 2019
--- License     : BSD3
+-- Copyright   : (c) Alexandre Moreno, 2019-2021
+-- License     : BSD-3-Clause
 -- Maintainer  : alexmorenocano@gmail.com
 -- Stability   : experimental
 
@@ -24,6 +24,7 @@
   , ContentProvider(..)
   , EpochMilli(..)
   , Source(..)
+  , MessageSource(..)
   , Members(..)
   , Postback(..)
   , Beacon(..)
@@ -60,10 +61,10 @@
 
 -- | Events generated on the LINE Platform.
 data Event =
-    EventMessage      { replyToken :: ReplyToken
-                      , message    :: Message
-                      , source     :: Source
-                      , timestamp  :: EpochMilli
+    EventMessage      { replyToken    :: ReplyToken
+                      , message       :: Message
+                      , messageSource :: MessageSource
+                      , timestamp     :: EpochMilli
                       }
   | EventFollow       { replyToken :: ReplyToken
                       , source     :: Source
@@ -117,6 +118,7 @@
       , contentsFieldName = undefined
       }
     , constructorTagModifier = drop 5 >>> \(x:xs) -> toLower x : xs
+    , fieldLabelModifier = \s -> if s == "messageSource" then "source" else s
     }
 
 data Message =
@@ -205,6 +207,28 @@
   toJSON (Source (UserId a))  = object ["type" .= String "user", "userId" .= a]
   toJSON (Source (GroupId a)) = object ["type" .= String "group", "groupId" .= a]
   toJSON (Source (RoomId a))  = object ["type" .= String "room", "roomId" .= a]
+
+data MessageSource
+  = MessageSourceUser (Id 'User)
+  | MessageSourceGroup (Id 'Group) (Id 'User)
+  | MessageSourceRoom (Id 'Room) (Id 'User)
+
+deriving instance Show MessageSource
+deriving instance Typeable MessageSource
+
+instance FromJSON MessageSource where
+  parseJSON = withObject "MessageSource" $ \o -> do
+    messageType <- o .: "type"
+    case messageType of
+      "user"  -> MessageSourceUser . UserId  <$> o .: "userId"
+      "group" -> MessageSourceGroup <$> (GroupId <$> o .: "groupId") <*> (UserId <$> o .: "userId")
+      "room"  -> MessageSourceRoom <$> (RoomId  <$> o .: "roomId") <*> (UserId <$> o .: "userId")
+      _       -> fail ("unknown message source: " ++ messageType)
+
+instance ToJSON MessageSource where
+  toJSON (MessageSourceUser (UserId a))  = object ["type" .= String "user", "userId" .= a]
+  toJSON (MessageSourceGroup (GroupId a) (UserId b)) = object ["type" .= String "group", "groupId" .= a, "userId" .= b]
+  toJSON (MessageSourceRoom (RoomId a) (UserId b))  = object ["type" .= String "room", "roomId" .= a, "userId" .= b]
 
 newtype Members = Members { members :: [Source] }
   deriving (Show, Generic)
