diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2011, Scott Sadler.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. 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.
+
+3. Neither the name of the author nor the names of his contributors
+   may be used to endorse or promote products derived from this software
+   without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE 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 AUTHORS 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/Quickson.cabal b/Quickson.cabal
new file mode 100644
--- /dev/null
+++ b/Quickson.cabal
@@ -0,0 +1,24 @@
+name:              quickson
+version:           1.0
+Build-Type:        Simple
+cabal-version:     >= 1.2
+Name:		       Quickson
+Version:	       0.1
+Cabal-Version:     >= 1.2
+License:	       BSD3
+License-File:      LICENSE
+Author:		       Scott Sadler
+Homepage:	       https://github.com/ssadler/quickson
+Category:	       Text, Web, JSON
+Synopsis:	       Quick JSON extractions with Aeson
+
+
+Library
+  Exposed-modules: Data.Quickson
+  hs-source-dirs:  src
+  Build-Depends:   base >= 3 && < 5,
+                   bytestring,
+                   aeson >= 0.7,
+                   text,
+                   attoparsec >= 0.12,
+                   either
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/src/Data/Quickson.hs b/src/Data/Quickson.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/Quickson.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Data.Quickson where
+
+import           Control.Monad
+import           Control.Applicative
+import           Data.Aeson
+import qualified Data.Aeson.Types as AT
+import           Data.Attoparsec.ByteString.Char8 as A8
+import qualified Data.ByteString as BS
+import qualified Data.ByteString.Char8 as C8
+import qualified Data.Text as T
+
+
+-- | Quickson intermediary representation
+data Quickson = Ob [(T.Text, Bool, Quickson)]
+              | Li Quickson
+              | Va deriving (Show)
+
+
+-- | Parse a quickson structure
+quicksonParse :: BS.ByteString -> Either String Quickson
+quicksonParse = parseOnly parseStructure
+  where
+    parseStructure = parseObject <|> parseArray
+    parseObject = Ob <$> ("{" *> sepBy1 parseLookups (char ',') <* "}")
+    parseArray = Li <$> ("[" *> parseStructure <* "]")
+    parseLookups = (,,) <$> (b2t <$> takeWhile1 (notInClass "?,:}"))
+                        <*> ("?" *> pure True <|> pure False)
+                        <*> (":" *> parseStructure <|> pure Va)
+    b2t = T.pack . C8.unpack
+
+
+-- | Execute a quickson structure against a value
+quicksonExecute :: FromJSON a => Quickson -> Value -> Either String a
+quicksonExecute que = AT.parseEither (drill que >=> parseJSON)
+  where
+    drill :: Quickson -> Value -> AT.Parser Value
+    drill (Ob [l]) = parseJSON >=> flip look l
+    drill (Ob keys) = parseJSON >=> forM keys . look >=> return . toJSON
+    drill (Li q) = parseJSON >=> mapM (drill q) >=> return . toJSON
+    drill Va = return
+    look v (k,True,qq) = v.:?k >>= maybe (return Null) (drill qq)
+    look v (k,False,qq) = v.:k >>= drill qq
+
+
+-- | Perform a JSON extraction
+quickson :: FromJSON a => BS.ByteString -> BS.ByteString -> Either String a
+quickson structureSpec bs = do
+    val <- eitherDecodeStrict bs
+    query <- quicksonParse structureSpec
+    quicksonExecute query val
