diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+import           Distribution.Simple
+
+main = defaultMain
diff --git a/examples/Calc.hs b/examples/Calc.hs
--- a/examples/Calc.hs
+++ b/examples/Calc.hs
@@ -233,6 +233,10 @@
   , inspectInfo = langInfo
   , run = parseAndRun
   , debug = False
+  , kernelBanner = "Expanded Hutton's Razor"
+  , kernelProtocolVersion = "5.0"
+  , kernelImplName = "expanded_huttons_razor"
+  , kernelImplVersion = "0.0"
   }
   where
     displayRes (Left err) =
diff --git a/examples/Simple.hs b/examples/Simple.hs
--- a/examples/Simple.hs
+++ b/examples/Simple.hs
@@ -130,6 +130,10 @@
   , inspectInfo = languageInspect
   , run = languageRun
   , debug = False
+  , kernelBanner = "Simple Arithmetic Expressions"
+  , kernelProtocolVersion = "5.0"
+  , kernelImplName = "funcalc"
+  , kernelImplVersion = "0.0"
   }
 
 main :: IO ()
diff --git a/ipython-kernel.cabal b/ipython-kernel.cabal
--- a/ipython-kernel.cabal
+++ b/ipython-kernel.cabal
@@ -1,5 +1,5 @@
 name:                ipython-kernel
-version:             0.8.4.0
+version:             0.9.0.0
 synopsis:            A library for creating kernels for IPython frontends
 
 description:         ipython-kernel is a library for communicating with frontends for the interactive IPython framework. It is used extensively in IHaskell, the interactive Haskell environment.
@@ -34,34 +34,34 @@
   other-extensions:    OverloadedStrings
   hs-source-dirs:      src
   default-language:    Haskell2010
-  build-depends:       base            >=4.6 && < 4.9,
-                       aeson           >=0.6 && < 0.12,
-                       bytestring      >=0.10,
-                       cereal          >=0.3,
-                       containers      >=0.5,
-                       directory       >=1.1,
-                       temporary       >=1.2,
-                       filepath        >=1.2,
-                       process         >=1.1,
-                       mtl             >=2.1,
-                       text            >=0.11,
-                       transformers    >=0.3,
-                       unordered-containers >= 0.2.5,
-                       uuid            >=1.3,
-                       zeromq4-haskell >=0.1,
-                       SHA             >=1.6
+  build-depends:       base                 >=4.6 && <5,
+                       aeson           ,
+                       bytestring      ,
+                       cereal          ,
+                       containers      ,
+                       directory       ,
+                       temporary       ,
+                       filepath        ,
+                       process         ,
+                       mtl             ,
+                       text            ,
+                       transformers    ,
+                       unordered-containers,
+                       uuid            ,
+                       zeromq4-haskell ,
+                       SHA
 
 -- Example program
 executable simple-calc-example
   hs-source-dirs: examples
   main-is:        Calc.hs
   build-depends:  ipython-kernel,
-                  base           >=4.6 && <4.9,
-                  filepath       >=1.2,
-                  mtl            >=2.1,
-                  parsec         >=3.1,
-                  text           >=0.11,
-                  transformers   >=0.3
+                  base           ,
+                  filepath       ,
+                  mtl            ,
+                  parsec         ,
+                  text           ,
+                  transformers
 
   if !flag(examples)
     buildable: False
@@ -70,12 +70,12 @@
   hs-source-dirs: examples
   main-is:        Simple.hs
   build-depends:  ipython-kernel,
-                  base           >=4.6 && <4.9,
-                  filepath       >=1.2,
-                  mtl            >=2.1,
-                  parsec         >=3.1,
-                  text           >=0.11,
-                  transformers   >=0.3
+                  base           ,
+                  filepath       ,
+                  mtl            ,
+                  parsec         ,
+                  text           ,
+                  transformers
 
   if !flag(examples)
     buildable: False
diff --git a/src/IHaskell/IPython/EasyKernel.hs b/src/IHaskell/IPython/EasyKernel.hs
--- a/src/IHaskell/IPython/EasyKernel.hs
+++ b/src/IHaskell/IPython/EasyKernel.hs
@@ -77,6 +77,14 @@
          -- should be handled by defining an appropriate error constructor in your result type.
          , run :: T.Text -> IO () -> (output -> IO ()) -> m (result, ExecuteReplyStatus, String)
          , debug :: Bool -- ^ Whether to print extra debugging information to
+         -- | A One-line description of the kernel
+         , kernelBanner :: String
+         -- | The version of the messaging specification used by the kernel
+         , kernelProtocolVersion :: String
+         -- | Name of the kernel implementation
+         , kernelImplName :: String
+         -- | Version of the kernel implementation
+         , kernelImplVersion :: String
          }
 
 -- Install the kernelspec, using the `writeKernelspec` field of the kernel configuration.
@@ -160,9 +168,18 @@
     KernelInfoReply
       { header = replyHeader
       , languageInfo = kernelLanguageInfo config
-      , implementation = "ipython-kernel.EasyKernel"
-      , implementationVersion = "0.0"
+      , implementation = kernelImplName config
+      , implementationVersion = kernelImplVersion config
+      , banner = kernelBanner config
+      , protocolVersion = kernelProtocolVersion config
       }
+
+replyTo config _ _ CommInfoRequest{} replyHeader =
+  return
+    CommInfoReply
+      { header = replyHeader
+      , commInfo = Map.empty }
+
 replyTo config _ interface ShutdownRequest { restartPending = pending } replyHeader = do
   liftIO $ writeChan (shellReplyChannel interface) $ ShutdownReply replyHeader pending
   liftIO exitSuccess
diff --git a/src/IHaskell/IPython/Message/Parser.hs b/src/IHaskell/IPython/Message/Parser.hs
--- a/src/IHaskell/IPython/Message/Parser.hs
+++ b/src/IHaskell/IPython/Message/Parser.hs
@@ -90,6 +90,7 @@
 parser InputReplyMessage = inputReplyParser
 parser CommOpenMessage = commOpenParser
 parser CommDataMessage = commDataParser
+parser CommInfoRequestMessage = commInfoRequestParser
 parser CommCloseMessage = commCloseParser
 parser HistoryRequestMessage = historyRequestParser
 parser StatusMessage = statusMessageParser
@@ -103,6 +104,11 @@
 -- body.
 kernelInfoRequestParser :: LByteString -> Message
 kernelInfoRequestParser _ = KernelInfoRequest { header = noHeader }
+
+-- | Parse a comm info request. A comm info request has no auxiliary information, so ignore the
+-- body.
+commInfoRequestParser :: LByteString -> Message
+commInfoRequestParser _ = CommInfoRequest { header = noHeader }
 
 -- | Parse an execute_input response. Fields used are:
 executeInputParser :: LByteString -> Message
diff --git a/src/IHaskell/IPython/Message/Writer.hs b/src/IHaskell/IPython/Message/Writer.hs
--- a/src/IHaskell/IPython/Message/Writer.hs
+++ b/src/IHaskell/IPython/Message/Writer.hs
@@ -11,6 +11,7 @@
 import           Data.Map (Map)
 import           Data.Monoid (mempty)
 import           Data.Text (Text, pack)
+import qualified Data.Map               as Map
 import           IHaskell.IPython.Types
 
 instance ToJSON LanguageInfo where
@@ -32,12 +33,18 @@
       , "language_info" .= languageInfo rep
       ]
 
+  toJSON CommInfoReply
+    { header = header
+    , commInfo = commInfo
+    } =
+    object
+      [ "comms" .= Map.map (\comm -> object ["target_name" .= comm]) commInfo ]
+
   toJSON ExecuteRequest
     { getCode = code
     , getSilent = silent
     , getStoreHistory = storeHistory
     , getAllowStdin = allowStdin
-    , getUserVariables = userVariables
     , getUserExpressions = userExpressions
     } =
     object
@@ -45,7 +52,6 @@
       , "silent" .= silent
       , "store_history" .= storeHistory
       , "allow_stdin" .= allowStdin
-      , "user_variables" .= userVariables
       , "user_expressions" .= userExpressions
       ]
 
@@ -56,16 +62,16 @@
       , "payload" .=
         if null pager
           then []
-          else map mkObj pager
-      , "user_variables" .= emptyMap
+          else mkPayload pager
       , "user_expressions" .= emptyMap
       ]
     where
-      mkObj o = object
-                  [ "source" .= string "page"
-                  , "line" .= Number 0
-                  , "data" .= object [displayDataToJson o]
-                  ]
+      mkPayload o = [ object
+                        [ "source" .= string "page"
+                        , "start" .= Number 0
+                        , "data" .= object (map displayDataToJson o)
+                        ]
+                    ]
   toJSON PublishStatus { executionState = executionState } =
     object ["execution_state" .= executionState]
   toJSON PublishStream { streamType = streamType, streamContent = content } =
diff --git a/src/IHaskell/IPython/Types.hs b/src/IHaskell/IPython/Types.hs
--- a/src/IHaskell/IPython/Types.hs
+++ b/src/IHaskell/IPython/Types.hs
@@ -193,6 +193,8 @@
                  | InputReplyMessage
                  | CommOpenMessage
                  | CommDataMessage
+                 | CommInfoRequestMessage
+                 | CommInfoReplyMessage
                  | CommCloseMessage
                  | HistoryRequestMessage
                  | HistoryReplyMessage
@@ -224,6 +226,8 @@
 showMessageType InputReplyMessage = "input_reply"
 showMessageType CommOpenMessage = "comm_open"
 showMessageType CommDataMessage = "comm_msg"
+showMessageType CommInfoRequestMessage = "comm_info_request"
+showMessageType CommInfoReplyMessage = "comm_info_reply"
 showMessageType CommCloseMessage = "comm_close"
 showMessageType HistoryRequestMessage = "history_request"
 showMessageType HistoryReplyMessage = "history_reply"
@@ -256,6 +260,8 @@
       "input_reply"         -> return InputReplyMessage
       "comm_open"           -> return CommOpenMessage
       "comm_msg"            -> return CommDataMessage
+      "comm_info_request"   -> return CommInfoRequestMessage
+      "comm_info_reply"     -> return CommInfoReplyMessage
       "comm_close"          -> return CommCloseMessage
       "history_request"     -> return HistoryRequestMessage
       "history_reply"       -> return HistoryReplyMessage
@@ -288,12 +294,22 @@
                KernelInfoReply
                  { header :: MessageHeader
                  , protocolVersion :: String -- ^ current protocol version, major and minor
-                 , banner :: String -- ^ Kernel information description e.g. (IHaskell 0.8.3.0 GHC 7.10.2)
+                 , banner :: String -- ^ Kernel information description e.g. (IHaskell 0.8.3.0 GHC
+                                    -- 7.10.2)
                  , implementation :: String -- ^ e.g. IHaskell
                  , implementationVersion :: String -- ^ The version of the implementation
                  , languageInfo :: LanguageInfo
                  }
              |
+             -- | A request from a frontend for information about the comms.
+               CommInfoRequest { header :: MessageHeader }
+             |
+             -- | A response to a CommInfoRequest.
+               CommInfoReply
+                 { header   :: MessageHeader
+                 , commInfo :: Map String String -- ^ A dictionary of the comms, indexed by uuids.
+                 }
+             |
              -- | A request from a frontend to execute some code.
                ExecuteInput
                  { header :: MessageHeader
@@ -518,6 +534,7 @@
 replyType ShutdownRequestMessage = Just ShutdownReplyMessage
 replyType HistoryRequestMessage = Just HistoryReplyMessage
 replyType CommOpenMessage = Just CommDataMessage
+replyType CommInfoRequestMessage = Just CommInfoReplyMessage
 replyType _ = Nothing
 
 -- | Data for display: a string with associated MIME type.
