diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,18 @@
+Copyright © 2015-2016 Arthur S. Fayzrakhmanov <https://github.com/geraldus>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+the Software, and to permit persons to whom the Software is furnished to do so,
+subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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/Yesod/Form/Summernote.hs b/src/Yesod/Form/Summernote.hs
new file mode 100644
--- /dev/null
+++ b/src/Yesod/Form/Summernote.hs
@@ -0,0 +1,117 @@
+-- | Provide the user with the Summernote rich text editor.
+--
+-- /NOTES:/
+--
+-- Editor fields have hidden textareas which are updated automatically when
+-- editor contents changes.
+--
+-- @
+-- summerForm :: Form HtmlComment
+-- summerForm = renderBootstrap3 BootstrapBasicForm $ HtmlComment
+--   \<$\> areq (snHtmlFieldCustomized "{toolbar:false}") "Title" Nothing
+--   \<*\> areq snHtmlField "Comment" Nothing
+-- @
+
+module Yesod.Form.Summernote
+    ( YesodSummernote (..)
+    , snHtmlField
+    , snHtmlFieldCustomized
+    ) where
+
+import           Control.Monad                   (when)
+import           Data.Maybe                      (listToMaybe)
+import           Data.Text                       (Text, pack)
+import           Text.Blaze.Html.Renderer.String (renderHtml)
+import           Text.Hamlet                     (shamlet)
+import           Text.HTML.SanitizeXSS           (sanitizeBalance)
+import           Text.Julius                     (julius, rawJS)
+import           Yesod.Core
+import           Yesod.Form
+
+class Yesod a => YesodSummernote a where
+    -- | Bootstrap 3 CSS location.
+    urlBootstrapCss :: a -> Either (Route a) Text
+    urlBootstrapCss _ =
+        Right "http://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css"
+    -- | Bootstrap 3 library location.
+    urlBootstrapScript :: a -> Either (Route a) Text
+    urlBootstrapScript _ =
+        Right "http://netdna.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.js"
+    -- | JQuery library location.
+    urlJQueryScript :: a -> Either (Route a) Text
+    urlJQueryScript _ =
+        Right "http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.js"
+    -- | Summernote Editor CSS location.
+    urlSummernoteCss :: a -> Either (Route a) Text
+    urlSummernoteCss _ = Right
+        "http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.0/summernote.css"
+    -- | Summernote Editor library location.
+    urlSummernoteScript :: a -> Either (Route a) Text
+    urlSummernoteScript _ = Right
+        "http://cdnjs.cloudflare.com/ajax/libs/summernote/0.8.0/summernote.js"
+    -- | Should required libraries and scripts be added in DOM tree?  This
+    -- property required to control script loading.  In case if you load JQuery,
+    -- Bootstrap, and Summernote libraries and CSS in @<head>@ it is not
+    -- necessary to load them second time, moreover this could bring some
+    -- issues, for example if JQuery is loaded second time it could brake AJAX
+    -- configuration from 'defaultCsrfMiddleware'.  Setting this to @True@ could
+    -- be useful in case you need single instance of editor on some pages only.
+    summernoteLoadLibrariesAndCss :: a -> Bool
+    summernoteLoadLibrariesAndCss _ = False
+
+-- | Customizable Summernote editor field.
+--
+-- @cfg@ argument should be a JSON formatted string, it will be passed to
+-- @$.summernote()@ call as first argument.
+--
+-- @
+-- snHtmlFieldCustomized "{ height: 150, codemirror: { theme:'monokai' } }"
+-- @
+snHtmlFieldCustomized :: YesodSummernote site
+                      => String -> Field (HandlerT site IO) Html
+snHtmlFieldCustomized cfg = Field
+    { fieldParse =
+        \e _ -> return $
+            Right . fmap (preEscapedToMarkup . sanitizeBalance) . listToMaybe $ e
+    , fieldView = \theId name attrs val _isReq -> do
+        toWidget [shamlet|
+$newline never
+<textarea id="#{theId}" *{attrs} name="#{name}" .html>#{showVal val}
+|]
+        master <- getYesod
+        (when (summernoteLoadLibrariesAndCss master) $ do
+            addScript'     urlJQueryScript
+            addStylesheet' urlBootstrapCss
+            addScript'     urlBootstrapScript
+            addStylesheet' urlSummernoteCss
+            addScript'     urlSummernoteScript)
+        toWidget $ [julius|
+$(document).ready(function(){
+  var input = document.getElementById("#{rawJS theId}");
+  $(input).summernote(#{rawJS cfg}).on('summernote.change',function(){
+    $(input).text($(input).summernote('code'));
+  });
+});|]
+    , fieldEnctype = UrlEncoded
+    }
+  where
+    showVal = either id (pack . renderHtml)
+
+-- | Summernote editor field with default settings.
+snHtmlField :: YesodSummernote site => Field (HandlerT site IO) Html
+snHtmlField = snHtmlFieldCustomized ""
+
+
+addScript' :: (MonadWidget m, HandlerSite m ~ site)
+           => (site -> Either (Route site) Text)
+           -> m ()
+addScript' f = do
+    y <- getYesod
+    addScriptEither $ f y
+
+addStylesheet' :: (MonadWidget m, HandlerSite m ~ site)
+               => (site -> Either (Route site) Text)
+               -> m ()
+addStylesheet' f = do
+    y <- getYesod
+    addStylesheetEither $ f y
diff --git a/yesod-form-richtext.cabal b/yesod-form-richtext.cabal
new file mode 100644
--- /dev/null
+++ b/yesod-form-richtext.cabal
@@ -0,0 +1,35 @@
+name:                yesod-form-richtext
+version:             0.1.0.0
+synopsis:            Various rich-text WYSIWYG editors for Yesod forms.
+description:         Please see README.md
+homepage:            http://github.com/geraldus/yesod-form-richtext#readme
+license:             MIT
+license-file:        LICENSE
+author:              Arthur S. Fayzrakhmanov
+maintainer:          heraldhoi@gmail.com
+copyright:           2016 Arthur S. Fayzrakhmanov
+category:            Web
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Yesod.Form.Summernote
+  build-depends:       base               >= 4.7     && < 5
+                     , blaze-builder      >= 0.2.1.4
+                     , blaze-html         >= 0.5
+                     , shakespeare        >= 2.0
+                     , text               >= 0.9
+                     , xss-sanitize       >= 0.3.0.1
+                     , yesod-core         >= 1.4     && < 1.5
+                     , yesod-form         >= 1.4.4.1 && < 1.5
+  default-language:    Haskell2010
+  default-extensions:  FlexibleContexts
+                       OverloadedStrings
+                       QuasiQuotes
+                       TypeFamilies
+
+
+source-repository head
+  type:     git
+  location: https://github.com/geraldus/yesod-form-richtext
