diff --git a/Control/SentenceJP.hs b/Control/SentenceJP.hs
new file mode 100644
--- /dev/null
+++ b/Control/SentenceJP.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Control.SentenceJP
+  ( generateSentence
+  ) where
+
+import Control.Monad.IO.Class ( MonadIO (), liftIO )
+import Data.List ( concat, foldl1 )
+import Data.Text ( Text () )
+import Prelude hiding ( foldl1 )
+import System.Random.Shuffle ( shuffleM )
+import Text.MeCab ( new, parseToNodes, Node (..) )
+import qualified Data.Text as T
+
+
+--- Define data types
+--
+data PositionText = Begin Text | Middle Text | End Text deriving (Show)
+
+extractPositionText :: PositionText -> Text
+extractPositionText (Begin  x) = x
+extractPositionText (Middle x) = x
+extractPositionText (End    x) = x
+
+isEnd :: PositionText -> Bool
+isEnd (End _) = True
+isEnd _       = False
+
+type PositionTextCons = (Text -> PositionText)
+getPosition :: PositionText -> PositionTextCons
+getPosition (Begin  _) = Begin
+getPosition (Middle _) = Middle
+getPosition (End    _) = End
+
+
+data ChainableWords = ChainableWords PositionText PositionText deriving (Show)
+
+areChainable :: ChainableWords -> ChainableWords -> Bool
+areChainable (ChainableWords _ y1) (ChainableWords x2 _) =
+  let jointL = extractPositionText y1
+      jointR = extractPositionText x2
+  in jointL == jointR
+
+toText :: ChainableWords -> Text
+toText (ChainableWords x y) = extractPositionText x `T.append` extractPositionText y
+
+hasBegin :: ChainableWords -> Bool
+hasBegin (ChainableWords (Begin _) _) = True
+hasBegin _                            = False
+
+
+--- Define functions
+--
+
+-- | Generating Sentence as Text from [Text]
+generateSentence :: MonadIO m => [Text] -> m Text
+generateSentence sources = do
+  mecab      <- liftIO . new $ ["mecab"]
+  nodes      <- liftIO . mapM (parseToNodes mecab) $ sources
+  let sentences = map (toChainable . filter (/= "") . map nodeSurface) $ nodes
+  sentences' <- liftIO . shuffleM . concat $ sentences
+  return . chainWords $ sentences'
+
+toChainable :: [Text] -> [ChainableWords]
+toChainable [x] = [ChainableWords (Begin x) (End "")]
+toChainable xs  = zipWith ChainableWords xs' (tail xs')
+  where
+    beginWord   = Begin . head $ xs
+    endWord     = End   . last $ xs
+    middleWords = map Middle . init . tail $ xs
+    xs'         = [beginWord] ++ middleWords ++ [endWord]
+
+chainWords :: [ChainableWords] -> Text
+chainWords []  = error "aho-baka-hoge"
+chainWords [x] = toText x
+chainWords xs  = toText . foldl1 chain . dropWhile (not . hasBegin) $ xs
+  where
+    chain :: ChainableWords -> ChainableWords -> ChainableWords
+    chain a@(ChainableWords _ y1) b@(ChainableWords _ y2)
+      | areChainable a b = if isEnd y1
+                              then a
+                              else let l = Begin . toText $ a
+                                   in ChainableWords l y2
+      | otherwise = a
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright aiya000 (c) 2016
+
+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 aiya000 nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 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 COPYRIGHT
+OWNER 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/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/sentence-jp.cabal b/sentence-jp.cabal
new file mode 100644
--- /dev/null
+++ b/sentence-jp.cabal
@@ -0,0 +1,27 @@
+name:                sentence-jp
+version:             0.1.0.0
+synopsis:            Easily generating message of japanese natural language
+description:         Please see README.md
+homepage:            https://github.com/aiya000/hs-sentence-jp#readme
+license:             BSD3
+license-file:        LICENSE
+author:              aiya000
+maintainer:          aiya000.develop@gmail.com
+copyright:           2016 aiya000
+category:            Japanese Natural Language Processing
+build-type:          Simple
+-- extra-source-files:
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Control.SentenceJP
+  build-depends:       base >= 4.7 && < 5
+                     , mecab
+                     , random-shuffle
+                     , text
+                     , transformers
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/aiya000/hs-sentence-jp
