diff --git a/README b/README
deleted file mode 100644
index b502625..0000000
--- a/README
+++ /dev/null
@@ -1,2 +0,0 @@
-Pontarius XMPP is an active work in progress to build a Haskell XMPP library
-that implements the client capabilities of RFC 6120 ("XMPP Core").
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..62a766e
--- /dev/null
+++ b/README.md
@@ -0,0 +1,75 @@
+Welcome to Pontarius XMPP!
+==========================
+
+Pontarius XMPP is an active work in progress to build a Haskell XMPP library
+that implements the client capabilities of [RFC 6120 ("XMPP
+Core")](http://tools.ietf.org/html/rfc6120).
+
+Getting started
+---------------
+
+The latest release of Pontarius XMPP, as well as its module API pages, can
+always be found at [the Pontarius XMPP Hackage
+page](http://hackage.haskell.org/package/pontarius-xmpp/).
+
+_Note:_ Pontarius XMPP is still in its Alpha phase. Pontarius XMPP is not yet
+feature-complete, it may contain bugs, and its API may change between versions.
+
+The first thing to do is to import the Network.Xmpp module.
+
+ import Network.Xmpp
+
+When this is done, a Session object can be acquired by calling
+session. This object will be used for interacting with the library.
+
+ result <- session
+ "example.com"
+ def
+ (Just ([scramSha1 "user" Nothing "Password"], Nothing))
+
+_Tip:_ Note that the first parameter actually is a Text value. Import
+Data.Text and use the OverloadedStrings LANGUAGE pragma.
+
+The three parameters above are the XMPP server realm, the session configuration
+settings (set to the default settings), and a SASL handler (for authentication).
+session will perform the necessary DNS queries to find the address
+of the realm, connect, establish the XMPP stream, attempt to secure the stream
+with TLS, authenticate, establish a concurrent interface for interacting with
+the stream, and return the Session object.
+
+The return type of session is IO (Either XmppFailure
+(Session, Maybe AuthFailure)). As XmppFailure is an
+Control.Monad.Error instance, you can utilize the
+ErrorT monad transformer for error handling. A more simple way of
+doing it could be doing something like this:
+
+ sess <- case result of
+ Right (sess, Nothing) -> sess
+ Right (_sess, e) -> error "AuthFailure: " ++ (show e)
+ Left e -> error "XmppFailure: " ++ (show e)
+
+Next, let us set our status to Online.
+
+ sendPresence presenceOnline sess
+
+Now, let's say that we want to receive all message stanzas, and echo the stanzas
+back to the recipient. This can be done like so:
+
+ forever $ do
+ msg <- getMessage sess
+ sendMessage (answerIM (bodies msg) [] msg) sess
+ let sender = show . fromJust $ messageFrom msg
+ let contents = maybe "nothing" Text.unpack $ body msg
+ printf "%s says \"%s\"\n" sender contents
+
+Additional XMPP threads can be created using dupSession and
+forkIO.
+
+For a public domain example of a simple Pontarius XMPP (Cabal) project, refer to
+the examples/echoclient directory.
+
+More information
+----------------
+
+Feel free to [contact Jon Kristensen](http://www.jonkri.com/contact/) if you
+have any questions or comments.