diff --git a/Network/IRC/Bot/BotMonad.hs b/Network/IRC/Bot/BotMonad.hs
--- a/Network/IRC/Bot/BotMonad.hs
+++ b/Network/IRC/Bot/BotMonad.hs
@@ -5,7 +5,7 @@
     , BotEnv(..)
     , runBotPartT
     , mapBotPartT
-    , askSenderNickName
+    , maybeZero
     ) where
 
 import Control.Applicative (Applicative, Alternative, (<$>))
@@ -69,10 +69,6 @@
                   liftIO $ l lvl msg
   whoami       =  BotPartT $ botName <$> ask
 
--- | get the nickname of the user who sent the message
-askSenderNickName :: (BotMonad m) => m (Maybe String)
-askSenderNickName =
-    do msg <- askMessage
-       case msg_prefix msg of
-         (Just (NickName nick _ _)) -> return (Just nick)
-         _ -> return Nothing
+maybeZero :: (MonadPlus m) => Maybe a -> m a
+maybeZero Nothing = mzero
+maybeZero (Just a) = return a
diff --git a/Network/IRC/Bot/Commands.hs b/Network/IRC/Bot/Commands.hs
--- a/Network/IRC/Bot/Commands.hs
+++ b/Network/IRC/Bot/Commands.hs
@@ -4,6 +4,7 @@
 import Control.Applicative
 import Control.Monad
 import Data.Data
+import Data.List (isPrefixOf)
 import Network (HostName, PortID(PortNumber))
 import Network.IRC
 import Network.IRC.Bot.BotMonad
@@ -66,4 +67,34 @@
 
 instance ToMessage PrivMsg where
     toMessage (PrivMsg prefix receivers msg) = Message prefix "PRIVMSG" (receivers ++ [msg])
+
+
+-- | get the nickname of the user who sent the message
+askSenderNickName :: (BotMonad m) => m (Maybe String)
+askSenderNickName =
+    do msg <- askMessage
+       case msg_prefix msg of
+         (Just (NickName nick _ _)) -> return (Just nick)
+         _ -> return Nothing
+
+-- | figure out who to reply to for a given `Message`
+-- 
+-- If message was sent to a #channel reply to the channel. Otherwise reply to the sender.
+replyTo :: (BotMonad m) => m (Maybe String)
+replyTo =
+    do priv <- privMsg
+       let receiver = head (receivers priv)
+       if ("#" `isPrefixOf` receiver)
+          then return (Just receiver)
+          else askSenderNickName
+
+-- | returns the receiver of a message
+-- 
+-- if multiple receivers, it returns only the first
+askReceiver :: (Alternative m, BotMonad m) => m (Maybe String)
+askReceiver =
+    do priv <- privMsg
+       return (Just (head $ receivers priv))
+    <|>
+    do return Nothing
 
diff --git a/Network/IRC/Bot/Parsec.hs b/Network/IRC/Bot/Parsec.hs
--- a/Network/IRC/Bot/Parsec.hs
+++ b/Network/IRC/Bot/Parsec.hs
@@ -35,7 +35,8 @@
 import Control.Monad.Reader (MonadReader, ask)
 import Control.Monad.Trans
 import Data.Char (digitToInt)
-import Data.List (intercalate, nub)
+import Data.List (intercalate, isPrefixOf, nub)
+import Data.Maybe (fromMaybe)
 import Network.IRC.Bot.Log
 import Network.IRC.Bot.BotMonad
 import Network.IRC.Bot.Commands
@@ -64,11 +65,11 @@
 -- | parser that checks for the 'cmdPrefix' (from the 'BotEnv')
 botPrefix :: (BotMonad m) => ParsecT String () m ()
 botPrefix =
-    (try $ do str <- cmdPrefix <$> askBotEnv
-              string str
-              return ())
-      <|>
-       lift mzero
+    do recv <- fromMaybe "" <$> askReceiver
+       pref <- cmdPrefix <$> askBotEnv
+       if "#" `isPrefixOf` recv
+          then (try $ string pref >> return ()) <|> lift mzero
+          else (try $ string pref >> return ()) <|> return ()
 
 -- | create a bot part by using Parsec to parse the command
 --
@@ -80,12 +81,12 @@
 --
 -- see 'dicePart' for an example usage.
 parsecPart :: (BotMonad m) =>
-              (String -> ParsecT String () m a) 
+              (ParsecT String () m a) 
            -> m a
 parsecPart p = 
     do priv <- privMsg 
        logM Debug $ "I got a message: " ++ msg priv ++ " sent to " ++ show (receivers priv)
-       ma <- runParserT (p $ head (receivers priv)) () (msg priv) (msg priv)
+       ma <- runParserT p () (msg priv) (msg priv)
        case ma of
          (Left e) -> 
              do logM Debug $ "Parse error: " ++ show e
diff --git a/Network/IRC/Bot/Part/Dice.hs b/Network/IRC/Bot/Part/Dice.hs
--- a/Network/IRC/Bot/Part/Dice.hs
+++ b/Network/IRC/Bot/Part/Dice.hs
@@ -3,8 +3,8 @@
 import Control.Monad            (replicateM)
 import Control.Monad.Trans      (liftIO)
 import Network.IRC.Bot.Log      (LogLevel(Debug))
-import Network.IRC.Bot.BotMonad (BotMonad(..))
-import Network.IRC.Bot.Commands (PrivMsg(..), sendCommand)
+import Network.IRC.Bot.BotMonad (BotMonad(..), maybeZero)
+import Network.IRC.Bot.Commands (PrivMsg(..), sendCommand, replyTo)
 import Network.IRC.Bot.Parsec   (botPrefix, nat, parsecPart)
 import System.Random            (randomRIO)
 import Text.Parsec              (ParsecT, (<|>), (<?>), char, skipMany1, space, string, try)
@@ -12,10 +12,11 @@
 dicePart :: (BotMonad m) => m ()
 dicePart = parsecPart diceCommand
 
-diceCommand :: (BotMonad m) => String -> ParsecT String () m ()
-diceCommand target =
+diceCommand :: (BotMonad m) => ParsecT String () m ()
+diceCommand =
     do try $ botPrefix >> string "dice"
        logM Debug "dicePart"
+       target <- maybeZero =<< replyTo
        (numDice, numSides, modifier) <- (do 
          skipMany1 space
          nd <- nat <|> return 1
diff --git a/Network/IRC/Bot/Part/Hello.hs b/Network/IRC/Bot/Part/Hello.hs
--- a/Network/IRC/Bot/Part/Hello.hs
+++ b/Network/IRC/Bot/Part/Hello.hs
@@ -3,8 +3,8 @@
 import Control.Monad.Trans      (liftIO)
 import Data.Maybe               (fromMaybe)
 import Network.IRC.Bot.Log      (LogLevel(Debug))
-import Network.IRC.Bot.BotMonad (BotMonad(..), askSenderNickName)
-import Network.IRC.Bot.Commands (PrivMsg(..), sendCommand)
+import Network.IRC.Bot.BotMonad (BotMonad(..), maybeZero)
+import Network.IRC.Bot.Commands (PrivMsg(..),askSenderNickName, replyTo, sendCommand)
 import Network.IRC.Bot.Parsec   (botPrefix, parsecPart)
 import System.Random            (randomRIO)
 import Text.Parsec              (ParsecT, (<|>), string, try)
@@ -12,10 +12,12 @@
 helloPart :: (BotMonad m) => m ()
 helloPart = parsecPart helloCommand
 
-helloCommand :: (BotMonad m) => String -> ParsecT String () m ()
-helloCommand target =
+helloCommand :: (BotMonad m) => ParsecT String () m ()
+helloCommand =
     do try $ botPrefix >> string "hello"
        logM Debug "helloPart"
+       target <- maybeZero =<< replyTo
+       logM Debug $ "target: " ++ target
        mNick <- askSenderNickName
        let greetings = ["Hello", "Howdy", "Greetings", "Word up"]
        n <- liftIO $ randomRIO (0, length greetings - 1)
diff --git a/ircbot.cabal b/ircbot.cabal
--- a/ircbot.cabal
+++ b/ircbot.cabal
@@ -1,5 +1,5 @@
 Name:                ircbot
-Version:             0.2.3
+Version:             0.3.0
 Synopsis:            A library for writing irc bots
 Homepage:            http://patch-tag.com/r/stepcut/ircbot
 License:             BSD3
