diff --git a/Data/Reference.hs b/Data/Reference.hs
new file mode 100644
--- /dev/null
+++ b/Data/Reference.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{- |
+Module      : $Header$
+Description : Class connecting mutable variables and monads they exists in.
+Copyright   : (c) Maciej Piechotka
+License     : MIT
+
+Stability   : none
+Portability : portable
+
+Reference is class which generalizes references and monads they exists in. It means that IORef, STRef and others can be accessed by common interface.
+-}
+module Data.Reference
+  (
+    Reference(..),
+  )
+where
+import Control.Concurrent.MVar
+import Control.Concurrent.STM
+import Control.Monad.ST
+import Data.IORef
+import Data.STRef
+
+-- | Class connecting mutable variable and monad it exists in.
+class Monad m => Reference r m where
+    -- | Create new reference.
+    newRef :: a -- ^ An initial value
+           -> m (r a)
+    -- | Reads a reference.
+    readRef :: r a -- ^ Reference
+            -> m a
+    -- | Write to reference.
+    writeRef :: r a -- ^ Reference
+             -> a -- ^ New value
+             -> m ()
+    -- | Modify the reference. Default implementation is provided but it MUST
+    -- be overloaded if the reference is atomic to provide an atomic write.
+    modifyRef :: r a -- ^ Reference
+              -> (a -> m (a, b)) -- ^ Computation
+              -> m b -- ^ Result of computation
+    modifyRef r f = readRef r >>= f >>= \(a, b) -> writeRef r a >> return b
+
+instance Reference IORef IO where
+    newRef = newIORef
+    readRef = readIORef
+    writeRef = writeIORef
+
+instance Reference (STRef s) (ST s) where
+    newRef = newSTRef
+    readRef = readSTRef
+    writeRef = writeSTRef
+
+instance Reference MVar IO where
+    newRef = newMVar
+    readRef = readMVar
+    writeRef = putMVar
+    modifyRef = modifyMVar
+
+instance Reference TVar STM where
+    newRef = newTVar
+    readRef = readTVar
+    writeRef = writeTVar
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2010 Maciej Piechotka
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/reference.cabal b/reference.cabal
new file mode 100644
--- /dev/null
+++ b/reference.cabal
@@ -0,0 +1,19 @@
+Name:                reference
+Version:             0.1
+Synopsis:            A class for references in Haskell
+Description:         Reference is class which generalizes references and monads                      they exists in. It means that IORef, STRef and others can
+                     be accessed by common interface.
+License:             MIT
+License-file:        LICENSE
+Author:              Maciej Piechotka
+Maintainer:          uzytkownik2@gmail.com
+Copyright:           2010 (c) Maciej Piechotka
+Category:            Control, Data
+Build-type:          Simple
+Cabal-version:       >=1.4
+
+Library
+  Exposed-modules:   Data.Reference
+  Build-depends:     base >= 4 && < 5,
+                     stm
+  
