diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,24 @@
+* Copyright (c) 2009, George Pollard
+* All rights reserved.
+*
+* 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 <organization> 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 <copyright holder> ''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 <copyright holder> 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/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/Text/IDNA.hs b/Text/IDNA.hs
new file mode 100644
--- /dev/null
+++ b/Text/IDNA.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Text.IDNA (acePrefix, toASCII, toUnicode)
+where
+
+import Text.StringPrep
+import Text.NamePrep
+import Control.Monad
+import Data.Encoding.BootString
+import Data.Encoding.ByteSink
+import Data.Encoding
+import qualified Data.Text as Text
+import qualified Data.Text.Encoding as E
+
+acePrefix :: Text.Text
+acePrefix = "xn--"
+
+toASCII allowUnassigned useSTD3ASCIIRules t = do
+		step2 <- if Text.any (>'\x7f') t
+			then runStringPrep (namePrepProfile allowUnassigned) t
+			else return t
+
+		step3 <- if (useSTD3ASCIIRules && (Text.any isLDHascii step2 ||	Text.head step2 == '-' || Text.last step2 == '-'))
+			then Nothing
+			else return step2
+
+		step7 <- if (Text.any (>'\x7f') step2)
+				then if acePrefix `Text.isPrefixOf` step3
+					then Nothing
+					else case encodeStrictByteStringExplicit punycode $ Text.unpack step3 of
+						Left _ -> Nothing
+						Right t -> return $ acePrefix `Text.append` E.decodeASCII t
+				else return step3
+		
+		if Text.length step7 <= 63
+			then return step7
+			else Nothing
+
+isLDHascii c =
+	'\x0' <= c && c <= '\x2c' ||
+	'\x2e' <= c && c <= '\x2f' ||
+	'\x3a' <= c && c <= '\x40' ||
+	'\x5b' <= c && c <= '\x60' ||
+	'\x7b' <= c && c <= '\x7f' 
+
+toUnicode allowUnassigned useSTD3ASCIIRules t = mergeEither $ do
+	step2 <- if Text.any (>'\x7f') t
+		then case runStringPrep (namePrepProfile allowUnassigned) t of
+			Nothing -> Left t
+			Just t' -> return t'
+		else return t
+
+	step3 <- if not $ acePrefix `Text.isPrefixOf` step2
+		then Left step2
+		else return step2
+	
+	let step4 = Text.drop (Text.length acePrefix) step3
+	step5 <- case decodeStrictByteStringExplicit punycode $ E.encodeUtf8 step4 of
+		Left _ -> Left step3
+		Right s -> return (Text.pack s)
+
+	case toASCII allowUnassigned useSTD3ASCIIRules step5 of
+		Nothing -> return step3
+		Just t -> if t == step3
+			then return step5
+			else return step3
+
+mergeEither :: Either a a -> a
+mergeEither (Left x) = x
+mergeEither (Right y) = y
+
+instance Monad (Either a) where
+	return = Right
+	Left x >>= _ = Left x
+	Right y >>= f = f y
+
+tests :: [Text.Text]
+tests = ["Bücher","tūdaliņ"]
diff --git a/idna.cabal b/idna.cabal
new file mode 100644
--- /dev/null
+++ b/idna.cabal
@@ -0,0 +1,16 @@
+Name: idna
+Version: 0.1
+Description: Implements IDNA -- Internationalized Domain Names in Applications (RFC 3490).
+Synopsis: Implements IDNA (RFC 3490).
+License: BSD3
+Author: George Pollard <porges@porg.es>
+Maintainer: George Pollard <porges@porg.es>
+Build-Type: Simple
+Cabal-Version: >=1.6
+License-file: LICENSE
+Category: data text
+
+Library
+ Build-Depends: base, encoding>=0.5.1, stringprep>=0.1.2, text>=0.1
+ Exposed-modules: Text.IDNA
+ ghc-options: -O2 -Wall
