diff --git a/kafka-device-leap.cabal b/kafka-device-leap.cabal
--- a/kafka-device-leap.cabal
+++ b/kafka-device-leap.cabal
@@ -1,19 +1,19 @@
 name:                kafka-device-leap
-version:             0.1.3.0
+version:             0.2.1.2
 synopsis:            Leap Motion events via a Kafka message broker
 description:         This package contains functions for passing Leap Motion \<<https://www.leapmotion.com/product/desktop>\> events to topics on a Kafka message broker \<<https://kafka.apache.org/>\>.  Also see \<https://hackage.haskell.org/package/kafka-device/>\>.
 license:             MIT
 license-file:        LICENSE
 author:              Brian W Bush <consult@brianwbush.info>
 maintainer:          Brian W Bush <consult@brianwbush.info>
-copyright:           (c) 2016 Brian W Bush
+copyright:           (c) 2016-17 Brian W Bush
 category:            Hardware
 build-type:          Simple
 cabal-version:       >= 1.10
 stability:           Experimental
 homepage:            https://bitbucket.org/functionally/kafka-device-leap
 bug-reports:         https://bwbush.atlassian.net/projects/HKAFDEV/issues/
-package-url:         https://bitbucket.org/functionally/kafka-device-leap/downloads/kafka-device-leap-0.1.3.0.tar.gz
+package-url:         https://bitbucket.org/functionally/kafka-device-leap/downloads/kafka-device-leap-$version.tar.gz
 
 extra-source-files:  ReadMe.md
 
@@ -24,11 +24,10 @@
 library
   exposed-modules:  Network.UI.Kafka.Leap
   build-depends:    base         >= 4.8 && < 5
-               ,    aeson
-               ,    hleap
-               ,    kafka-device
-               ,    milena
-               ,    websockets
+               ,    aeson        >= 0.11.3
+               ,    hleap        >= 0.1.2
+               ,    kafka-device >= 0.2.1.2
+               ,    websockets   >= 0.10.0
   hs-source-dirs:   src
   ghc-options:      -Wall
   default-language: Haskell2010
@@ -39,7 +38,6 @@
                ,    aeson
                ,    hleap
                ,    kafka-device
-               ,    milena
                ,    websockets
   hs-source-dirs:   src
   ghc-options:      -Wall -threaded
diff --git a/src/Main.hs b/src/Main.hs
--- a/src/Main.hs
+++ b/src/Main.hs
@@ -16,7 +16,7 @@
 ) where
 
 
-import Data.String (IsString(fromString))
+import Network.UI.Kafka (TopicConnection(TopicConnection))
 import Network.UI.Kafka.Leap (leapApp)
 import System.Environment (getArgs)
 import System.Hardware.Leap (Configuration(..), run)
@@ -37,8 +37,6 @@
           putStrLn $ "Sensor name:   " ++ sensor
           run (Configuration leapHost $ read leapPort)
             $ leapApp
-              (fromString client)
-              (fromString kafkaHost, toEnum $ read kafkaPort)
-              (fromString topic)
+              (TopicConnection client (kafkaHost, read kafkaPort) topic)
               sensor
       _ -> putStrLn "USAGE: kafka-device-leap leap-host leap-port client kafka-host kafka-port topic senosr"
diff --git a/src/Network/UI/Kafka/Leap.hs b/src/Network/UI/Kafka/Leap.hs
--- a/src/Network/UI/Kafka/Leap.hs
+++ b/src/Network/UI/Kafka/Leap.hs
@@ -1,6 +1,6 @@
 {-|
 Module      :  Network.UI.Kafka.Leap
-Copyright   :  (c) 2016 Brian W Bush
+Copyright   :  (c) 2016-17 Brian W Bush
 License     :  MIT
 Maintainer  :  Brian W Bush <consult@brianwbush.info>
 Stability   :  Experimental
@@ -21,9 +21,7 @@
 
 import Control.Monad (void)
 import Data.Aeson (eitherDecode)
-import Network.Kafka (KafkaAddress, KafkaClientId)
-import Network.Kafka.Protocol (TopicName)
-import Network.UI.Kafka (Sensor, producerLoop)
+import Network.UI.Kafka (Sensor, TopicConnection, producerLoop)
 import Network.UI.Kafka.Types as K (Event(..), Finger(..), Hand(..))
 import Network.WebSockets (receiveData)
 import System.Hardware.Leap (ClientApp, setFocused, setGestures)
@@ -33,17 +31,15 @@
 
 
 -- | WebSocket application for producing Leap Motion events.
-leapApp :: KafkaClientId -- ^ A Kafka client identifier for the producer.
-        -> KafkaAddress  -- ^ The address of the Kafka broker.
-        -> TopicName     -- ^ The Kafka topic name.
-        -> Sensor        -- ^ The name of the sensor producing events.
-        -> ClientApp ()  -- ^ The WebSocket client application.
-leapApp clientId address topic sensor connection =
+leapApp :: TopicConnection -- ^ The Kafka topic name and connection information.
+        -> Sensor          -- ^ The name of the sensor producing events.
+        -> ClientApp ()    -- ^ The WebSocket client application.
+leapApp topicConnection sensor connection =
   do
     setFocused  True  connection
     setGestures False connection
     (_, loop) <-
-      producerLoop clientId address topic sensor
+      producerLoop topicConnection sensor
         $ do
             event <- eitherDecode <$> receiveData connection
             case event of
