diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,9 @@
+# 0.4.0.0 (2017/10/07)
+
+- Add: More transformations and purifications of Kirakira :star: PreCure A La Mode, including Cure Parfait's and Kirakiraru Creamer's.
+- Add: Experimental feature: [cure-index.json](https://github.com/igrep/typesafe-precure/blob/master/gen/cure-index.json) and [pretty-cure-index.json](https://github.com/igrep/typesafe-precure/blob/master/gen/pretty-cure-index.json) are generated at build-time by Template Haskell.
+    - Currently, only data of Kirakira :star: A La Mode is collected.
+
 # 0.3.1.1 (2017/06/05)
 
 - Improve documentation :memo: : Add README and CHANGELOG to extra-source-files, to make README readable on hackage.org.
diff --git a/gen/cure-index.json b/gen/cure-index.json
new file mode 100644
--- /dev/null
+++ b/gen/cure-index.json
@@ -0,0 +1,1 @@
+{"girls":[{"id":"Ichika","nameEn":"Ichika Usami","nameJa":"宇佐美 いちか"},{"id":"Himari","nameEn":"Himari Arisugawa","nameJa":"有栖川 ひまり"},{"id":"Aoi","nameEn":"Aoi Tategami","nameJa":"立神 あおい"},{"id":"Yukari","nameEn":"Yukari Kotozume","nameJa":"琴爪 ゆかり"},{"id":"Akira","nameEn":"Akira Kenjo","nameJa":"剣城 あきら"},{"id":"Ciel","nameEn":"Ciel Kirahoshi","nameJa":"キラ星 シエル"}],"transformees":[{"id":"CureWhip","nameEn":"Cure Whip","nameJa":"キュアホイップ","introducesHerselfAs":"ショートケーキ！元気と笑顔を！レッツ・ラ・まぜまぜ！キュアホイップ！できあがり！","variation":""},{"id":"CureCustard","nameEn":"Cure Custard","nameJa":"キュアカスタード","introducesHerselfAs":"プリン！知性と勇気を！レッツ・ラ・まぜまぜ！キュアカスタード！できあがり！","variation":""},{"id":"CureGelato","nameEn":"Cure Gelato","nameJa":"キュアジェラート","introducesHerselfAs":"アイス！自由と情熱を！レッツ・ラ・まぜまぜ！キュアジェラート！できあがり！","variation":""},{"id":"CureMacaron","nameEn":"Cure Macaron","nameJa":"キュアマカロン","introducesHerselfAs":"マカロン！美しさとトキメキを！レッツ・ラ・まぜまぜ！キュアマカロン！できあがり！","variation":""},{"id":"CureChocolat","nameEn":"Cure Chocolat","nameJa":"キュアショコラ","introducesHerselfAs":"チョコレート！強さと愛を！レッツ・ラ・まぜまぜ！キュアショコラ！できあがり！","variation":""},{"id":"CureParfait","nameEn":"Cure Parfait","nameJa":"キュアパルフェ","introducesHerselfAs":"パフェ！夢と希望を！レッツ・ラ・まぜまぜ！キュアパルフェ！できあがり！","variation":""}],"specialItems":[{"id":"SweetsPact","nameEn":"Sweets Pact","nameJa":"スイーツパクト","attachments":["Animal Sweets"]},{"id":"RabbitShortcake","nameEn":"Rabbit Shortcake","nameJa":"うさぎショートケーキ","attachments":[]},{"id":"SquirrelPudding","nameEn":"Squirrel Pudding","nameJa":"りすプリン","attachments":[]},{"id":"LionIce","nameEn":"Lion Ice","nameJa":"らいおんアイス","attachments":[]},{"id":"CatMacaron","nameEn":"Cat Macaron","nameJa":"ねこマカロン","attachments":[]},{"id":"DogChocolate","nameEn":"Dog Chocolate","nameJa":"いぬチョコレート","attachments":[]},{"id":"PegasusParfait","nameEn":"Pegasus Parfait","nameJa":"ペガサスパフェ","attachments":[]},{"id":"CandyRod","nameEn":"Candy Rod","nameJa":"キャンディロッド","attachments":[]},{"id":"RainbowRibbon","nameEn":"Rainbow Ribbon","nameJa":"レインボーリボン","attachments":[]},{"id":"KirakiraruCreamer","nameEn":"Kirakiraru Creamer","nameJa":"キラキラルクリーマー","attachments":["Crystal Animal"]},{"id":"CrystalAnimalRabbit","nameEn":"Crystal Animal Rabbit","nameJa":"クリスタルアニマルうさぎ","attachments":[]},{"id":"CrystalAnimalSquirrel","nameEn":"Crystal Animal Squirrel","nameJa":"クリスタルアニマルりす","attachments":[]},{"id":"CrystalAnimalLion","nameEn":"Crystal Animal Lion","nameJa":"クリスタルアニマルらいおん","attachments":[]},{"id":"CrystalAnimalCat","nameEn":"Crystal Animal Cat","nameJa":"クリスタルアニマルねこ","attachments":[]},{"id":"CrystalAnimalDog","nameEn":"Crystal Animal Dog","nameJa":"クリスタルアニマルいぬ","attachments":[]},{"id":"CrystalAnimalPegasus","nameEn":"Crystal Animal Pegasus","nameJa":"クリスタルアニマルペガサス","attachments":[]}],"transformations":[{"transformers":["Ichika"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"}],"transformees":["CureWhip"],"speech":["キュアラモード・デコレーション！","ショートケーキ！","元気と笑顔を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！"]},{"transformers":["Himari"],"specialItems":[{"a":["SquirrelPudding"],"i":"SweetsPact"}],"transformees":["CureCustard"],"speech":["キュアラモード・デコレーション！","プリン！","知性と勇気を！","レッツ・ラ・まぜまぜ！","キュアカスタード！できあがり！"]},{"transformers":["Aoi"],"specialItems":[{"a":["LionIce"],"i":"SweetsPact"}],"transformees":["CureGelato"],"speech":["キュアラモード・デコレーション！","アイス！","自由と情熱を！","レッツ・ラ・まぜまぜ！","キュアジェラート！できあがり！"]},{"transformers":["Yukari"],"specialItems":[{"a":["CatMacaron"],"i":"SweetsPact"}],"transformees":["CureMacaron"],"speech":["キュアラモード・デコレーション！","マカロン！","美しさとトキメキを！","レッツ・ラ・まぜまぜ！","キュアマカロン！できあがり！"]},{"transformers":["Akira"],"specialItems":[{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureChocolat"],"speech":["キュアラモード・デコレーション！","チョコレート！","強さと愛を！","レッツ・ラ・まぜまぜ！","キュアショコラ！できあがり！"]},{"transformers":["Ciel"],"specialItems":[{"a":["PegasusParfait"],"i":"SweetsPact"}],"transformees":["CureParfait"],"speech":["キュアラモード・デコレーション！","パフェ！","夢と希望を！","レッツ・ラ・まぜまぜ！","キュアパルフェ！できあがり！"]},{"transformers":["Ichika","Himari","Aoi","Yukari","Akira"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション！","ショートケーキ！","元気と笑顔を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Ichika","Himari","Aoi","Yukari","Akira","Ciel"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"},{"a":["PegasusParfait"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat","CureParfait"],"speech":["キュアラモード・デコレーション！","ショートケーキ！","元気と笑顔を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キュアパルフェ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Himari","Ichika","Aoi","Yukari","Akira"],"specialItems":[{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureCustard","CureWhip","CureGelato","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション！","プリン！","知性と勇気を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Aoi","Ichika","Himari","Yukari","Akira"],"specialItems":[{"a":["LionIce"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureGelato","CureWhip","CureCustard","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション！","アイス！","自由と情熱を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Yukari","Ichika","Himari","Aoi","Akira"],"specialItems":[{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureMacaron","CureWhip","CureCustard","CureGelato","CureChocolat"],"speech":["キュアラモード・デコレーション！","マカロン！","美しさとトキメキを！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Akira","Ichika","Himari","Aoi","Yukari"],"specialItems":[{"a":["DogChocolate"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"}],"transformees":["CureChocolat","CureWhip","CureCustard","CureGelato","CureMacaron"],"speech":["キュアラモード・デコレーション！","チョコレート！","強さと愛を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Ciel","Ichika","Himari","Aoi","Yukari","Akira"],"specialItems":[{"a":["PegasusParfait"],"i":"SweetsPact"},{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureParfait","CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション！","パフェ！","夢と希望を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！","キュアショコラ！できあがり！","キュアパルフェ！できあがり！","キラキラ☆プリキュアアラモード！"]},{"transformers":["Ichika","Himari","Aoi"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato"],"speech":["キュアラモード・デコレーション！","ショートケーキ！","元気と笑顔を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！"]},{"transformers":["Ichika","Himari","Aoi","Yukari"],"specialItems":[{"a":["RabbitShortcake"],"i":"SweetsPact"},{"a":["SquirrelPudding"],"i":"SweetsPact"},{"a":["LionIce"],"i":"SweetsPact"},{"a":["CatMacaron"],"i":"SweetsPact"}],"transformees":["CureWhip","CureCustard","CureGelato","CureMacaron"],"speech":["キュアラモード・デコレーション！","ショートケーキ！","元気と笑顔を！","レッツ・ラ・まぜまぜ！","キュアホイップ！できあがり！","キュアカスタード！できあがり！","キュアジェラート！できあがり！","キュアマカロン！できあがり！"]},{"transformers":["Yukari","Akira"],"specialItems":[{"a":["CatMacaron"],"i":"SweetsPact"},{"a":["DogChocolate"],"i":"SweetsPact"}],"transformees":["CureMacaron","CureChocolat"],"speech":["キュアラモード・デコレーション！","マカロン！","美しさとトキメキを！","レッツ・ラ・まぜまぜ！","キュアマカロン！できあがり！","キュアショコラ！できあがり！"]}],"purifications":[{"purifier":["CureWhip"],"specialItems":["CandyRod"],"speech":["キラキラキラルン！","ホイップ・デコレーション！"]},{"purifier":["CureCustard"],"specialItems":["CandyRod"],"speech":["キラキラキラルン！","カスタード・イリュージョン！"]},{"purifier":["CureGelato"],"specialItems":["CandyRod"],"speech":["キラキラキラルン！","ジェラート・シェイク！"]},{"purifier":["CureMacaron"],"specialItems":["CandyRod"],"speech":["キラキラキラルン！","マカロン・ジュリエンヌ！","にゃーお♥"]},{"purifier":["CureChocolat"],"specialItems":["CandyRod"],"speech":["キラキラキラルン！","ショコラ・アロマーゼ！"]},{"purifier":["CureParfait"],"specialItems":["RainbowRibbon"],"speech":["レインボーリボン！","行くよ！アン・ドゥ・トレビアン！","キラクル・レインボー！","ボナペティ！"]},{"purifier":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat"],"specialItems":["CandyRod"],"speech":["キャンディーロッド！","キラキラキラル・フルチャージ！","スイー・ツー・ワンダフル・アラモード！"]},{"purifier":["CureWhip","CureCustard","CureGelato","CureMacaron","CureChocolat","CureParfait"],"specialItems":[{"a":["CrystalAnimalRabbit"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalSquirrel"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalLion"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalCat"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalDog"],"i":"KirakiraruCreamer"},{"a":["CrystalAnimalPegasus"],"i":"KirakiraruCreamer"}],"speech":["キラキラルクリーマー！","キラッと輝け！クリスタルアニマル！","ぴょーん！","くるるっ！","がぁおー！","にゃーお！","わん！","ぱたた！","プリキュア・アニマルゴーランド！"]}]}
diff --git a/gen/pretty-cure-index.json b/gen/pretty-cure-index.json
new file mode 100644
--- /dev/null
+++ b/gen/pretty-cure-index.json
@@ -0,0 +1,1034 @@
+{
+    "specialItems": [
+        {
+            "nameEn": "Sweets Pact",
+            "attachments": [
+                "Animal Sweets"
+            ],
+            "nameJa": "スイーツパクト",
+            "id": "SweetsPact"
+        },
+        {
+            "nameEn": "Rabbit Shortcake",
+            "attachments": [],
+            "nameJa": "うさぎショートケーキ",
+            "id": "RabbitShortcake"
+        },
+        {
+            "nameEn": "Squirrel Pudding",
+            "attachments": [],
+            "nameJa": "りすプリン",
+            "id": "SquirrelPudding"
+        },
+        {
+            "nameEn": "Lion Ice",
+            "attachments": [],
+            "nameJa": "らいおんアイス",
+            "id": "LionIce"
+        },
+        {
+            "nameEn": "Cat Macaron",
+            "attachments": [],
+            "nameJa": "ねこマカロン",
+            "id": "CatMacaron"
+        },
+        {
+            "nameEn": "Dog Chocolate",
+            "attachments": [],
+            "nameJa": "いぬチョコレート",
+            "id": "DogChocolate"
+        },
+        {
+            "nameEn": "Pegasus Parfait",
+            "attachments": [],
+            "nameJa": "ペガサスパフェ",
+            "id": "PegasusParfait"
+        },
+        {
+            "nameEn": "Candy Rod",
+            "attachments": [],
+            "nameJa": "キャンディロッド",
+            "id": "CandyRod"
+        },
+        {
+            "nameEn": "Rainbow Ribbon",
+            "attachments": [],
+            "nameJa": "レインボーリボン",
+            "id": "RainbowRibbon"
+        },
+        {
+            "nameEn": "Kirakiraru Creamer",
+            "attachments": [
+                "Crystal Animal"
+            ],
+            "nameJa": "キラキラルクリーマー",
+            "id": "KirakiraruCreamer"
+        },
+        {
+            "nameEn": "Crystal Animal Rabbit",
+            "attachments": [],
+            "nameJa": "クリスタルアニマルうさぎ",
+            "id": "CrystalAnimalRabbit"
+        },
+        {
+            "nameEn": "Crystal Animal Squirrel",
+            "attachments": [],
+            "nameJa": "クリスタルアニマルりす",
+            "id": "CrystalAnimalSquirrel"
+        },
+        {
+            "nameEn": "Crystal Animal Lion",
+            "attachments": [],
+            "nameJa": "クリスタルアニマルらいおん",
+            "id": "CrystalAnimalLion"
+        },
+        {
+            "nameEn": "Crystal Animal Cat",
+            "attachments": [],
+            "nameJa": "クリスタルアニマルねこ",
+            "id": "CrystalAnimalCat"
+        },
+        {
+            "nameEn": "Crystal Animal Dog",
+            "attachments": [],
+            "nameJa": "クリスタルアニマルいぬ",
+            "id": "CrystalAnimalDog"
+        },
+        {
+            "nameEn": "Crystal Animal Pegasus",
+            "attachments": [],
+            "nameJa": "クリスタルアニマルペガサス",
+            "id": "CrystalAnimalPegasus"
+        }
+    ],
+    "transformees": [
+        {
+            "nameEn": "Cure Whip",
+            "nameJa": "キュアホイップ",
+            "id": "CureWhip",
+            "introducesHerselfAs": "ショートケーキ！元気と笑顔を！レッツ・ラ・まぜまぜ！キュアホイップ！できあがり！",
+            "variation": ""
+        },
+        {
+            "nameEn": "Cure Custard",
+            "nameJa": "キュアカスタード",
+            "id": "CureCustard",
+            "introducesHerselfAs": "プリン！知性と勇気を！レッツ・ラ・まぜまぜ！キュアカスタード！できあがり！",
+            "variation": ""
+        },
+        {
+            "nameEn": "Cure Gelato",
+            "nameJa": "キュアジェラート",
+            "id": "CureGelato",
+            "introducesHerselfAs": "アイス！自由と情熱を！レッツ・ラ・まぜまぜ！キュアジェラート！できあがり！",
+            "variation": ""
+        },
+        {
+            "nameEn": "Cure Macaron",
+            "nameJa": "キュアマカロン",
+            "id": "CureMacaron",
+            "introducesHerselfAs": "マカロン！美しさとトキメキを！レッツ・ラ・まぜまぜ！キュアマカロン！できあがり！",
+            "variation": ""
+        },
+        {
+            "nameEn": "Cure Chocolat",
+            "nameJa": "キュアショコラ",
+            "id": "CureChocolat",
+            "introducesHerselfAs": "チョコレート！強さと愛を！レッツ・ラ・まぜまぜ！キュアショコラ！できあがり！",
+            "variation": ""
+        },
+        {
+            "nameEn": "Cure Parfait",
+            "nameJa": "キュアパルフェ",
+            "id": "CureParfait",
+            "introducesHerselfAs": "パフェ！夢と希望を！レッツ・ラ・まぜまぜ！キュアパルフェ！できあがり！",
+            "variation": ""
+        }
+    ],
+    "girls": [
+        {
+            "nameEn": "Ichika Usami",
+            "nameJa": "宇佐美 いちか",
+            "id": "Ichika"
+        },
+        {
+            "nameEn": "Himari Arisugawa",
+            "nameJa": "有栖川 ひまり",
+            "id": "Himari"
+        },
+        {
+            "nameEn": "Aoi Tategami",
+            "nameJa": "立神 あおい",
+            "id": "Aoi"
+        },
+        {
+            "nameEn": "Yukari Kotozume",
+            "nameJa": "琴爪 ゆかり",
+            "id": "Yukari"
+        },
+        {
+            "nameEn": "Akira Kenjo",
+            "nameJa": "剣城 あきら",
+            "id": "Akira"
+        },
+        {
+            "nameEn": "Ciel Kirahoshi",
+            "nameJa": "キラ星 シエル",
+            "id": "Ciel"
+        }
+    ],
+    "purifications": [
+        {
+            "specialItems": [
+                "CandyRod"
+            ],
+            "speech": [
+                "キラキラキラルン！",
+                "ホイップ・デコレーション！"
+            ],
+            "purifier": [
+                "CureWhip"
+            ]
+        },
+        {
+            "specialItems": [
+                "CandyRod"
+            ],
+            "speech": [
+                "キラキラキラルン！",
+                "カスタード・イリュージョン！"
+            ],
+            "purifier": [
+                "CureCustard"
+            ]
+        },
+        {
+            "specialItems": [
+                "CandyRod"
+            ],
+            "speech": [
+                "キラキラキラルン！",
+                "ジェラート・シェイク！"
+            ],
+            "purifier": [
+                "CureGelato"
+            ]
+        },
+        {
+            "specialItems": [
+                "CandyRod"
+            ],
+            "speech": [
+                "キラキラキラルン！",
+                "マカロン・ジュリエンヌ！",
+                "にゃーお♥"
+            ],
+            "purifier": [
+                "CureMacaron"
+            ]
+        },
+        {
+            "specialItems": [
+                "CandyRod"
+            ],
+            "speech": [
+                "キラキラキラルン！",
+                "ショコラ・アロマーゼ！"
+            ],
+            "purifier": [
+                "CureChocolat"
+            ]
+        },
+        {
+            "specialItems": [
+                "RainbowRibbon"
+            ],
+            "speech": [
+                "レインボーリボン！",
+                "行くよ！アン・ドゥ・トレビアン！",
+                "キラクル・レインボー！",
+                "ボナペティ！"
+            ],
+            "purifier": [
+                "CureParfait"
+            ]
+        },
+        {
+            "specialItems": [
+                "CandyRod"
+            ],
+            "speech": [
+                "キャンディーロッド！",
+                "キラキラキラル・フルチャージ！",
+                "スイー・ツー・ワンダフル・アラモード！"
+            ],
+            "purifier": [
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron",
+                "CureChocolat"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "CrystalAnimalRabbit"
+                    ],
+                    "i": "KirakiraruCreamer"
+                },
+                {
+                    "a": [
+                        "CrystalAnimalSquirrel"
+                    ],
+                    "i": "KirakiraruCreamer"
+                },
+                {
+                    "a": [
+                        "CrystalAnimalLion"
+                    ],
+                    "i": "KirakiraruCreamer"
+                },
+                {
+                    "a": [
+                        "CrystalAnimalCat"
+                    ],
+                    "i": "KirakiraruCreamer"
+                },
+                {
+                    "a": [
+                        "CrystalAnimalDog"
+                    ],
+                    "i": "KirakiraruCreamer"
+                },
+                {
+                    "a": [
+                        "CrystalAnimalPegasus"
+                    ],
+                    "i": "KirakiraruCreamer"
+                }
+            ],
+            "speech": [
+                "キラキラルクリーマー！",
+                "キラッと輝け！クリスタルアニマル！",
+                "ぴょーん！",
+                "くるるっ！",
+                "がぁおー！",
+                "にゃーお！",
+                "わん！",
+                "ぱたた！",
+                "プリキュア・アニマルゴーランド！"
+            ],
+            "purifier": [
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron",
+                "CureChocolat",
+                "CureParfait"
+            ]
+        }
+    ],
+    "transformations": [
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureWhip"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "ショートケーキ！",
+                "元気と笑顔を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！"
+            ],
+            "transformers": [
+                "Ichika"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureCustard"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "プリン！",
+                "知性と勇気を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアカスタード！できあがり！"
+            ],
+            "transformers": [
+                "Himari"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureGelato"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "アイス！",
+                "自由と情熱を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアジェラート！できあがり！"
+            ],
+            "transformers": [
+                "Aoi"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureMacaron"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "マカロン！",
+                "美しさとトキメキを！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアマカロン！できあがり！"
+            ],
+            "transformers": [
+                "Yukari"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "チョコレート！",
+                "強さと愛を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアショコラ！できあがり！"
+            ],
+            "transformers": [
+                "Akira"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "PegasusParfait"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureParfait"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "パフェ！",
+                "夢と希望を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアパルフェ！できあがり！"
+            ],
+            "transformers": [
+                "Ciel"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron",
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "ショートケーキ！",
+                "元気と笑顔を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Ichika",
+                "Himari",
+                "Aoi",
+                "Yukari",
+                "Akira"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "PegasusParfait"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron",
+                "CureChocolat",
+                "CureParfait"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "ショートケーキ！",
+                "元気と笑顔を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キュアパルフェ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Ichika",
+                "Himari",
+                "Aoi",
+                "Yukari",
+                "Akira",
+                "Ciel"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureCustard",
+                "CureWhip",
+                "CureGelato",
+                "CureMacaron",
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "プリン！",
+                "知性と勇気を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Himari",
+                "Ichika",
+                "Aoi",
+                "Yukari",
+                "Akira"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureGelato",
+                "CureWhip",
+                "CureCustard",
+                "CureMacaron",
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "アイス！",
+                "自由と情熱を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Aoi",
+                "Ichika",
+                "Himari",
+                "Yukari",
+                "Akira"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureMacaron",
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "マカロン！",
+                "美しさとトキメキを！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Yukari",
+                "Ichika",
+                "Himari",
+                "Aoi",
+                "Akira"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureChocolat",
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "チョコレート！",
+                "強さと愛を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Akira",
+                "Ichika",
+                "Himari",
+                "Aoi",
+                "Yukari"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "PegasusParfait"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureParfait",
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron",
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "パフェ！",
+                "夢と希望を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！",
+                "キュアパルフェ！できあがり！",
+                "キラキラ☆プリキュアアラモード！"
+            ],
+            "transformers": [
+                "Ciel",
+                "Ichika",
+                "Himari",
+                "Aoi",
+                "Yukari",
+                "Akira"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureWhip",
+                "CureCustard",
+                "CureGelato"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "ショートケーキ！",
+                "元気と笑顔を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！"
+            ],
+            "transformers": [
+                "Ichika",
+                "Himari",
+                "Aoi"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "RabbitShortcake"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "SquirrelPudding"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "LionIce"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureWhip",
+                "CureCustard",
+                "CureGelato",
+                "CureMacaron"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "ショートケーキ！",
+                "元気と笑顔を！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアホイップ！できあがり！",
+                "キュアカスタード！できあがり！",
+                "キュアジェラート！できあがり！",
+                "キュアマカロン！できあがり！"
+            ],
+            "transformers": [
+                "Ichika",
+                "Himari",
+                "Aoi",
+                "Yukari"
+            ]
+        },
+        {
+            "specialItems": [
+                {
+                    "a": [
+                        "CatMacaron"
+                    ],
+                    "i": "SweetsPact"
+                },
+                {
+                    "a": [
+                        "DogChocolate"
+                    ],
+                    "i": "SweetsPact"
+                }
+            ],
+            "transformees": [
+                "CureMacaron",
+                "CureChocolat"
+            ],
+            "speech": [
+                "キュアラモード・デコレーション！",
+                "マカロン！",
+                "美しさとトキメキを！",
+                "レッツ・ラ・まぜまぜ！",
+                "キュアマカロン！できあがり！",
+                "キュアショコラ！できあがり！"
+            ],
+            "transformers": [
+                "Yukari",
+                "Akira"
+            ]
+        }
+    ]
+}
diff --git a/src/ACME/PreCure/Index.hs b/src/ACME/PreCure/Index.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Index.hs
@@ -0,0 +1,63 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module ACME.PreCure.Index where
+
+
+import           Control.Monad
+                   ( forM
+                   )
+import           Data.Aeson
+                   ( encode
+                   )
+import           Data.Aeson.Encode.Pretty
+                   ( encodePretty
+                   )
+import           Data.Data
+                   ( Data
+                   )
+import qualified Data.ByteString.Lazy as ByteString
+import           Language.Haskell.TH
+                   ( Q
+                   , thisModule
+                   , runIO
+                   , tupE
+                   )
+import           Language.Haskell.TH.Syntax
+                   ( Module
+                   )
+
+import           ACME.PreCure.Textbook ()
+import           ACME.PreCure.Index.Lib
+import           ACME.PreCure.Index.Types
+
+
+writeCureIndexJson :: ()
+writeCureIndexJson =
+  $( do
+        textbookRootMod <-
+          fmap (head . filter isTextbookMod) . loadImportedModules =<< thisModule :: Q Module
+        -- ^ ACME.PreCure.Textbook
+
+        modsImportedByRoot <- loadImportedModules textbookRootMod :: Q [Module]
+
+        textbookMods <-
+            fmap (filter isTextbookMod . concat) $ mapM loadImportedModules modsImportedByRoot :: Q [Module]
+          -- ^ ACME.PreCure.Textbook.*
+
+        let collectAnnotationsFromEachSeriesModules :: Data a => Q [a]
+            collectAnnotationsFromEachSeriesModules =
+              fmap concat $ forM textbookMods $ \eachSeriesMod {- ACME.PreCure.Textbook.*.* -} ->
+                concat <$> loadAnnotations eachSeriesMod
+
+        gs <- collectAnnotationsFromEachSeriesModules
+        ts <- collectAnnotationsFromEachSeriesModules
+        is <- collectAnnotationsFromEachSeriesModules
+        trs <- collectAnnotationsFromEachSeriesModules
+        prs <- collectAnnotationsFromEachSeriesModules
+
+        let index = mkIndex gs ts is trs prs
+        runIO $ ByteString.writeFile "gen/cure-index.json" $ encode index
+        runIO $ ByteString.writeFile "gen/pretty-cure-index.json" $ encodePretty index
+        tupE []
+    )
diff --git a/src/ACME/PreCure/Index/Lib.hs b/src/ACME/PreCure/Index/Lib.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Index/Lib.hs
@@ -0,0 +1,69 @@
+module ACME.PreCure.Index.Lib
+  ( loadImportedModules
+  , isTextbookMod
+  , loadAnnotations
+  , deriveToJsonWithoutTypeNamePrefix
+  )
+where
+
+
+import           Data.Aeson.TH
+                   ( deriveToJSON
+                   )
+import qualified Data.Aeson as Json
+import           Data.Aeson.Types
+                   ( Options(fieldLabelModifier)
+                   )
+import           Data.Char
+                   ( toLower
+                   )
+import           Data.Data
+                   ( Data
+                   )
+import           Data.List
+                   ( isPrefixOf
+                   )
+import           Language.Haskell.TH
+                   ( AnnLookup(AnnLookupModule)
+                   , ModuleInfo(ModuleInfo)
+                   , Name
+                   , Dec
+                   , Q
+                   , reifyAnnotations
+                   , reifyModule
+                   , nameBase
+                   )
+import           Language.Haskell.TH.Syntax
+                   ( Module(Module)
+                   , ModName(ModName)
+                   )
+
+
+loadImportedModules :: Module -> Q [Module]
+loadImportedModules = fmap getImportedModules . reifyModule
+
+
+isTextbookMod :: Module -> Bool
+isTextbookMod = ("ACME.PreCure.Textbook" `isPrefixOf`) . getModName
+
+
+loadAnnotations ::  Data a => Module -> Q [a]
+loadAnnotations = reifyAnnotations . AnnLookupModule
+
+
+getModName :: Module -> String
+getModName (Module _ (ModName modName)) = modName
+
+
+getImportedModules :: ModuleInfo -> [Module]
+getImportedModules (ModuleInfo mods) = mods
+
+
+deriveToJsonWithoutTypeNamePrefix :: Name -> Q [Dec]
+deriveToJsonWithoutTypeNamePrefix name =
+  deriveToJSON Json.defaultOptions { fieldLabelModifier = firstLower . drop (length $ nameBase name) } name
+
+
+firstLower :: String -> String
+firstLower (x:xs) = toLower x : xs
+firstLower _ = error "firstLower: Assertion failed: empty string"
diff --git a/src/ACME/PreCure/Index/Types.hs b/src/ACME/PreCure/Index/Types.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Index/Types.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE DeriveDataTypeable #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# OPTIONS_GHC -fno-warn-unused-top-binds #-}
+
+module ACME.PreCure.Index.Types
+  ( Girl(Girl)
+  , Transformee(Transformee)
+  , SpecialItem(SpecialItem)
+  , IdAttachments(IdAttachments)
+  , Transformation(Transformation)
+  , Purification(Purification)
+  , Index
+  , mkGirl
+  , mkTransformee
+  , mkSpecialItem
+  , mkIA
+  , mkTransformation
+  , mkPurification
+  , mkIndex
+  ) where
+
+import           Data.Aeson
+                   ( ToJSON
+                   , toJSON
+                   , object
+                   , (.=)
+                   )
+import           Data.Data
+                   ( Data
+                   )
+import           Data.String
+                   ( IsString
+                   , fromString
+                   )
+
+import           ACME.PreCure.Index.Lib
+
+
+-- | Pair of the Girl data type name and their name
+data Girl =
+  Girl { girlId :: String, girlNameEn :: String, girlNameJa :: String }
+    deriving (Eq, Show, Data)
+
+$(deriveToJsonWithoutTypeNamePrefix ''Girl)
+
+mkGirl :: String -> String -> Girl
+mkGirl ne = Girl (head $ words ne) ne
+
+
+data Transformee =
+  Transformee
+    { transformedId :: String
+    , transformedNameEn :: String
+    , transformedNameJa :: String
+    , transformedIntroducesHerselfAs :: String
+    , transformedVariation :: String
+    } deriving (Eq, Show, Data)
+
+$(deriveToJsonWithoutTypeNamePrefix ''Transformee)
+
+mkTransformee :: String -> String -> String -> String -> Transformee
+mkTransformee ne = Transformee (concat $ words ne) ne
+
+
+data SpecialItem =
+  SpecialItem
+    { specialItemId :: String
+    , specialItemNameEn :: String
+    , specialItemNameJa :: String
+    , specialItemAttachments :: [String]
+    } deriving (Eq, Show, Data)
+
+$(deriveToJsonWithoutTypeNamePrefix ''SpecialItem)
+
+mkSpecialItem :: String -> String -> [String] -> SpecialItem
+mkSpecialItem ne = SpecialItem (concat $ words ne) ne
+
+
+data IdAttachments =
+  IdAttachments
+    { idAttachementsI :: String
+    , idAttachementsA :: [IdAttachments]
+    } deriving (Eq, Show, Data)
+
+instance ToJSON IdAttachments where
+  toJSON (IdAttachments i []) = toJSON i
+  toJSON (IdAttachments i a) =
+    object ["i" .= toJSON i, "a" .= toJSON a]
+
+instance IsString IdAttachments where
+  fromString s = mkIA s []
+
+
+mkIA :: String -> [IdAttachments] -> IdAttachments
+mkIA = IdAttachments
+
+
+data Transformation =
+  Transformation
+    { transformationTransformers :: [IdAttachments]
+    , transformationSpecialItems :: [IdAttachments]
+    , transformationTransformees :: [String]
+    , transformationSpeech :: [String]
+    } deriving (Eq, Show, Data)
+
+$(deriveToJsonWithoutTypeNamePrefix ''Transformation)
+
+mkTransformation :: [IdAttachments] -> [IdAttachments] -> [String] -> [String] -> Transformation
+mkTransformation = Transformation
+
+
+data Purification =
+  Purification
+    { purificationPurifier :: [IdAttachments]
+    , purificationSpecialItems :: [IdAttachments]
+    , purificationSpeech :: [String]
+    } deriving (Eq, Show, Data)
+
+$(deriveToJsonWithoutTypeNamePrefix ''Purification)
+
+mkPurification :: [IdAttachments] -> [IdAttachments] -> [String] -> Purification
+mkPurification = Purification
+
+
+data Index =
+  Index
+    { indexGirls :: [Girl]
+    , indexTransformees :: [Transformee]
+    , indexSpecialItems :: [SpecialItem]
+    , indexTransformations :: [Transformation]
+    , indexPurifications :: [Purification]
+    } deriving (Eq, Show)
+
+$(deriveToJsonWithoutTypeNamePrefix ''Index)
+
+mkIndex
+  :: [Girl]
+  -> [Transformee]
+  -> [SpecialItem]
+  -> [Transformation]
+  -> [Purification]
+  -> Index
+mkIndex = Index
diff --git a/src/ACME/PreCure/Textbook/KirakiraALaMode/Instances.hs b/src/ACME/PreCure/Textbook/KirakiraALaMode/Instances.hs
deleted file mode 100644
--- a/src/ACME/PreCure/Textbook/KirakiraALaMode/Instances.hs
+++ /dev/null
@@ -1,105 +0,0 @@
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE TypeFamilies #-}
-{-# OPTIONS_GHC -fno-warn-orphans #-}
-
-module ACME.PreCure.Textbook.KirakiraALaMode.Instances where
-
-
-import           ACME.PreCure.Types.TH
-
-import           ACME.PreCure.Textbook.KirakiraALaMode.Types
-import           ACME.PreCure.Textbook.KirakiraALaMode.Words
-
-
-transformationInstance [t| Ichika |] [t| SweetsPact RabbitShortcake |] [t| CureWhip |] [| CureWhip |] (cureALaModeDecoration : introducesHerselfAs_CureWhip)
-transformationInstance [t| Himari |] [t| SweetsPact SquirrelPudding |] [t| CureCustard |] [| CureCustard |] (cureALaModeDecoration : introducesHerselfAs_CureCustard)
-transformationInstance [t| Aoi |] [t| SweetsPact LionIce |] [t| CureGelato |] [| CureGelato |] (cureALaModeDecoration : introducesHerselfAs_CureGelato)
-transformationInstance [t| Yukari |] [t| SweetsPact CatMacaron |] [t| CureMacaron |] [| CureMacaron |] (cureALaModeDecoration : introducesHerselfAs_CureMacaron)
-transformationInstance [t| Akira |] [t| SweetsPact DogChocolate |] [t| CureChocolat |] [| CureChocolat |] (cureALaModeDecoration : introducesHerselfAs_CureChocolat)
-
-transformationInstance
-  [t| (Ichika, Himari, Aoi, Yukari, Akira) |]
-  [t| (SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact CatMacaron, SweetsPact DogChocolate) |]
-  [t| (CureWhip, CureCustard, CureGelato, CureMacaron, CureChocolat) |]
-  [| (CureWhip, CureCustard, CureGelato, CureMacaron, CureChocolat) |]
-  (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureWhip)
-
-transformationInstance
-  [t| (Himari, Ichika, Aoi, Yukari, Akira) |]
-  [t| (SweetsPact SquirrelPudding, SweetsPact RabbitShortcake, SweetsPact LionIce, SweetsPact CatMacaron, SweetsPact DogChocolate) |]
-  [t| (CureCustard, CureWhip, CureGelato, CureMacaron, CureChocolat) |]
-  [| (CureCustard, CureWhip, CureGelato, CureMacaron, CureChocolat) |]
-  (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureCustard)
-
-transformationInstance
-  [t| (Aoi, Ichika, Himari, Yukari, Akira) |]
-  [t| (SweetsPact LionIce, SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact CatMacaron, SweetsPact DogChocolate) |]
-  [t| (CureGelato, CureWhip, CureCustard, CureMacaron, CureChocolat) |]
-  [| (CureGelato, CureWhip, CureCustard, CureMacaron, CureChocolat) |]
-  (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureGelato)
-
-transformationInstance
-  [t| (Yukari, Ichika, Himari, Aoi, Akira) |]
-  [t| (SweetsPact CatMacaron, SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact DogChocolate) |]
-  [t| (CureMacaron, CureWhip, CureCustard, CureGelato, CureChocolat) |]
-  [| (CureMacaron, CureWhip, CureCustard, CureGelato, CureChocolat) |]
-  (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureMacaron)
-
-transformationInstance
-  [t| (Akira, Ichika, Himari, Aoi, Yukari) |]
-  [t| (SweetsPact DogChocolate, SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact CatMacaron) |]
-  [t| (CureChocolat, CureWhip, CureCustard, CureGelato, CureMacaron) |]
-  [| (CureChocolat, CureWhip, CureCustard, CureGelato, CureMacaron) |]
-  (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureChocolat)
-
-transformationInstance
-  [t| (Ichika, Himari, Aoi) |]
-  [t| (SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce) |]
-  [t| (CureWhip, CureCustard, CureGelato) |]
-  [| (CureWhip, CureCustard, CureGelato) |]
-  ( kirakiraALaModeTransformationSpeechOf
-      [ introducesHerselfAs_CureWhip
-      , introducesHerselfAs_CureCustard
-      , introducesHerselfAs_CureGelato
-      ]
-  )
-
-transformationInstance
-  [t| (Ichika, Himari, Aoi, Yukari) |]
-  [t| (SweetsPact RabbitShortcake, SweetsPact SquirrelPudding, SweetsPact LionIce, SweetsPact CatMacaron) |]
-  [t| (CureWhip, CureCustard, CureGelato, CureMacaron) |]
-  [| (CureWhip, CureCustard, CureGelato, CureMacaron) |]
-  ( kirakiraALaModeTransformationSpeechOf
-      [ introducesHerselfAs_CureWhip
-      , introducesHerselfAs_CureCustard
-      , introducesHerselfAs_CureGelato
-      , introducesHerselfAs_CureMacaron
-      ]
-  )
-
-transformationInstance
-  [t| (Yukari, Akira) |]
-  [t| (SweetsPact CatMacaron, SweetsPact DogChocolate) |]
-  [t| (CureMacaron, CureChocolat) |]
-  [| (CureMacaron, CureChocolat) |]
-  ( kirakiraALaModeTransformationSpeechOf
-      [ introducesHerselfAs_CureMacaron
-      , introducesHerselfAs_CureChocolat
-      ]
-  )
-
-purificationInstance [t| CureWhip |]     [t| CandyRod |] ["キラキラキラルン！", "ホイップ・デコレーション！"]
-purificationInstance [t| CureCustard |]  [t| CandyRod |] ["キラキラキラルン！", "カスタード・イリュージョン！"]
-purificationInstance [t| CureGelato |]   [t| CandyRod |] ["キラキラキラルン！", "ジェラート・シェイク！"]
-purificationInstance [t| CureMacaron |]  [t| CandyRod |] ["キラキラキラルン！", "マカロン・ジュリエンヌ！", "にゃーお♥"]
-purificationInstance [t| CureChocolat |] [t| CandyRod |] ["キラキラキラルン！", "ショコラ・アロマーゼ！"]
-
-purificationInstance
-  [t| (CureWhip, CureCustard, CureGelato, CureMacaron, CureChocolat) |]
-  [t| CandyRod |]
-  [ "キャンディーロッド！"
-  , "キラキラキラル・フルチャージ！"
-  , "スイー・ツー・ワンダフル・アラモード！"
-  ]
diff --git a/src/ACME/PreCure/Textbook/KirakiraALaMode/Profiles.hs b/src/ACME/PreCure/Textbook/KirakiraALaMode/Profiles.hs
new file mode 100644
--- /dev/null
+++ b/src/ACME/PreCure/Textbook/KirakiraALaMode/Profiles.hs
@@ -0,0 +1,203 @@
+{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
+{-# LANGUAGE OverloadedStrings #-}
+
+module ACME.PreCure.Textbook.KirakiraALaMode.Profiles where
+
+import           ACME.PreCure.Index.Types
+
+
+girls :: [Girl]
+girls =
+  [ mkGirl "Ichika Usami" "宇佐美 いちか"
+  , mkGirl "Himari Arisugawa" "有栖川 ひまり"
+  , mkGirl "Aoi Tategami" "立神 あおい"
+  , mkGirl "Yukari Kotozume" "琴爪 ゆかり"
+  , mkGirl "Akira Kenjo" "剣城 あきら"
+  , mkGirl "Ciel Kirahoshi" "キラ星 シエル" -- TODO: Synonym for Kirarin
+  ]
+
+
+transformees :: [Transformee]
+transformees =
+  [ mkTransformee "Cure Whip" "キュアホイップ" (concat introducesHerselfAs_CureWhip) ""
+  , mkTransformee "Cure Custard" "キュアカスタード" (concat introducesHerselfAs_CureCustard) ""
+  , mkTransformee "Cure Gelato" "キュアジェラート" (concat introducesHerselfAs_CureGelato) ""
+  , mkTransformee "Cure Macaron" "キュアマカロン" (concat introducesHerselfAs_CureMacaron) ""
+  , mkTransformee "Cure Chocolat" "キュアショコラ" (concat introducesHerselfAs_CureChocolat) ""
+  , mkTransformee "Cure Parfait" "キュアパルフェ" (concat introducesHerselfAs_CureParfait) ""
+  ]
+
+
+specialItems :: [SpecialItem]
+specialItems =
+  [ mkSpecialItem "Sweets Pact"        "スイーツパクト"       ["Animal Sweets"]
+  , mkSpecialItem "Rabbit Shortcake"   "うさぎショートケーキ" []
+  , mkSpecialItem "Squirrel Pudding"   "りすプリン"           []
+  , mkSpecialItem "Lion Ice"           "らいおんアイス"       []
+  , mkSpecialItem "Cat Macaron"        "ねこマカロン"         []
+  , mkSpecialItem "Dog Chocolate"      "いぬチョコレート"     []
+  , mkSpecialItem "Pegasus Parfait"    "ペガサスパフェ"       []
+  , mkSpecialItem "Candy Rod"          "キャンディロッド"     []
+  , mkSpecialItem "Rainbow Ribbon"     "レインボーリボン"     []
+  , mkSpecialItem "Kirakiraru Creamer" "キラキラルクリーマー" ["Crystal Animal"]
+  , mkSpecialItem "Crystal Animal Rabbit"   "クリスタルアニマルうさぎ"   []
+  , mkSpecialItem "Crystal Animal Squirrel" "クリスタルアニマルりす"     []
+  , mkSpecialItem "Crystal Animal Lion"     "クリスタルアニマルらいおん" []
+  , mkSpecialItem "Crystal Animal Cat"      "クリスタルアニマルねこ"     []
+  , mkSpecialItem "Crystal Animal Dog"      "クリスタルアニマルいぬ"     []
+  , mkSpecialItem "Crystal Animal Pegasus"  "クリスタルアニマルペガサス" []
+  ]
+
+
+transformations :: [Transformation]
+transformations =
+      [ mkTransformation ["Ichika"] [mkIA "SweetsPact" ["RabbitShortcake"]] ["CureWhip"]     (cureALaModeDecoration : introducesHerselfAs_CureWhip)
+      , mkTransformation ["Himari"] [mkIA "SweetsPact" ["SquirrelPudding"]] ["CureCustard"]  (cureALaModeDecoration : introducesHerselfAs_CureCustard)
+      , mkTransformation ["Aoi"]    [mkIA "SweetsPact" ["LionIce"]]         ["CureGelato"]   (cureALaModeDecoration : introducesHerselfAs_CureGelato)
+      , mkTransformation ["Yukari"] [mkIA "SweetsPact" ["CatMacaron"]]      ["CureMacaron"]  (cureALaModeDecoration : introducesHerselfAs_CureMacaron)
+      , mkTransformation ["Akira"]  [mkIA "SweetsPact" ["DogChocolate"]]    ["CureChocolat"] (cureALaModeDecoration : introducesHerselfAs_CureChocolat)
+      , mkTransformation ["Ciel"]   [mkIA "SweetsPact" ["PegasusParfait"]]  ["CureParfait"]  (cureALaModeDecoration : introducesHerselfAs_CureParfait)
+      , mkTransformation
+          ["Ichika", "Himari", "Aoi", "Yukari", "Akira"]
+          [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]
+          ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat"]
+          (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureWhip)
+      , mkTransformation
+          ["Ichika", "Himari", "Aoi", "Yukari", "Akira", "Ciel"]
+          [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"], mkIA "SweetsPact" ["PegasusParfait"]]
+          ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat", "CureParfait"]
+          (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureWhip)
+      , mkTransformation
+          ["Himari", "Ichika", "Aoi", "Yukari", "Akira"]
+          [mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]
+          ["CureCustard", "CureWhip", "CureGelato", "CureMacaron", "CureChocolat"]
+          (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureCustard)
+      , mkTransformation
+          ["Aoi", "Ichika", "Himari", "Yukari", "Akira"]
+          [mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]
+          ["CureGelato", "CureWhip", "CureCustard", "CureMacaron", "CureChocolat"]
+          (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureGelato)
+      , mkTransformation
+          ["Yukari", "Ichika", "Himari", "Aoi", "Akira"]
+          [mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["DogChocolate"]]
+          ["CureMacaron", "CureWhip", "CureCustard", "CureGelato", "CureChocolat"]
+          (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureMacaron)
+      , mkTransformation
+          ["Akira", "Ichika", "Himari", "Aoi", "Yukari"]
+          [mkIA "SweetsPact" ["DogChocolate"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"]]
+          ["CureChocolat", "CureWhip", "CureCustard", "CureGelato", "CureMacaron"]
+          (kirakiraALaModeTransformationSpeechFeaturing' introducesHerselfAs_CureChocolat)
+      , mkTransformation
+          ["Ciel", "Ichika", "Himari", "Aoi", "Yukari", "Akira"]
+          [mkIA "SweetsPact" ["PegasusParfait"], mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]
+          ["CureParfait", "CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat"]
+          (kirakiraALaModeTransformationSpeechFeaturing introducesHerselfAs_CureParfait)
+      , mkTransformation
+          ["Ichika", "Himari", "Aoi"]
+          [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"]]
+          ["CureWhip", "CureCustard", "CureGelato"]
+          ( kirakiraALaModeTransformationSpeechOf
+              [ introducesHerselfAs_CureWhip
+              , introducesHerselfAs_CureCustard
+              , introducesHerselfAs_CureGelato
+              ]
+          )
+      , mkTransformation
+          ["Ichika", "Himari", "Aoi", "Yukari"]
+          [mkIA "SweetsPact" ["RabbitShortcake"], mkIA "SweetsPact" ["SquirrelPudding"], mkIA "SweetsPact" ["LionIce"], mkIA "SweetsPact" ["CatMacaron"]]
+          ["CureWhip", "CureCustard", "CureGelato", "CureMacaron"]
+          ( kirakiraALaModeTransformationSpeechOf
+              [ introducesHerselfAs_CureWhip
+              , introducesHerselfAs_CureCustard
+              , introducesHerselfAs_CureGelato
+              , introducesHerselfAs_CureMacaron
+              ]
+          )
+      , mkTransformation
+          ["Yukari", "Akira"]
+          [mkIA "SweetsPact" ["CatMacaron"], mkIA "SweetsPact" ["DogChocolate"]]
+          ["CureMacaron", "CureChocolat"]
+          ( kirakiraALaModeTransformationSpeechOf
+              [ introducesHerselfAs_CureMacaron
+              , introducesHerselfAs_CureChocolat
+              ]
+          )
+      ]
+
+
+purifications :: [Purification]
+purifications =
+  [ mkPurification ["CureWhip"]     ["CandyRod"] ["キラキラキラルン！", "ホイップ・デコレーション！"]
+  , mkPurification ["CureCustard"]  ["CandyRod"] ["キラキラキラルン！", "カスタード・イリュージョン！"]
+  , mkPurification ["CureGelato"]   ["CandyRod"] ["キラキラキラルン！", "ジェラート・シェイク！"]
+  , mkPurification ["CureMacaron"]  ["CandyRod"] ["キラキラキラルン！", "マカロン・ジュリエンヌ！", "にゃーお♥"]
+  , mkPurification ["CureChocolat"] ["CandyRod"] ["キラキラキラルン！", "ショコラ・アロマーゼ！"]
+  -- TODO: Purification Instance of CureParfait and RainbowRibbon overlap!
+  -- , mkPurification ["CureParfait"]  ["RainbowRibbon"] ["キラキラキラリン！", "パルフェ・エトワール！"]
+  , mkPurification ["CureParfait"]  ["RainbowRibbon"] ["レインボーリボン！", "行くよ！アン・ドゥ・トレビアン！", "キラクル・レインボー！", "ボナペティ！"]
+  , mkPurification
+      ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat"]
+      ["CandyRod"]
+      ["キャンディーロッド！", "キラキラキラル・フルチャージ！", "スイー・ツー・ワンダフル・アラモード！"]
+  , mkPurification
+      ["CureWhip", "CureCustard", "CureGelato", "CureMacaron", "CureChocolat", "CureParfait"]
+      [ mkIA "KirakiraruCreamer" ["CrystalAnimalRabbit"]
+      , mkIA "KirakiraruCreamer" ["CrystalAnimalSquirrel"]
+      , mkIA "KirakiraruCreamer" ["CrystalAnimalLion"]
+      , mkIA "KirakiraruCreamer" ["CrystalAnimalCat"]
+      , mkIA "KirakiraruCreamer" ["CrystalAnimalDog"]
+      , mkIA "KirakiraruCreamer" ["CrystalAnimalPegasus"]
+      ]
+      [ "キラキラルクリーマー！"
+      , "キラッと輝け！クリスタルアニマル！"
+      , "ぴょーん！"
+      , "くるるっ！"
+      , "がぁおー！"
+      , "にゃーお！"
+      , "わん！"
+      , "ぱたた！"
+      , "プリキュア・アニマルゴーランド！"
+      ]
+  ]
+
+
+groupName_KirakiraALaMode = "キラキラ☆プリキュアアラモード"
+
+cureALaModeDecoration = "キュアラモード・デコレーション！"
+
+introducesHerselfAs_CureWhip     = ["ショートケーキ！", "元気と笑顔を！", "レッツ・ラ・まぜまぜ！", "キュアホイップ！できあがり！"]
+introducesHerselfAs_CureCustard  = ["プリン！", "知性と勇気を！", "レッツ・ラ・まぜまぜ！", "キュアカスタード！できあがり！"]
+introducesHerselfAs_CureGelato   = ["アイス！", "自由と情熱を！", "レッツ・ラ・まぜまぜ！", "キュアジェラート！できあがり！"]
+introducesHerselfAs_CureMacaron  = ["マカロン！", "美しさとトキメキを！", "レッツ・ラ・まぜまぜ！", "キュアマカロン！できあがり！"]
+introducesHerselfAs_CureChocolat = ["チョコレート！", "強さと愛を！", "レッツ・ラ・まぜまぜ！", "キュアショコラ！できあがり！"]
+introducesHerselfAs_CureParfait  = ["パフェ！", "夢と希望を！", "レッツ・ラ・まぜまぜ！", "キュアパルフェ！できあがり！"]
+
+kirakiraALaModeTransformationSpeechOf :: [[String]] -> [String]
+kirakiraALaModeTransformationSpeechOf [] = error "No transforamation speech given!"
+kirakiraALaModeTransformationSpeechOf al@(first:_) =
+  cureALaModeDecoration : init first ++ map last al
+
+kirakiraALaModeTransformationSpeechFeaturing' :: [String] -> [String]
+kirakiraALaModeTransformationSpeechFeaturing' first =
+  cureALaModeDecoration : init first ++ allDekiagari ++ [groupName_KirakiraALaMode ++ "！"]
+  where
+    allDekiagari = map last
+      [ introducesHerselfAs_CureWhip
+      , introducesHerselfAs_CureCustard
+      , introducesHerselfAs_CureGelato
+      , introducesHerselfAs_CureMacaron
+      , introducesHerselfAs_CureChocolat
+      ]
+
+kirakiraALaModeTransformationSpeechFeaturing :: [String] -> [String]
+kirakiraALaModeTransformationSpeechFeaturing first =
+  cureALaModeDecoration : init first ++ allDekiagari ++ [groupName_KirakiraALaMode ++ "！"]
+  where
+    allDekiagari = map last
+      [ introducesHerselfAs_CureWhip
+      , introducesHerselfAs_CureCustard
+      , introducesHerselfAs_CureGelato
+      , introducesHerselfAs_CureMacaron
+      , introducesHerselfAs_CureChocolat
+      , introducesHerselfAs_CureParfait
+      ]
diff --git a/src/ACME/PreCure/Textbook/KirakiraALaMode/Types.hs b/src/ACME/PreCure/Textbook/KirakiraALaMode/Types.hs
--- a/src/ACME/PreCure/Textbook/KirakiraALaMode/Types.hs
+++ b/src/ACME/PreCure/Textbook/KirakiraALaMode/Types.hs
@@ -1,30 +1,26 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# LANGUAGE TemplateHaskell #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 
 module ACME.PreCure.Textbook.KirakiraALaMode.Types where
 
 import           ACME.PreCure.Types.TH
 
-import           ACME.PreCure.Textbook.KirakiraALaMode.Words
-
+import           ACME.PreCure.Textbook.KirakiraALaMode.Profiles
 
-defineGirl "Ichika" "宇佐美 いちか"
-defineGirl "Himari" "有栖川 ひまり"
-defineGirl "Aoi" "立神 あおい"
-defineGirl "Yukari" "琴爪 ゆかり"
-defineGirl "Akira" "剣城 あきら"
+{-# ANN module girls #-}
+$(declareGirls girls)
 
-defineTransformedDefault "CureWhip" "キュアホイップ" $ concat introducesHerselfAs_CureWhip
-defineTransformedDefault "CureCustard" "キュアカスタード" $ concat introducesHerselfAs_CureCustard
-defineTransformedDefault "CureGelato" "キュアジェラート" $ concat introducesHerselfAs_CureGelato
-defineTransformedDefault "CureMacaron" "キュアマカロン" $ concat introducesHerselfAs_CureMacaron
-defineTransformedDefault "CureChocolat" "キュアショコラ" $ concat introducesHerselfAs_CureChocolat
+{-# ANN module transformees #-}
+$(declareTransformees transformees)
 
-data SweetsPact s = SweetsPact s
+{-# ANN module specialItems #-}
+$(declareSpecialItems specialItems)
 
-define "RabbitShortcake"
-define "SquirrelPudding"
-define "LionIce"
-define "CatMacaron"
-define "DogChocolate"
+{-# ANN module transformations #-}
+$(declareTransformations transformations)
 
-define "CandyRod"
+{-# ANN module purifications #-}
+$(declarePurifications purifications)
diff --git a/src/ACME/PreCure/Textbook/KirakiraALaMode/Words.hs b/src/ACME/PreCure/Textbook/KirakiraALaMode/Words.hs
deleted file mode 100644
--- a/src/ACME/PreCure/Textbook/KirakiraALaMode/Words.hs
+++ /dev/null
@@ -1,30 +0,0 @@
-{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
-
-module ACME.PreCure.Textbook.KirakiraALaMode.Words where
-
-groupName_KirakiraALaMode = "キラキラ☆プリキュアアラモード"
-
-cureALaModeDecoration = "キュアラモード・デコレーション！"
-
-introducesHerselfAs_CureWhip     = ["ショートケーキ！", "元気と笑顔を！", "レッツ・ラ・まぜまぜ！", "キュアホイップ！できあがり！"]
-introducesHerselfAs_CureCustard  = ["プリン！", "知性と勇気を！", "レッツ・ラ・まぜまぜ！", "キュアカスタード！できあがり！"]
-introducesHerselfAs_CureGelato   = ["アイス！", "自由と情熱を！", "レッツ・ラ・まぜまぜ！", "キュアジェラート！できあがり！"]
-introducesHerselfAs_CureMacaron  = ["マカロン！", "美しさとトキメキを！", "レッツ・ラ・まぜまぜ！", "キュアマカロン！できあがり！"]
-introducesHerselfAs_CureChocolat = ["チョコレート！", "強さと愛を！", "レッツ・ラ・まぜまぜ！", "キュアショコラ！できあがり！"]
-
-kirakiraALaModeTransformationSpeechOf :: [[String]] -> [String]
-kirakiraALaModeTransformationSpeechOf [] = error "No transforamation speech given!"
-kirakiraALaModeTransformationSpeechOf al@(first:_) =
-  cureALaModeDecoration : init first ++ map last al
-
-kirakiraALaModeTransformationSpeechFeaturing :: [String] -> [String]
-kirakiraALaModeTransformationSpeechFeaturing first =
-  cureALaModeDecoration : init first ++ allDekiagari ++ [groupName_KirakiraALaMode ++ "！"]
-  where
-    allDekiagari = map last
-      [ introducesHerselfAs_CureWhip
-      , introducesHerselfAs_CureCustard
-      , introducesHerselfAs_CureGelato
-      , introducesHerselfAs_CureMacaron
-      , introducesHerselfAs_CureChocolat
-      ]
diff --git a/src/ACME/PreCure/Types/TH.hs b/src/ACME/PreCure/Types/TH.hs
--- a/src/ACME/PreCure/Types/TH.hs
+++ b/src/ACME/PreCure/Types/TH.hs
@@ -1,10 +1,11 @@
 {-# LANGUAGE TemplateHaskell #-}
 
 module ACME.PreCure.Types.TH
-        ( define
-        , defineGirl
-        , defineTransformed
-        , defineTransformedDefault
+        ( declareGirls
+        , declareTransformees
+        , declareSpecialItems
+        , declareTransformations
+        , declarePurifications
 
         , girlInstance
         , transformedInstance
@@ -19,55 +20,108 @@
 
 
 import           ACME.PreCure.Types
+import qualified ACME.PreCure.Index.Types as Index
 
+import           Data.Char
+                   ( toLower
+                   )
 import           Language.Haskell.TH
                    ( Name
-                   , conT
-                   , mkName
-                   )
-import           Language.Haskell.TH.Compat.Data
-                   ( dataD'
-                   )
-import           Language.Haskell.TH.Lib
-                   ( DecsQ
                    , DecQ
+                   , DecsQ
                    , ExpQ
                    , TypeQ
+                   , Type(VarT, ConT, TupleT)
+                   , conE
+                   , conT
                    , cxt
                    , listE
+                   , mkName
                    , normalC
                    , stringE
+                   , tupE
                    )
+import           Language.Haskell.TH.Lib
+                   ( StrictTypeQ
+                   , plainTV
+                   )
+import           Language.Haskell.TH.Compat.Data
+                   ( dataD'
+                   )
+import           Language.Haskell.TH.Compat.Strict
+                   ( isStrict
+                   )
+import           TH.Utilities
+                   ( appsT
+                   )
 
-singletonDataD :: Name -> DecQ
-singletonDataD name =
-  dataD' (cxt []) name [] [normalC name []] [''Show, ''Eq]
 
+-- Add type argument names
+singletonDataD :: Name -> [Name] -> DecQ
+singletonDataD name tyVarNames =
+  dataD' (cxt []) name (map plainTV tyVarNames) [normalC name $ map toTypeVar tyVarNames] [''Show, ''Eq]
 
-define :: String -> DecsQ
-define string = (:[]) <$> singletonDataD (mkName string)
 
+defineWithTypeVars :: String -> [String] -> DecsQ
+defineWithTypeVars string strings =
+  (: []) <$> singletonDataD (mkName string) (map mkName strings)
 
+
+toTypeVar :: Name -> StrictTypeQ
+toTypeVar name = return (isStrict, VarT name)
+
+
 defineWith :: Name -> DecsQ -> DecsQ
-defineWith name decsq = (:) <$> singletonDataD name <*> decsq
+defineWith name decsq = (:) <$> singletonDataD name [] <*> decsq
 
 
-defineGirl :: String -> String -> DecsQ
-defineGirl string humanN = do
-  let name = mkName string
-  defineWith name $ girlInstance (conT name) humanN
+-- | Declare data types with their Girl instances from the type names and girl names.
+declareGirls :: [Index.Girl] -> DecsQ
+declareGirls = fmap concat . mapM d
+  where
+    d (Index.Girl n _e j) = do
+      let name = mkName n
+      defineWith name $ girlInstance (conT name) j
 
 
-defineTransformed :: String -> String -> String -> String -> DecsQ
-defineTransformed string cureN intro vari = do
-  let name = mkName string
-  defineWith name $ transformedInstance (conT name) cureN intro vari
+declareTransformees :: [Index.Transformee] -> DecsQ
+declareTransformees = fmap concat . mapM d
+  where
+    d (Index.Transformee n _e j intro vari) = do
+      let name = mkName n
+      defineWith name $ transformedInstance (conT name) j intro vari
 
 
-defineTransformedDefault :: String -> String -> String -> DecsQ
-defineTransformedDefault string cureN intro = defineTransformed string cureN intro ""
+declareSpecialItems :: [Index.SpecialItem] -> DecsQ
+declareSpecialItems = fmap concat . mapM d
+  where
+    d (Index.SpecialItem n _e _j as) = do
+      let aNames = map (firstLower . concat . words) as
+      defineWithTypeVars n aNames
 
 
+declareTransformations :: [Index.Transformation] -> DecsQ
+declareTransformations = fmap concat . mapM d
+  where
+    d (Index.Transformation tas ias ds s) = do
+      transformationInstance
+        (tupleTFromIdAttachments tas)
+        (tupleTFromIdAttachments ias)
+        (tupleT $ map mkName ds)
+        (tupleE $ map mkName ds)
+        s
+
+
+declarePurifications :: [Index.Purification] -> DecsQ
+declarePurifications = fmap concat . mapM d
+  where
+    d (Index.Purification pas ias s) = do
+      purificationInstance
+        (tupleTFromIdAttachments pas)
+        (tupleTFromIdAttachments ias)
+        s
+
+
 girlInstance :: TypeQ -> String -> DecsQ
 girlInstance typeq humanN =
   [d|
@@ -136,3 +190,27 @@
     instance NonItemPurification $(p') where
       nonItemPurificationSpeech _ = $(listE $ map stringE speech)
   |]
+
+
+tupleTFromIdAttachments :: [Index.IdAttachments] -> TypeQ
+tupleTFromIdAttachments = tupleTBy toAppT
+  where
+    toAppT :: Index.IdAttachments -> Type
+    toAppT (Index.IdAttachments i ias) = appsT (ConT $ mkName i) $ map toAppT ias
+
+
+tupleT :: [Name] -> TypeQ
+tupleT ns = tupleTBy ConT ns
+
+
+tupleTBy :: (a -> Type) -> [a] -> TypeQ
+tupleTBy f ns = return $ appsT (TupleT (length ns)) (map f ns)
+
+
+tupleE :: [Name] -> ExpQ
+tupleE = tupE . map conE
+
+
+firstLower :: String -> String
+firstLower (x:xs) = toLower x : xs
+firstLower _ = error "firstLower: Assertion failed: empty string"
diff --git a/typesafe-precure.cabal b/typesafe-precure.cabal
--- a/typesafe-precure.cabal
+++ b/typesafe-precure.cabal
@@ -1,17 +1,19 @@
-name:                typesafe-precure
-version:             0.3.1.1
-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:           2017 Yuji Yamamoto
-category:            ACME
-build-type:          Simple
-extra-source-files:  README.md CHANGELOG.md
-cabal-version:       >=1.10
+name:                 typesafe-precure
+version:              0.4.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:            2017 Yuji Yamamoto
+category:             ACME
+build-type:           Simple
+extra-source-files:   README.md
+                      CHANGELOG.md
+                      gen/*.json
+cabal-version:        >=1.10
 
 library
   hs-source-dirs:      src
@@ -77,19 +79,28 @@
 
                      , ACME.PreCure.Textbook.KirakiraALaMode
 
+                     , ACME.PreCure.Index
+                     , ACME.PreCure.Index.Types
+
                      , ACME.PreCure.Types
                      , ACME.PreCure.Monad
   other-modules:       ACME.PreCure.Types.TH
-                     , ACME.PreCure.Textbook.KirakiraALaMode.Instances
+                     , ACME.PreCure.Index.Lib
                      , ACME.PreCure.Textbook.KirakiraALaMode.Types
-                     , ACME.PreCure.Textbook.KirakiraALaMode.Words
+                     , ACME.PreCure.Textbook.KirakiraALaMode.Profiles
   build-depends:       base >= 4.7 && < 5
                      -- TODO: specify version
+                     , aeson
+                     , aeson-pretty
                      , autoexporter
+                     , bytestring
                      , monad-skeleton
                      , dlist
                      , template-haskell
+                     , text
                      , th-data-compat
+                     , th-strict-compat
+                     , th-utilities
   default-language:    Haskell2010
 
 test-suite typesafe-precure-test
