diff --git a/Lambdajudge.cabal b/Lambdajudge.cabal
--- a/Lambdajudge.cabal
+++ b/Lambdajudge.cabal
@@ -1,5 +1,5 @@
 name: Lambdajudge
-version: 1.0.0.3
+version: 1.0.0.4
 cabal-version: >=1.10
 build-type: Simple
 license: MIT
@@ -26,7 +26,7 @@
         process >= 1.2.3.0 && < 1.3.0.0
     default-language: Haskell2010
     hs-source-dirs: src
-    exposed-modules: Lambdajudge
+    exposed-modules: Lambdajudge, DataStructures, Utility
 
 test-suite spec
   default-language: Haskell2010
diff --git a/src/DataStructures.hs b/src/DataStructures.hs
new file mode 100644
--- /dev/null
+++ b/src/DataStructures.hs
@@ -0,0 +1,50 @@
+{-# LANGUAGE FlexibleContexts #-}
+
+module DataStructures where
+
+import Control.Monad.State
+import Control.Monad.Writer
+import Control.Monad.Error
+
+-- | counts number of times code has been evaluated against test cases
+type ProcCount = Int
+
+-- | Require logging, state and need to throw exceptions during computation
+type LJMonad a = WriterT String (StateT ProcCount (ErrorT String IO)) a
+
+-- | Content of the input file
+type TestCase = String
+
+-- | Content of the output file
+type Answer = String
+
+-- | group together a problem atatement, its input and outputs and max allowed time limit
+data Problem = Problem {
+    problemStatement :: String,
+    testCases :: [(TestCase,Answer)],
+    problemSetterCode :: String,
+    timeLimit :: Int
+}
+
+-- | Contest is a list of problems
+data Contest = Contest {
+    problems :: [Problem]
+}
+
+-- | Status code determines the result of evaluation of the submitted code
+data StatusCode  =  AC   -- Accepted
+                  | WA   -- Wrong Answer
+                  | TLE  -- Time Limit Exceeded
+                  | NZEC -- Non zero exit code
+                    deriving (Eq,Show)
+
+type SubmissionResult = [ (TestCase , StatusCode) ]
+
+-- | All that is required to run a mueval command
+data MuevalCommand = MuevalCommand {
+  expression :: String,
+  testData :: String,
+  ansData :: String,
+  solutionFile :: String,
+  maxRunTime :: Int
+} deriving Show
diff --git a/src/Utility.hs b/src/Utility.hs
new file mode 100644
--- /dev/null
+++ b/src/Utility.hs
@@ -0,0 +1,13 @@
+module Utility where
+import Data.Char
+import System.IO
+
+-- | removes newlines from both ends of text
+trim :: String -> String
+trim = let f = reverse . dropWhile (=='\n') in f . f
+
+-- | reads contents of a file
+getFileContents :: String -> IO String
+getFileContents fileName = do
+                inh <- openFile fileName ReadMode
+                hGetContents inh
