diff --git a/freddy.cabal b/freddy.cabal
--- a/freddy.cabal
+++ b/freddy.cabal
@@ -1,5 +1,5 @@
 name:                freddy
-version:             0.1.0.0
+version:             0.1.1.0
 homepage:            https://github.com/salemove/freddy-hs
 license:             MIT
 license-file:        LICENSE
@@ -12,7 +12,11 @@
 synopsis:            RabbitMQ Messaging API supporting request-response
 
 library
-  exposed-modules:   Network.Freddy
+  exposed-modules:
+    Network.Freddy,
+    Network.Freddy.CorrelationIdGenerator,
+    Network.Freddy.Request,
+    Network.Freddy.ResultType
   build-depends:
     base           >= 4.8 && < 5,
     bytestring     >= 0.9,
diff --git a/src/Network/Freddy/CorrelationIdGenerator.hs b/src/Network/Freddy/CorrelationIdGenerator.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Freddy/CorrelationIdGenerator.hs
@@ -0,0 +1,16 @@
+module Network.Freddy.CorrelationIdGenerator (CorrelationId, generateCorrelationId) where
+
+import System.Random (randomIO)
+import qualified Data.UUID as UUID
+import Data.UUID (UUID)
+import Data.Text (Text)
+
+type CorrelationId = Text
+
+generateCorrelationId :: IO CorrelationId
+generateCorrelationId = do
+  uuid <- newUUID
+  return $ UUID.toText uuid
+
+newUUID :: IO UUID
+newUUID = randomIO
diff --git a/src/Network/Freddy/Request.hs b/src/Network/Freddy/Request.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Freddy/Request.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Network.Freddy.Request (
+  Request (..),
+  timeoutInMicroseconds,
+  expirationInMs,
+  newReq
+) where
+
+import Data.Text (Text, pack)
+import Data.Default (Default, def)
+import Data.ByteString.Lazy.Char8 (ByteString)
+import qualified Data.ByteString.Lazy.Char8 as BS
+
+data Request = Request {
+  queueName :: Text,
+  body :: ByteString,
+  timeoutInMs :: Int,
+  deleteOnTimeout :: Bool
+} deriving (Show)
+
+instance Default Request where
+  def = Request {
+    queueName = "localhost",
+    body = BS.empty,
+    timeoutInMs = 3000,
+    deleteOnTimeout = True
+  }
+
+timeoutInMicroseconds :: Request -> Int
+timeoutInMicroseconds = (*) 1000 . timeoutInMs
+
+expirationInMs :: Request -> Maybe Text
+expirationInMs request =
+  if deleteOnTimeout request
+    then Just . pack . show . timeoutInMs $ request
+    else Nothing
+
+newReq :: Request
+newReq = def
diff --git a/src/Network/Freddy/ResultType.hs b/src/Network/Freddy/ResultType.hs
new file mode 100644
--- /dev/null
+++ b/src/Network/Freddy/ResultType.hs
@@ -0,0 +1,16 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Network.Freddy.ResultType (ResultType (..), serializeResultType, fromText) where
+
+import Data.Text (Text, pack)
+
+data ResultType = Success | Error deriving (Eq)
+
+serializeResultType :: ResultType -> Text
+serializeResultType resType = case resType of
+  Success -> pack "success"
+  Error -> pack "error"
+
+fromText :: Text -> ResultType
+fromText text = case text of
+   "success" -> Success
+   _ -> Error
