diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Yuji Yamamoto (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 Yuji Yamamoto 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/src/ACME/PreCure.hs b/src/ACME/PreCure.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure.hs
@@ -0,0 +1,14 @@
+module ACME.PreCure
+  ( module P
+  , PreCureMonad
+  ) where
+
+
+import qualified ACME.PreCure.Monad as M
+import           ACME.PreCure.Monad as P hiding (PreCureMonad)
+import           ACME.PreCure.Types as P
+import           ACME.PreCure.Textbook as P
+
+
+-- To hide Monad.Skeleton when using on GHCi
+type PreCureMonad = M.PreCureMonad
diff --git a/src/ACME/PreCure/Monad.hs b/src/ACME/PreCure/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Monad.hs
@@ -0,0 +1,129 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE GADTs #-}
+
+module ACME.PreCure.Monad
+  ( PreCureMonad
+  , EpisodeConfig(lineIntervalMicroSec)
+  , defaultEpisodeConfig
+  , speak
+  , say
+  , runPreCureMonad
+  , composeEpisode
+  , printEpisode
+  , printEpisodeWith
+  , hPrintEpisode
+  , hPrintEpisodeWith
+  , transform
+  , purify
+  , purifyWithoutItem
+  ) where
+
+
+import qualified Control.Arrow as Arrow
+import qualified Control.Concurrent as Concurrent
+import qualified Control.Monad as Monad
+import           Control.Monad.Skeleton
+                   ( Skeleton
+                   , MonadView((:>>=), Return)
+                   , bone
+                   , debone
+                   )
+import qualified Data.DList as DList
+import           Data.Monoid ((<>))
+import qualified System.IO as IO
+
+import           ACME.PreCure.Types
+
+
+data PreCureMonadBase x where
+  Speak :: [String] -> PreCureMonadBase ()
+
+
+type PreCureMonad = Skeleton PreCureMonadBase
+
+
+newtype EpisodeConfig =
+  EpisodeConfig
+    { lineIntervalMicroSec :: Int }
+
+
+defaultEpisodeConfig :: EpisodeConfig
+defaultEpisodeConfig =
+  EpisodeConfig $ 1 * 1000 * 1000
+
+
+speak :: [String] -> PreCureMonad ()
+speak =
+  bone . Speak
+
+
+say :: String -> PreCureMonad ()
+say =
+  speak . (:[])
+
+
+composeEpisode :: PreCureMonad a -> [String]
+composeEpisode =
+  snd . runPreCureMonad
+
+
+-- TODO: Write test
+runPreCureMonad :: PreCureMonad a -> (a, [String])
+runPreCureMonad =
+    Arrow.second DList.toList . runPreCureMonadD
+
+
+runPreCureMonadD :: PreCureMonad a -> (a, DList.DList String)
+runPreCureMonadD a =
+  case debone a of
+       Speak ss :>>= k ->
+         let (x, ss') = runPreCureMonadD $ k ()
+         in
+           (x, DList.fromList ss <> ss')
+       Return x -> (x, DList.empty)
+
+
+printEpisode :: PreCureMonad a -> IO ()
+printEpisode =
+  printEpisodeWith defaultEpisodeConfig
+
+
+hPrintEpisode :: IO.Handle -> PreCureMonad a -> IO ()
+hPrintEpisode =
+  flip hPrintEpisodeWith defaultEpisodeConfig
+
+
+printEpisodeWith :: EpisodeConfig -> PreCureMonad a -> IO ()
+printEpisodeWith =
+  hPrintEpisodeWith IO.stdout
+
+
+hPrintEpisodeWith :: IO.Handle -> EpisodeConfig -> PreCureMonad a -> IO ()
+hPrintEpisodeWith h cfg a = do
+  let interval = lineIntervalMicroSec cfg
+  Monad.forM_ (composeEpisode a) $ \s -> do
+    IO.hPutStrLn h s 
+    IO.hFlush h
+    Concurrent.threadDelay interval
+
+
+transform
+  :: (Transformation g' i')
+  => g' -> i' -> (Style g' i' -> PreCureMonad x) -> PreCureMonad x
+transform g i a = do
+  speak $ transformationSpeech g i
+  a $ transformedStyle g i
+
+
+purify
+  :: (Purification p' i')
+  => p' -> i' -> PreCureMonad ()
+purify p =
+  speak . purificationSpeech p
+
+
+purifyWithoutItem
+  :: (NonItemPurification p')
+  => p' -> PreCureMonad ()
+purifyWithoutItem =
+  speak . nonItemPurificationSpeech
diff --git a/src/ACME/PreCure/Textbook.hs b/src/ACME/PreCure/Textbook.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook.hs
@@ -0,0 +1,18 @@
+module ACME.PreCure.Textbook
+  ( module T
+  ) where
+
+
+import           ACME.PreCure.Textbook.First as T
+import           ACME.PreCure.Textbook.MaxHeart as T
+import           ACME.PreCure.Textbook.SplashStar as T
+import           ACME.PreCure.Textbook.Yes5 as T
+import           ACME.PreCure.Textbook.Yes5GoGo as T
+import           ACME.PreCure.Textbook.Fresh as T
+import           ACME.PreCure.Textbook.HeartCatch as T
+import           ACME.PreCure.Textbook.Suite as T
+import           ACME.PreCure.Textbook.Smile as T
+import           ACME.PreCure.Textbook.Dokidoki as T
+import           ACME.PreCure.Textbook.HappinessCharge as T
+import           ACME.PreCure.Textbook.GoPrincess as T
+import           ACME.PreCure.Textbook.MahoGirls as T
diff --git a/src/ACME/PreCure/Textbook/Dokidoki.hs b/src/ACME/PreCure/Textbook/Dokidoki.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Dokidoki.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Dokidoki
+  ( module D
+  ) where
+
+
+import           ACME.PreCure.Textbook.Dokidoki.Types as D
diff --git a/src/ACME/PreCure/Textbook/Dokidoki/Types.hs b/src/ACME/PreCure/Textbook/Dokidoki/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Dokidoki/Types.hs
@@ -0,0 +1,96 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Dokidoki.Types where
+
+
+import           ACME.PreCure.Textbook.Dokidoki.Words
+import           ACME.PreCure.Types.TH
+
+
+data Mana   = Mana deriving (Eq, Show)
+data Rikka  = Rikka deriving (Eq, Show)
+data Alice  = Alice deriving (Eq, Show)
+data Makoto = Makoto deriving (Eq, Show)
+data Aguri  = Aguri deriving (Eq, Show)
+
+girlInstance [t| Mana |] girlName_Mana
+girlInstance [t| Rikka |] girlName_Rikka
+girlInstance [t| Alice |] girlName_Alice
+girlInstance [t| Makoto |] girlName_Makoto
+girlInstance [t| Aguri |] girlName_Aguri
+
+data CureHeart   = CureHeart deriving (Eq, Show)
+data CureDiamond = CureDiamond deriving (Eq, Show)
+data CureRosetta = CureRosetta deriving (Eq, Show)
+data CureSword   = CureSword deriving (Eq, Show)
+data CureAce     = CureAce deriving (Eq, Show)
+
+data LovelyCommune_Sharuru cl = LovelyCommune_Sharuru cl deriving (Eq, Show)
+data LovelyCommune_Raquel cl  = LovelyCommune_Raquel cl deriving (Eq, Show)
+data LovelyCommune_Lance cl   = LovelyCommune_Lance cl deriving (Eq, Show)
+data LovelyCommune_Davi cl    = LovelyCommune_Davi cl deriving (Eq, Show)
+data LoveEyesPalette cl       = LoveEyesPalette cl deriving (Eq, Show)
+
+-- TODO: Define each distinct cure loveads type?
+data CureLoveads = CureLoveads deriving (Eq, Show)
+
+data LoveKissRouge = LoveKissRouge deriving (Eq, Show)
+
+data MagicalLovelyHarp cl = MagicalLovelyHarp cl deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureHeart |] cureName_Heart introducesHerselfAs_Heart
+transformedInstanceDefault [t| CureDiamond |] cureName_Diamond introducesHerselfAs_Diamond
+transformedInstanceDefault [t| CureRosetta |] cureName_Rosetta introducesHerselfAs_Rosetta
+transformedInstanceDefault [t| CureSword |] cureName_Sword introducesHerselfAs_Sword
+transformedInstanceDefault [t| CureAce |] cureName_Ace introducesHerselfAs_Ace
+
+transformedGroupInstanceDefault
+  [t| (CureHeart, CureDiamond, CureRosetta, CureSword, CureAce) |]
+  groupName_Dokidoki
+
+transformationInstance [t| Mana |] [t| LovelyCommune_Sharuru CureLoveads |] [t| CureHeart |] [| CureHeart |] transformationSpeech_Heart
+transformationInstance [t| Rikka |] [t| LovelyCommune_Raquel CureLoveads |] [t| CureDiamond |] [| CureDiamond |] transformationSpeech_Diamond
+transformationInstance [t| Alice |] [t| LovelyCommune_Lance CureLoveads |] [t| CureRosetta |] [| CureRosetta |] transformationSpeech_Rosetta
+transformationInstance [t| Makoto |] [t| LovelyCommune_Davi CureLoveads |] [t| CureSword |] [| CureSword |] transformationSpeech_Sword
+transformationInstance [t| Aguri |] [t| LoveEyesPalette CureLoveads |] [t| CureAce |] [| CureAce |] transformationSpeech_Ace
+
+transformationInstance
+  [t| (Mana, Rikka, Alice, Makoto) |]
+  [t|
+    ( LovelyCommune_Sharuru CureLoveads
+    , LovelyCommune_Raquel CureLoveads
+    , LovelyCommune_Lance CureLoveads
+    , LovelyCommune_Davi CureLoveads
+    )
+  |]
+  [t| (CureHeart, CureDiamond, CureRosetta, CureSword) |]
+  [| (CureHeart, CureDiamond, CureRosetta, CureSword) |]
+  transformationSpeech_Dokidoki_Heart_Diamond_Rosetta_Sword
+
+transformationInstance
+  [t| (Mana, Rikka, Alice, Makoto, Aguri) |]
+  [t|
+    ( LovelyCommune_Sharuru CureLoveads
+    , LovelyCommune_Raquel CureLoveads
+    , LovelyCommune_Lance CureLoveads
+    , LovelyCommune_Davi CureLoveads
+    , LoveEyesPalette CureLoveads
+    )
+  |]
+  [t| (CureHeart, CureDiamond, CureRosetta, CureSword, CureAce) |]
+  [| (CureHeart, CureDiamond, CureRosetta, CureSword, CureAce) |]
+  transformationSpeech_Dokidoki
+
+purificationInstance [t| CureHeart |] [t| LovelyCommune_Sharuru CureLoveads |] purificationSpeech_Heart
+purificationInstance [t| CureDiamond |] [t| LovelyCommune_Raquel CureLoveads |] purificationSpeech_Diamond
+purificationInstance [t| CureRosetta |] [t| LovelyCommune_Lance CureLoveads |] purificationSpeech_Rosetta
+purificationInstance [t| CureSword |] [t| LovelyCommune_Davi CureLoveads |] purificationSpeech_Sword
+purificationInstance [t| CureAce |] [t| LoveKissRouge |] purificationSpeech_Ace
+
+purificationInstance
+  [t| (CureHeart, CureDiamond, CureRosetta, CureSword, CureAce) |]
+  [t| MagicalLovelyHarp CureLoveads |]
+  purificationSpeech_Dokidoki
diff --git a/src/ACME/PreCure/Textbook/Dokidoki/Words.hs b/src/ACME/PreCure/Textbook/Dokidoki/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Dokidoki/Words.hs
@@ -0,0 +1,82 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Dokidoki.Words where
+
+
+groupName_Dokidoki = "ドキドキ！プリキュア"
+
+girlName_Mana   = "相田マナ"
+girlName_Rikka  = "菱川六花"
+girlName_Alice  = "四葉ありす"
+girlName_Makoto = "剣崎真琴"
+girlName_Aguri  = "円亜久里"
+
+cureName_Heart   = "キュアハート"
+cureName_Diamond = "キュアダイヤモンド"
+cureName_Rosetta = "キュアロゼッタ"
+cureName_Sword   = "キュアソード"
+cureName_Ace     = "キュアエース"
+
+introducesHerselfAs_Heart   = "みなぎる愛！ キュアハート！"
+introducesHerselfAs_Diamond = "英知の光！ キュアダイヤモンド！"
+introducesHerselfAs_Rosetta = "ひだまりポカポカ、キュアロゼッタ！"
+introducesHerselfAs_Sword   = "勇気の刃！ キュアソード！"
+introducesHerselfAs_Ace     = "愛の切り札！ キュアエース！"
+
+loveLink = ["プリキュア！ラブリンク！", "(L! O! V! E!)"]
+dressUp =  ["プリキュアドレスアップ！" , "(キュピラッパー！)"]
+
+-- https://www.youtube.com/watch?v=aAQDqrN_EZI
+transformationSpeech_Heart =
+  ["(シャールルーン！)"] ++ loveLink ++ [introducesHerselfAs_Heart, "愛を無くした悲しいジコチューさん、このキュアハートが あなたのドキドキ 取り戻してみせる！"]
+-- https://www.youtube.com/watch?v=Y8zh7aYhR5Q
+transformationSpeech_Diamond =
+  ["(ラケル！)"] ++ loveLink ++ [introducesHerselfAs_Diamond, "人の思いを踏みにじるなんて許せない、このキュアダイヤモンドが あなたの頭を冷やしてあげる！"]
+-- https://www.youtube.com/watch?v=ToAhnZ3pVu4
+transformationSpeech_Rosetta =
+  ["(ラーンスー！)"] ++ loveLink ++ [introducesHerselfAs_Rosetta, "世界を制するのは愛だけです、さぁ、あなたも私と 愛を育んでくださいな"]
+-- https://www.youtube.com/watch?v=weIHLwev5ZI
+transformationSpeech_Sword =
+  ["(ダビィー！)"] ++ loveLink ++ [introducesHerselfAs_Sword, "このキュアソードが 愛の剣で、あなたの野望を断ち切ってみせる！"]
+-- https://www.youtube.com/watch?v=OxJI0yUR_GI
+transformationSpeech_Ace =
+  dressUp ++
+    [ introducesHerselfAs_Ace
+    , "美しさは正義の証し！"
+    , "ウインク一つで、あなたのハートを射抜いて差し上げますわ！"
+    ]
+
+-- https://www.youtube.com/watch?v=DD8ylHEydBQ
+transformationSpeech_Dokidoki_Heart_Diamond_Rosetta_Sword =
+  ["(シャールルーン！)"] ++ loveLink ++
+    [ introducesHerselfAs_Heart
+    , introducesHerselfAs_Diamond
+    , introducesHerselfAs_Rosetta
+    , introducesHerselfAs_Sword
+    , "響け愛の鼓動！ドキドキプリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=qtVFBUNNfo4&list=PLz2Gy-e060c4rfoLomOWf9foSxXUGTJer&index=11
+transformationSpeech_Dokidoki =
+  ["(シャールルーン！)"] ++ loveLink ++ dressUp ++
+    [ introducesHerselfAs_Heart
+    , introducesHerselfAs_Diamond
+    , introducesHerselfAs_Rosetta
+    , introducesHerselfAs_Sword
+    , introducesHerselfAs_Ace
+    , "響け愛の鼓動！ドキドキプリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=9V17voMJ9vg
+purificationSpeech_Heart   = ["あなたに届け！マイ・スイート・ハート！"]
+purificationSpeech_Diamond = ["煌めきなさい！トゥインクル・ダイヤモンド！"]
+purificationSpeech_Rosetta = ["カッチカチの！ロゼッタ・ウォール！"]
+purificationSpeech_Sword   = ["閃け！ホーリー・ソード！"]
+-- https://www.youtube.com/watch?v=1BHlgN2abMk
+purificationSpeech_Ace     = ["彩れ！ラブ・キッス・ルージュ！", "ときめきなさい！エースショット！", "ばきゅ〜ん！！"]
+
+-- https://www.youtube.com/watch?v=1dcf6X3h13o
+purificationSpeech_Dokidoki =
+    [ "(キュピラッパー！)"
+    , "プリキュア！ロイヤル・ラブリー・ストレート・フラッシュ！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/First.hs b/src/ACME/PreCure/Textbook/First.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/First.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.First
+  ( module F
+  ) where
+
+
+import           ACME.PreCure.Textbook.First.Types as F
diff --git a/src/ACME/PreCure/Textbook/First/Types.hs b/src/ACME/PreCure/Textbook/First/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/First/Types.hs
@@ -0,0 +1,47 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.First.Types where
+
+import           ACME.PreCure.Textbook.First.Words
+import           ACME.PreCure.Types.TH
+
+
+data Nagisa = Nagisa deriving (Eq, Show)
+data Honoka = Honoka deriving (Eq, Show)
+
+$(girlInstance [t| Nagisa  |] girlName_Nagisa)
+$(girlInstance [t| Honoka  |] girlName_Honoka)
+
+data CureBlack = CureBlack deriving (Eq, Show)
+data CureWhite = CureWhite deriving (Eq, Show)
+
+data CardCommune_Mepple = CardCommune_Mepple deriving (Eq, Show)
+data CardCommune_Mipple = CardCommune_Mipple deriving (Eq, Show)
+
+data RainbowBrace = RainbowBrace deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureBlack |] cureName_Black introducesHerselfAs_Black
+transformedInstanceDefault [t| CureWhite |] cureName_White introducesHerselfAs_White
+
+transformedGroupInstanceDefault
+  [t| (CureBlack, CureWhite) |]
+  groupName_First
+
+transformationInstance
+  [t| (Nagisa, Honoka) |]
+  [t| (CardCommune_Mepple, CardCommune_Mipple) |]
+  [t| (CureBlack, CureWhite) |]
+  [| (CureBlack, CureWhite) |]
+  transformationSpeech_Black_White
+
+nonItemPurificationInstance
+  [t| (CureBlack, CureWhite) |]
+  purificationSpeech_Black_White
+
+purificationInstance
+  [t| (CureBlack, CureWhite) |]
+  [t| RainbowBrace |]
+  purificationSpeech_Black_White_RainbowStorm
diff --git a/src/ACME/PreCure/Textbook/First/Words.hs b/src/ACME/PreCure/Textbook/First/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/First/Words.hs
@@ -0,0 +1,41 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.First.Words where
+
+
+groupName_First = "ふたりはプリキュア"
+
+girlName_Nagisa = "美墨なぎさ"
+girlName_Honoka = "雪城ほのか"
+
+cureName_Black = "キュアブラック"
+cureName_White = "キュアホワイト"
+
+introducesHerselfAs_Black = "光の使者、キュアブラック！" 
+introducesHerselfAs_White = "光の使者、キュアホワイト！" 
+
+
+transformationSpeech_Black_White =
+    [ "デュアル・オーロラ・ウェイブ！！"
+    , introducesHerselfAs_Black
+    , introducesHerselfAs_White
+    , "ふたりはプリキュア！"
+    , "闇の力のしもべ達よ！"
+    , "とっととお家に帰りなさい！"
+    ]
+
+
+purificationSpeech_Black_White =
+    [ "ブラックサンダー！"
+    , "ホワイトサンダー！"
+    , "プリキュアの美しき魂が！"
+    , "邪悪な心を打ち砕く！"
+    , "プリキュア・マーブル・スクリュー！！"
+    ]
+
+-- https://www.youtube.com/watch?v=jTaon2204i4
+purificationSpeech_Black_White_RainbowStorm =
+    [ "希望の力よ！光の意思よ！"
+    , "未来に向かって、突き進め！"
+    , "プリキュア・レインボー・ストーム！！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/Fresh.hs b/src/ACME/PreCure/Textbook/Fresh.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Fresh.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Fresh
+  ( module F
+  ) where
+
+
+import           ACME.PreCure.Textbook.Fresh.Types as F
diff --git a/src/ACME/PreCure/Textbook/Fresh/Types.hs b/src/ACME/PreCure/Textbook/Fresh/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Fresh/Types.hs
@@ -0,0 +1,74 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Fresh.Types where
+
+import           Data.List
+                   ( intercalate
+                   )
+
+
+import           ACME.PreCure.Textbook.Fresh.Words
+import           ACME.PreCure.Types.TH
+
+
+data Love    = Love deriving (Eq, Show)
+data Miki    = Miki deriving (Eq, Show)
+data Inori   = Inori deriving (Eq, Show)
+data Setsuna = Setsuna deriving (Eq, Show)
+
+girlInstance [t| Love |] girlName_Love
+girlInstance [t| Miki |] girlName_Miki
+girlInstance [t| Inori |] girlName_Inori
+girlInstance [t| Setsuna |] girlName_Setsuna
+
+data CurePeach   = CurePeach deriving (Eq, Show)
+data CureBerry   = CureBerry deriving (Eq, Show)
+data CurePine    = CurePine deriving (Eq, Show)
+data CurePassion = CurePassion deriving (Eq, Show)
+
+data Linkrun = Linkrun deriving (Eq, Show)
+
+data CureStickPeachRod = CureStickPeachRod deriving (Eq, Show)
+data CureStickBerrySword = CureStickBerrySword deriving (Eq, Show)
+data CureStickPineFlute = CureStickPineFlute deriving (Eq, Show)
+data PassionHarp = PassionHarp deriving (Eq, Show)
+
+data CloverBox = CloverBox deriving (Eq, Show)
+
+transformedInstanceDefault [t| CurePeach |] cureName_Peach $ intercalate "\n" introducesHerselfAs_Peach
+transformedInstanceDefault [t| CureBerry |] cureName_Berry $ intercalate "\n" introducesHerselfAs_Berry
+transformedInstanceDefault [t| CurePine |] cureName_Pine $ intercalate "\n" introducesHerselfAs_Pine
+transformedInstanceDefault [t| CurePassion |] cureName_Passion $ intercalate "\n" introducesHerselfAs_Passion
+
+transformedGroupInstanceDefault
+  [t| (CurePeach, CureBerry, CurePine, CurePassion) |]
+  groupName_Fresh
+
+transformationInstance [t| Love |] [t| Linkrun |] [t| CurePeach |] [| CurePeach |] transformationSpeech_Peach
+transformationInstance [t| Miki |] [t| Linkrun |] [t| CureBerry |] [| CureBerry |] transformationSpeech_Berry
+transformationInstance [t| Inori |] [t| Linkrun |] [t| CurePine |] [| CurePine |] transformationSpeech_Pine
+transformationInstance [t| Setsuna |] [t| Linkrun |] [t| CurePassion |] [| CurePassion |] transformationSpeech_Passion
+
+transformationInstance
+  [t| (Love, Miki, Inori, Setsuna) |]
+  [t| Linkrun |]
+  [t| (CurePeach, CureBerry, CurePine, CurePassion) |]
+  [| (CurePeach, CureBerry, CurePine, CurePassion) |]
+  transformationSpeech_Fresh
+
+nonItemPurificationInstance [t| CurePeach |] purificationSpeech_Peach
+nonItemPurificationInstance [t| CureBerry |] purificationSpeech_Berry
+nonItemPurificationInstance [t| CurePine |] purificationSpeech_Pine
+
+purificationInstance [t| CurePeach |] [t| CureStickPeachRod |] purificationSpeech_Peach_Fresh
+purificationInstance [t| CureBerry |] [t| CureStickBerrySword |] purificationSpeech_Berry_Fresh
+purificationInstance [t| CurePine |] [t| CureStickPineFlute |] purificationSpeech_Pine_Fresh
+purificationInstance [t| CurePassion |] [t| PassionHarp |] purificationSpeech_Passion
+
+purificationInstance
+  [t| (CurePeach, CureBerry, CurePine, CurePassion) |]
+  [t| CloverBox |]
+  purificationSpeech_Fresh
diff --git a/src/ACME/PreCure/Textbook/Fresh/Words.hs b/src/ACME/PreCure/Textbook/Fresh/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Fresh/Words.hs
@@ -0,0 +1,86 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Fresh.Words where
+
+
+groupName_Fresh = "フレッシュプリキュア！"
+
+girlName_Love    = "桃園ラブ"
+girlName_Miki    = "蒼乃美希"
+girlName_Inori   = "山吹祈里"
+girlName_Setsuna = "東せつな"
+
+cureName_Peach   = "キュアピーチ"
+cureName_Berry   = "キュアベリー"
+cureName_Pine    = "キュアパイン"
+cureName_Passion = "キュアパッション"
+
+introducesHerselfAs_Peach   = ["ピンクのハートは愛ある印！", "もぎたてフレッシュ、キュアピーチ！"]
+introducesHerselfAs_Berry   = ["ブルーのハートは希望の印！", "つみたてフレッシュ、キュアベリー！"]
+introducesHerselfAs_Pine    = ["イエローハートは祈りの印！", "とれたてフレッシュ、キュアパイン！"]
+introducesHerselfAs_Passion = ["真っ赤なハートは幸せの証！", "うれたてフレッシュ、キュアパッション！"]
+
+beatUp = "チェインジ！プリキュア・ビートアップ！"
+
+-- https://www.youtube.com/watch?v=IljAwH4jzFU
+-- https://www.youtube.com/watch?v=XRAQPWccIZk
+transformationSpeech_Peach   = [beatUp] ++ introducesHerselfAs_Peach
+transformationSpeech_Berry   = [beatUp] ++ introducesHerselfAs_Berry
+transformationSpeech_Pine    = [beatUp] ++ introducesHerselfAs_Pine
+transformationSpeech_Passion = [beatUp] ++ introducesHerselfAs_Passion
+
+-- https://www.youtube.com/watch?v=t8sKE4SrEkU
+transformationSpeech_Fresh =
+  [beatUp]
+    ++ introducesHerselfAs_Peach
+    ++ introducesHerselfAs_Berry
+    ++ introducesHerselfAs_Pine
+    ++ introducesHerselfAs_Passion
+    ++ ["レッツ・プリキュア！"]
+
+-- https://www.youtube.com/watch?v=m0vnBI60VZ4
+purificationSpeech_Peach   = ["悪いの悪いの飛んでいけ！", "プリキュア！ラブ・サンシャイン！"]
+purificationSpeech_Berry   = ["悪いの悪いの飛んでいけ！", "プリキュア！エスポワール・シャワー！"]
+purificationSpeech_Pine    = ["悪いの悪いの飛んでいけ！", "プリキュア！ヒーリング・プレアー！"]
+
+purificationSpeech_Peach_Fresh =
+    [ "届け！愛のメロディ！"
+    , "キュアスティック・ピーチロッド！"
+    , "悪いの悪いの飛んでいけ！"
+    , "プリキュア！ラブサンシャイン・フレッシュ！"
+    ]
+purificationSpeech_Berry_Fresh =
+    [ "響け！希望のリズム！"
+    , "キュアスティック・ベリーソード！"
+    , "悪いの悪いの飛んでいけ！"
+    , "プリキュア！エスポワールシャワー・フレッシュ！"
+    ]
+
+-- https://www.youtube.com/watch?v=ILDYtMvlW9g
+purificationSpeech_Pine_Fresh =
+    [ "癒せ！祈りのハーモニー！"
+    , "キュアスティック・パインフルート！"
+    , "悪いの悪いの飛んでいけ！"
+    , "プリキュア！ヒーリングプレアー・フレッシュ！"
+    ]
+
+-- https://www.youtube.com/watch?v=ec990NE_ooU
+purificationSpeech_Passion =
+    [ "歌え！幸せのラプソディ、パッションハープ！"
+    , "吹き荒れよ、幸せの嵐！"
+    , "プリキュア！ハピネス・ハリケーン！"
+    ]
+
+-- https://www.youtube.com/watch?v=y8_ogPmNCV8
+purificationSpeech_Fresh =
+    [ "クローバーボックスよ、私達に力を貸して！"
+    , "プリキュア・フォーメーション！レディー・ゴー!"
+    , "ハピネスリーフ、セット！"
+    , "パイン！"
+    , "プラスワン、プレアーリーフ！"
+    , "ベリー！"
+    , "プラスワン、エスポワールリーフ！"
+    , "ピーチ！"
+    , "プラスワン、ラブリーリーフ！"
+    , "ラッキークローバー・グランドフィナーレ！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/GoPrincess.hs b/src/ACME/PreCure/Textbook/GoPrincess.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/GoPrincess.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.GoPrincess
+  ( module G
+  ) where
+
+
+import           ACME.PreCure.Textbook.GoPrincess.Types as G
diff --git a/src/ACME/PreCure/Textbook/GoPrincess/Types.hs b/src/ACME/PreCure/Textbook/GoPrincess/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/GoPrincess/Types.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.GoPrincess.Types where
+
+
+import           ACME.PreCure.Textbook.GoPrincess.Words
+import           ACME.PreCure.Types.TH
+
+
+data Haruka = Haruka deriving (Eq, Show)
+data Minami = Minami deriving (Eq, Show)
+data Kirara = Kirara deriving (Eq, Show)
+data Towa   = Towa deriving (Eq, Show)
+
+girlInstance [t| Haruka |] girlName_Haruka
+girlInstance [t| Minami |] girlName_Minami
+girlInstance [t| Kirara |] girlName_Kirara
+girlInstance [t| Towa |] girlName_Towa
+
+data CureFlora   = CureFlora deriving (Eq, Show)
+data CureMermaid = CureMermaid deriving (Eq, Show)
+data CureTwinkle = CureTwinkle deriving (Eq, Show)
+data CureScarlet = CureScarlet deriving (Eq, Show)
+
+data CureFlora_ModeElegant   = CureFlora_ModeElegant deriving (Eq, Show)
+data CureMermaid_ModeElegant = CureMermaid_ModeElegant deriving (Eq, Show)
+data CureTwinkle_ModeElegant = CureTwinkle_ModeElegant deriving (Eq, Show)
+data CureScarlet_ModeElegant = CureScarlet_ModeElegant deriving (Eq, Show)
+
+data CureFlora_ModeElegantRoyal   = CureFlora_ModeElegantRoyal deriving (Eq, Show)
+data CureMermaid_ModeElegantRoyal = CureMermaid_ModeElegantRoyal deriving (Eq, Show)
+data CureTwinkle_ModeElegantRoyal = CureTwinkle_ModeElegantRoyal deriving (Eq, Show)
+data CureScarlet_ModeElegantRoyal = CureScarlet_ModeElegantRoyal deriving (Eq, Show)
+
+data PrincessPerfume dk = PrincessPerfume dk deriving (Eq, Show)
+data CrystalPrincessRod dk = CrystalPrincessRod dk deriving (Eq, Show)
+data ScarletViolin dk = ScarletViolin dk deriving (Eq, Show)
+data MusicPrincessPalace dk = MusicPrincessPalace dk deriving (Eq, Show)
+
+
+-- http://prettycure.wikia.com/wiki/Dress_Up_Key
+data DressUpKey_Flora   = DressUpKey_Flora deriving (Eq, Show)
+data DressUpKey_Rose   = DressUpKey_Rose deriving (Eq, Show)
+data DressUpKey_Lily   = DressUpKey_Lily deriving (Eq, Show)
+data DressUpKey_Sakura   = DressUpKey_Sakura deriving (Eq, Show)
+
+data DressUpKey_Mermaid = DressUpKey_Mermaid deriving (Eq, Show)
+data DressUpKey_Ice = DressUpKey_Ice deriving (Eq, Show)
+data DressUpKey_Bubble = DressUpKey_Bubble deriving (Eq, Show)
+data DressUpKey_Sango = DressUpKey_Sango deriving (Eq, Show)
+
+data DressUpKey_Twinkle = DressUpKey_Twinkle deriving (Eq, Show)
+data DressUpKey_Luna = DressUpKey_Luna deriving (Eq, Show)
+data DressUpKey_ShootingStar = DressUpKey_ShootingStar deriving (Eq, Show)
+data DressUpKey_Ginga = DressUpKey_Ginga deriving (Eq, Show)
+
+data DressUpKey_Scarlet = DressUpKey_Scarlet deriving (Eq, Show)
+data DressUpKey_Phoenix = DressUpKey_Phoenix deriving (Eq, Show)
+data DressUpKey_Hanabi = DressUpKey_Hanabi deriving (Eq, Show)
+data DressUpKey_Sun = DressUpKey_Sun deriving (Eq, Show)
+
+data RoyalDressUpKey = RoyalDressUpKey deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureFlora |] cureName_Flora introducesHerselfAs_Flora
+transformedInstanceDefault [t| CureMermaid |] cureName_Mermaid introducesHerselfAs_Mermaid
+transformedInstanceDefault [t| CureTwinkle |] cureName_Twinkle introducesHerselfAs_Twinkle
+transformedInstanceDefault [t| CureScarlet |] cureName_Scarlet introducesHerselfAs_Scarlet
+
+transformedInstance [t| CureFlora_ModeElegant |] cureName_Flora introducesHerselfAs_Flora variation_ModeElegant
+transformedInstance [t| CureMermaid_ModeElegant |] cureName_Mermaid introducesHerselfAs_Mermaid variation_ModeElegant
+transformedInstance [t| CureTwinkle_ModeElegant |] cureName_Twinkle introducesHerselfAs_Twinkle variation_ModeElegant
+transformedInstance [t| CureScarlet_ModeElegant |] cureName_Scarlet introducesHerselfAs_Scarlet variation_ModeElegant
+
+transformedInstance [t| CureFlora_ModeElegantRoyal |] cureName_Flora introducesHerselfAs_Flora variation_ModeElegantRoyal
+transformedInstance [t| CureMermaid_ModeElegantRoyal |] cureName_Mermaid introducesHerselfAs_Mermaid variation_ModeElegantRoyal
+transformedInstance [t| CureTwinkle_ModeElegantRoyal |] cureName_Twinkle introducesHerselfAs_Twinkle variation_ModeElegantRoyal
+transformedInstance [t| CureScarlet_ModeElegantRoyal |] cureName_Scarlet introducesHerselfAs_Scarlet variation_ModeElegantRoyal
+
+transformedGroupInstanceDefault
+  [t| (CureFlora, CureMermaid, CureTwinkle, CureScarlet) |]
+  groupName_GoPrincess
+
+transformedGroupInstance
+  [t| (CureFlora_ModeElegantRoyal, CureMermaid_ModeElegantRoyal, CureTwinkle_ModeElegantRoyal, CureScarlet_ModeElegantRoyal) |]
+  groupName_GoPrincess
+  variation_ModeElegantRoyal
+
+transformationInstance [t| Haruka |] [t| PrincessPerfume DressUpKey_Flora |] [t| CureFlora |] [| CureFlora |] transformationSpeech_Flora
+transformationInstance [t| Minami |] [t| PrincessPerfume DressUpKey_Mermaid |] [t| CureMermaid |] [| CureMermaid |] transformationSpeech_Mermaid
+transformationInstance [t| Kirara |] [t| PrincessPerfume DressUpKey_Twinkle |] [t| CureTwinkle |] [| CureTwinkle |] transformationSpeech_Twinkle
+transformationInstance [t| Towa |] [t| PrincessPerfume DressUpKey_Scarlet |] [t| CureScarlet |] [| CureScarlet |] transformationSpeech_Scarlet
+
+transformationInstance [t| CureFlora |] [t| PrincessPerfume DressUpKey_Flora |] [t| CureFlora_ModeElegant |] [| CureFlora_ModeElegant |] transformationSpeech_GoPrincess_ModeElegant
+transformationInstance [t| CureMermaid |] [t| PrincessPerfume DressUpKey_Mermaid |] [t| CureMermaid_ModeElegant |] [| CureMermaid_ModeElegant |] transformationSpeech_GoPrincess_ModeElegant
+transformationInstance [t| CureTwinkle |] [t| PrincessPerfume DressUpKey_Twinkle |] [t| CureTwinkle_ModeElegant |] [| CureTwinkle_ModeElegant |] transformationSpeech_GoPrincess_ModeElegant
+transformationInstance [t| CureScarlet |] [t| PrincessPerfume DressUpKey_Phoenix |] [t| CureScarlet_ModeElegant |] [| CureScarlet_ModeElegant |] transformationSpeech_GoPrincess_ModeElegant
+
+transformationInstance
+  [t| (Haruka, Minami, Kirara) |]
+  [t| (PrincessPerfume DressUpKey_Flora, PrincessPerfume DressUpKey_Mermaid, PrincessPerfume DressUpKey_Twinkle) |]
+  [t| (CureFlora, CureMermaid, CureTwinkle) |]
+  [| (CureFlora, CureMermaid, CureTwinkle) |]
+  transformationSpeech_Flora_Mermaid_Twinkle
+
+transformationInstance
+  [t| (Haruka, Minami, Kirara, Towa) |]
+  [t| (PrincessPerfume DressUpKey_Flora, PrincessPerfume DressUpKey_Mermaid, PrincessPerfume DressUpKey_Twinkle, PrincessPerfume DressUpKey_Scarlet) |]
+  [t| (CureFlora, CureMermaid, CureTwinkle, CureScarlet) |]
+  [| (CureFlora, CureMermaid, CureTwinkle, CureScarlet) |]
+  transformationSpeech_GoPrincess
+
+transformationInstance
+  [t| (CureFlora, CureMermaid, CureTwinkle, CureScarlet) |]
+  [t| (MusicPrincessPalace RoyalDressUpKey) |]
+  [t| (CureFlora_ModeElegantRoyal, CureMermaid_ModeElegantRoyal, CureTwinkle_ModeElegantRoyal, CureScarlet_ModeElegantRoyal) |]
+  [| (CureFlora_ModeElegantRoyal, CureMermaid_ModeElegantRoyal, CureTwinkle_ModeElegantRoyal, CureScarlet_ModeElegantRoyal) |]
+  transformationSpeech_GoPrincess_ModeElegantRoyal
+
+nonItemPurificationInstance [t| CureFlora_ModeElegant |] purificationSpeech_Flora
+purificationInstance [t| CureFlora |] [t| CrystalPrincessRod DressUpKey_Rose |] purificationSpeech_Flora_Rose
+purificationInstance [t| CureFlora |] [t| CrystalPrincessRod DressUpKey_Lily |] purificationSpeech_Flora_Lily
+purificationInstance [t| CureFlora |] [t| MusicPrincessPalace DressUpKey_Sakura |] purificationSpeech_Flora_Sakura
+
+nonItemPurificationInstance [t| CureMermaid_ModeElegant |] purificationSpeech_Mermaid
+purificationInstance [t| CureMermaid |] [t| CrystalPrincessRod DressUpKey_Ice |] purificationSpeech_Mermaid_Ice
+purificationInstance [t| CureMermaid |] [t| CrystalPrincessRod DressUpKey_Bubble |] purificationSpeech_Mermaid_Bubble
+purificationInstance [t| CureMermaid |] [t| MusicPrincessPalace DressUpKey_Sango |] purificationSpeech_Mermaid_Sango
+
+nonItemPurificationInstance [t| CureTwinkle_ModeElegant |] purificationSpeech_Twinkle
+purificationInstance [t| CureTwinkle |] [t| CrystalPrincessRod DressUpKey_Luna |] purificationSpeech_Twinkle_Luna
+purificationInstance [t| CureTwinkle |] [t| CrystalPrincessRod DressUpKey_ShootingStar |] purificationSpeech_Twinkle_ShootingStar
+purificationInstance [t| CureTwinkle |] [t| MusicPrincessPalace DressUpKey_Ginga |] purificationSpeech_Twinkle_Ginga
+
+purificationInstance [t| CureScarlet_ModeElegant |] [t| ScarletViolin DressUpKey_Phoenix |] purificationSpeech_Scarlet_Phoenix
+purificationInstance [t| CureScarlet |] [t| ScarletViolin DressUpKey_Scarlet |] purificationSpeech_Scarlet
+purificationInstance [t| CureScarlet |] [t| ScarletViolin DressUpKey_Hanabi |] purificationSpeech_Scarlet_Hanabi
+purificationInstance [t| CureScarlet |] [t| MusicPrincessPalace DressUpKey_Sun |] purificationSpeech_Scarlet_Sun
+
+purificationInstance
+  [t| (CureFlora_ModeElegantRoyal, CureMermaid_ModeElegantRoyal, CureTwinkle_ModeElegantRoyal, CureScarlet_ModeElegantRoyal) |]
+  [t| (MusicPrincessPalace RoyalDressUpKey) |]
+  purificationSpeech_GoPrincess_ModeElegantRoyal
diff --git a/src/ACME/PreCure/Textbook/GoPrincess/Words.hs b/src/ACME/PreCure/Textbook/GoPrincess/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/GoPrincess/Words.hs
@@ -0,0 +1,101 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.GoPrincess.Words where
+
+groupName_GoPrincess = "Go! プリンセスプリキュア！"
+
+girlName_Haruka = "春野はるか"
+girlName_Minami = "海藤みなみ"
+girlName_Kirara = "天ノ川きらら"
+girlName_Towa   = "紅城トワ"
+
+cureName_Flora   = "キュアフローラ"
+cureName_Mermaid = "キュアマーメイド"
+cureName_Twinkle = "キュアトゥインクル"
+cureName_Scarlet = "キュアスカーレット"
+
+-- TODO Add more forms of Go! Princess PreCure
+variation_ModeElegant = "モードエレガント"
+variation_ModeElegantRoyal = "モードエレガント・ロイヤル"
+
+introducesHerselfAs_Flora   = "咲き誇る、花のプリンセス！キュアフローラ！"
+introducesHerselfAs_Mermaid = "澄み渡る、海のプリンセス！キュアマーメイド！"
+introducesHerselfAs_Twinkle = "きらめく星のプリンセス！キュアトゥインクル！"
+introducesHerselfAs_Scarlet = "深紅の炎のプリンセス！キュアスカーレット！"
+
+princessEngage = "プリキュア！プリンセスエンゲージ！"
+okakugo  = ["冷たい檻に閉ざされた夢、返していただきますわ！", "お覚悟はよろしくて？"]
+-- From Ep. 23
+okakugo' = ["冷たい檻に閉ざされた夢、返していただきますわ。", "お覚悟を決めなさい！"]
+
+-- https://www.youtube.com/watch?v=L1DjtwIeQxk
+transformationSpeech_Flora   = [princessEngage, introducesHerselfAs_Flora] ++ okakugo
+transformationSpeech_Mermaid = [princessEngage, introducesHerselfAs_Mermaid] ++ okakugo
+transformationSpeech_Twinkle = [princessEngage, introducesHerselfAs_Twinkle] ++ okakugo
+-- https://www.youtube.com/watch?v=AcGs-uEkqHg
+transformationSpeech_Scarlet = [princessEngage, introducesHerselfAs_Scarlet] ++ okakugo'
+
+-- https://www.youtube.com/watch?v=3CeAisvfyOw
+transformationSpeech_Flora_Mermaid_Twinkle =
+    [ princessEngage
+    , introducesHerselfAs_Flora
+    , introducesHerselfAs_Mermaid
+    , introducesHerselfAs_Twinkle
+    , "つよく、やさしく、美しく！"
+    , "Go! プリンセスプリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=w3iMzceJc_o
+transformationSpeech_GoPrincess =
+    [ princessEngage
+    , introducesHerselfAs_Flora
+    , introducesHerselfAs_Mermaid
+    , introducesHerselfAs_Twinkle
+    , introducesHerselfAs_Scarlet
+    , "つよく、やさしく、美しく！"
+    , "Go! プリンセスプリキュア！"
+    ]
+
+transformationSpeech_GoPrincess_ModeElegant = ["エクスチェンジ！モードエレガント！"]
+
+-- https://www.youtube.com/watch?v=IPBZXpJBMHU
+transformationSpeech_GoPrincess_ModeElegantRoyal = ["モードエレガント・ロイヤル！", "ドレスアップ・ロイヤル！"]
+
+
+-- https://www.youtube.com/watch?v=L1DjtwIeQxk
+purificationSpeech_Flora = ["舞え、花よ！", "プリキュア！ フローラル・トルビヨン！" , "ごきげんよう。"]
+purificationSpeech_Flora_Rose = ["ローズ！", "舞え、バラよ！", "プリキュア！ ローズ・トルビヨン！"]
+purificationSpeech_Flora_Lily = ["リリィ！", "舞え、ユリよ！", "プリキュア！ リィス・トルビヨン！"]
+purificationSpeech_Flora_Sakura = ["サクラ！", "舞え、サクラよ！", "プリキュア！ サクラ・トルビュランス！"]
+
+-- https://www.youtube.com/watch?v=8lfG0iCSVPA
+purificationSpeech_Mermaid = ["高鳴れ、海よ！", "プリキュア！ マーメイド・リップル！", "ごきげんよう。"]
+purificationSpeech_Mermaid_Ice = ["アイス！", "高鳴れ、氷よ！", "プリキュア！ フローズン・リップル！"]
+purificationSpeech_Mermaid_Bubble = ["バブル！", "高鳴れ、泡よ！", "プリキュア！ バブル・リップル！"]
+purificationSpeech_Mermaid_Sango = ["サンゴ！", "高鳴れ、珊瑚よ！", "プリキュア！ コーラル・メイルシュトロム！"]
+
+-- https://www.youtube.com/watch?v=p02w5AiO49s
+purificationSpeech_Twinkle = ["キラキラ、星よ！", "プリキュア！ トゥインクル・ハミング！", "ごきげんよう。"]
+purificationSpeech_Twinkle_Luna = ["ルナ！", "キラキラ、月よ！", "プリキュア！ フルムーン・ハミング！"]
+purificationSpeech_Twinkle_ShootingStar = ["シューティングスター！", "キラキラ、流れ星よ！", "プリキュア！ ミーティア・ハミング！"]
+purificationSpeech_Twinkle_Ginga = ["ギンガ！", "シャランラ、銀河よ！", "プリキュア！ ギャラクシー・コーラス！"]
+
+-- https://www.youtube.com/watch?v=AcGs-uEkqHg
+purificationSpeech_Scarlet_Phoenix =
+    [ "スカーレット・バイオリン！フェニックス！"
+    , "羽ばたけ炎の翼！"
+    , "プリキュア！ フェニックス・ブレイズ！"
+    , "ごきげんよう。"
+    ]
+purificationSpeech_Scarlet = ["たぎれ、炎よ！", "プリキュア！ スカーレット・フレイム！"]
+purificationSpeech_Scarlet_Hanabi = ["ハナビ！", "燃えよ、炎よ！", "プリキュア！ スカーレット・イリュージョン！"]
+purificationSpeech_Scarlet_Sun = ["サン！", "燃えよ、炎よ！", "プリキュア！ スカーレット・プロミネンス！"]
+
+-- https://www.youtube.com/watch?v=IPBZXpJBMHU
+purificationSpeech_GoPrincess_ModeElegantRoyal =
+    [ "はっ！"
+    , "響け！遙か彼方へ！"
+    , "プリキュア！ グラン・プランタン！"
+    , "ブルーミング"
+    , "ごきげんよう。"
+    ]
diff --git a/src/ACME/PreCure/Textbook/HappinessCharge.hs b/src/ACME/PreCure/Textbook/HappinessCharge.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/HappinessCharge.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.HappinessCharge
+  ( module H
+  ) where
+
+
+import           ACME.PreCure.Textbook.HappinessCharge.Types as H
diff --git a/src/ACME/PreCure/Textbook/HappinessCharge/Types.hs b/src/ACME/PreCure/Textbook/HappinessCharge/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/HappinessCharge/Types.hs
@@ -0,0 +1,114 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.HappinessCharge.Types where
+
+
+import           ACME.PreCure.Textbook.HappinessCharge.Words
+import           ACME.PreCure.Types.TH
+
+
+data Megumi = Megumi deriving (Eq, Show)
+data Hime   = Hime deriving (Eq, Show)
+data Yuko   = Yuko deriving (Eq, Show)
+data Iona   = Iona deriving (Eq, Show)
+
+girlInstance [t| Megumi |] girlName_Megumi
+girlInstance [t| Hime |] girlName_Hime
+girlInstance [t| Yuko |] girlName_Yuko
+girlInstance [t| Iona |] girlName_Iona
+
+data CureLovely   = CureLovely deriving (Eq, Show)
+data CurePrincess = CurePrincess deriving (Eq, Show)
+data CureHoney    = CureHoney deriving (Eq, Show)
+data CureFortune  = CureFortune deriving (Eq, Show)
+
+data CureLovely_InnocentForm   = CureLovely_InnocentForm deriving (Eq, Show)
+data CurePrincess_InnocentForm = CurePrincess_InnocentForm deriving (Eq, Show)
+data CureHoney_InnocentForm    = CureHoney_InnocentForm deriving (Eq, Show)
+data CureFortune_InnocentForm  = CureFortune_InnocentForm deriving (Eq, Show)
+
+data PreChanMirror pc = PreChanMirror pc deriving (Eq, Show)
+data FortunePiano pc = FortunePiano pc deriving (Eq, Show)
+
+-- TODO: Make more PreCards
+data PreCard_Lovely   = PreCard_Lovely deriving (Eq, Show)
+data PreCard_Princess = PreCard_Princess deriving (Eq, Show)
+data PreCard_Honey    = PreCard_Honey deriving (Eq, Show)
+data PreCard_Fortune  = PreCard_Fortune deriving (Eq, Show)
+
+data PreCard_Lovely_InnocentForm   = PreCard_Lovely_InnocentForm deriving (Eq, Show)
+data PreCard_Princess_InnocentForm = PreCard_Princess_InnocentForm deriving (Eq, Show)
+data PreCard_Honey_InnocentForm    = PreCard_Honey_InnocentForm deriving (Eq, Show)
+data PreCard_Fortune_InnocentForm  = PreCard_Fortune_InnocentForm deriving (Eq, Show)
+
+data LovePreBrace = LovePreBrace deriving (Eq, Show)
+data TripleDanceHoneyBaton = TripleDanceHoneyBaton deriving (Eq, Show)
+data FortuneTambourine = FortuneTambourine deriving (Eq, Show)
+
+data ShiningMakeDresser = ShiningMakeDresser deriving (Eq, Show)
+data InnocentHarmonyMic = InnocentHarmonyMic deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureLovely |] cureName_Lovely introducesHerselfAs_Lovely
+transformedInstanceDefault [t| CurePrincess |] cureName_Princess introducesHerselfAs_Princess
+transformedInstanceDefault [t| CureHoney |] cureName_Honey introducesHerselfAs_Honey
+transformedInstanceDefault [t| CureFortune |] cureName_Fortune introducesHerselfAs_Fortune
+
+transformedInstance [t| CureLovely_InnocentForm |] cureName_Lovely introducesHerselfAs_Lovely variation_InnocentForm
+transformedInstance [t| CurePrincess_InnocentForm |] cureName_Princess introducesHerselfAs_Princess variation_InnocentForm
+transformedInstance [t| CureHoney_InnocentForm |] cureName_Honey introducesHerselfAs_Honey variation_InnocentForm
+transformedInstance [t| CureFortune_InnocentForm |] cureName_Fortune introducesHerselfAs_Fortune variation_InnocentForm
+
+transformedGroupInstanceDefault
+  [t| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
+  groupName_HappinessCharge
+
+transformedGroupInstance
+  [t| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
+  groupName_HappinessCharge
+  variation_InnocentForm
+
+transformationInstance [t| Megumi |] [t| PreChanMirror PreCard_Lovely |] [t| CureLovely |] [| CureLovely |] transformationSpeech_Lovely
+transformationInstance [t| Hime |] [t| PreChanMirror PreCard_Princess |] [t| CurePrincess |] [| CurePrincess |] transformationSpeech_Princess
+transformationInstance [t| Yuko |] [t| PreChanMirror PreCard_Honey |] [t| CureHoney |] [| CureHoney |] transformationSpeech_Honey
+transformationInstance [t| Iona |] [t| FortunePiano PreCard_Fortune |] [t| CureFortune |] [| CureFortune |] transformationSpeech_Fortune
+
+transformationInstance
+  [t| (Megumi, Hime) |]
+  [t| (PreChanMirror PreCard_Lovely, PreChanMirror PreCard_Princess) |]
+  [t| (CureLovely, CurePrincess) |]
+  [| (CureLovely, CurePrincess) |]
+  transformationSpeech_Lovely_Princess
+
+transformationInstance
+  [t| (Megumi, Hime, Yuko) |]
+  [t| (PreChanMirror PreCard_Lovely, PreChanMirror PreCard_Princess, PreChanMirror PreCard_Honey) |]
+  [t| (CureLovely, CurePrincess, CureHoney) |]
+  [| (CureLovely, CurePrincess, CureHoney) |]
+  transformationSpeech_Lovely_Princess_Honey
+
+transformationInstance
+  [t| (Megumi, Hime, Yuko, Iona) |]
+  [t| (PreChanMirror PreCard_Lovely, PreChanMirror PreCard_Princess, PreChanMirror PreCard_Honey, FortunePiano PreCard_Fortune) |]
+  [t| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
+  [| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
+  transformationSpeech_HappinessCharge
+
+transformationInstance
+  [t| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
+  [t| (PreChanMirror PreCard_Lovely_InnocentForm, PreChanMirror PreCard_Princess_InnocentForm, PreChanMirror PreCard_Honey_InnocentForm, FortunePiano PreCard_Fortune_InnocentForm) |]
+  [t| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
+  [| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
+  transformationSpeech_HappinessCharge_InnocentForm
+
+purificationInstance [t| CureLovely |] [t| LovePreBrace |] purificationSpeech_Lovely
+purificationInstance [t| CurePrincess |] [t| LovePreBrace |] purificationSpeech_Princess
+purificationInstance [t| CureHoney |] [t| TripleDanceHoneyBaton |] purificationSpeech_Honey
+purificationInstance [t| CureFortune |] [t| FortuneTambourine |] purificationSpeech_Fortune
+
+purificationInstance
+  [t| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
+  [t| (ShiningMakeDresser, InnocentHarmonyMic) |]
+  purificationSpeech_HappinessCharge_InnocentForm
diff --git a/src/ACME/PreCure/Textbook/HappinessCharge/Words.hs b/src/ACME/PreCure/Textbook/HappinessCharge/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/HappinessCharge/Words.hs
@@ -0,0 +1,128 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.HappinessCharge.Words where
+
+groupName_HappinessCharge = "ハピネスチャージプリキュア！"
+
+girlName_Megumi = "愛乃めぐみ"
+girlName_Hime   = "白雪ひめ(ヒメルダ・ウインドウ・キュアクイーン・オブ・ザ・ブルースカイ)"
+girlName_Yuko   = "大森ゆうこ"
+girlName_Iona   = "氷川いおな"
+
+cureName_Lovely   = "キュアラブリー"
+cureName_Princess = "キュアプリンセス"
+cureName_Honey    = "キュアハニー"
+cureName_Fortune  = "キュアフォーチュン"
+
+-- TODO Add more forms of HappinessCharge PreCure
+variation_InnocentForm = "イノセントフォーム"
+
+-- https://www.youtube.com/watch?v=gcLBpRlMly8
+introducesHerselfAs_Lovely   = "世界に広がる、ビッグな愛！ キュアラブリー！"
+introducesHerselfAs_Princess = "天空に舞う、蒼き風！ (ヒュッ！) キュアプリンセス！"
+introducesHerselfAs_Honey    = "大地に実る、命の光！ キュアハニー！"
+introducesHerselfAs_Fortune  = "夜空に煌めく、希望の星！ キュアフォーチュン！"
+
+kawarunrun = "(かわルンルン！)"
+mirrorChange  = "プリキュア！くるりんミラーチェーンジ！"
+mirrorChange' = "プリキュア！くるりんミラーチェンジ！"
+starSymphony  = "プリキュア！きらりんスターシンフォニー！"
+
+-- https://www.youtube.com/watch?v=yVDBhXPNK5M
+transformationSpeech_Lovely   = [kawarunrun, mirrorChange, introducesHerselfAs_Lovely]
+transformationSpeech_Princess = [kawarunrun, mirrorChange', introducesHerselfAs_Princess]
+transformationSpeech_Honey    = [kawarunrun, mirrorChange, introducesHerselfAs_Honey]
+transformationSpeech_Fortune  = [kawarunrun, starSymphony, introducesHerselfAs_Fortune]
+
+transformationSpeech_Lovely_Princess =
+    [ kawarunrun
+    , mirrorChange
+    , introducesHerselfAs_Lovely
+    , introducesHerselfAs_Princess
+    , "ハピネス注入！幸せチャージ！"
+    , "ハピネスチャージプリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=tlfGXy5Jsvw
+transformationSpeech_Lovely_Princess_Honey =
+    [ kawarunrun
+    , mirrorChange
+    , introducesHerselfAs_Lovely
+    , introducesHerselfAs_Princess
+    , introducesHerselfAs_Honey
+    , "ハピネス注入！幸せチャージ！"
+    , "ハピネスチャージプリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=LuNix0VtC5w&list=PLz2Gy-e060c4B5aHpdkjTJOFft5nhBHdl&index=5
+transformationSpeech_HappinessCharge =
+    [ kawarunrun
+    , mirrorChange'
+    , starSymphony
+    , introducesHerselfAs_Lovely
+    , introducesHerselfAs_Princess
+    , introducesHerselfAs_Honey
+    , introducesHerselfAs_Fortune
+    , "ハピネス注入！幸せチャージ！"
+    , "ハピネスチャージプリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=_nHcTw_RBJM
+transformationSpeech_HappinessCharge_InnocentForm =
+    [ kawarunrun
+    , mirrorChange'
+    , starSymphony
+    , "ハピネスチャージプリキュア！イノセントフォーム！"
+    ]
+
+
+-- https://www.youtube.com/watch?v=zYl0HeAGzG4
+purificationSpeech_Lovely =
+    [ "愛の光を聖なる力に！"
+    , "ラブプリブレス！"
+    , "プリキュア！ピンキーラブ・シュート！！"
+    , "愛よ、天に返れ！"
+    ]
+
+-- https://www.youtube.com/watch?v=kZl2B7OHzjo
+purificationSpeech_Princess =
+    [ "勇気の光を聖なる力へ！"
+    , "ラブプリブレス！"
+    , "プリキュア！ブルーハッピー・シュート！！"
+    , "勇気よ、天に返れ！"
+    ]
+
+-- https://www.youtube.com/watch?v=nvZ-ywR6NGM
+purificationSpeech_Honey =
+    [ "命の光を聖なる力へ！"
+    , "ハニーバトン！"
+    , "プリキュア！スパークリングバトンアタック！！"
+    , "イエイ！"
+    , "命よ、天に返れ！"
+    ]
+
+-- https://www.youtube.com/watch?v=vyVRx-G20vI
+purificationSpeech_Fortune =
+    [ "星の光を聖なる力に！"
+    , "フォーチュン・タンバリン！"
+    , "プリキュア！スターライト・アセンション！！"
+    , "星よ、天に返れ！"
+    ]
+
+-- https://www.youtube.com/watch?v=_nHcTw_RBJM
+purificationSpeech_HappinessCharge_InnocentForm =
+    [ "(集まれ、ハピネスな気持ち！)"
+    , "(高まれ、イノセントな思い！)"
+    , "輝け！シャイニング・メイク・ドレッサー！"
+    , "カタチなき愛求め♪"
+    , "確かなその優しさ♪"
+    , "色褪せない希望♪"
+    , "奏でよう未来へ♪"
+    , "勇気のカケラがひとつ♪"
+    , "まだ見つからない♪"
+    , "だけどきっと♪"
+    , "イノセント♪ イノセント♪"
+    , "小さな勇気 愛の光り 星の瞬き 尊き命♪"
+    , "心を重ねて 響き合うメロディ♪"
+    , "プリキュア！ イノセントプリフィケーション！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/HeartCatch.hs b/src/ACME/PreCure/Textbook/HeartCatch.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/HeartCatch.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.HeartCatch
+  ( module H
+  ) where
+
+
+import           ACME.PreCure.Textbook.HeartCatch.Types as H
diff --git a/src/ACME/PreCure/Textbook/HeartCatch/Types.hs b/src/ACME/PreCure/Textbook/HeartCatch/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/HeartCatch/Types.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.HeartCatch.Types where
+
+
+import           ACME.PreCure.Textbook.HeartCatch.Words
+import           ACME.PreCure.Types.TH
+
+
+data Tsubomi = Tsubomi deriving (Eq, Show)
+data Erika   = Erika deriving (Eq, Show)
+data Itsuki  = Itsuki deriving (Eq, Show)
+data Yuri    = Yuri deriving (Eq, Show)
+
+girlInstance [t| Tsubomi |] girlName_Tsubomi
+girlInstance [t| Erika |] girlName_Erika
+girlInstance [t| Itsuki |] girlName_Itsuki
+girlInstance [t| Yuri |] girlName_Yuri
+
+data CureBlossom   = CureBlossom deriving (Eq, Show)
+data CureMarine    = CureMarine deriving (Eq, Show)
+data CureSunshine  = CureSunshine deriving (Eq, Show)
+data CureMoonlight = CureMoonlight deriving (Eq, Show)
+
+data SuperCureBlossom   = SuperCureBlossom deriving (Eq, Show)
+data SuperCureMarine    = SuperCureMarine deriving (Eq, Show)
+data SuperCureSunshine  = SuperCureSunshine deriving (Eq, Show)
+data SuperCureMoonlight = SuperCureMoonlight deriving (Eq, Show)
+
+data HeartPerfume hs = HeartPerfume hs deriving (Eq, Show)
+data ShinyPerfume hs = ShinyPerfume hs deriving (Eq, Show)
+data HeartPot hs = HeartPot hs deriving (Eq, Show)
+
+-- TODO: Use distinct name for each heart seed?
+data HeartSeed = HeartSeed deriving (Eq, Show)
+
+data BlossomTakt     = BlossomTakt deriving (Eq, Show)
+data MarineTakt      = MarineTakt deriving (Eq, Show)
+data ShinyTambourine = ShinyTambourine deriving (Eq, Show)
+data MoonTakt        = MoonTakt deriving (Eq, Show)
+
+data HeartCatchMirage sps = HeartCatchMirage sps deriving (Eq, Show)
+
+data SuperPreCureSeed = SuperPreCureSeed deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureBlossom |] cureName_Blossom introducesHerselfAs_Blossom
+transformedInstanceDefault [t| CureMarine |] cureName_Marine introducesHerselfAs_Marine
+transformedInstanceDefault [t| CureSunshine |] cureName_Sunshine introducesHerselfAs_Sunshine
+transformedInstanceDefault [t| CureMoonlight |] cureName_Moonlight introducesHerselfAs_Moonlight
+
+transformedInstance [t| SuperCureBlossom |] cureName_Blossom introducesHerselfAs_Blossom variation_SuperBlossom
+transformedInstance [t| SuperCureMarine |] cureName_Marine introducesHerselfAs_Marine variation_SuperMarine
+transformedInstance [t| SuperCureSunshine |] cureName_Sunshine introducesHerselfAs_Sunshine variation_SuperSunshine
+transformedInstance [t| SuperCureMoonlight |] cureName_Moonlight introducesHerselfAs_Moonlight variation_SuperMoonlight
+
+transformedGroupInstanceDefault
+  [t| (CureBlossom, CureMarine, CureSunshine, CureMoonlight) |]
+  groupName_HeartCatch
+
+transformedGroupInstance
+  [t| (SuperCureBlossom, SuperCureMarine, SuperCureSunshine, SuperCureMoonlight) |]
+  groupName_HeartCatch
+  variation_SuperSilhouette
+
+transformationInstance [t| Tsubomi |] [t| HeartPerfume HeartSeed |] [t| CureBlossom |] [| CureBlossom |] transformationSpeech_Blossom
+transformationInstance [t| Erika |] [t| HeartPerfume HeartSeed |] [t| CureMarine |] [| CureMarine |] transformationSpeech_Marine
+transformationInstance [t| Itsuki |] [t| ShinyPerfume HeartSeed |] [t| CureSunshine |] [| CureSunshine |] transformationSpeech_Sunshine
+transformationInstance [t| Yuri |] [t| HeartPot HeartSeed |] [t| CureMoonlight |] [| CureMoonlight |] transformationSpeech_Moonlight
+
+transformationInstance
+  [t| (Tsubomi, Erika, Itsuki, Yuri) |]
+  [t| (HeartPerfume HeartSeed, HeartPerfume HeartSeed, ShinyPerfume HeartSeed, HeartPot HeartSeed) |]
+  [t| (CureBlossom, CureMarine, CureSunshine, CureMoonlight) |]
+  [| (CureBlossom, CureMarine, CureSunshine, CureMoonlight) |]
+  transformationSpeech_HeartCatch
+
+transformationInstance
+  [t| (CureBlossom, CureMarine, CureSunshine, CureMoonlight) |]
+  [t| HeartCatchMirage SuperPreCureSeed |]
+  [t| (SuperCureBlossom, SuperCureMarine, SuperCureSunshine, SuperCureMoonlight) |]
+  [| (SuperCureBlossom, SuperCureMarine, SuperCureSunshine, SuperCureMoonlight) |]
+  transformationSpeech_HeartCatch_SuperSilhouette
+
+purificationInstance [t| CureBlossom |] [t| BlossomTakt |] purificationSpeech_Blossom
+purificationInstance [t| CureMarine |] [t| MarineTakt |] purificationSpeech_Marine
+purificationInstance [t| CureSunshine |] [t| ShinyTambourine |] purificationSpeech_Sunshine
+purificationInstance [t| CureMoonlight |] [t| MoonTakt |] purificationSpeech_Moonlight
+
+purificationInstance
+  [t| (CureBlossom, CureMarine, CureSunshine, CureMoonlight) |]
+  [t| HeartCatchMirage SuperPreCureSeed |]
+  purificationSpeech_HeartCatch_SuperSilhouette
diff --git a/src/ACME/PreCure/Textbook/HeartCatch/Words.hs b/src/ACME/PreCure/Textbook/HeartCatch/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/HeartCatch/Words.hs
@@ -0,0 +1,91 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.HeartCatch.Words where
+
+groupName_HeartCatch = "ハートキャッチプリキュア！"
+
+girlName_Tsubomi = "花咲つぼみ"
+girlName_Erika   = "来海えりか"
+girlName_Itsuki  = "明堂院いつき"
+girlName_Yuri    = "月影ゆり"
+
+cureName_Blossom   = "キュアブロッサム"
+cureName_Marine    = "キュアマリン"
+cureName_Sunshine  = "キュアサンシャイン"
+cureName_Moonlight = "キュアムーンライト"
+
+variation_SuperBlossom   = "スーパーキュアブロッサム"
+variation_SuperMarine    = "スーパーキュアマリン"
+variation_SuperSunshine  = "スーパーキュアサンシャイン"
+variation_SuperMoonlight = "スーパーキュアムーンライト"
+
+variation_SuperSilhouette = "スーパーシルエット"
+
+-- https://www.youtube.com/watch?v=gcLBpRlMly8
+introducesHerselfAs_Blossom   = "大地に咲く一輪の花！ キュアブロッサム！"
+introducesHerselfAs_Marine    = "海風に揺れる一輪の花！ キュアマリン！"
+introducesHerselfAs_Sunshine  = "陽の光浴びる一輪の花！ キュアサンシャイン！"
+introducesHerselfAs_Moonlight = "月光に冴える一輪の花！ キュアムーンライト！"
+
+preCureSeed = "(プリキュアの種、いくですぅ！)"
+openMyHeart = "プリキュア！オープンマイハート！"
+
+transformationSpeech_Blossom   = [preCureSeed, openMyHeart, introducesHerselfAs_Blossom]
+transformationSpeech_Marine    = [preCureSeed, openMyHeart, introducesHerselfAs_Marine]
+transformationSpeech_Sunshine  = [preCureSeed, openMyHeart, introducesHerselfAs_Sunshine]
+transformationSpeech_Moonlight = [openMyHeart, introducesHerselfAs_Moonlight]
+
+transformationSpeech_HeartCatch =
+    [ preCureSeed
+    , openMyHeart
+    , introducesHerselfAs_Blossom
+    , introducesHerselfAs_Marine
+    , introducesHerselfAs_Sunshine
+    , introducesHerselfAs_Moonlight
+    , "ハートキャッチ・プリキュア！"
+    ]
+
+-- https://www.youtube.com/watch?v=zpfoddTKS6U
+transformationSpeech_HeartCatch_SuperSilhouette =
+    [ "鏡よ鏡、プリキュアに力を！"
+    , "世界に輝く一面の花！ ハートキャッチプリキュア！ スーパーシルエット！"
+    ]
+
+
+-- https://www.youtube.com/watch?v=zpfoddTKS6U
+purificationSpeech_Blossom =
+    [ "集まれ、花のパワー！"
+    , "ブロッサム・タクト！"
+    , "花よ輝け！"
+    , "プリキュア！ピンクフォルテウェイブ！！"
+    ]
+
+-- https://www.youtube.com/watch?v=-kWxDb4kkpY
+purificationSpeech_Marine =
+    [ "集まれ、花のパワー！"
+    , "マリン・タクト！"
+    , "花よ煌めけ！"
+    , "プリキュア！ブルーフォルテウェイブ！！"
+    ]
+
+-- https://www.youtube.com/watch?v=BOXWBXhj4K4
+purificationSpeech_Sunshine =
+    [ "集まれ、花のパワー！"
+    , "シャイニー・タンバリン！"
+    , "花よ、舞い踊れ！"
+    , "プリキュア！ゴールドフォルテバースト！！"
+    ]
+
+-- https://www.youtube.com/watch?v=bprklJEuUBk
+purificationSpeech_Moonlight =
+    [ "集まれ、花のパワー！"
+    , "ムーン・タクト！"
+    , "花よ輝け！"
+    , "プリキュア！シルバーフォルテウェイブ！！"
+    ]
+
+-- https://www.youtube.com/watch?v=s3Epi7ArY5A
+purificationSpeech_HeartCatch_SuperSilhouette =
+    [ "花よ、咲き誇れ！"
+    , "プリキュア！ハートキャッチ・オーケストラ！！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/MahoGirls.hs b/src/ACME/PreCure/Textbook/MahoGirls.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/MahoGirls.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.MahoGirls
+  ( module M
+  ) where
+
+
+import           ACME.PreCure.Textbook.MahoGirls.Types as M
diff --git a/src/ACME/PreCure/Textbook/MahoGirls/Types.hs b/src/ACME/PreCure/Textbook/MahoGirls/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/MahoGirls/Types.hs
@@ -0,0 +1,296 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.MahoGirls.Types where
+
+import           ACME.PreCure.Textbook.MahoGirls.Words
+import           ACME.PreCure.Types.TH
+
+
+data Mirai  = Mirai deriving (Eq, Show)
+-- According to the Ep. 40, Liko spells "Liko" instead of "Riko"
+data Liko   = Liko deriving (Eq, Show)
+data Kotoha = Kotoha deriving (Eq, Show)
+
+
+$(girlInstance [t| Mirai  |] girlName_Mirai)
+$(girlInstance [t| Liko   |] girlName_Liko)
+$(girlInstance [t| Kotoha |] girlName_Kotoha)
+
+
+data CureMiracle                = CureMiracle deriving (Eq, Show)
+data CureMiracle_Ruby           = CureMiracle_Ruby deriving (Eq, Show)
+data CureMiracle_Sapphire       = CureMiracle_Sapphire deriving (Eq, Show)
+data CureMiracle_Topaz          = CureMiracle_Topaz deriving (Eq, Show)
+data CureMiracle_OverTheRainbow = CureMiracle_OverTheRainbow deriving (Eq, Show)
+data CureMiracle_Heartful       = CureMiracle_Heartful deriving (Eq, Show)
+
+data CureMagical                = CureMagical deriving (Eq, Show)
+data CureMagical_Ruby           = CureMagical_Ruby deriving (Eq, Show)
+data CureMagical_Sapphire       = CureMagical_Sapphire deriving (Eq, Show)
+data CureMagical_Topaz          = CureMagical_Topaz deriving (Eq, Show)
+data CureMagical_OverTheRainbow = CureMagical_OverTheRainbow deriving (Eq, Show)
+data CureMagical_Heartful       = CureMagical_Heartful deriving (Eq, Show)
+
+data CureFelice                = CureFelice deriving (Eq, Show)
+data CureFelice_OverTheRainbow = CureFelice_OverTheRainbow deriving (Eq, Show)
+data CureFelice_Heartful       = CureFelice_Heartful deriving (Eq, Show)
+
+data CureMofurun               = CureMofurun deriving (Eq, Show)
+data CureMofurun_Ruby          = CureMofurun_Ruby deriving (Eq, Show)
+data CureMofurun_Sapphire      = CureMofurun_Sapphire deriving (Eq, Show)
+data CureMofurun_Topaz         = CureMofurun_Topaz deriving (Eq, Show)
+data CureMofurun_Heartful      = CureMofurun_Heartful deriving (Eq, Show)
+
+data Mofurun ls = Mofurun ls deriving (Eq, Show)
+
+data LinkleSmarthon ls = LinkleSmarthon ls deriving (Eq, Show)
+
+data RainbowCarriage ls mof = RainbowCarriage ls mof deriving (Eq, Show)
+
+data PreciousBrace = PreciousBrace deriving (Eq, Show)
+
+data MiracleMofurunLight = MiracleMofurunLight deriving (Eq, Show)
+
+
+data LinkleStoneDia         = LinkleStoneDia deriving (Show, Eq)
+data LinkleStoneRuby        = LinkleStoneRuby deriving (Show, Eq)
+data LinkleStoneSapphire    = LinkleStoneSapphire deriving (Show, Eq)
+data LinkleStoneTopaz       = LinkleStoneTopaz deriving (Show, Eq)
+data LinkleStoneEmerald     = LinkleStoneEmerald deriving (Show, Eq)
+data LinkleStoneAlexandrite = LinkleStoneAlexandrite deriving (Show, Eq)
+
+data LinkleStoneOfHope   = LinkleStoneOfHope deriving (Show, Eq)
+data HeartfulLinkleStone = HeartfulLinkleStone deriving (Show, Eq)
+
+data LinkleStick ls = LinkleStick ls deriving (Eq, Show)
+data FlowerEchoWand ls = FlowerEchoWand ls deriving (Eq, Show)
+
+transformedInstance [t| CureMiracle                |] cureName_Miracle introducesHerselfAs_Miracle variation_Dia
+transformedInstance [t| CureMiracle_Ruby           |] cureName_Miracle introducesHerselfAs_Miracle variation_Ruby
+transformedInstance [t| CureMiracle_Sapphire       |] cureName_Miracle introducesHerselfAs_Miracle variation_Sapphire
+transformedInstance [t| CureMiracle_Topaz          |] cureName_Miracle introducesHerselfAs_Miracle variation_Topaz
+transformedInstance [t| CureMiracle_OverTheRainbow |] cureName_Miracle introducesHerselfAs_Miracle variation_OverTheRainbow
+transformedInstance [t| CureMiracle_Heartful       |] cureName_Miracle introducesHerselfAs_Miracle variation_Heartful
+
+transformedInstance [t| CureMagical                |] cureName_Magical introducesHerselfAs_Magical variation_Dia
+transformedInstance [t| CureMagical_Ruby           |] cureName_Magical introducesHerselfAs_Magical variation_Ruby
+transformedInstance [t| CureMagical_Sapphire       |] cureName_Magical introducesHerselfAs_Magical variation_Sapphire
+transformedInstance [t| CureMagical_Topaz          |] cureName_Magical introducesHerselfAs_Magical variation_Topaz
+transformedInstance [t| CureMagical_OverTheRainbow |] cureName_Magical introducesHerselfAs_Magical variation_OverTheRainbow
+transformedInstance [t| CureMagical_Heartful       |] cureName_Magical introducesHerselfAs_Magical variation_Heartful
+
+transformedInstanceDefault [t| CureFelice |] cureName_Felice introducesHerselfAs_Felice
+transformedInstance [t| CureFelice_OverTheRainbow |] cureName_Felice introducesHerselfAs_Felice variation_OverTheRainbow
+transformedInstance [t| CureFelice_Heartful       |] cureName_Felice introducesHerselfAs_Felice variation_Heartful
+
+transformedInstance [t| CureMofurun |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Dia
+
+transformedInstance [t| CureMofurun_Ruby |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Ruby
+
+transformedInstance [t| CureMofurun_Sapphire |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Sapphire
+
+transformedInstance [t| CureMofurun_Topaz |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Topaz
+
+transformedGroupInstance
+  [t| (CureMiracle, CureMagical) |]
+  groupName_MahoGirls
+  variation_Dia
+
+transformedGroupInstance
+  [t| (CureMiracle_Ruby, CureMagical_Ruby) |]
+  groupName_MahoGirls
+  variation_Ruby
+
+transformedGroupInstance
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
+  groupName_MahoGirls
+  variation_Sapphire
+
+transformedGroupInstance
+  [t| (CureMiracle_Topaz, CureMagical_Topaz) |]
+  groupName_MahoGirls
+  variation_Topaz
+
+transformedGroupInstance
+  [t| (CureMiracle, CureMagical, CureFelice) |]
+  groupName_MahoGirls
+  variation_Dia
+
+transformedGroupInstance
+  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
+  groupName_MahoGirls
+  variation_Ruby
+
+transformedGroupInstance
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
+  groupName_MahoGirls
+  variation_Sapphire
+
+transformedGroupInstance
+  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
+  groupName_MahoGirls
+  variation_Topaz
+
+transformedGroupInstance
+  [t| (CureMiracle, CureMagical, CureFelice, CureMofurun) |]
+  groupName_MahoGirls
+  variation_Dia
+
+transformedGroupInstance
+  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice, CureMofurun_Ruby) |]
+  groupName_MahoGirls
+  variation_Ruby
+
+transformedGroupInstance
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice, CureMofurun_Sapphire) |]
+  groupName_MahoGirls
+  variation_Sapphire
+
+transformedGroupInstance
+  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice, CureMofurun_Topaz) |]
+  groupName_MahoGirls
+  variation_Topaz
+
+transformedGroupInstance
+  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  groupName_MahoGirls
+  variation_OverTheRainbow
+
+-- TODO: Add purification instance after watching the movie again
+transformedGroupInstance
+  [t| (CureMiracle_Heartful, CureMagical_Heartful, CureFelice_Heartful, CureMofurun_Heartful) |]
+  groupName_MahoGirls
+  variation_Heartful
+
+transformationInstance
+  [t| (Mirai, Liko) |]
+  [t| (Mofurun LinkleStoneDia) |]
+  [t| (CureMiracle, CureMagical) |]
+  [| (CureMiracle, CureMagical) |]
+  transformationSpeech_Miracle_Magical
+
+transformationInstance
+  [t| (Mirai, Liko) |]
+  [t| (Mofurun LinkleStoneRuby) |]
+  [t| (CureMiracle_Ruby, CureMagical_Ruby) |]
+  [| (CureMiracle_Ruby, CureMagical_Ruby) |]
+  transformationSpeech_Miracle_Magical_Ruby
+
+transformationInstance
+  [t| (Mirai, Liko) |]
+  [t| (Mofurun LinkleStoneSapphire) |]
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
+  [| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
+  transformationSpeech_Miracle_Magical_Sapphire
+
+transformationInstance
+  [t| (Mirai, Liko) |]
+  [t| (Mofurun LinkleStoneTopaz) |]
+  [t| (CureMiracle_Topaz, CureMagical_Topaz) |]
+  [| (CureMiracle_Topaz, CureMagical_Topaz) |]
+  transformationSpeech_Miracle_Magical_Topaz
+
+transformationInstance
+  [t| Kotoha |]
+  [t| (LinkleSmarthon LinkleStoneEmerald) |]
+  [t| CureFelice |]
+  [| CureFelice |]
+  transformationSpeech_Felice
+
+transformationInstance
+  [t| (Mirai, Liko, Kotoha) |]
+  [t| (Mofurun LinkleStoneDia, LinkleSmarthon LinkleStoneEmerald) |]
+  [t| (CureMiracle, CureMagical, CureFelice) |]
+  [| (CureMiracle, CureMagical, CureFelice) |]
+  transformationSpeech_MahoGirls
+
+transformationInstance
+  [t| (Mirai, Liko, Kotoha) |]
+  [t| (Mofurun LinkleStoneRuby, LinkleSmarthon LinkleStoneEmerald) |]
+  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
+  [| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
+  transformationSpeech_MahoGirls_Ruby
+
+transformationInstance
+  [t| (Mirai, Liko, Kotoha) |]
+  [t| (Mofurun LinkleStoneSapphire, LinkleSmarthon LinkleStoneEmerald) |]
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
+  [| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
+  transformationSpeech_MahoGirls_Sapphire
+
+transformationInstance
+  [t| (Mirai, Liko, Kotoha) |]
+  [t| (Mofurun LinkleStoneTopaz, LinkleSmarthon LinkleStoneEmerald) |]
+  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
+  [| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
+  transformationSpeech_MahoGirls_Topaz
+
+
+transformationInstance
+  [t| (CureMiracle, CureMagical, CureFelice) |]
+  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
+  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  transformationSpeech_MahoGirls_OverTheRainbow
+
+transformationInstance
+  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
+  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
+  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  transformationSpeech_MahoGirls_OverTheRainbow
+
+transformationInstance
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
+  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
+  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  transformationSpeech_MahoGirls_OverTheRainbow
+
+transformationInstance
+  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
+  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
+  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  transformationSpeech_MahoGirls_OverTheRainbow
+
+transformationInstance
+  [t| Mofurun LinkleStoneOfHope |]
+  [t| MiracleMofurunLight |]
+  [t| CureMofurun |]
+  [| CureMofurun |]
+  transformationSpeech_Mofurun
+
+
+purificationInstance
+  [t| (CureMiracle, CureMagical) |]
+  [t| (Mofurun LinkleStoneDia, LinkleStick LinkleStoneDia) |]
+  purificationSpeech_Miracle_Magical
+
+purificationInstance
+  [t| (CureMiracle_Ruby, CureMagical_Ruby) |]
+  [t| (Mofurun LinkleStoneRuby, LinkleStick LinkleStoneRuby) |]
+  purificationSpeech_Miracle_Magical_Ruby
+
+purificationInstance
+  [t| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
+  [t| (Mofurun LinkleStoneSapphire, LinkleStick LinkleStoneSapphire) |]
+  purificationSpeech_Miracle_Magical_Sapphire
+
+purificationInstance
+  [t| (CureMiracle_Topaz, CureMagical_Topaz) |]
+  [t| (Mofurun LinkleStoneTopaz, LinkleStick LinkleStoneTopaz) |]
+  purificationSpeech_Miracle_Magical_Topaz
+
+purificationInstance
+  [t| CureFelice |]
+  [t| FlowerEchoWand LinkleStoneEmerald |]
+  purificationSpeech_Felice
+
+purificationInstance
+  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
+  [t| (RainbowCarriage LinkleStoneAlexandrite (Mofurun LinkleStoneAlexandrite), PreciousBrace) |]
+  purificationSpeech_MahoGirls_extreme_rainbow
diff --git a/src/ACME/PreCure/Textbook/MahoGirls/Words.hs b/src/ACME/PreCure/Textbook/MahoGirls/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/MahoGirls/Words.hs
@@ -0,0 +1,151 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.MahoGirls.Words where
+
+
+groupName_MahoGirls = "魔法つかいプリキュア！"
+
+
+girlName_Mirai  = "朝日奈みらい"
+girlName_Liko   = "十六夜リコ"
+girlName_Kotoha = "花海ことは"
+
+cureName_Miracle = "キュアミラクル"
+cureName_Magical = "キュアマジカル"
+cureName_Felice  = "キュアフェリーチェ"
+cureName_Mofurun = "キュアモフルン"
+
+introducesHerselfAs_Miracle = "ふたりの奇跡！キュアミラクル！" 
+introducesHerselfAs_Magical = "ふたりの魔法！キュアマジカル！" 
+introducesHerselfAs_Felice  = "あまねく生命に祝福を！キュアフェリーチェ！" 
+introducesHerselfAs_Mofurun = "モフモフモフルン！キュアモフルン！" 
+
+variation_Dia = "ダイヤスタイル"
+variation_Ruby = "ルビースタイル"
+variation_Sapphire = "サファイアスタイル"
+variation_Topaz = "トパーズスタイル"
+variation_OverTheRainbow = "オーバー・ザ・レインボー"
+variation_Heartful = "ハートフルスタイル"
+
+linkleStoneName_Dia = "ダイヤ"
+linkleStoneName_Ruby = "ルビー"
+linkleStoneName_Sapphire = "サファイヤ"
+linkleStoneName_Topaz = "トパーズ"
+linkleStoneName_Emerald = "エメラルド"
+linkleStoneName_Alexandrite = "アレキサンドライト"
+linkleStoneName_OfHope = "願いの石"
+linkleStoneName_Heartful = "ハートフルリンクルストーン"
+
+
+transformationSpeechWith_Miracle_Magical :: String -> [String]
+transformationSpeechWith_Miracle_Magical lsn =
+    [ "キュアップ・ラパパ！　" ++ lsn ++ "！"
+    , "ミラクル・マジカル・ジュエリーレ！"
+    , introducesHerselfAs_Miracle
+    , introducesHerselfAs_Magical
+    , "魔法つかいプリキュア！！"
+    ]
+
+
+-- https://www.youtube.com/watch?v=YUd5IkDjEds
+transformationSpeechWith_MahoGirls :: String -> [String]
+transformationSpeechWith_MahoGirls lsn =
+    [ "キュアップ・ラパパ！　" ++ lsn ++ "！"
+    , "ミラクル・マジカル・ジュエリーレ！"
+    , "エメラルド！"
+    , "フェリーチェ・ファンファン・フラワーレ！"
+    , introducesHerselfAs_Miracle
+    , introducesHerselfAs_Magical
+    , introducesHerselfAs_Felice
+    , "魔法つかいプリキュア！！"
+    ]
+
+transformationSpeech_Miracle_Magical =
+  transformationSpeechWith_Miracle_Magical linkleStoneName_Dia
+transformationSpeech_Miracle_Magical_Ruby =
+  transformationSpeechWith_Miracle_Magical linkleStoneName_Ruby
+transformationSpeech_Miracle_Magical_Sapphire =
+  transformationSpeechWith_Miracle_Magical linkleStoneName_Sapphire
+transformationSpeech_Miracle_Magical_Topaz =
+  transformationSpeechWith_Miracle_Magical linkleStoneName_Topaz
+
+transformationSpeech_MahoGirls =
+  transformationSpeechWith_MahoGirls linkleStoneName_Dia
+transformationSpeech_MahoGirls_Ruby =
+  transformationSpeechWith_MahoGirls linkleStoneName_Ruby
+transformationSpeech_MahoGirls_Sapphire =
+  transformationSpeechWith_MahoGirls linkleStoneName_Sapphire
+transformationSpeech_MahoGirls_Topaz =
+  transformationSpeechWith_MahoGirls linkleStoneName_Topaz
+
+transformationSpeech_Felice =
+    [ "キュアップ・ラパパ！　エメラルド！"
+    , "フェリーチェ・ファンファン・フラワーレ！"
+    , introducesHerselfAs_Felice
+    ]
+
+-- TODO: Check the movie again
+transformationSpeech_Mofurun = [introducesHerselfAs_Mofurun]
+
+-- https://www.youtube.com/watch?v=BSseiA_pBYI
+transformationSpeech_MahoGirls_OverTheRainbow =
+    [ "キュアップ・ラパパ！　アレキサンドライト！"
+    , "魔法つかいプリキュア！　オーバー・ザ・レインボー！"
+    ]
+
+
+-- https://www.youtube.com/watch?v=QBQfnFOyRS4
+purificationSpeech_Miracle_Magical =
+    [ "ダイヤ！永遠の輝きを私達の手に！"
+    , "フルフルリンクル！"
+    , "プリキュア！ダイヤモンド・エターナル！"
+    ]
+
+-- https://www.youtube.com/watch?v=sM7VC9-hCU8
+purificationSpeech_Miracle_Magical_Ruby =
+    [ "リンクルステッキ！"
+    , "(モッフー！)"
+    , "ルビー！紅の情熱よ私達の手に！"
+    , "フルフルリンクル！"
+    , "プリキュア！ルビー・パッショナーレ！"
+    ]
+
+-- https://www.youtube.com/watch?v=lNUa2Sfa894
+purificationSpeech_Miracle_Magical_Sapphire =
+    [ "リンクルステッキ！"
+    , "(モッフー！)"
+    , "サファイア！青き知性よ私達の手に！"
+    , "フルフルリンクル！"
+    , "プリキュア！サファイア・スマーティッシュ！"
+    ]
+
+-- https://www.youtube.com/watch?v=uu7V5Fxw8NQ
+purificationSpeech_Miracle_Magical_Topaz =
+    [ "リンクルステッキ！"
+    , "(モォッフー！モッフッ！)"
+    , "トパーズ！金色の希望よ私達の手に！"
+    , "フルフルリンクル！"
+    , "プリキュア！トパーズ・エスペランサ！"
+    ]
+
+-- https://www.youtube.com/watch?v=vEWAnGM0-Os
+purificationSpeech_Felice =
+    [ "フラワーエコーワンド！"
+    , "エメラルド！"
+    , "キュアー・アップ！"
+    , "（キュアー・アップ！キュアー・アップ！キュアー・アップ！）"
+    , "プリキュア！エメラルド・リンカネーション！"
+    ]
+
+-- https://www.youtube.com/watch?v=dGaiygaMDUM
+purificationSpeech_MahoGirls_extreme_rainbow =
+    [ "（レインボー・キャリッジ！ モフッ！　モォッフー！！）"
+    , "巡り会う奇跡よ！"
+    , "繋がる魔法よ！" 
+    , "育まれし幸福（しあわせ）よ！" 
+    , "今私たちの手に！"
+    , "プレシャスブレス！"
+    , "フル・フル・フルフルリンクル！"
+    , "プリキュア！エクストリーム・レインボー！"
+    , "キュアップ・ラパパ！　虹の彼方に！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/MaxHeart.hs b/src/ACME/PreCure/Textbook/MaxHeart.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/MaxHeart.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.MaxHeart
+  ( module M
+  ) where
+
+
+import           ACME.PreCure.Textbook.MaxHeart.Types as M
diff --git a/src/ACME/PreCure/Textbook/MaxHeart/Types.hs b/src/ACME/PreCure/Textbook/MaxHeart/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/MaxHeart/Types.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.MaxHeart.Types where
+
+import           ACME.PreCure.Textbook.First.Words
+import           ACME.PreCure.Textbook.First.Types
+import           ACME.PreCure.Textbook.MaxHeart.Words
+import           ACME.PreCure.Types.TH
+
+
+data Hikari = Hikari deriving (Eq, Show)
+
+data CureBlack_Max = CureBlack_Max deriving (Eq, Show)
+data CureWhite_Max = CureWhite_Max deriving (Eq, Show)
+
+$(girlInstance [t| Hikari |] girlName_Hikari)
+
+data ShinyLuminous = ShinyLuminous deriving (Eq, Show)
+
+data HeartfulCommune_Mepple = HeartfulCommune_Mepple deriving (Eq, Show)
+data HeartfulCommune_Mipple = HeartfulCommune_Mipple deriving (Eq, Show)
+
+data TouchCommune_Porun = TouchCommune_Porun deriving (Eq, Show)
+
+data SparkleBrace = SparkleBrace deriving (Eq, Show)
+
+data HeartielBaton = HeartielBaton deriving (Eq, Show)
+
+transformedInstance [t| CureBlack_Max |] cureName_Black introducesHerselfAs_Black variation_MaxHeart
+transformedInstance [t| CureWhite_Max |] cureName_White introducesHerselfAs_White variation_MaxHeart
+
+transformedGroupInstanceDefault
+  [t| (CureBlack_Max, CureWhite_Max) |]
+  groupName_MaxHeart
+
+transformedGroupInstanceDefault
+  [t| (CureBlack_Max, CureWhite_Max, ShinyLuminous) |]
+  groupName_MaxHeart
+
+transformationInstance
+  [t| (Nagisa, Honoka) |]
+  [t| (HeartfulCommune_Mepple, HeartfulCommune_Mipple) |]
+  [t| (CureBlack_Max, CureWhite_Max) |]
+  [| (CureBlack_Max, CureWhite_Max) |]
+  transformationSpeech_Black_White
+
+transformationInstance
+  [t| Hikari |]
+  [t| TouchCommune_Porun |]
+  [t| ShinyLuminous |]
+  [| ShinyLuminous |]
+  transformationSpeech_Luminous
+
+nonItemPurificationInstance
+  [t| (CureBlack_Max, CureWhite_Max) |]
+  purificationSpeech_Black_White_Max
+
+purificationInstance
+  [t| ShinyLuminous |]
+  [t| HeartielBaton |]
+  purificationSpeech_Luminous
+
+-- TODO: more purifications after confirming the phrases
diff --git a/src/ACME/PreCure/Textbook/MaxHeart/Words.hs b/src/ACME/PreCure/Textbook/MaxHeart/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/MaxHeart/Words.hs
@@ -0,0 +1,33 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.MaxHeart.Words where
+
+
+import           ACME.PreCure.Textbook.First.Words
+
+
+groupName_MaxHeart = "ふたりはプリキュア Max Heart"
+
+girlName_Hikari = "九条ひかり"
+
+cureName_Luminous = "シャイニールミナス"
+
+introducesHerselfAs_Luminous = "輝く命、シャイニールミナス！" 
+
+variation_MaxHeart = "Max Heart"
+
+transformationSpeech_Luminous =
+    [ "ルミナス・シャイニングストリーム！"
+    , introducesHerselfAs_Luminous
+    , "光の心と光の意志、すべてを一つにするために！"
+    ]
+
+
+purificationSpeech_Black_White_Max =
+  purificationSpeech_Black_White ++ ["マックス！！"]
+
+
+purificationSpeech_Luminous =
+    [ "光の意志よ！私に勇気を！希望と力を！！"
+    , "ルミナス・ハーティエル・アンクション！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/Movie.hs b/src/ACME/PreCure/Textbook/Movie.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Movie.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Movie
+  ( module M
+  ) where
+
+
+import           ACME.PreCure.Textbook.Movie.Types as M
diff --git a/src/ACME/PreCure/Textbook/Movie/Types.hs b/src/ACME/PreCure/Textbook/Movie/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Movie/Types.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Movie.Types where
+
+
+import           ACME.PreCure.Textbook.Movie.Words
+import           ACME.PreCure.Types.TH
+
+
+data Ayumi = Ayumi deriving (Eq, Show)
+
+girlInstance [t| Ayumi |] girlName_Ayumi
+
+data CureEcho = CureEcho deriving (Eq, Show)
+
+data FeelingToBePreCure = FeelingToBePreCure deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureEcho |] cureName_Echo introducesHerselfAs_Echo
+transformationInstance
+  [t| Ayumi |]
+  [t| FeelingToBePreCure |]
+  [t| CureEcho |]
+  [| CureEcho |]
+  transformationSpeech_Echo
+
+nonItemPurificationInstance [t| CureEcho |] purificationSpeech_Echo
diff --git a/src/ACME/PreCure/Textbook/Movie/Words.hs b/src/ACME/PreCure/Textbook/Movie/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Movie/Words.hs
@@ -0,0 +1,15 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Movie.Words where
+
+girlName_Ayumi = "坂上あゆみ"
+
+cureName_Echo = "キュアエコー"
+introducesHerselfAs_Echo = "思いよ届け！キュアエコー！"
+
+transformationSpeech_Echo =
+  ["みんなの思いを守るために", "心をひとつに！", introducesHerselfAs_Echo]
+
+
+purificationSpeech_Echo =
+  ["世界に響け、みんなの思い！", "プリキュア・ハートフルエコー！"]
diff --git a/src/ACME/PreCure/Textbook/Smile.hs b/src/ACME/PreCure/Textbook/Smile.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Smile.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Smile
+  ( module S
+  ) where
+
+
+import           ACME.PreCure.Textbook.Smile.Types as S
diff --git a/src/ACME/PreCure/Textbook/Smile/Types.hs b/src/ACME/PreCure/Textbook/Smile/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Smile/Types.hs
@@ -0,0 +1,95 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Smile.Types where
+
+
+import           ACME.PreCure.Textbook.Smile.Words
+import           ACME.PreCure.Types.TH
+
+
+data Miyuki = Miyuki deriving (Eq, Show)
+data Akane  = Akane deriving (Eq, Show)
+data Yayoi  = Yayoi deriving (Eq, Show)
+data Nao    = Nao deriving (Eq, Show)
+data Reika  = Reika deriving (Eq, Show)
+
+girlInstance [t| Miyuki |] girlName_Miyuki
+girlInstance [t| Akane |] girlName_Akane
+girlInstance [t| Yayoi |] girlName_Yayoi
+girlInstance [t| Nao |] girlName_Nao
+girlInstance [t| Reika |] girlName_Reika
+
+data CureHappy  = CureHappy deriving (Eq, Show)
+data CureSunny  = CureSunny deriving (Eq, Show)
+data CurePeace  = CurePeace deriving (Eq, Show)
+data CureMarch  = CureMarch deriving (Eq, Show)
+data CureBeauty = CureBeauty deriving (Eq, Show)
+
+data PrincessHappy  = PrincessHappy deriving (Eq, Show)
+data PrincessSunny  = PrincessSunny deriving (Eq, Show)
+data PrincessPeace  = PrincessPeace deriving (Eq, Show)
+data PrincessMarch  = PrincessMarch deriving (Eq, Show)
+data PrincessBeauty = PrincessBeauty deriving (Eq, Show)
+
+data SmilePact cd = SmilePact cd deriving (Eq, Show)
+-- TODO: Make distinct decors for each PreCure or purification?
+data CureDecors = CureDecors deriving (Eq, Show)
+
+data PrincessCandle cd = PrincessCandle cd deriving (Eq, Show)
+
+data RoyalClock cd = RoyalClock cd deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureHappy |] cureName_Happy introducesHerselfAs_Happy
+transformedInstanceDefault [t| CureSunny |] cureName_Sunny introducesHerselfAs_Sunny
+transformedInstanceDefault [t| CurePeace |] cureName_Peace introducesHerselfAs_Peace
+transformedInstanceDefault [t| CureMarch |] cureName_March introducesHerselfAs_March
+transformedInstanceDefault [t| CureBeauty |] cureName_Beauty introducesHerselfAs_Beauty
+
+transformedInstance [t| PrincessHappy |] cureName_Happy introducesHerselfAs_Happy_Princess variation_Happy_Princess
+transformedInstance [t| PrincessSunny |] cureName_Sunny introducesHerselfAs_Sunny_Princess variation_Sunny_Princess
+transformedInstance [t| PrincessPeace |] cureName_Peace introducesHerselfAs_Peace_Princess variation_Peace_Princess
+transformedInstance [t| PrincessMarch |] cureName_March introducesHerselfAs_March_Princess variation_March_Princess
+transformedInstance [t| PrincessBeauty |] cureName_Beauty introducesHerselfAs_Beauty_Princess variation_Beauty_Princess
+
+transformedGroupInstanceDefault
+  [t| (CureHappy, CureSunny, CurePeace, CureMarch, CureBeauty) |]
+  groupName_Smile
+
+transformedGroupInstance
+  [t| (PrincessHappy, PrincessSunny, PrincessPeace, PrincessMarch, PrincessBeauty) |]
+  groupName_Smile
+  variation_Smile_Princess
+
+transformationInstance [t| Miyuki |] [t| SmilePact CureDecors |] [t| CureHappy |] [| CureHappy |] transformationSpeech_Happy
+transformationInstance [t| Akane |] [t| SmilePact CureDecors |] [t| CureSunny |] [| CureSunny |] transformationSpeech_Sunny
+transformationInstance [t| Yayoi |] [t| SmilePact CureDecors |] [t| CurePeace |] [| CurePeace |] transformationSpeech_Peace
+transformationInstance [t| Nao |] [t| SmilePact CureDecors |] [t| CureMarch |] [| CureMarch |] transformationSpeech_March
+transformationInstance [t| Reika |] [t| SmilePact CureDecors |] [t| CureBeauty |] [| CureBeauty |] transformationSpeech_Beauty
+
+transformationInstance
+  [t| (Miyuki, Akane, Yayoi, Nao, Reika) |]
+  [t| SmilePact CureDecors |]
+  [t| (CureHappy, CureSunny, CurePeace, CureMarch, CureBeauty) |]
+  [| (CureHappy, CureSunny, CurePeace, CureMarch, CureBeauty) |]
+  transformationSpeech_Smile
+
+transformationInstance
+  [t| (CureHappy, CureSunny, CurePeace, CureMarch, CureBeauty) |]
+  [t| PrincessCandle CureDecors |]
+  [t| (PrincessHappy, PrincessSunny, PrincessPeace, PrincessMarch, PrincessBeauty) |]
+  [| (PrincessHappy, PrincessSunny, PrincessPeace, PrincessMarch, PrincessBeauty) |]
+  transformationSpeech_Smile_Princess
+
+purificationInstance [t| CureHappy |] [t| SmilePact CureDecors |] purificationSpeech_Happy
+purificationInstance [t| CureSunny |] [t| SmilePact CureDecors |] purificationSpeech_Sunny
+purificationInstance [t| CurePeace |] [t| SmilePact CureDecors |] purificationSpeech_Peace
+purificationInstance [t| CureMarch |] [t| SmilePact CureDecors |] purificationSpeech_March
+purificationInstance [t| CureBeauty |] [t| SmilePact CureDecors |] purificationSpeech_Beauty
+
+purificationInstance
+  [t| (PrincessHappy, PrincessSunny, PrincessPeace, PrincessMarch, PrincessBeauty) |]
+  [t| RoyalClock CureDecors |]
+  purificationSpeech_Smile
diff --git a/src/ACME/PreCure/Textbook/Smile/Words.hs b/src/ACME/PreCure/Textbook/Smile/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Smile/Words.hs
@@ -0,0 +1,92 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Smile.Words where
+
+
+groupName_Smile = "スマイルプリキュア！"
+
+girlName_Miyuki = "星空みゆき"
+girlName_Akane  = "日野あかね"
+girlName_Yayoi  = "黄瀬やよい"
+girlName_Nao    = "緑川なお"
+girlName_Reika  = "青木れいか"
+
+cureName_Happy  = "キュアハッピー"
+cureName_Sunny  = "キュアサニー"
+cureName_Peace  = "キュアピース"
+cureName_March  = "キュアマーチ"
+cureName_Beauty = "キュアビューティー"
+
+introducesHerselfAs_Happy  = "キラキラ輝く未来の光！ キュアハッピー！"
+introducesHerselfAs_Sunny  = "太陽サンサン熱血パワー！ キュアサニー！"
+introducesHerselfAs_Peace  = "ピカピカピカリン、ジャンケンポン！ キュアピース！"
+introducesHerselfAs_March  = "勇気リンリン、直球勝負！ キュアマーチ！"
+introducesHerselfAs_Beauty = "しんしんと降り積もる清き心！ キュアビューティ！"
+
+smileCharge = ["(レディ？)", "プリキュア！スマイルチャージ！"]
+
+-- https://www.youtube.com/watch?v=5kh14uGcgCs
+transformationSpeech_Happy =
+  smileCharge ++ ["(ゴー！ゴー！レッツ・ゴー！ハッピー！！)", introducesHerselfAs_Happy]
+transformationSpeech_Sunny =
+  smileCharge ++ ["(ゴー！ゴー！レッツ・ゴー！サニー！！)", introducesHerselfAs_Sunny]
+transformationSpeech_Peace =
+  smileCharge ++ ["(ゴー！ゴー！レッツ・ゴー！ピース！！)", introducesHerselfAs_Peace]
+transformationSpeech_March =
+  smileCharge ++ ["(ゴー！ゴー！レッツ・ゴー！マーチ！！)", introducesHerselfAs_March]
+transformationSpeech_Beauty =
+  smileCharge ++ ["(ゴー！ゴー！レッツ・ゴー！ビューティー！！)", introducesHerselfAs_Beauty]
+
+-- https://www.youtube.com/watch?v=Guo_fReC6Gk
+transformationSpeech_Smile =
+    smileCharge
+      ++ ["(ゴー！ゴー！レッツ・ゴー！)"]
+      ++
+        [ introducesHerselfAs_Happy
+        , introducesHerselfAs_Sunny
+        , introducesHerselfAs_Peace
+        , introducesHerselfAs_March
+        , introducesHerselfAs_Beauty
+        ]
+          ++ ["5つの光が導く未来！" , "輝け！スマイルプリキュア！"]
+
+purificationSpeech_Happy  = ["プリキュア！ハッピー・シャワー！"]
+purificationSpeech_Sunny  = ["プリキュア！サニー・ファイヤー！"]
+-- https://www.youtube.com/watch?v=zbpEU6ma6Q0
+purificationSpeech_Peace  = ["プリキュア！ピース・サンダー！"]
+purificationSpeech_March  = ["プリキュア！マーチ・シュート！"]
+purificationSpeech_Beauty = ["プリキュア！ビューティー・ブリザード！"]
+
+variation_Smile_Princess = "プリキュア・プリンセス・フォーム"
+
+variation_Happy_Princess  = "プリンセスハッピー"
+variation_Sunny_Princess  = "プリンセスサニー"
+variation_Peace_Princess  = "プリンセスピース"
+variation_March_Princess  = "プリンセスマーチ"
+variation_Beauty_Princess = "プリンセスビューティー" 
+
+introducesHerselfAs_Happy_Princess = variation_Happy_Princess ++ "！"
+introducesHerselfAs_Sunny_Princess = variation_Sunny_Princess ++ "！"
+introducesHerselfAs_Peace_Princess = variation_Peace_Princess ++ "！"
+introducesHerselfAs_March_Princess = variation_March_Princess ++ "！"
+introducesHerselfAs_Beauty_Princess = variation_Beauty_Princess ++ "！"
+
+transformationSpeech_Smile_Princess =
+    [ "ペガサスよ！私たちに力を！"
+    , introducesHerselfAs_Happy_Princess
+    , introducesHerselfAs_Sunny_Princess
+    , introducesHerselfAs_Peace_Princess
+    , introducesHerselfAs_March_Princess
+    , introducesHerselfAs_Beauty_Princess
+    , "プリキュア・プリンセス・フォーム！"
+    ]
+
+-- https://www.youtube.com/watch?v=RK-vbzvShwE
+purificationSpeech_Smile =
+    [ "開け、ロイヤルクロック！"
+    , "(みんなの力を1つにするクル！)"
+    , "届け、希望の光！"
+    , "はばたけ！光り輝く未来へ！"
+    , "プリキュア！ロイヤル・レインボー・バースト！"
+    , "輝け！ハッピースマイル！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/SplashStar.hs b/src/ACME/PreCure/Textbook/SplashStar.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/SplashStar.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.SplashStar
+  ( module S
+  ) where
+
+
+import           ACME.PreCure.Textbook.SplashStar.Types as S
diff --git a/src/ACME/PreCure/Textbook/SplashStar/Types.hs b/src/ACME/PreCure/Textbook/SplashStar/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/SplashStar/Types.hs
@@ -0,0 +1,63 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.SplashStar.Types where
+
+
+import           ACME.PreCure.Textbook.SplashStar.Words
+import           ACME.PreCure.Types.TH
+
+data Saki = Saki deriving (Eq, Show)
+data Mai = Mai deriving (Eq, Show)
+
+$(girlInstance [t| Saki |] girlName_Saki)
+$(girlInstance [t| Mai |] girlName_Mai)
+
+data CureBloom = CureBloom deriving (Eq, Show)
+data CureEgret = CureEgret deriving (Eq, Show)
+
+data MixCommune_Flappy = MixCommune_Flappy deriving (Eq, Show)
+data MixCommune_Choppy = MixCommune_Choppy deriving (Eq, Show)
+
+data CureBright = CureBright deriving (Eq, Show)
+data CureWindy  = CureWindy deriving (Eq, Show)
+
+data CrystalCommune_Flappy = CrystalCommune_Flappy deriving (Eq, Show)
+data CrystalCommune_Choppy = CrystalCommune_Choppy deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureBloom |] cureName_Bloom introducesHerselfAs_Bloom
+transformedInstanceDefault [t| CureEgret |] cureName_Egret introducesHerselfAs_Egret
+
+transformedInstanceDefault [t| CureBright |] cureName_Bright introducesHerselfAs_Bright
+transformedInstanceDefault [t| CureWindy  |] cureName_Windy  introducesHerselfAs_Windy
+
+transformedGroupInstanceDefault
+  [t| (CureBloom, CureEgret) |]
+  groupName_SplashStar
+
+transformedGroupInstance
+  [t| (CureBright, CureWindy) |]
+  groupName_SplashStar
+  variation_Bright_Windy
+
+transformationInstance
+  [t| (Saki, Mai) |]
+  [t| (MixCommune_Flappy, MixCommune_Choppy) |]
+  [t| (CureBloom, CureEgret) |]
+  [| (CureBloom, CureEgret) |]
+  transformationSpeech_Bloom_Egret
+
+transformationInstance
+  [t| (Saki, Mai) |]
+  [t| (CrystalCommune_Flappy, CrystalCommune_Choppy) |]
+  [t| (CureBright, CureWindy) |]
+  [| (CureBright, CureWindy) |]
+  transformationSpeech_Bright_Windy
+
+nonItemPurificationInstance
+  [t| (CureBloom, CureEgret) |]
+  purificationSpeech_Bloom_Egret
+
+-- TODO: more purifications after confirming the phrases
diff --git a/src/ACME/PreCure/Textbook/SplashStar/Words.hs b/src/ACME/PreCure/Textbook/SplashStar/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/SplashStar/Words.hs
@@ -0,0 +1,56 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.SplashStar.Words where
+
+
+groupName_SplashStar = "ふたりはプリキュア Splash Star"
+
+girlName_Saki = "日向咲"
+girlName_Mai  = "美翔舞"
+
+cureName_Bloom = "キュアブルーム"
+cureName_Egret = "キュアイーグレット"
+
+cureName_Bright = "キュアブライト"
+cureName_Windy  = "キュアウィンディ"
+
+variation_Bright_Windy = "（キュアブルーム・キュアウィンディ）"
+
+introducesHerselfAs_Bloom = "輝く金の花！ キュアブルーム！" 
+introducesHerselfAs_Egret = "煌めく銀の翼！ キュアイーグレット！" 
+
+introducesHerselfAs_Bright = "天空に満ちる月！ キュアブライト！" 
+introducesHerselfAs_Windy  = "大地に薫る風！ キュアウィンディ！" 
+
+-- https://www.youtube.com/watch?v=BNfpwV-sPJU
+transformationSpeech_Bloom_Egret =
+    [ "デュアル・スピリチュアル・パワー！"
+    , "花開け大地に！"
+    , "羽ばたけ空に！"
+    , introducesHerselfAs_Bloom
+    , introducesHerselfAs_Egret
+    , "ふたりはプリキュア！"
+    , "聖なる泉を汚す者よ！"
+    , "阿漕な真似はお止めなさい！"
+    ]
+
+
+-- https://www.youtube.com/watch?v=5RMeQZzksuQ
+transformationSpeech_Bright_Windy =
+    [ "デュアル・スピリチュアル・パワー！"
+    , "未来を照らし!"
+    , "勇気を運べ!"
+    , introducesHerselfAs_Bright
+    , introducesHerselfAs_Windy
+    , "ふたりはプリキュア！"
+    , "聖なる泉を汚す者よ！"
+    , "阿漕な真似はお止めなさい！"
+    ]
+
+purificationSpeech_Bloom_Egret =
+    [ "大地の精霊よ"
+    , "大空の精霊よ"
+    , "今、プリキュアと共に！"
+    , "奇跡の力を解き放て！"
+    , "プリキュア　ツインストリーム・スプラッシュ！！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/Suite.hs b/src/ACME/PreCure/Textbook/Suite.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Suite.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Suite
+  ( module H
+  ) where
+
+
+import           ACME.PreCure.Textbook.Suite.Types as H
diff --git a/src/ACME/PreCure/Textbook/Suite/Types.hs b/src/ACME/PreCure/Textbook/Suite/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Suite/Types.hs
@@ -0,0 +1,85 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Suite.Types where
+
+
+import           ACME.PreCure.Textbook.Suite.Words
+import           ACME.PreCure.Types.TH
+
+
+data Hibiki = Hibiki deriving (Eq, Show)
+data Kanade = Kanade deriving (Eq, Show)
+data Ellen  = Ellen deriving (Eq, Show)
+data Ako    = Ako deriving (Eq, Show)
+
+girlInstance [t| Hibiki |] girlName_Hibiki
+girlInstance [t| Kanade |] girlName_Kanade
+girlInstance [t| Ellen |] girlName_Ellen
+girlInstance [t| Ako |] girlName_Ako
+
+data CureMelody = CureMelody deriving (Eq, Show)
+data CureRhythm = CureRhythm deriving (Eq, Show)
+data CureBeat   = CureBeat deriving (Eq, Show)
+data CureMuse   = CureMuse deriving (Eq, Show)
+
+data CureModules fs = CureModules fs deriving (Eq, Show)
+
+data Dory = Dory deriving (Eq, Show)
+data Rery = Rery deriving (Eq, Show)
+data Miry = Miry deriving (Eq, Show)
+data Fary = Fary deriving (Eq, Show)
+data Sory = Sory deriving (Eq, Show)
+data Lary = Lary deriving (Eq, Show)
+data Tiry = Tiry deriving (Eq, Show)
+data Dodory = Dodory deriving (Eq, Show)
+
+data MiracleBelltier miry   = MiracleBelltier miry deriving (Eq, Show)
+data FantasticBelltier fary = FantasticBelltier fary deriving (Eq, Show)
+data LoveGuitarRod sory = LoveGuitarRod sory deriving (Eq, Show)
+
+data HealingChest = HealingChest deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureMelody |] cureName_Melody introducesHerselfAs_Melody
+transformedInstanceDefault [t| CureRhythm |] cureName_Rhythm introducesHerselfAs_Rhythm
+transformedInstanceDefault [t| CureBeat |] cureName_Beat introducesHerselfAs_Beat
+transformedInstanceDefault [t| CureMuse |] cureName_Muse introducesHerselfAs_Muse
+
+transformedGroupInstanceDefault
+  [t| (CureMelody, CureRhythm, CureBeat, CureMuse) |]
+  groupName_Suite
+
+transformationInstance
+  [t| (Hibiki, Kanade) |]
+  [t| (CureModules Dory, CureModules Rery) |]
+  [t| (CureMelody, CureRhythm) |]
+  [| (CureMelody, CureRhythm) |]
+  transformationSpeech_Melody_Rhythm
+transformationInstance [t| Ellen |] [t| CureModules Lary |] [t| CureBeat |] [| CureBeat |] transformationSpeech_Beat
+transformationInstance [t| Ako |] [t| CureModules Dodory |] [t| CureMuse |] [| CureMuse |] transformationSpeech_Muse
+
+transformationInstance
+  [t| (Hibiki, Kanade, Ellen) |]
+  [t| (CureModules Dory, CureModules Rery, CureModules Lary) |]
+  [t| (CureMelody, CureRhythm, CureBeat) |]
+  [| (CureMelody, CureRhythm, CureBeat) |]
+  transformationSpeech_Melody_Rhythm_Beat
+
+transformationInstance
+  [t| (Hibiki, Kanade, Ellen, Ako) |]
+  [t| (CureModules Dory, CureModules Rery, CureModules Lary, CureModules Dodory) |]
+  [t| (CureMelody, CureRhythm, CureBeat, CureMuse) |]
+  [| (CureMelody, CureRhythm, CureBeat, CureMuse) |]
+  transformationSpeech_Suite
+
+purificationInstance [t| CureMelody |] [t| MiracleBelltier Miry |] purificationSpeech_Melody
+purificationInstance [t| CureRhythm |] [t| FantasticBelltier Fary |] purificationSpeech_Rhythm
+purificationInstance [t| CureBeat |] [t| LoveGuitarRod Sory |] purificationSpeech_Beat
+purificationInstance [t| CureMuse |] [t| CureModules Tiry |] purificationSpeech_Muse
+
+purificationInstance
+  [t| (CureMelody, CureRhythm, CureBeat, CureMuse) |]
+  [t| HealingChest |]
+  purificationSpeech_Suite
diff --git a/src/ACME/PreCure/Textbook/Suite/Words.hs b/src/ACME/PreCure/Textbook/Suite/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Suite/Words.hs
@@ -0,0 +1,119 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Suite.Words where
+
+groupName_Suite = "ハートキャッチプリキュア！"
+
+girlName_Hibiki = "北条響"
+girlName_Kanade = "南野奏"
+girlName_Ellen  = "黒川エレン"
+girlName_Ako    = "調辺アコ"
+
+
+cureName_Melody = "キュアメロディ"
+cureName_Rhythm = "キュアリズム"
+cureName_Beat   = "キュアビート"
+cureName_Muse   = "キュアミューズ"
+
+-- https://www.youtube.com/watch?v=gcLBpRlMly8
+introducesHerselfAs_Melody = "爪弾くは荒ぶる調べ！ キュアメロディー！"
+introducesHerselfAs_Rhythm = "爪弾くはたおやかな調べ！ キュアリズム！"
+introducesHerselfAs_Beat   = "爪弾くは魂の調べ！ キュアビート！"
+introducesHerselfAs_Muse   = "爪弾くは女神の調べ！ キュアミューズ！"
+
+
+modulation = "レッツプレイ！ プリキュア・モジュレーション！"
+
+-- http://prettycure.wikia.com/wiki/Pretty_Cure#Suite_Pretty_Cure.E2.99.AA
+resonateSuiteOfN :: Int -> String
+resonateSuiteOfN n =
+  "届け！" ++ show n ++ "人の組曲！ スイートプリキュア！"
+
+-- https://www.youtube.com/watch?v=Awj263rFma0
+transformationSpeech_Melody_Rhythm =
+  [ modulation
+  , introducesHerselfAs_Melody
+  , introducesHerselfAs_Rhythm
+  , resonateSuiteOfN 2
+  ]
+-- https://www.youtube.com/watch?v=pys-olfeXL8
+transformationSpeech_Beat = [modulation, introducesHerselfAs_Beat]
+-- https://www.youtube.com/watch?v=Cw7ds_UsCyA
+transformationSpeech_Muse = [modulation, introducesHerselfAs_Muse]
+
+-- https://www.youtube.com/watch?v=163dGbTWh3g
+transformationSpeech_Melody_Rhythm_Beat =
+  [ modulation
+  , introducesHerselfAs_Melody
+  , introducesHerselfAs_Rhythm
+  , introducesHerselfAs_Beat
+  , resonateSuiteOfN 3
+  ]
+
+-- https://www.youtube.com/watch?v=Y-9PB0D6_Lc
+transformationSpeech_Suite =
+  [ modulation
+  , introducesHerselfAs_Melody
+  , introducesHerselfAs_Rhythm
+  , introducesHerselfAs_Beat
+  , introducesHerselfAs_Muse
+  , resonateSuiteOfN 4
+  ]
+
+
+-- https://www.youtube.com/watch?v=H5idj3Cp894
+purificationSpeech_Melody =
+  [ "(ミミ～！)"
+  , "奏でましょう、奇跡のメロディー！ミラクル・ベルティエ！"
+  , "おいで、ミリー！"
+  , "(ミミ～！)"
+  , "翔けめぐれ、トーンのリング！"
+  , "プリキュア！ミュージックロンド！"
+  , "三拍子！１、２、３"
+  , "フィナーレ！"
+  ]
+
+-- https://www.youtube.com/watch?v=dmzuSVxB5vE
+purificationSpeech_Rhythm =
+  [ "(ファファ～！)"
+  , "刻みましょう、大いなるリズム！ファンタスティック・ベルティエ！"
+  , "おいで、ファリー！"
+  , "(ファファ～！)"
+  , "翔けめぐれ、トーンのリング！"
+  , "プリキュア！ミュージックロンド！"
+  , "三拍子！１、２、３"
+  , "フィナーレ！"
+  ]
+
+-- https://www.youtube.com/watch?v=al6LzdWpfZU
+purificationSpeech_Beat =
+  [ "(ソソッ)"
+  , "弾き鳴らせ、愛の魂！ラブギターロッド！"
+  , "おいで、ソリー！"
+  , "(ソソッ)"
+  , "チェンジ！ソウルロッド！"
+  , "翔けめぐれ、トーンのリング！"
+  , "プリキュア！ハートフル・ビート・ロック！"
+  , "三拍子！１、２、３"
+  , "フィナーレ！"
+  ]
+
+-- https://www.youtube.com/watch?v=19MEQ1VcIOo
+purificationSpeech_Muse =
+  [ "おいで、シリー！"
+  , "(シシ～)"
+  , "「シ」の音符の、シャイニングメロディ！"
+  , "プリキュア！スパーリング・シャワー！！"
+  , "三拍子！１、２、３"
+  , "フィナーレ！"
+  ]
+
+-- https://www.youtube.com/watch?v=QHjkhUVEaeY
+purificationSpeech_Suite =
+  [ "いでよ、すべての音の源よ！"
+  , "届けましょう、希望のシンフォニー！"
+  , "プリキュア！スイートセッションアンサンブル！"
+  , "クレッシェンド！！"
+  , "フィナーレ！"
+  ]
+
diff --git a/src/ACME/PreCure/Textbook/Yes5.hs b/src/ACME/PreCure/Textbook/Yes5.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Yes5.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Yes5
+  ( module Y
+  ) where
+
+
+import           ACME.PreCure.Textbook.Yes5.Types as Y
diff --git a/src/ACME/PreCure/Textbook/Yes5/Types.hs b/src/ACME/PreCure/Textbook/Yes5/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Yes5/Types.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Yes5.Types where
+
+
+import           ACME.PreCure.Textbook.Yes5.Words
+import           ACME.PreCure.Types.TH
+
+
+data Nozomi  = Nozomi deriving (Eq, Show)
+data Rin     = Rin deriving (Eq, Show)
+data Urara   = Urara deriving (Eq, Show)
+data Komachi = Komachi deriving (Eq, Show)
+data Karen   = Karen deriving (Eq, Show)
+
+girlInstance [t| Nozomi |] girlName_Nozomi
+girlInstance [t| Rin |] girlName_Rin
+girlInstance [t| Urara |] girlName_Urara
+girlInstance [t| Komachi |] girlName_Komachi
+girlInstance [t| Karen |] girlName_Karen
+
+data CureDream    = CureDream deriving (Eq, Show)
+data CureRouge    = CureRouge deriving (Eq, Show)
+data CureLemonade = CureLemonade deriving (Eq, Show)
+data CureMint     = CureMint deriving (Eq, Show)
+data CureAqua     = CureAqua deriving (Eq, Show)
+
+data PinkyCatch = PinkyCatch deriving (Eq, Show)
+
+data DreamTorch       = DreamTorch deriving (Eq, Show)
+data RougeTact        = RougeTact deriving (Eq, Show)
+data LemonadeCastanet = LemonadeCastanet deriving (Eq, Show)
+data MintLeaf         = MintLeaf deriving (Eq, Show)
+data AquaRibbon       = AquaRibbon deriving (Eq, Show)
+
+transformedInstanceDefault [t| CureDream |] cureName_Dream introducesHerselfAs_Dream
+transformedInstanceDefault [t| CureRouge |] cureName_Rouge introducesHerselfAs_Rouge
+transformedInstanceDefault [t| CureLemonade |] cureName_Lemonade introducesHerselfAs_Lemonade
+transformedInstanceDefault [t| CureMint |] cureName_Mint introducesHerselfAs_Mint
+transformedInstanceDefault [t| CureAqua |] cureName_Aqua introducesHerselfAs_Aqua
+
+transformedGroupInstanceDefault
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  groupName_Yes5
+
+transformationInstance [t| Nozomi |] [t| PinkyCatch |] [t| CureDream |] [| CureDream |] transformationSpeech_Dream
+transformationInstance [t| Rin |] [t| PinkyCatch |] [t| CureRouge |] [| CureRouge |] transformationSpeech_Rouge
+transformationInstance [t| Urara |] [t| PinkyCatch |] [t| CureLemonade |] [| CureLemonade |] transformationSpeech_Lemonade
+transformationInstance [t| Komachi |] [t| PinkyCatch |] [t| CureMint |] [| CureMint |] transformationSpeech_Mint
+transformationInstance [t| Karen |] [t| PinkyCatch |] [t| CureAqua |] [| CureAqua |] transformationSpeech_Aqua
+
+transformationInstance
+  [t| (Nozomi, Rin, Urara, Komachi, Karen) |]
+  [t| PinkyCatch |]
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  [| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  transformationSpeech_Yes5
+
+purificationInstance [t| CureDream |] [t| PinkyCatch |] purificationSpeech_Dream
+purificationInstance [t| CureRouge |] [t| PinkyCatch |] purificationSpeech_Rouge
+purificationInstance [t| CureLemonade |] [t| PinkyCatch |] purificationSpeech_Lemonade
+purificationInstance [t| CureMint |] [t| PinkyCatch |] purificationSpeech_Mint
+purificationInstance [t| CureAqua |] [t| PinkyCatch |] purificationSpeech_Aqua
+
+purificationInstance [t| CureDream |] [t| DreamTorch |] purificationSpeech_Dream_Crystal_Shoot
+purificationInstance [t| CureRouge |] [t| RougeTact |] purificationSpeech_Rouge_Burning
+purificationInstance [t| CureLemonade |] [t| LemonadeCastanet |] purificationSpeech_Lemonade_Shining
+purificationInstance [t| CureMint |] [t| MintLeaf |] purificationSpeech_Mint_Shield
+purificationInstance [t| CureAqua |] [t| AquaRibbon |] purificationSpeech_Aqua_Tornado
+
+purificationInstance
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  [t| (DreamTorch, RougeTact, LemonadeCastanet, MintLeaf, AquaRibbon) |]
+  purificationSpeech_Yes5
diff --git a/src/ACME/PreCure/Textbook/Yes5/Words.hs b/src/ACME/PreCure/Textbook/Yes5/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Yes5/Words.hs
@@ -0,0 +1,73 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Yes5.Words where
+
+
+groupName_Yes5 = "Yes! プリキュア 5"
+
+girlName_Nozomi  = "夢原のぞみ"
+girlName_Rin     = "夏木りん"
+girlName_Urara   = "春日野うらら"
+girlName_Komachi = "秋元こまち"
+girlName_Karen   = "水無月かれん"
+
+cureName_Dream    = "キュアドリーム"
+cureName_Rouge    = "キュアルージュ"
+cureName_Lemonade = "キュアレモネード"
+cureName_Mint     = "キュアミント"
+cureName_Aqua     = "キュアアクア"
+
+introducesHerselfAs_Dream    = "大いなる希望の力、キュアドリーム！"
+introducesHerselfAs_Rouge    = "情熱の赤い炎、キュアルージュ！"
+introducesHerselfAs_Lemonade = "はじけるレモンの香り、キュアレモネード！"
+introducesHerselfAs_Mint     = "安らぎの緑の大地、キュアミント！"
+introducesHerselfAs_Aqua     = "知性の青き泉、キュアアクア！"
+
+metamorphose = "プリキュア！メタモルフォーゼ！"
+
+-- https://www.youtube.com/watch?v=exafSi98n2g
+transformationSpeech_Dream    = [metamorphose, introducesHerselfAs_Dream]
+transformationSpeech_Rouge    = [metamorphose, introducesHerselfAs_Rouge]
+transformationSpeech_Lemonade = [metamorphose, introducesHerselfAs_Lemonade]
+transformationSpeech_Mint     = [metamorphose, introducesHerselfAs_Mint]
+transformationSpeech_Aqua     = [metamorphose, introducesHerselfAs_Aqua]
+
+-- https://www.youtube.com/watch?v=wxH7h3D31ho
+transformationSpeech_Yes5 =
+    [ metamorphose
+    , introducesHerselfAs_Dream
+    , introducesHerselfAs_Rouge
+    , introducesHerselfAs_Lemonade
+    , introducesHerselfAs_Mint
+    , introducesHerselfAs_Aqua
+    , "希望の力と未来の光！"
+    , "華麗に羽ばたく5つの心！"
+    , "Yes！プリキュア5！"
+    ]
+
+purificationSpeech_Dream_Common    = "夢見る乙女の底力、受けてみなさい！"
+purificationSpeech_Rouge_Common    = "純情乙女の炎の力、受けてみなさい！"
+purificationSpeech_Lemonade_Common = "輝く乙女のはじける力、受けてみなさい！"
+purificationSpeech_Mint_Common     = "大地を揺るがす乙女の怒り、受けてみなさい！"
+purificationSpeech_Aqua_Common     = "岩をも砕く乙女の激流、受けてみなさい！"
+
+-- https://www.youtube.com/watch?v=bypPLRhJQCk
+purificationSpeech_Dream    = [purificationSpeech_Dream_Common, "プリキュア！ドリーム・アタック！"]
+purificationSpeech_Rouge    = [purificationSpeech_Rouge_Common, "プリキュア！ルージュ・ファイヤー！"]
+purificationSpeech_Lemonade = [purificationSpeech_Lemonade_Common, "プリキュア！レモネード・フラッシュ！"]
+purificationSpeech_Mint     = [purificationSpeech_Mint_Common, "プリキュア！ミント・プロテクション！"]
+purificationSpeech_Aqua     = [purificationSpeech_Aqua_Common, "プリキュア！アクア・ストリーム！"]
+
+purificationSpeech_Dream_Crystal_Shoot = [purificationSpeech_Dream_Common, "プリキュア！クリスタル・シュート！"]
+purificationSpeech_Rouge_Burning       = [purificationSpeech_Rouge_Common, "プリキュア！ルージュ・バーニング！"]
+purificationSpeech_Lemonade_Shining    = [purificationSpeech_Lemonade_Common, "プリキュア！レモネード・シャイニング！"]
+purificationSpeech_Mint_Shield         = [purificationSpeech_Mint_Common, "プリキュア！ミント・シールド！"]
+purificationSpeech_Aqua_Tornado        = [purificationSpeech_Aqua_Common, "プリキュア！アクア・トルネード！"]
+
+-- https://www.youtube.com/watch?v=wUBVBa6PiVo
+purificationSpeech_Yes5 =
+    [ "夢と希望の力とともに！"
+    , "5つの光よ！"
+    , "今ここに！"
+    , "プリキュア！ファイブ・エクスプロージョン！"
+    ]
diff --git a/src/ACME/PreCure/Textbook/Yes5GoGo.hs b/src/ACME/PreCure/Textbook/Yes5GoGo.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Yes5GoGo.hs
@@ -0,0 +1,6 @@
+module ACME.PreCure.Textbook.Yes5GoGo
+  ( module Y
+  ) where
+
+
+import           ACME.PreCure.Textbook.Yes5GoGo.Types as Y
diff --git a/src/ACME/PreCure/Textbook/Yes5GoGo/Types.hs b/src/ACME/PreCure/Textbook/Yes5GoGo/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Yes5GoGo/Types.hs
@@ -0,0 +1,70 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Textbook.Yes5GoGo.Types where
+
+
+import           ACME.PreCure.Textbook.Yes5.Words
+import           ACME.PreCure.Textbook.Yes5.Types
+import           ACME.PreCure.Textbook.Yes5GoGo.Words
+import           ACME.PreCure.Types.TH
+
+data Kurumi = Kurumi deriving (Eq, Show)
+
+girlInstance [t| Kurumi |] girlName_Kurumi
+
+data MilkyRose = MilkyRose deriving (Eq, Show)
+
+data CureMo = CureMo deriving (Eq, Show)
+data MilkyPalette = MilkyPalette deriving (Eq, Show)
+
+data CrystalFlourez = CrystalFlourez deriving (Eq, Show)
+data FireFlourez    = FireFlourez deriving (Eq, Show)
+data ShiningFlourez = ShiningFlourez deriving (Eq, Show)
+data ProtectFlourez = ProtectFlourez deriving (Eq, Show)
+data TornadoFlourez = TornadoFlourez deriving (Eq, Show)
+data MilkyMirror    = MilkyMirror deriving (Eq, Show)
+
+transformedGroupInstanceDefault
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua, MilkyRose) |]
+  groupName_Yes5GoGo
+
+transformationInstance [t| Nozomi |] [t| CureMo |] [t| CureDream |] [| CureDream |] transformationSpeech_Dream
+transformationInstance [t| Rin |] [t| CureMo |] [t| CureRouge |] [| CureRouge |] transformationSpeech_Rouge
+transformationInstance [t| Urara |] [t| CureMo |] [t| CureLemonade |] [| CureLemonade |] transformationSpeech_Lemonade
+transformationInstance [t| Komachi |] [t| CureMo |] [t| CureMint |] [| CureMint |] transformationSpeech_Mint
+transformationInstance [t| Karen |] [t| CureMo |] [t| CureAqua |] [| CureAqua |] transformationSpeech_Aqua
+transformationInstance [t| Kurumi |] [t| MilkyPalette |] [t| MilkyRose |] [| MilkyRose |] transformationSpeech_MilkyRose
+
+transformationInstance
+  [t| (Nozomi, Rin, Urara, Komachi, Karen) |]
+  [t| CureMo |]
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  [| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  transformationSpeech_Yes5
+
+transformationInstance
+  [t| (Nozomi, Rin, Urara, Komachi, Karen, Kurumi) |]
+  [t| (CureMo, MilkyPalette) |]
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua, MilkyRose) |]
+  [| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua, MilkyRose) |]
+  transformationSpeech_Yes5GoGo
+
+-- https://www.youtube.com/watch?v=bypPLRhJQCk
+nonItemPurificationInstance [t| CureDream |] purificationSpeech_Dream_GoGo
+nonItemPurificationInstance [t| CureRouge |] purificationSpeech_Rouge_GoGo
+nonItemPurificationInstance [t| CureLemonade |] purificationSpeech_Lemonade_GoGo
+nonItemPurificationInstance [t| CureMint |] purificationSpeech_Mint_GoGo
+nonItemPurificationInstance [t| CureAqua |] purificationSpeech_Aqua_GoGo
+
+purificationInstance [t| MilkyRose |] [t| MilkyPalette |] purificationSpeech_MilkyRose
+purificationInstance [t| MilkyRose |] [t| MilkyMirror |] purificationSpeech_MilkyRose_Metal
+
+purificationInstance
+  [t| (CureDream, CureRouge, CureLemonade, CureMint, CureAqua) |]
+  [t| (CrystalFlourez, FireFlourez, ShiningFlourez, ProtectFlourez, TornadoFlourez) |]
+  purificationSpeech_Yes5GoGo
diff --git a/src/ACME/PreCure/Textbook/Yes5GoGo/Words.hs b/src/ACME/PreCure/Textbook/Yes5GoGo/Words.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/Yes5GoGo/Words.hs
@@ -0,0 +1,56 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+
+module ACME.PreCure.Textbook.Yes5GoGo.Words where
+
+import           ACME.PreCure.Textbook.Yes5.Words
+
+
+groupName_Yes5GoGo = "Yes! プリキュア 5 GoGo!"
+
+girlName_Kurumi = "美々野くるみ"
+
+cureName_MilkyRose = "ミルキィローズ"
+
+introducesHerselfAs_MilkyRose = "青いバラは秘密のしるし！ ミルキィローズ！"
+
+transformationSpeech_MilkyRose =
+  ["スカイローズ・トランスレイト！", introducesHerselfAs_MilkyRose]
+
+-- https://www.youtube.com/watch?v=cVEE_yXU0mM
+transformationSpeech_Yes5GoGo =
+  transformationSpeech_Yes5 ++ transformationSpeech_MilkyRose
+
+purificationSpeech_Dream_GoGo =
+  [purificationSpeech_Dream_Common, "プリキュア！シューティング・スター！"]
+purificationSpeech_Rouge_GoGo =
+  [purificationSpeech_Rouge_Common, "プリキュア！ファイヤー・ストライク！"]
+purificationSpeech_Lemonade_GoGo =
+  [purificationSpeech_Lemonade_Common, "プリキュア！プリズム・チェーン！"]
+purificationSpeech_Mint_GoGo =
+  [purificationSpeech_Mint_Common, "プリキュア！エメラルド・ソーサー！"]
+purificationSpeech_Aqua_GoGo =
+  [purificationSpeech_Aqua_Common, "プリキュア！サファイヤ・アロー！"]
+
+purificationSpeech_MilkyRose =
+    [ "邪悪な力を包み込む"
+    , "バラの吹雪を咲かせましょう！"
+    , "ミルキィローズ・ブリザード！"
+    ]
+
+purificationSpeech_MilkyRose_Metal =
+    [ "邪悪な力を包み込む"
+    , "煌くバラを咲かせましょう！"
+    , "ミルキィローズ・メタル・ブリザード！"
+    ]
+
+-- https://www.youtube.com/watch?v=fC2tM3jOMeE
+purificationSpeech_Yes5GoGo =
+    [ "クリスタルフルーレ！希望の光！"
+    , "ファイヤーフルーレ！情熱の光！"
+    , "プロテクトフルーレ！安らぎの光！"
+    , "トルネードフルーレ！知性の光！"
+    , "5つの光に！"
+    , "勇気をのせて！"
+    , "プリキュア！レインボー・ローズ・エクスプロージョン！"
+    , "行け！"
+    ]
diff --git a/src/ACME/PreCure/Types.hs b/src/ACME/PreCure/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Types.hs
@@ -0,0 +1,39 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeFamilies #-}
+
+module ACME.PreCure.Types where
+
+
+-- g': A girl or a group of girls
+-- i: A special item or a group of special items
+class Transformation g' i' where
+  type Style g' i'
+  transformedStyle :: g' -> i' -> Style g' i'
+  transformationSpeech :: g' -> i' -> [String]
+
+
+class Transformed t where
+  cureName :: t -> String
+  introducesHerselfAs :: t -> String
+  variation :: t -> String
+  variation _ = ""
+
+
+class TransformedGroup ts where
+  groupName :: ts -> String
+  groupVariation :: ts -> String
+  groupVariation _ = ""
+
+
+-- p': A (transformed) precure or a group of precures
+class Purification p' i' where
+  purificationSpeech :: p' -> i' -> [String]
+
+
+class NonItemPurification p' where
+  nonItemPurificationSpeech :: p' -> [String]
+
+
+-- g: A girl
+class Girl g where
+  humanName :: g -> String
diff --git a/src/ACME/PreCure/Types/TH.hs b/src/ACME/PreCure/Types/TH.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Types/TH.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module ACME.PreCure.Types.TH where
+
+
+import           ACME.PreCure.Types
+
+import           Language.Haskell.TH.Lib
+                   ( DecsQ
+                   , ExpQ
+                   , TypeQ
+                   , listE
+                   , stringE
+                   )
+
+
+girlInstance :: TypeQ -> String -> DecsQ
+girlInstance typeq humanN =
+  [d|
+    instance Girl $(typeq) where
+      humanName _ = $(stringE humanN)
+  |]
+
+
+transformedInstance :: TypeQ -> String -> String -> String -> DecsQ
+transformedInstance typeq cureN intro vari =
+  [d|
+    instance Transformed $(typeq) where
+      cureName _ = $(stringE cureN)
+      introducesHerselfAs _ = $(stringE intro)
+      variation _ = $(stringE vari)
+  |]
+
+
+transformedGroupInstance :: TypeQ -> String -> String -> DecsQ
+transformedGroupInstance typeq groupN vari =
+  [d|
+    instance TransformedGroup $(typeq) where
+      groupName _ = $(stringE groupN)
+      groupVariation _ = $(stringE vari)
+  |]
+
+
+transformedInstanceDefault :: TypeQ -> String -> String -> DecsQ
+transformedInstanceDefault typeq cureN intro =
+  [d|
+    instance Transformed $(typeq) where
+      cureName _ = $(stringE cureN)
+      introducesHerselfAs _ = $(stringE intro)
+  |]
+
+
+transformedGroupInstanceDefault :: TypeQ -> String -> DecsQ
+transformedGroupInstanceDefault typeq groupN =
+  [d|
+    instance TransformedGroup $(typeq) where
+      groupName _ = $(stringE groupN)
+  |]
+
+
+transformationInstance :: TypeQ -> TypeQ -> TypeQ -> ExpQ -> [String] -> DecsQ
+transformationInstance g' i' p' pvalue' speech =
+  [d|
+    instance Transformation $(g') $(i') where
+      type Style $(g') $(i') = $(p')
+      transformedStyle _ _ = $(pvalue')
+      transformationSpeech _ _ = $(listE $ map stringE speech)
+  |]
+
+
+purificationInstance :: TypeQ -> TypeQ -> [String] -> DecsQ
+purificationInstance p' i' speech =
+  [d|
+    instance Purification $(p') $(i') where
+      purificationSpeech _ _ = $(listE $ map stringE speech)
+  |]
+
+
+nonItemPurificationInstance :: TypeQ -> [String] -> DecsQ
+nonItemPurificationInstance p' speech =
+  [d|
+    instance NonItemPurification $(p') where
+      nonItemPurificationSpeech _ = $(listE $ map stringE speech)
+  |]
diff --git a/test/ACME/PreCureSpec.hs b/test/ACME/PreCureSpec.hs
new file mode 100644
--- /dev/null
+++ b/test/ACME/PreCureSpec.hs
@@ -0,0 +1,70 @@
+module ACME.PreCureSpec
+  ( main
+  , spec
+  ) where
+
+
+import           Test.Hspec
+
+import           ACME.PreCure
+import           ACME.PreCure.Textbook.First.Words
+
+
+main :: IO ()
+main = hspec spec
+
+
+spec :: Spec
+spec = do
+  let specialForm = (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow)
+
+  describe "transformedStyle" $ do
+    it "returns transformed precure" $ do
+      (transformedStyle (Mirai, Liko) (Mofurun LinkleStoneDia)) `shouldBe` (CureMiracle, CureMagical)
+
+    it "some precures can transform into special form" $ do
+      (transformedStyle (CureMiracle, CureMagical, CureFelice) (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite)) `shouldBe` specialForm
+
+  describe "transformationSpeech" $ do
+    it "returns group transformation speech of the pair" $ do
+      (transformationSpeech (Mirai, Liko) (Mofurun LinkleStoneDia)) `shouldBe` ["キュアップ・ラパパ！　ダイヤ！", "ミラクル・マジカル・ジュエリーレ！", "ふたりの奇跡！キュアミラクル！", "ふたりの魔法！キュアマジカル！", "魔法つかいプリキュア！！"]
+
+    it "returns group transformation speech with alexandrite" $ do
+      (transformationSpeech (CureMiracle, CureMagical, CureFelice) (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite)) `shouldBe` ["キュアップ・ラパパ！　アレキサンドライト！", "魔法つかいプリキュア！　オーバー・ザ・レインボー！"]
+
+  describe "purificationSpeech" $ do
+    it "returns purification speech" $ do
+      (purificationSpeech (CureMiracle, CureMagical) (Mofurun LinkleStoneDia, LinkleStick LinkleStoneDia)) `shouldBe` ["ダイヤ！永遠の輝きを私達の手に！", "フルフルリンクル！", "プリキュア！ダイヤモンド・エターナル！"]
+
+  describe "TransformedGroup" $ do
+    describe "CureMagical, CureMiracle, and CureFelice" $ do
+      it "are Maho Girls PreCure" $ do
+        groupName (CureMiracle, CureMagical, CureFelice) `shouldBe` "魔法つかいプリキュア！"
+
+      it "Their variation is dia style" $ do
+        groupVariation (CureMiracle, CureMagical, CureFelice) `shouldBe` "ダイヤスタイル"
+
+    describe "CureMagical, CureMiracle, and CureFelice (special form)" $ do
+      it "are Maho Girls PreCure" $ do
+        groupName specialForm `shouldBe` "魔法つかいプリキュア！"
+
+      it "Their variation is over the raibow style" $ do
+        groupVariation specialForm `shouldBe` "オーバー・ザ・レインボー"
+
+  let action = do
+        transform (Nagisa, Honoka) (CardCommune_Mepple, CardCommune_Mipple) $ \(CureBlack, CureWhite) -> do
+          purifyWithoutItem (CureBlack, CureWhite)
+          purify (CureBlack, CureWhite) RainbowBrace
+
+  describe "composeEpisode" $ do
+    it "returns accumulated lines" $ do
+      let actual = composeEpisode action
+          expected =
+              transformationSpeech_Black_White
+                ++ purificationSpeech_Black_White
+                ++ purificationSpeech_Black_White_RainbowStorm
+      actual `shouldBe` expected
+
+  describe "printEpisodeWith" $ do
+    it "prints lines by line" $ do
+      printEpisodeWith (defaultEpisodeConfig { lineIntervalMicroSec = 300 * 1000 }) action
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF hspec-discover #-}
diff --git a/typesafe-precure.cabal b/typesafe-precure.cabal
new file mode 100644
--- /dev/null
+++ b/typesafe-precure.cabal
@@ -0,0 +1,102 @@
+name:                typesafe-precure
+version:             0.1.0.0
+synopsis:            Type-safe transformations and purifications of PreCures (Japanese Battle Heroine)
+description:         See README.md for details.
+homepage:            https://github.com/igrep/typesafe-precure#readme
+license:             BSD3
+license-file:        LICENSE
+author:              Yuji Yamamoto
+maintainer:          whosekiteneverfly@gmail.com
+copyright:           2016 Yuji Yamamoto
+category:            ACME
+build-type:          Simple
+-- extra-source-files:
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  ghc-options:         -Wall
+  exposed-modules:     ACME.PreCure
+                     , ACME.PreCure.Textbook
+
+                     , ACME.PreCure.Textbook.First
+                     , ACME.PreCure.Textbook.First.Words
+                     , ACME.PreCure.Textbook.First.Types
+
+                     , ACME.PreCure.Textbook.MaxHeart
+                     , ACME.PreCure.Textbook.MaxHeart.Words
+                     , ACME.PreCure.Textbook.MaxHeart.Types
+
+                     , ACME.PreCure.Textbook.SplashStar
+                     , ACME.PreCure.Textbook.SplashStar.Words
+                     , ACME.PreCure.Textbook.SplashStar.Types
+
+                     , ACME.PreCure.Textbook.Yes5
+                     , ACME.PreCure.Textbook.Yes5.Words
+                     , ACME.PreCure.Textbook.Yes5.Types
+
+                     , ACME.PreCure.Textbook.Yes5GoGo
+                     , ACME.PreCure.Textbook.Yes5GoGo.Words
+                     , ACME.PreCure.Textbook.Yes5GoGo.Types
+
+                     , ACME.PreCure.Textbook.Fresh
+                     , ACME.PreCure.Textbook.Fresh.Words
+                     , ACME.PreCure.Textbook.Fresh.Types
+
+                     , ACME.PreCure.Textbook.HeartCatch
+                     , ACME.PreCure.Textbook.HeartCatch.Words
+                     , ACME.PreCure.Textbook.HeartCatch.Types
+
+                     , ACME.PreCure.Textbook.Suite
+                     , ACME.PreCure.Textbook.Suite.Words
+                     , ACME.PreCure.Textbook.Suite.Types
+
+                     , ACME.PreCure.Textbook.Smile
+                     , ACME.PreCure.Textbook.Smile.Words
+                     , ACME.PreCure.Textbook.Smile.Types
+
+                     , ACME.PreCure.Textbook.Dokidoki
+                     , ACME.PreCure.Textbook.Dokidoki.Words
+                     , ACME.PreCure.Textbook.Dokidoki.Types
+
+                     , ACME.PreCure.Textbook.HappinessCharge
+                     , ACME.PreCure.Textbook.HappinessCharge.Words
+                     , ACME.PreCure.Textbook.HappinessCharge.Types
+
+                     , ACME.PreCure.Textbook.GoPrincess
+                     , ACME.PreCure.Textbook.GoPrincess.Words
+                     , ACME.PreCure.Textbook.GoPrincess.Types
+
+                     , ACME.PreCure.Textbook.Movie
+                     , ACME.PreCure.Textbook.Movie.Words
+                     , ACME.PreCure.Textbook.Movie.Types
+
+                     , ACME.PreCure.Textbook.MahoGirls
+                     , ACME.PreCure.Textbook.MahoGirls.Types
+                     , ACME.PreCure.Textbook.MahoGirls.Words
+
+                     , ACME.PreCure.Types
+                     , ACME.PreCure.Monad
+  other-modules:       ACME.PreCure.Types.TH
+  build-depends:       base >= 4.7 && < 5
+                     -- TODO: specify version
+                     , monad-skeleton
+                     , dlist
+                     , template-haskell
+  default-language:    Haskell2010
+
+test-suite typesafe-precure-test
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      test
+  ghc-options:         -Wall
+  main-is:             Spec.hs
+  other-modules:       ACME.PreCureSpec
+  build-depends:       base
+                     , typesafe-precure
+                     , hspec
+  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/igrep/typesafe-precure
