diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,43 @@
+## Changelog
+
+### 0.6.1.0
+
+* Add `currentTarget` thanks to Jelle Hermsen
+
+#### 0.6.0.3 (2015-01-05)
+
+* Bug fix: Serialize ajax post bodies using JSON.stringify.
+
+#### 0.6.0.2 (2014-01-06)
+
+* Bug fix: Force thunks on polymorphic arguments such as `a` in `append :: Selectable a => a -> JQuery -> Fay JQuery`. Previously only constant values would be passed to jQuery correctly for these arguments.
+
+#### 0.6.0.1 (2013-12-28)
+
+* Fix typo in constraint, fixes build
+
+### 0.6 (2013-12-26)
+
+* Constrain more free type variables to `Selectable`
+* Change `getAttr :: Text -> JQuery -> Fay Text` to `Text -> JQuery -> Fay (Defined Text)`
+
+### 0.5 (2013-11-07)
+
+* Add `Selectable` typeclass (with instances for `Text`, `JQuery` and `Element`. `String` is not a valid instance.)
+* `select` and `is` now accept `Selectable a => a` as the first argument.
+* `selectElement`, `selectObject`, `isJQuery`, and `isElement` has been removed in favor of `select` and `is`.
+* `createJQuery :: Text -> a -> Fay JQuery` has been replaced by `selectInContext :: (Selectable a, Selectable b) => a -> b -> Fay JQuery`
+* `isWith :: (Double -> Bool) -> JQuery -> Fay JQuery` has changed to `isWith :: (Int -> Bool) -> JQuery -> Fay JQuery`
+* Updated usage instructions in README
+
+Bug fixes:
+* `is` now returns `Bool`
+
+### 0.4.0.1 (2013-09-24)
+
+* Fixed bug in definition of `clone`
+* Don't define `fromIntegral`.
+
+### 0.4 (2013-08-27)
+
+* Updated to use fay-text, which fixes bugs in ajax FFI calls.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,89 @@
+Fay jQuery
+==========
+
+[Changelog](CHANGELOG.md)
+
+jQuery bindings for Fay. This project is experimental, but seems to work pretty well!
+
+The short-term goals of this project are to help discover the real world
+requirements of Fay and to invite bikeshedding over the fay-jquery API. That
+means that names and types may change in rapid and annoying ways until
+conventions settle down.
+
+The one consistent convention in the library is that the jQuery object on which
+methods operate is the *last* parameter to every function. This allows simple
+monadic composition:
+
+```haskell
+{-# LANGUAGE RebindableSyntax, OverloadedStrings #-}
+
+import Fay.Text (fromString)
+import JQuery
+import Prelude
+
+(>=>) :: (a -> Fay b) -> (b -> Fay c) -> a -> Fay c
+f >=> g = \x -> f x >>= g
+
+makeSquare :: JQuery -> Fay JQuery
+makeSquare = addClass "square" >=>
+             setWidth 400 >=>
+             setHeight 400
+
+-- `ready` is the same as jQuery(document).ready(%1);
+-- You generally need to wait for this event to fire before modifying the DOM.
+main :: Fay ()
+main = ready $ do
+    select "#elementToMakeSquare" >>= makeSquare
+    return ()
+```
+
+Usage
+-----
+
+
+Install:
+```bash
+cabal install fay-text fay-jquery
+```
+
+Compile your file:
+
+```bash
+fay --package fay-jquery,fay-text MyFile.hs
+```
+
+
+Supported API calls
+-------------------
+
+This binding is a work in progress. We're adding calls by section of the jQuery
+docs. There is some overlap in the sections, but the following sections are
+(mostly) complete.
+
+- Ajax
+- Attributes
+- Core
+- CSS
+- Effects (Basic, Fading)
+- Manipulation
+- Traversing
+- Events
+
+Still to do
+-----------
+
+- Data
+- Deferred Object
+- Effects (Custom, Sliding)
+- Forms
+- Internals
+- Miscellaneous
+- Offset
+- Plugins
+- Properties
+- Utilities
+
+Not Applicable
+--------------
+
+- Selectors
diff --git a/fay-jquery.cabal b/fay-jquery.cabal
--- a/fay-jquery.cabal
+++ b/fay-jquery.cabal
@@ -1,19 +1,30 @@
 name:                fay-jquery
-version:             0.3.0.0
-synopsis:            jQuery binding.
-description:         jQuery binding.
+version:             0.6.1.0
+synopsis:            jQuery bindings for Fay.
+description:         jQuery bindings for Fay.
 homepage:            https://github.com/faylang/fay-jquery
 bug-reports:         https://github.com/faylang/fay-jquery/issues
 license:             BSD3
 license-file:        LICENSE
 author:              Adam Bergmark, Brian Victor, Chris Done
-maintainer:          Chris Done <chrisdone@gmail.com>
+maintainer:          adam@bergmark.nl
 copyright:           Adam Bergmark, Brian Victor, Chris Done
+category:            Web, Fay
 build-type:          Simple
 cabal-version:       >=1.8
+extra-source-files:
+  README.md
+  CHANGELOG.md
 data-files: src/JQuery.hs
 
+source-repository head
+  type: git
+  location: https://github.com/faylang/fay-jquery.git
+
+
 library
   hs-source-dirs: src
+  ghc-options: -Wall
   exposed-modules: JQuery
-  build-depends: fay-base >= 0.14.1.0
+  build-depends: fay-base >= 0.18
+               , fay-text >= 0.2
diff --git a/src/JQuery.hs b/src/JQuery.hs
--- a/src/JQuery.hs
+++ b/src/JQuery.hs
@@ -1,5 +1,8 @@
 {-# LANGUAGE EmptyDataDecls    #-}
+{-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE RankNTypes        #-}
+{-# LANGUAGE RebindableSyntax  #-}
+{-# LANGUAGE TypeSynonymInstances #-}
 
 module JQuery where
 
@@ -8,16 +11,17 @@
 data types all subject to drastic change.
 --}
 
+import           Fay.Text
 import           FFI
-import           Prelude
+import           Prelude hiding (succ)
 
 data JQuery
 
 data JQXHR
 
-type EventType = String
+type EventType = Text
 
-type Selector = String
+type Selector = Text
 
 
 -- Things that should go in fay or fay-dom
@@ -36,22 +40,22 @@
 ---- Ajax
 ----
 
-ajax :: String
+ajax :: Text
      -> (Automatic b -> Fay ())
-     -> (JQXHR -> Maybe String -> Maybe String -> Fay ())
+     -> (JQXHR -> Maybe Text -> Maybe Text -> Fay ())
      -> Fay ()
 ajax ur succ err = ajax' $ defaultAjaxSettings
   { success = Defined succ
-  , data' = Undefined :: Defined String -- hackety hack
+  , data' = Undefined :: Defined Text -- hackety hack
   , error' = Defined err
   , url = Defined ur }
 
 -- | Serializes the given object to JSON and passes it as the request body without request parameters.
 --   The response is deserialized depending on its type.
-ajaxPost :: String
+ajaxPost :: Text
          -> Automatic f
          -> (Automatic g -> Fay ())
-         -> (JQXHR -> Maybe String -> Maybe String -> Fay ())
+         -> (JQXHR -> Maybe Text -> Maybe Text -> Fay ())
          -> Fay ()
 ajaxPost ur dat succ err = ajax' $ defaultAjaxSettings
   { success = Defined succ
@@ -65,11 +69,11 @@
   }
 
 -- | Same as ajaxPost but sends the data inside the given request parameter
-ajaxPostParam :: String
-              -> String
+ajaxPostParam :: Text
+              -> Text
               -> Automatic f
               -> (Automatic g -> Fay ())
-              -> (JQXHR -> Maybe String -> Maybe String -> Fay ())
+              -> (JQXHR -> Maybe Text -> Maybe Text -> Fay ())
               -> Fay ()
 ajaxPostParam ur rqparam dat succ err = ajax' $ defaultAjaxSettings
   { success = Defined succ
@@ -82,41 +86,41 @@
   , dataType = Defined "json"
   }
 
-makeRqObj :: String -> a -> Object
+makeRqObj :: Text -> a -> Object
 makeRqObj = ffi "(function () { var o = {}; o[%1] = %2; return o; })()"
 
 data AjaxSettings a b = AjaxSettings
-  { accepts     :: Defined String
+  { accepts     :: Defined Text
   , async       :: Defined Bool
   , beforeSend  :: Defined (JQXHR -> AjaxSettings a b -> Fay ())
   , cache       :: Defined Bool
-  , complete    :: Defined (JQXHR -> String -> Fay ())
+  , complete    :: Defined (JQXHR -> Text -> Fay ())
   -- , contents :: Defined (Object RegExp) -- skipped
-  , contentType :: Defined String
+  , contentType :: Defined Text
   -- , context :: Defined Object -- skipped
   -- , converters :: Defined (Object Value) -- skipped
   , crossDomain :: Defined Bool
   , data'       :: Defined a
   -- , dataFilter  :: Defined (Data -> Type -> Fay ()) -- skipped
-  , dataType    :: Defined String
-  , error'      :: Defined (JQXHR -> Maybe String -> Maybe String -> Fay ())
+  , dataType    :: Defined Text
+  , error'      :: Defined (JQXHR -> Maybe Text -> Maybe Text -> Fay ())
   , global      :: Defined Bool
-  -- , headers :: Object String -- need generic objects
+  -- , headers :: Object Text -- need generic objects
   , ifModified  :: Defined Bool
   , isLocal     :: Defined Bool
   -- , jsonp -- skipped
   -- , jsonpCallback -- skipped
-  , mimeType    :: Defined String
-  , password    :: Defined String
+  , mimeType    :: Defined Text
+  , password    :: Defined Text
   , processData :: Defined Bool
   -- , scriptCharset -- skipped
   -- , statusCode -- skipped
   , success     :: Defined (b -> Fay ())
   , timeout     :: Defined Double
   -- , traditional -- skipped
-  , type'       :: Defined String
-  , url         :: Defined String
-  , username    :: Defined String
+  , type'       :: Defined Text
+  , url         :: Defined Text
+  , username    :: Defined Text
   -- , xhr :: XHR -- XHR needs to be added to fay-dom
   }
 
@@ -155,7 +159,7 @@
         \ delete o[p]; \
       \ } \
     \ } \
-    \ console.log(o); \
+    \ o['data'] = JSON.stringify(o['data']); \
     \ return jQuery.ajax(o); \
   \ })(%1)"
 
@@ -163,92 +167,91 @@
 ---- Attributes
 ----
 
-addClass :: String -> JQuery -> Fay JQuery
+addClass :: Text -> JQuery -> Fay JQuery
 addClass = ffi "%2['addClass'](%1)"
 
--- FIXME: https://github.com/chrisdone/fay/issues/38
-addClassWith :: (Double -> String -> Fay String) -> JQuery -> Fay JQuery
+addClassWith :: (Double -> Text -> Fay Text) -> JQuery -> Fay JQuery
 addClassWith = ffi "%2['addClass'](%1)"
 
-getAttr :: String -> JQuery -> Fay String
+getAttr :: Text -> JQuery -> Fay (Defined Text)
 getAttr = ffi "%2['attr'](%1)"
 
-setAttr :: String -> String -> JQuery -> Fay JQuery
+setAttr :: Text -> Text -> JQuery -> Fay JQuery
 setAttr = ffi "%3['attr'](%1, %2)"
 
 -- TODO: setAttrs with map
 
-setAttrWith :: String -> (Double -> String -> Fay String) -> JQuery -> Fay JQuery
+setAttrWith :: Text -> (Double -> Text -> Fay Text) -> JQuery -> Fay JQuery
 setAttrWith = ffi "%3['attr'](%1, %2)"
 
-hasClass :: String -> JQuery -> Fay Bool
+hasClass :: Text -> JQuery -> Fay Bool
 hasClass = ffi "%2['hasClass'](%1)"
 
-getHtml :: JQuery -> Fay String
+getHtml :: JQuery -> Fay Text
 getHtml = ffi "%1['html']()"
 
-setHtml :: String -> JQuery -> Fay JQuery
+setHtml :: Text -> JQuery -> Fay JQuery
 setHtml = ffi "%2['html'](%1)"
 
-setHtmlWith :: (Double -> String -> Fay JQuery) -> JQuery -> Fay JQuery
+setHtmlWith :: (Double -> Text -> Fay JQuery) -> JQuery -> Fay JQuery
 setHtmlWith = ffi "%2['html'](%1)"
 
 -- TODO: html with props
 
-getProp :: String -> JQuery -> Fay String
+getProp :: Text -> JQuery -> Fay Text
 getProp = ffi "%2['prop'](%1)"
 
-setProp :: String -> String -> JQuery -> Fay JQuery
+setProp :: Text -> Text -> JQuery -> Fay JQuery
 setProp = ffi "%3['prop'](%1, %2)"
 
 -- TODO: setProp with map
 
-setPropWith :: String -> (Double -> String -> Fay String) -> JQuery -> Fay JQuery
+setPropWith :: Text -> (Double -> Text -> Fay Text) -> JQuery -> Fay JQuery
 setPropWith = ffi "%3['prop'](%1, %2)"
 
-removeAttr :: String -> JQuery -> Fay JQuery
+removeAttr :: Text -> JQuery -> Fay JQuery
 removeAttr = ffi "%2['removeAttr'](%1)"
 
-removeClass :: String -> JQuery -> Fay JQuery
+removeClass :: Text -> JQuery -> Fay JQuery
 removeClass = ffi "%2['removeClass'](%1)"
 
-removeClassWith :: (Double -> String -> Fay JQuery) -> JQuery -> Fay JQuery
+removeClassWith :: (Double -> Text -> Fay JQuery) -> JQuery -> Fay JQuery
 removeClassWith = ffi "%2['removeClass'](%1)"
 
-removeProp :: String -> JQuery -> Fay JQuery
+removeProp :: Text -> JQuery -> Fay JQuery
 removeProp = ffi "%2['removeProp'](%1)"
 
-toggleClass :: String -> JQuery -> Fay JQuery
+toggleClass :: Text -> JQuery -> Fay JQuery
 toggleClass = ffi "%2['toggleClass'](%1)"
 
-toggleClassBool :: String -> Bool -> JQuery -> Fay JQuery
+toggleClassBool :: Text -> Bool -> JQuery -> Fay JQuery
 toggleClassBool = ffi "%3['toggleClass'](%1, %2)"
 
 toggleAllClasses :: Bool -> JQuery -> Fay JQuery
 toggleAllClasses = ffi "%2['toggleClass'](%1)"
 
-toggleClassWith :: (Double -> String -> Bool -> Fay JQuery) -> JQuery -> Fay JQuery
+toggleClassWith :: (Double -> Text -> Bool -> Fay JQuery) -> JQuery -> Fay JQuery
 toggleClassWith = ffi "%2['toggleClass'](%1)"
 
-toggleClassBoolWith :: (Double -> String -> Bool -> Fay JQuery) -> Bool -> JQuery -> Fay JQuery
+toggleClassBoolWith :: (Double -> Text -> Bool -> Fay JQuery) -> Bool -> JQuery -> Fay JQuery
 toggleClassBoolWith = ffi "%3['toggleClass'](%1, %2)"
 
-getVal :: JQuery -> Fay String
+getVal :: JQuery -> Fay Text
 getVal = ffi "%1['val']()"
 
-setVal :: String -> JQuery -> Fay JQuery
+setVal :: Text -> JQuery -> Fay JQuery
 setVal = ffi "%2['val'](%1)"
 
-setValWith :: (Double -> String -> Fay JQuery) -> JQuery -> Fay JQuery
+setValWith :: (Double -> Text -> Fay JQuery) -> JQuery -> Fay JQuery
 setValWith = ffi "%2['val'](%1)"
 
-setText :: String -> JQuery -> Fay JQuery
+setText :: Text -> JQuery -> Fay JQuery
 setText = ffi "%2['text'](%1)"
 
-setTextWith :: (Double -> String -> Fay JQuery) -> JQuery -> Fay JQuery
+setTextWith :: (Double -> Text -> Fay JQuery) -> JQuery -> Fay JQuery
 setTextWith = ffi "%2['text'](%1)"
 
-getText :: JQuery -> Fay String
+getText :: JQuery -> Fay Text
 getText = ffi "%1['text']()"
 
 ----
@@ -259,20 +262,21 @@
 holdReady = ffi "jQuery['holdReady'](%1)"
 
 -- jQuery()
-selectElement :: Element -> Fay JQuery
-selectElement = ffi "jQuery(%1)"
+-- http://api.jquery.com/jQuery/
+class Selectable a
 
-selectObject :: a -> Fay JQuery
-selectObject = ffi "jQuery(%1)"
+instance Selectable Text
+instance Selectable Element
+instance Selectable JQuery
 
-select :: String -> Fay JQuery
-select = ffi "jQuery(%1)"
+select :: Selectable a => a -> Fay JQuery
+select = ffi "jQuery(Fay$$_(%1))"
 
 selectEmpty :: Fay JQuery
 selectEmpty = ffi "jQuery()"
 
-createJQuery :: String -> a -> Fay JQuery
-createJQuery = ffi "jQuery(%1, %2)"
+selectInContext :: (Selectable a, Selectable b) => a -> b -> Fay JQuery
+selectInContext = ffi "jQuery(Fay$$_(%1), Fay$$_(%2))"
 
 ready :: Fay () -> Fay ()
 ready = ffi "jQuery(%1)"
@@ -293,13 +297,13 @@
 ---- CSS
 ----
 
-getCss :: String -> JQuery -> Fay String
+getCss :: Text -> JQuery -> Fay Text
 getCss = ffi "%2['css'](%1)"
 
-setCss :: String -> String -> JQuery -> Fay JQuery
+setCss :: Text -> Text -> JQuery -> Fay JQuery
 setCss = ffi "%3['css'](%1, %2)"
 
-setCssWith :: String -> (Double -> String -> Fay String) -> JQuery -> Fay JQuery
+setCssWith :: Text -> (Double -> Text -> Fay Text) -> JQuery -> Fay JQuery
 setCssWith = ffi "%3['css'](%1, %2)"
 
 getHeight :: JQuery -> Fay Double
@@ -387,17 +391,17 @@
 data Speed = Instantly | Slow | Fast | Speed Double
 
 data Animation = Animation
-  { _type :: AnimationType
-  , _speed :: Speed
+  { _type          :: AnimationType
+  , _speed         :: Speed
   , _nextAnimation :: Maybe Animation
-  , _element :: JQuery
+  , _element       :: JQuery
   }
 
 anim :: AnimationType -> JQuery -> Animation
 anim ty el = Animation ty Fast Nothing el
 
 speed :: Speed -> Animation -> Animation
-speed spd anim = anim { _speed = spd }
+speed spd ani = ani { _speed = spd }
 
 chainAnim :: Animation -> Animation -> Animation
 chainAnim a1 a2 = a1 { _nextAnimation = Just a2 }
@@ -405,6 +409,7 @@
 chainAnims :: [Animation] -> Animation
 chainAnims [a] = a
 chainAnims (a:as) = a `chainAnim` chainAnims as
+chainAnims [] = error (unpack "chainAnims: empty list")
 
 runAnimation :: Animation -> Fay ()
 runAnimation a = do
@@ -592,7 +597,7 @@
 isPropagationStopped :: Event -> Fay Element
 isPropagationStopped = ffi "%1['isPropagationStopped']()"
 
-namespace :: Event -> Fay String
+namespace :: Event -> Fay Text
 namespace = ffi "%1['namespace']"
 
 pageX :: Event -> Fay Double
@@ -607,10 +612,13 @@
 target :: Event -> Fay Element
 target = ffi "%1['target']"
 
+currentTarget :: Event -> Fay Element
+currentTarget = ffi "%1['currentTarget']"
+
 timeStamp :: Event -> Fay Double
 timeStamp = ffi "%1['timeStamp']"
 
-eventType :: Event -> Fay String
+eventType :: Event -> Fay Text
 eventType = ffi "%1['type']"
 
 which :: Event -> Fay Int
@@ -664,15 +672,14 @@
 ---- Manipulation
 ----
 
--- Is there a better way to constrain the type here?
-after :: a -> JQuery -> Fay JQuery
-after = ffi "%2['after'](%1)"
+after :: Selectable a => a -> JQuery -> Fay JQuery
+after = ffi "%2['after'](Fay$$_(%1))"
 
 afterWith :: (Double -> Fay JQuery) -> JQuery -> Fay JQuery
 afterWith = ffi "%2['after'](%1)"
 
-append :: a -> JQuery -> Fay JQuery
-append = ffi "%2['append'](%1)"
+append :: Selectable a => a -> JQuery -> Fay JQuery
+append = ffi "%2['append'](Fay$$_(%1))"
 
 appendJQuery :: JQuery -> JQuery -> Fay JQuery
 appendJQuery = ffi "%2['append'](%1)"
@@ -681,16 +688,16 @@
 appendWith :: (Double -> Fay JQuery) -> JQuery -> Fay JQuery
 appendWith = ffi "%2['append'](%1)"
 
-appendTo :: a -> JQuery -> Fay JQuery
-appendTo = ffi "%2['appendTo'](%1)"
+appendTo :: Selectable a => a -> JQuery -> Fay JQuery
+appendTo = ffi "%2['appendTo'](Fay$$_(%1))"
 
 appendToJQuery :: JQuery -> JQuery -> Fay JQuery
 appendToJQuery = ffi "%2['appendTo'](%1)"
 
 
 
-before :: a -> JQuery -> Fay JQuery
-before = ffi "%2['before'](%1)"
+before :: Selectable a => a -> JQuery -> Fay JQuery
+before = ffi "%2['before'](Fay$$_(%1))"
 
 beforeWith :: (Double -> Fay JQuery) -> JQuery -> Fay JQuery
 beforeWith = ffi "%2['before'](%1)"
@@ -698,45 +705,46 @@
 data CloneType = WithoutDataAndEvents | WithDataAndEvents | DeepWithDataAndEvents
 
 clone :: CloneType -> JQuery -> Fay JQuery
-clone WithoutDataAndEvents  = ffi "%2['clone'](false)"
-clone WithDataAndEvents     = ffi "%2['clone'](true, false)"
-clone DeepWithDataAndEvents = ffi "%2['clone'](true, true)"
+clone WithoutDataAndEvents  = ffi "%1['clone'](false)"       :: JQuery -> Fay JQuery
+clone WithDataAndEvents     = ffi "%1['clone'](true, false)" :: JQuery -> Fay JQuery
+clone DeepWithDataAndEvents = ffi "%1['clone'](true, true)"  :: JQuery -> Fay JQuery
 
+
 detach :: JQuery -> Fay JQuery
 detach = ffi "%1['detach']()"
 
-detachSelector :: String -> JQuery -> Fay JQuery
+detachSelector :: Text -> JQuery -> Fay JQuery
 detachSelector = ffi "%2['detach'](%1)"
 
 empty :: JQuery -> Fay JQuery
 empty = ffi "%1['empty']()"
 
-insertAfter :: a -> JQuery -> Fay JQuery
-insertAfter = ffi "%2['insertAfter'](%1)"
+insertAfter :: Selectable a => a -> JQuery -> Fay JQuery
+insertAfter = ffi "%2['insertAfter'](Fay$$_(%1))"
 
-insertBefore :: a -> JQuery -> Fay JQuery
-insertBefore = ffi "%2['insertBefore'](%1)"
+insertBefore :: Selectable a => a -> JQuery -> Fay JQuery
+insertBefore = ffi "%2['insertBefore'](Fay$$_(%1))"
 
-prepend :: a -> JQuery -> Fay JQuery
-prepend = ffi "%2['prepend'](%1)"
+prepend :: Selectable a => a -> JQuery -> Fay JQuery
+prepend = ffi "%2['prepend'](Fay$$_(%1))"
 
 prependWith :: (Double -> Fay JQuery) -> JQuery -> Fay JQuery
 prependWith = ffi "%2['prepend'](%1)"
 
-prependTo :: a -> JQuery -> Fay JQuery
-prependTo = ffi "%2['prependTo'](%1)"
+prependTo :: Selectable a => a -> JQuery -> Fay JQuery
+prependTo = ffi "%2['prependTo'](Fay$$_(%1))"
 
 remove :: JQuery -> Fay JQuery
 remove = ffi "%1['remove']()"
 
-removeSelector :: String -> JQuery -> Fay JQuery
+removeSelector :: Text -> JQuery -> Fay JQuery
 removeSelector = ffi "%2['remove'](%1)"
 
-replaceAll :: String -> JQuery -> Fay JQuery
+replaceAll :: Text -> JQuery -> Fay JQuery
 replaceAll = ffi "%2['replaceAll'](%1)"
 
 -- FIXME: create other forms of replaceWith
-replaceWith :: String -> JQuery -> Fay JQuery
+replaceWith :: Text -> JQuery -> Fay JQuery
 replaceWith = ffi "%2['replaceWith'](%1)"
 
 replaceWithJQuery :: JQuery -> JQuery -> Fay JQuery
@@ -750,25 +758,25 @@
 unwrap = ffi "%1['unwrap']()"
 
 -- FIXME: create other forms of wrap
-wrap :: String -> JQuery -> Fay JQuery
+wrap :: Text -> JQuery -> Fay JQuery
 wrap = ffi "%2['wrap'](%1)"
 
 wrapWith :: (Double -> Fay JQuery) -> JQuery -> Fay JQuery
 wrapWith = ffi "%2['wrap'](%1)"
 
-wrapAllHtml :: String -> JQuery -> Fay JQuery
+wrapAllHtml :: Text -> JQuery -> Fay JQuery
 wrapAllHtml = ffi "%2['wrapAll'](%1)"
 
-wrapAllSelector :: String -> JQuery -> Fay JQuery
+wrapAllSelector :: Text -> JQuery -> Fay JQuery
 wrapAllSelector = ffi "%2['wrapAll'](%1)"
 
 wrapAllElement :: Element -> JQuery -> Fay JQuery
 wrapAllElement = ffi "%2['wrapAll'](%1)"
 
-wrapInnerHtml :: String -> JQuery -> Fay JQuery
+wrapInnerHtml :: Text -> JQuery -> Fay JQuery
 wrapInnerHtml = ffi "%2['wrapInner'](%1)"
 
-wrapInnerSelector :: String -> JQuery -> Fay JQuery
+wrapInnerSelector :: Text -> JQuery -> Fay JQuery
 wrapInnerSelector = ffi "%2['wrapInner'](%1)"
 
 wrapInnerElement :: Element -> JQuery -> Fay JQuery
@@ -800,19 +808,19 @@
 ----
 
 -- TODO: unify these under a typeclass?
-addSelector :: String -> JQuery -> Fay JQuery
+addSelector :: Text -> JQuery -> Fay JQuery
 addSelector = ffi "%2['add'](%1)"
 
 addElement :: Element -> JQuery -> Fay JQuery
 addElement = ffi "%2['add'](%1)"
 
-addHtml :: String -> JQuery -> Fay JQuery
+addHtml :: Text -> JQuery -> Fay JQuery
 addHtml = ffi "%2['add'](%1)"
 
 add :: JQuery -> JQuery -> Fay JQuery
 add = ffi "%2['add'](%1)"
 
-addSelectorWithContext :: String -> JQuery -> JQuery -> Fay JQuery
+addSelectorWithContext :: Text -> JQuery -> JQuery -> Fay JQuery
 addSelectorWithContext = ffi "%3['add'](%1, %2)"
 
 andSelf :: JQuery -> Fay JQuery
@@ -821,14 +829,14 @@
 children :: JQuery -> Fay JQuery
 children = ffi "%1['children']()"
 
-childrenMatching :: String -> JQuery -> Fay JQuery
+childrenMatching :: Text -> JQuery -> Fay JQuery
 childrenMatching = ffi "%2['children'](%1)"
 
-closestSelector :: String -> JQuery -> Fay JQuery
+closestSelector :: Text -> JQuery -> Fay JQuery
 closestSelector = ffi "%2['closest'](%1)"
 
 -- TODO: is context really a string?
-closestWithContext :: String -> String -> JQuery -> Fay JQuery
+closestWithContext :: Text -> Text -> JQuery -> Fay JQuery
 closestWithContext = ffi "%3['closest'](%1, %2)"
 
 closest :: JQuery -> JQuery -> Fay JQuery
@@ -852,7 +860,7 @@
 eq :: Double -> JQuery -> Fay JQuery
 eq = ffi "%2['eq'](%1)"
 
-filter :: String -> JQuery -> Fay JQuery
+filter :: Text -> JQuery -> Fay JQuery
 filter = ffi "%2['filter'](%1)"
 
 filterWith :: (Double -> Fay Bool) -> JQuery -> Fay JQuery
@@ -865,7 +873,7 @@
 filterJQuery = ffi "%2['filter'](%1)"
 
 -- FIXME: not called find because Fay doesn't seem to deal well with name conflicts yet
-findSelector :: String -> JQuery -> Fay JQuery
+findSelector :: Text -> JQuery -> Fay JQuery
 findSelector = ffi "%2['find'](%1)"
 
 findJQuery :: JQuery -> JQuery -> Fay JQuery
@@ -877,24 +885,18 @@
 first :: JQuery -> Fay JQuery
 first = ffi "%1['first']()"
 
-has :: String -> JQuery -> Fay JQuery
+has :: Text -> JQuery -> Fay JQuery
 has = ffi "%2['has'](%1)"
 
 hasElement :: Element -> JQuery -> Fay JQuery
 hasElement = ffi "%2['has'](%1)"
 
-is :: String -> JQuery -> Fay JQuery
-is = ffi "%2['is'](%1)"
+is :: Selectable a => a -> JQuery -> Fay Bool
+is = ffi "%2['is'](Fay$$_(%1))"
 
-isWith :: (Double -> Bool) -> JQuery -> Fay JQuery
+isWith :: (Int -> Bool) -> JQuery -> Fay JQuery
 isWith = ffi "%2['is'](%1)"
 
-isJQuery :: JQuery -> JQuery -> Fay JQuery
-isJQuery = ffi "%2['is'](%1)"
-
-isElement :: Element -> JQuery -> Fay JQuery
-isElement = ffi "%2['is'](%1)"
-
 last :: JQuery -> Fay JQuery
 last = ffi "%1['last']()"
 
@@ -905,28 +907,28 @@
 next :: JQuery -> Fay JQuery
 next = ffi "%1['next']()"
 
-nextSelector :: String -> JQuery -> Fay JQuery
+nextSelector :: Text -> JQuery -> Fay JQuery
 nextSelector = ffi "%2['next'](%1)"
 
 nextAll :: JQuery -> Fay JQuery
 nextAll = ffi "%1['nextAll']()"
 
-nextAllSelector :: String -> JQuery -> Fay JQuery
+nextAllSelector :: Text -> JQuery -> Fay JQuery
 nextAllSelector = ffi "%2['nextAll'](%1)"
 
-nextUntil :: String -> JQuery -> Fay JQuery
+nextUntil :: Text -> JQuery -> Fay JQuery
 nextUntil = ffi "%2['nextUntil'](%1)"
 
-nextUntilFiltered :: String -> String -> JQuery -> Fay JQuery
+nextUntilFiltered :: Text -> Text -> JQuery -> Fay JQuery
 nextUntilFiltered = ffi "%3['nextUntil'](%1, %2)"
 
 nextUntilElement :: Element -> JQuery -> Fay JQuery
 nextUntilElement = ffi "%2['nextUntil'](%1)"
 
-nextUntilElementFiltered :: Element -> String -> JQuery -> Fay JQuery
+nextUntilElementFiltered :: Element -> Text -> JQuery -> Fay JQuery
 nextUntilElementFiltered = ffi "%3['nextUntil'](%1, %2)"
 
-not :: String -> JQuery -> Fay JQuery
+not :: Text -> JQuery -> Fay JQuery
 not = ffi "%2['not'](%1)"
 
 notElement :: Element -> JQuery -> Fay JQuery
@@ -947,55 +949,55 @@
 parent :: JQuery -> Fay JQuery
 parent = ffi "%1['parent']()"
 
-parentSelector :: String -> JQuery -> Fay JQuery
+parentSelector :: Text -> JQuery -> Fay JQuery
 parentSelector = ffi "%2['parent'](%1)"
 
 parents :: JQuery -> Fay JQuery
 parents = ffi "%1['parents']()"
 
-parentsSelector :: String -> JQuery -> Fay JQuery
+parentsSelector :: Text -> JQuery -> Fay JQuery
 parentsSelector = ffi "%2['parents'](%1)"
 
-parentsUntil :: String -> JQuery -> Fay JQuery
+parentsUntil :: Text -> JQuery -> Fay JQuery
 parentsUntil = ffi "%2['parentsUntil'](%1)"
 
-parentsUntilFiltered :: String -> String -> JQuery -> Fay JQuery
+parentsUntilFiltered :: Text -> Text -> JQuery -> Fay JQuery
 parentsUntilFiltered = ffi "%3['parentsUntil'](%1, %2)"
 
 parentsUntilElement :: Element -> JQuery -> Fay JQuery
 parentsUntilElement = ffi "%2['parentsUntil'](%1)"
 
-parentsUntilElementFiltered :: Element -> String -> JQuery -> Fay JQuery
+parentsUntilElementFiltered :: Element -> Text -> JQuery -> Fay JQuery
 parentsUntilElementFiltered = ffi "%3['parentsUntil'](%1, %2)"
 
 prev :: JQuery -> Fay JQuery
 prev = ffi "%1['prev']()"
 
-prevSelector :: String -> JQuery -> Fay JQuery
+prevSelector :: Text -> JQuery -> Fay JQuery
 prevSelector = ffi "%2['prev'](%1)"
 
 prevAll :: JQuery -> Fay JQuery
 prevAll = ffi "%1['prevAll']()"
 
-prevAllSelector :: String -> JQuery -> Fay JQuery
+prevAllSelector :: Text -> JQuery -> Fay JQuery
 prevAllSelector = ffi "%2['prevAll'](%1)"
 
-prevUntil :: String -> JQuery -> Fay JQuery
+prevUntil :: Text -> JQuery -> Fay JQuery
 prevUntil = ffi "%2['prevUntil'](%1)"
 
-prevUntilFiltered :: String -> String -> JQuery -> Fay JQuery
+prevUntilFiltered :: Text -> Text -> JQuery -> Fay JQuery
 prevUntilFiltered = ffi "%3['prevUntil'](%1, %2)"
 
 prevUntilElement :: Element -> JQuery -> Fay JQuery
 prevUntilElement = ffi "%2['prevUntil'](%1)"
 
-prevUntilElementFiltered :: Element -> String -> JQuery -> Fay JQuery
+prevUntilElementFiltered :: Element -> Text -> JQuery -> Fay JQuery
 prevUntilElementFiltered = ffi "%3['prevUntil'](%1, %2)"
 
 siblings :: JQuery -> Fay JQuery
 siblings = ffi "%1['siblings']()"
 
-siblingsSelector :: String -> JQuery -> Fay JQuery
+siblingsSelector :: Text -> JQuery -> Fay JQuery
 siblingsSelector = ffi "%2['siblings'](%1)"
 
 slice :: Double -> JQuery -> Fay JQuery
@@ -1010,7 +1012,7 @@
              | KeyRight
              | KeyRet
              | SomeKey Double
-  deriving (Show)
+--  deriving (Show)
 
 onKeycode :: (KeyCode -> Fay Bool) -> JQuery -> Fay JQuery
 onKeycode callback el = do
@@ -1058,9 +1060,3 @@
 
 -- vim implementation shortcut
 -- inoremap <F6> <ESC>:normal 0ywo<ESC>pa= ffi ""<ESC>F"i
-
-
-
-----
----- Utilities
-----
