diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+Neither the name of the ; nor the names of its contributors
+may be used to endorse or promote products derived from this software
+without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
diff --git a/Main.hs b/Main.hs
new file mode 100644
--- /dev/null
+++ b/Main.hs
@@ -0,0 +1,115 @@
+module Main where
+
+import Data.List (find, span, isPrefixOf, stripPrefix)
+import Data.Maybe (fromJust)
+import System.IO (hClose, hPutStr, hFileSize, hGetContents, IOMode(ReadMode, WriteMode), openFile)
+import System.Environment (getArgs)
+import System.Cmd (system)
+
+data LicenseInfo = LI 	{ modName 	:: String
+			, author	:: String
+			, copyHold	:: String
+			, licenseType 	:: String
+			, maintainer	:: String
+			, stability	:: String
+			, portability	:: String
+			, description	:: String}
+	deriving (Eq, Show)
+
+
+main = do
+	ls <- getArgs
+	let fp = head ls 
+	let li = if null (tail ls) then "" else (head $ tail ls)
+	fileHdl <- openFile fp ReadMode
+	fileToModify <- hGetContents fileHdl
+	licenseInfo <- if li == "" then getLicenseInfo 
+		    		   else (readFile li) >>= parseLicenseInfoFile
+	let licenseInfoWithModName = getModule fileToModify licenseInfo
+	let formatInfo = format licenseInfoWithModName
+	let formatted = (formatInfo ++ fileToModify)
+	writeFile (fp++"tmp") formatted
+	hClose fileHdl
+	system ("mv " ++ fp ++ "tmp" ++ " " ++ fp) -- Because the Lazy Gods can't read and write
+						   -- to the same goddamn file without getting
+						   -- bitchy.
+	
+	
+getModule :: String -> LicenseInfo -> LicenseInfo
+getModule p (LI _ a c l ma s po d) = LI mod a c l ma s po d
+	where 	mod = filter (/='\n') . getModname . maybeStringToString . findPrefix "module" $ (lines p)
+		
+	
+
+getModname :: String -> String
+getModname s = takeWhile (\x -> not $ elem x " (") $ drop (length "module ") s
+
+findPrefix :: String -> [String] -> Maybe String
+findPrefix _ [] = Nothing
+findPrefix s (x:xs) | s `isPrefixOf` x = Just x
+		    | otherwise	       = findPrefix s xs
+
+	
+
+maybeToString :: Show a => Maybe a -> String
+maybeToString Nothing = ""
+maybeToString (Just a) = show a
+
+maybeStringToString :: Maybe String -> String
+maybeStringToString Nothing = ""
+maybeStringToString (Just s) = s
+
+	
+format :: LicenseInfo -> String
+format li = (\x -> x ++ "\n") 
+	  $ unlines 
+	  $ map ("--"++) 
+	  $	[ bar
+		, bar
+		, " |"
+		, "Module       : " ++ modName li
+		, "Author       : " ++ author li
+		, "License      : " ++ licenseType li
+		, "Copyright    : " ++ copyHold li
+		, ""
+		, "Maintainer   : " ++ maintainer li
+		, "Stability    : " ++ stability li
+		, "Portability  : " ++ portability li
+		, ""
+		, bar
+		, "Description  : " ++ description li
+		, bar
+		, bar
+		]
+	where bar =  replicate 78 '-' 
+	  
+
+	
+parseLicenseInfoFile :: String -> IO LicenseInfo
+parseLicenseInfoFile s = do	
+	let ls = lines s
+	let ls_parsed = map parse ls
+	let filt = flip filt' $ ls_parsed
+	return $ LI (filt "Module") (filt "Author") (filt "Copyright") (filt "License") (filt "Maintainer") (filt "Stability") (filt "Portability") (filt "Description")
+	where parse s = (\x -> (fst x, dropWhile (==' ') $ tail $ snd x)) 	
+		      $ span (/=':') $ s
+	      filt' ss l = maybeStringToString $ lookup ss l
+
+getLicenseInfo :: IO LicenseInfo
+getLicenseInfo = do 
+	putStrLn "" 
+	license <- grab "Choose a license type?"
+	author  <- grab "Author?"
+	copy    <- grab "Copyright holder?"
+	mntnr   <- grab "Maintainer?"
+	stblt   <- grab "Stability Level?"
+	port    <- grab "Portability Level?"
+	desc	<- grab "Description?"
+	return $ LI "" author copy license mntnr stblt port desc
+
+
+grab :: String -> IO String
+grab s = do 
+	putStrLn s
+	get <- getLine
+	return get
diff --git a/Setup.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,3 @@
+#!/usr/bin/env runhaskell
+> import Distribution.Simple
+> main = defaultMain
diff --git a/addLicenseInfo.cabal b/addLicenseInfo.cabal
new file mode 100644
--- /dev/null
+++ b/addLicenseInfo.cabal
@@ -0,0 +1,17 @@
+name:                addLicenseInfo
+version:             0.0
+synopsis:            Adds license info to the top of a file.
+description:         Adds license info to the top of a file.
+category:            Development
+license:             BSD3
+license-file:        LICENSE
+author:              Joe Fredette
+maintainer:          jfredett@gmail.com
+build-depends:       base,
+                     process >= 1.0.1.0
+
+build-type:          Simple
+
+executable:          addLicenseInfo
+main-is:             Main.hs
+
