diff --git a/.ghci b/.ghci
new file mode 100644
--- /dev/null
+++ b/.ghci
@@ -0,0 +1,1 @@
+:set -isrc -idist/build/autogen -optP-include -optPdist/build/autogen/cabal_macros.h
diff --git a/.gitignore b/.gitignore
new file mode 100644
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,13 @@
+dist
+docs
+wiki
+TAGS
+tags
+wip
+.DS_Store
+.*.swp
+.*.swo
+*.o
+*.hi
+*~
+*#
diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,1 +1,8 @@
 language: haskell
+notifications:
+  irc:
+    channels:
+      - "irc.freenode.org#haskell-lens"
+    skip_join: true
+    template:
+      - "\x0313semigroups\x03/\x0306%{branch}\x03 \x0314%{commit}\x03 %{build_url} %{message}"
diff --git a/.vim.custom b/.vim.custom
new file mode 100644
--- /dev/null
+++ b/.vim.custom
@@ -0,0 +1,31 @@
+" Add the following to your .vimrc to automatically load this on startup
+
+" if filereadable(".vim.custom")
+"     so .vim.custom
+" endif
+
+function StripTrailingWhitespace()
+  let myline=line(".")
+  let mycolumn = col(".")
+  silent %s/  *$//
+  call cursor(myline, mycolumn)
+endfunction
+
+" enable syntax highlighting
+syntax on
+
+" search for the tags file anywhere between here and /
+set tags=TAGS;/
+
+" highlight tabs and trailing spaces
+set listchars=tab:‗‗,trail:‗
+set list
+
+" f2 runs hasktags
+map <F2> :exec ":!hasktags -x -c --ignore src"<CR><CR>
+
+" strip trailing whitespace before saving
+" au BufWritePre *.hs,*.markdown silent! cal StripTrailingWhitespace()
+
+" rebuild hasktags after saving
+au BufWritePost *.hs silent! :exec ":!hasktags -x -c --ignore src"
diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.markdown
@@ -0,0 +1,5 @@
+3.0.1
+-----
+* Updated build system
+* Removed my personal intra-package dependency upper bounds
+* Added `README` and `CHANGELOG`
diff --git a/Data/Groupoid.hs b/Data/Groupoid.hs
deleted file mode 100644
--- a/Data/Groupoid.hs
+++ /dev/null
@@ -1,13 +0,0 @@
-module Data.Groupoid
-  ( Groupoid(..)
-  ) where
-
-import Data.Semigroupoid
-import Data.Semigroupoid.Dual
-
--- | semigroupoid with inverses. This technically should be a category with inverses, except we need to use Ob to define the valid objects for the category
-class Semigroupoid k => Groupoid k where
-  inv :: k a b -> k b a
-
-instance Groupoid k => Groupoid (Dual k) where
-  inv (Dual k) = Dual (inv k)
diff --git a/Data/Isomorphism.hs b/Data/Isomorphism.hs
deleted file mode 100644
--- a/Data/Isomorphism.hs
+++ /dev/null
@@ -1,20 +0,0 @@
-module Data.Isomorphism
-  ( Iso(..)
-  ) where
-
-import Data.Semigroupoid
-import Data.Groupoid
-import Control.Category
-import Prelude ()
-
-data Iso k a b = Iso { embed :: k a b, project :: k b a }
-
-instance Semigroupoid k => Semigroupoid (Iso k) where
-  Iso f g `o` Iso h i = Iso (f `o` h) (i `o` g)
-
-instance Semigroupoid k => Groupoid (Iso k) where
-  inv (Iso f g) = Iso g f
-
-instance Category k => Category (Iso k) where
-  Iso f g . Iso h i = Iso (f . h) (i . g)
-  id = Iso id id
diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright 2011 Edward Kmett
+Copyright 2011-2013 Edward Kmett
 
 All rights reserved.
 
diff --git a/README.markdown b/README.markdown
new file mode 100644
--- /dev/null
+++ b/README.markdown
@@ -0,0 +1,15 @@
+groupoids
+==========
+
+[![Build Status](https://secure.travis-ci.org/ekmett/groupoids.png?branch=master)](http://travis-ci.org/ekmett/groupoids)
+
+A groupoid is a category where every arrow has an inverse. This package provides them for Haskell.
+
+Contact Information
+-------------------
+
+Contributions and bug reports are welcome!
+
+Please feel free to contact me through github or on the #haskell IRC channel on irc.freenode.net.
+
+-Edward Kmett
diff --git a/groupoids.cabal b/groupoids.cabal
--- a/groupoids.cabal
+++ b/groupoids.cabal
@@ -1,6 +1,6 @@
 name:          groupoids
 category:      Control, Categories
-version:       3.0
+version:       3.0.1
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -9,12 +9,18 @@
 stability:     experimental
 homepage:      http://github.com/ekmett/groupoids/
 bug-reports:   http://github.com/ekmett/groupoids/issues
-copyright:     Copyright (C) 2011 Edward A. Kmett
+copyright:     Copyright (C) 2011-2013 Edward A. Kmett
 synopsis:      Haskell 98 Groupoids
 description:   Haskell 98 Groupoids
 build-type:    Simple
 
-extra-source-files: .travis.yml
+extra-source-files:
+  .ghci
+  .gitignore
+  .vim.custom
+  .travis.yml
+  README.markdown
+  CHANGELOG.markdown
 
 source-repository head
   type: git
@@ -22,11 +28,12 @@
 
 library
   build-depends:
-    base          >= 4   && < 5,
-    semigroupoids >= 3.0 && <= 3.1
+    base          >= 4 && < 5,
+    semigroupoids >= 3
 
   exposed-modules:
     Data.Groupoid
     Data.Isomorphism
 
-  ghc-options:      -Wall
+  ghc-options: -Wall
+  hs-source-dirs: src
diff --git a/src/Data/Groupoid.hs b/src/Data/Groupoid.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Groupoid.hs
@@ -0,0 +1,13 @@
+module Data.Groupoid
+  ( Groupoid(..)
+  ) where
+
+import Data.Semigroupoid
+import Data.Semigroupoid.Dual
+
+-- | semigroupoid with inverses. This technically should be a category with inverses, except we need to use Ob to define the valid objects for the category
+class Semigroupoid k => Groupoid k where
+  inv :: k a b -> k b a
+
+instance Groupoid k => Groupoid (Dual k) where
+  inv (Dual k) = Dual (inv k)
diff --git a/src/Data/Isomorphism.hs b/src/Data/Isomorphism.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Isomorphism.hs
@@ -0,0 +1,20 @@
+module Data.Isomorphism
+  ( Iso(..)
+  ) where
+
+import Data.Semigroupoid
+import Data.Groupoid
+import Control.Category
+import Prelude ()
+
+data Iso k a b = Iso { embed :: k a b, project :: k b a }
+
+instance Semigroupoid k => Semigroupoid (Iso k) where
+  Iso f g `o` Iso h i = Iso (f `o` h) (i `o` g)
+
+instance Semigroupoid k => Groupoid (Iso k) where
+  inv (Iso f g) = Iso g f
+
+instance Category k => Category (Iso k) where
+  Iso f g . Iso h i = Iso (f . h) (i . g)
+  id = Iso id id
