diff --git a/Changelog-Trunk.txt b/Changelog-Trunk.txt
index b400802464..2b3a8f42e0 100644
--- a/Changelog-Trunk.txt
+++ b/Changelog-Trunk.txt
@@ -4,6 +4,7 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2006/08/07
+	* mpeg's Ninja work [Vicious]
 	* Adjusted Battle_check_target so that alchemist summoned mobs are
 	  targetted by everyone as long as 1. The top-level master is a player and 2.
 	  the actual attacker is not a mob-type. [Skotlex]
diff --git a/db/job_db1.txt b/db/job_db1.txt
index f4a05480b8..3d3e45f905 100644
--- a/db/job_db1.txt
+++ b/db/job_db1.txt
@@ -1,7 +1,7 @@
 // Job-specific Values Database
 //
 // Structure of Database:
-// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,BareFist,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Shotgun,Gatling Gun,Grenade Launcher
+// JobID,Weight,HPFactor,HPMultiplicator,SPFactor,BareFist,Dagger,1HSword,2HSword,1HSpear,2HSpear,1HAxe,2HAxe,1HMace,2HMace(unused),Rod,Bow,Knuckle,Instrument,Whip,Book,Katar,Revolver,Rifle,Shotgun,Gatling Gun,Grenade Launcher,Fuuma Shuriken
 //
 // Novice
 0,	20000,0    ,500  ,100  ,500  ,650  ,700  ,2000 ,2000 ,2000 ,800  ,2000 ,700  ,700  ,650  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
@@ -53,8 +53,8 @@
 23,	20000,0    ,500  ,100  ,500  ,650  ,700  ,2000 ,2000 ,2000 ,800  ,2000 ,700  ,700  ,650  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
 // Gunslinger
 24,	27000,75   ,300  ,600,  400  ,2000, 2000, 2000, 2000, 2000, 2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 , 700 , 800 ,1200 ,200  ,1400 ,2000
-// Ninja
-25,	24000,110  ,500  ,400  ,400  ,500  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 500
+// Ninja // Dagger is a bit faster than Fuuma Shuriken > temp value
+25,	24000,60   ,700  ,400  ,400  ,500  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000, 550
 // Novice High
 4001,	20000,0    ,500  ,100  ,500  ,650  ,700  ,2000 ,2000 ,2000 ,800  ,2000 ,700  ,700  ,650  ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000 ,2000
 // Swordman High
diff --git a/db/job_db2.txt b/db/job_db2.txt
index 51f657b15a..d3805d144f 100644
--- a/db/job_db2.txt
+++ b/db/job_db2.txt
@@ -62,7 +62,7 @@
 // Gunslinger
 24,5,6,0,6,0,5,0,0,0,5,5,6,2,0,0,0,5,0,0,0,6,0,0,0,5,0,0,0,0,0,6,1,0,0,5,0,0,0,0,0,1,0,0,0,5,0,0,0,0,1,6,4,0,0,5,0,0,0,2,3,0,5,6,1,0,0,0,0,0,0
 // Ninja
-25,2,2,0,0,0,0,0,0,0,5,0,0,2,0,0,0,0,0,0,2,4,5,0,0,0,0,0,0,4,6,2,5,0,0,0,0,0,0,0,6,2,4,5,0,0,0,0,0,0,4,2,6,5,0,0,0,0,0,1,3,2,0,5,6,0,0,0,0,0,0
+25,2,2,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,4,2,5,0,0,0,0,0,0,4,6,2,5,0,0,0,0,0,0,0,6,2,4,5,0,0,0,0,0,0,4,2,6,5,0,0,0,0,0,1,3,2,4,5,6,0,0,0,0,0,0
 // Novice High
 4001,0,0,0,0,0,0,0,0,0,0
 // Swordman High
diff --git a/db/skill_cast_db.txt b/db/skill_cast_db.txt
index 5ad74815fd..27d99c583c 100644
--- a/db/skill_cast_db.txt
+++ b/db/skill_cast_db.txt
@@ -885,20 +885,20 @@
 525,1000,1000,0,0,0
 //-- NJ_ZENYNAGE
 526,0,5000,0,0,0
-//-- NJ_TATAMIGAESHI
-527,0,0,0,3000,3000
+//-- NJ_TATAMIGAESHI // Duration1 used for SC_TATAMIGAESHI and ground visual effect and Duration2 for "damage-can-be-done" duration
+527,0,3000,0,3000,200 // ex> Skill will only hit during 200 first ticks (concretely do only 1 hit just after being casted)
 //-- NJ_KASUMIKIRI // Delay unknown (if there is one)
 528,0,0,0,30000:60000:90000:120000:150000:180000:210000:240000:270000:300000,0
 //-- NJ_SHADOWJUMP // Delay unknown (if there is one)
 529,0,0,0,0,0
 //-- NJ_KIRIKAGE // Seems to have no delay (English Translation Project)
 530,0,0,0,0,0
-//-- NJ_UTSUSEMI // Cast and Delay unknown (temp : NJ_NEN cast time)
-531,5000:4000:3000:2000:1000,0,0,20000:30000:40000:50000:60000,0
-//-- NJ_BUNSINJYUTSU // Cast and Delay unknown (temp : random cast :p)
+//-- NJ_UTSUSEMI
+531,0,0,0,20000:30000:40000:50000:60000,0
+//-- NJ_BUNSINJYUTSU // Cast and Delay unknown (temp > random cast)
 532,4000:3500:3000:2500:2000:3000:2500:2000:1500:1000,0,0,60000:80000:100000:120000:140000:160000:180000:200000:220000:240000,0
 
-//-- NJ_KOUENKA
+//-- NJ_KOUENKA // Should there really be a delay ?
 534,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,0
 //-- NJ_KAENSIN
 535,6000:5500:5000:4500:4000:3500:3000:2500:2000:1500,1000,0,20000,0,
@@ -908,17 +908,17 @@
 537,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 //-- NJ_SUITON
 538,3300:3200:3100:3000:2900:2800:2700:2600:2500:2400,0,0,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000,15000:20000:25000:30000:35000:40000:45000:50000:55000:60000
-//-- NJ_HYOUSYOURAKU
-539,3000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000 // converted from jAthena
+//-- NJ_HYOUSYOURAKU // Cast time taken from jA (not reliable, must be checked)
+539,3000,1000:1200:1400:1600:1800:2000:2200:2400:2600:2800,0,0,10000:11000:12000:13000:14000:15000:16000:17000:18000:19000
 //-- NJ_HUUJIN
 540,700:1400:2100:2800:3500:4200:4900:5600:6300:7000,0,0,0,0
 //-- NJ_RAIGEKISAI
-541,3700:3400:3100:2800:2500,0,0,0,0 // not sure of cast but very litely to be correct (English Translation Project)
+541,3700:3400:3100:2800:2500,0,0,0,0 // Not sure of cast but very litely to be correct (English Translation Project)
 //-- NJ_KAMAITACHI
-542,3000,2000,0,0,0 // cast and delay unknown. temp values (I put the same as bakuenryu)
+542,3000,2000,0,0,0 // Cast and delay unknown > temp values taken from NJ_BAKUENRYU
 //-- NJ_NEN
 543,5000:4000:3000:2000:1000,0,0,30000:45000:60000:75000:90000,30000:45000:60000:75000:90000
-//-- NJ_ISSEN // cast and delay unknown. temp values (same as MO_EXTREMITYFIST)
+//-- NJ_ISSEN // cast and delay unknown > temp values taken from MO_EXTREMITYFIST
 544,4000:3500:3000:2500:2000:3000:2500:2000:1500:1000,0,0,0,0
 //==========================================
 
diff --git a/db/skill_db.txt b/db/skill_db.txt
index bb251f9742..298ef3549e 100644
--- a/db/skill_db.txt
+++ b/db/skill_db.txt
@@ -4,7 +4,7 @@
 // 03 hit (8- repeated hitting, 6- single-hit)
 // 04 inf (0- passive, 1- enemy, 2- place, 4- self, 16- friend, 32- trap)
 // 05 pl attributes (0- nothing, 1- water, 2- earth, 3- fire, 4- wind, 5- poison, 6- saint, 7- darkness, 8- sense, 9- immortality)
-// 06 nk (0- normal skill, 1-no damage skill, 2-splash damage skill, 3-no damage area skill)
+// 06 nk (0- normal skill, 1-no damage skill, 2-splash damage skill, 3-no damage area skill, 4-splash and split damage skill)
 // 07 splash/effect range (-1 for screen-wide)
 // 08 MaxLv
 // 09 Number of hits (when positive, damage is increased by hits, 
@@ -31,7 +31,7 @@
 8,0,6,4,0,1,0,10,1,no,0,0,0,weapon,0	//SM_ENDURE#Endure#
 9,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//MG_SRECOVERY#Increase SP Recovery#
 10,0,6,4,3,3,3,1,1,yes,0,0,0,magic,0	//MG_SIGHT#Sight#
-11,9,6,1,8,0,1,10,1,yes,0,0,0,magic,0	//MG_NAPALMBEAT#Napalm Beat#
+11,9,6,1,8,4,1,10,1,yes,0,0,0,magic,0	//MG_NAPALMBEAT#Napalm Beat#
 12,9,8,2,8,1,0,10,1,yes,0,0,0,magic,0	//MG_SAFETYWALL#Safety Wall#
 13,9,8,1,8,0,0,10,1:1:2:2:3:3:4:4:5:5,yes,0,0,0,magic,0	//MG_SOULSTRIKE#Soul Strike#
 14,9,8,1,1,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//MG_COLDBOLT#Cold Bolt#
@@ -420,7 +420,7 @@
 397,5,8,1,-1,0,0,5,5,no,0,0,0,weapon,0	//LK_SPIRALPIERCE#Spiral Pierce#
 398,4,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//LK_HEADCRUSH#Traumatic Blow#
 399,4,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//LK_JOINTBEAT#Vital Strike#
-400,9,8,1,8,0,1,5,1:2:3:4:5,yes,0,0,0,magic,0	//HW_NAPALMVULCAN#Napalm Vulcan#
+400,9,8,1,8,4,1,5,1:2:3:4:5,yes,0,0,0,magic,0	//HW_NAPALMVULCAN#Napalm Vulcan#
 401,0,6,4,0,1,0,1,1,yes,0,0,0,none,0	//CH_SOULCOLLECT#Zen#
 402,9,6,1,0,1,0,5,1,no,0,0,0,none,0	//PF_MINDBREAKER#Mind Breaker#
 403,0,0,4,0,1,0,1,1,yes,0,0,0,magic,0	//PF_MEMORIZE#Foresight#
@@ -546,9 +546,9 @@
 522,0,0,0,0,0,0,10,1,no,0,0,0,weapon,0	//NJ_TOBIDOUGU#NJ_TOBIDOUGU#
 523,9,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_SYURIKEN#NJ_SYURIKEN#
 524,9,8,1,-1,0,0,5,3,no,0,0,0,weapon,0	//NJ_KUNAI#NJ_KUNAI#
-525,9,8,1,-1,0,1,5,-1:-2:-3:-4:-5,yes,0,0,0,weapon,0	//NJ_HUUMA#NJ_HUUMA#
+525,9,8,1,-1,4,1,5,-1:-2:-3:-4:-5,yes,0,0,0,weapon,0	//NJ_HUUMA#NJ_HUUMA#
 526,9,6,1,0,0,0,10,1,no,0,0,0,misc,0	//NJ_ZENYNAGE#NJ_ZENYNAGE#
-527,0,6,4,3,0,0,5,1,no,0,0,0,weapon,3	//NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
+527,0,6,4,-1,0,0,5,1,no,0,0,0,weapon,3	//NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
 528,-1,6,1,-1,0,0,10,1,no,0,0,0,weapon,0	//NJ_KASUMIKIRI#NJ_KASUMIKIRI#
 529,7:9:11:13:15,6,2,0,1,0,5,1,no,0,0,0,none,0	//NJ_SHADOWJUMP#NJ_SHADOWJUMP#
 530,-1,6,1,-1,0,0,5,1,no,0,0,0,weapon,0	//NJ_KIRIKAGE#NJ_KIRIKAGE#
@@ -557,12 +557,12 @@
 533,0,0,0,0,0,0,10,0,no,0,0,0,none,0	//NJ_NINPOU#NJ_NINPOU#
 534,9,8,1,3,0,0,10,1:2:3:4:5:6:7:8:9:10,yes,0,0,0,magic,0	//NJ_KOUENKA#NJ_KOUENKA#
 535,0,8,4,3,0,0,10,1,yes,0,0,0,magic,0	//NJ_KAENSIN#NJ_KAENSIN#
-536,9,8,1,3,2,1,5,3,yes,0,0,0,magic,0	//NJ_BAKUENRYU#NJ_BAKUENRYU#
+536,9,8,1,3,2,2,5,3,yes,0,0,0,magic,0	//NJ_BAKUENRYU#NJ_BAKUENRYU#
 537,9,8,1,1,0,0,10,3:4:5:6:7:8:9:10:11:12,yes,0,0,0,magic,0	//NJ_HYOUSENSOU#NJ_HYOUSENSOU#
 538,9,6,2,0,1,0,10,1,yes,0,0,0,magic,0	//NJ_SUITON#NJ_SUITON#
-539,0,6,4,1,1,0,5,1,yes,0,0,0,magic,0	//NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
+539,0,6,4,1,2,3,5,1,yes,0,0,0,magic,0	//NJ_HYOUSYOURAKU#NJ_HYOUSYOURAKU#
 540,9,8,1,4,0,0,10,-1:-2:-2:-3:-3:-4:-4:-5:-5:-6,yes,0,0,0,magic,0	//NJ_HUUJIN#NJ_HUUJIN#
-541,9,6,4,4,1,0,5,1,yes,0,0,0,magic,0	//NJ_RAIGEKISAI#NJ_RAIGEKISAI#
+541,9,6,4,4,2,2:2:3:3:4,5,1,yes,0,0,0,magic,0	//NJ_RAIGEKISAI#NJ_RAIGEKISAI#
 542,5:6:7:8:9,8,1,4,0,2,5,1,yes,0,0,0,magic,0	//NJ_KAMAITACHI#NJ_KAMAITACHI#
 543,0,6,4,0,1,0,5,1,no,0,0,0,none,0	//NJ_NEN#NJ_NEN#
 544,-2,6,1,0,0,0,10,1,yes,0,0,0,weapon,0	//NJ_ISSEN#NJ_ISSEN#
diff --git a/db/skill_nocast_db.txt b/db/skill_nocast_db.txt
index afcc62b912..538933c870 100644
--- a/db/skill_nocast_db.txt
+++ b/db/skill_nocast_db.txt
@@ -55,4 +55,4 @@
 //Zone 2 - Jail
 421,64 //TK_JUMPKICK#Flying Side Kick#
 426,64 //TK_HIGHJUMP#Taekwon Jump#
-
+529,64 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
diff --git a/db/skill_tree.txt b/db/skill_tree.txt
index 1cb03dc123..b8f0661795 100644
--- a/db/skill_tree.txt
+++ b/db/skill_tree.txt
@@ -678,10 +678,10 @@
 25,525,5,522,5,524,5,0,0,0,0,0,0 //NJ_HUUMA#NJ_HUUMA#
 25,526,10,522,10,525,5,0,0,0,0,0,0 //NJ_ZENYNAGE#NJ_ZENYNAGE#
 25,527,5,0,0,0,0,0,0,0,0,0,0 //NJ_TATAMIGAESHI#NJ_TATAMIGAESHI#
-25,528,10,0,0,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
-25,529,10,0,0,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
-25,530,5,0,0,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
-25,531,5,0,0,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI#
+25,528,10,529,1,0,0,0,0,0,0,0,0 //NJ_KASUMIKIRI#NJ_KASUMIKIRI#
+25,529,10,527,1,0,0,0,0,0,0,0,0 //NJ_SHADOWJUMP#NJ_SHADOWJUMP#
+25,530,5,528,5,0,0,0,0,0,0,0,0 //NJ_KIRIKAGE#NJ_KIRIKAGE#
+25,531,5,529,5,0,0,0,0,0,0,0,0 //NJ_UTSUSEMI#NJ_UTSUSEMI#
 25,532,10,531,4,530,3,543,1,0,0,0,0 //NJ_BUNSINJYUTSU#NJ_BUNSINJYUTSU#
 25,533,10,0,0,0,0,0,0,0,0,0,0 //NJ_NINPOU#NJ_NINPOU#
 25,534,10,533,1,0,0,0,0,0,0,0,0 //NJ_KOUENKA#NJ_KOUENKA#
@@ -2174,4 +2174,4 @@
 4049,471,3,452,1,0,0,0,0,0,0,0,0	//SL_SKE#Esk#
 4049,472,3,447,1,0,0,0,0,0,0,0,0	//SL_SKA#Eska#
 4049,494,5,451,1,0,0,0,0,0,0,0,0	//SL_HIGH#Spirit of Rebirth#
-4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
\ No newline at end of file
+4049,410,1,0,0,0,0,0,0,0,0,0,0 //WE_CALLBABY#Call Baby#
diff --git a/db/skill_unit_db.txt b/db/skill_unit_db.txt
index 93c384340c..6e39ac2a22 100644
--- a/db/skill_unit_db.txt
+++ b/db/skill_unit_db.txt
@@ -87,10 +87,8 @@
 430,0x86,    ,  0, 1, 500,enemy, 0x000	//SG_STAR_WARM
 484,0xb8,    ,  2, 0,1000,enemy, 0x808	//HW_GRAVITATION
 488,0xb9,    ,  3, 0,  -1,all,   0x200	//CG_HERMODE
-527,0xba,    , -1, 0,2500,enemy, 0x000	//NJ_TATAMIGAESHI
-535,0xbd,    ,  2, 0, 100,enemy, 0x008	//NJ_KAENSIN
-541,0x86,,0,2:2:3:3:4,1000,enemy,0x000 //NJ_RAIGEKISAI
-538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x002	//NJ_SUITON
-516,0xbc,    ,  0, 3, 100,enemy, 0x000	//GS_DESPERADO
+516,0xba,    ,  0, 3, 100,enemy, 0x000	//GS_DESPERADO
 521,0xc2,    ,  0, 1,1000,enemy, 0x006	//GS_GROUNDDRIFT
-539,0x86,    ,  0, 3,1000,enemy, 0x000	//NJ_HYOUSYOURAKU
+527,0xbc,    , -1, 0,2500,enemy, 0x000	//NJ_TATAMIGAESHI
+535,0xbd,    , -1, 0, 200,enemy, 0x008	//NJ_KAENSIN
+538,0xbb,,1:1:1:2:2:2:3:3:3:4,0,-1,all,0x000	//NJ_SUITON
diff --git a/src/map/battle.c b/src/map/battle.c
index a1f0e2a90c..34ff61ad23 100644
--- a/src/map/battle.c
+++ b/src/map/battle.c
@@ -314,7 +314,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 			rand()%100 < sc->data[SC_KAUPE].val2 &&
 			(src->type == BL_PC || !skill_num))
 		{	//Kaupe only blocks all skills of players.
-			clif_skill_nodamage(bl,bl,SL_KAUPE,1,1);
+			clif_specialeffect(bl, 462, AREA);
 			if (--sc->data[SC_KAUPE].val3 <= 0) //We make it work like Safety Wall, even though it only blocks 1 time.
 				status_change_end(bl, SC_KAUPE, -1);
 			return 0;
@@ -322,7 +322,7 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 
 		if(sc->data[SC_UTSUSEMI].timer != -1 && !skill_num)
 		{
-			clif_skill_nodamage(bl,bl,NJ_UTSUSEMI,1,1);
+			clif_specialeffect(bl, 462, AREA);
 			skill_blown (src, bl, sc->data[SC_UTSUSEMI].val3);
 			if (--sc->data[SC_UTSUSEMI].val2 <= 0)
 				status_change_end(bl, SC_UTSUSEMI, -1);
@@ -331,7 +331,6 @@ int battle_calc_damage(struct block_list *src,struct block_list *bl,int damage,i
 
 		if(sc->data[SC_BUNSINJYUTSU].timer != -1 && (flag&(BF_WEAPON|BF_MISC)) )
 		{
-			clif_skill_nodamage(bl,bl,NJ_BUNSINJYUTSU,1,1);
 			if (--sc->data[SC_BUNSINJYUTSU].val2 <= 0)
 				status_change_end(bl, SC_BUNSINJYUTSU, -1);
 			return 0;
@@ -2347,8 +2346,8 @@ struct Damage battle_calc_magic_attack(
 					case NJ_KOUENKA:
 						skillratio -= 10;
 						break;
-					case NJ_HUUJIN:
-						skillratio += 50 + 50*skill_lv; // extrapolation from a vid (unsure)
+					case NJ_KAENSIN:
+						skillratio -= 40; // extrapolation from a vid (seems correct +/- 10%)
 						break;
 					case NJ_BAKUENRYU:
 						skillratio += 50*(skill_lv-1); // recorrected after calculation from vids
@@ -2361,6 +2360,9 @@ struct Damage battle_calc_magic_attack(
 					case NJ_HYOUSYOURAKU:
 						skillratio += 50*skill_lv; // recorrected after calculation from vids
 						break;
+					case NJ_HUUJIN:
+						skillratio += 50 + 50*skill_lv; // extrapolation from a vid (unsure)
+						break;
 					case NJ_RAIGEKISAI:
 						skillratio += 60 + 40*skill_lv; // idem
 						break;
diff --git a/src/map/skill.c b/src/map/skill.c
index 2cd3ff4e64..3de357f223 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1827,11 +1827,12 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 
 	if (attack_type&BF_MAGIC) {
 	 	if(sc && sc->data[SC_KAITE].timer != -1 && (dmg.damage || dmg.damage2)
-			&& !(sstatus->mode&MD_BOSS) && (sd || status_get_lv(dsrc) <= 80) 
-		) {	//Works on players or mobs with level under 80.
-			clif_skill_nodamage(bl,bl,SL_KAITE,sc->data[SC_KAITE].val1,1);
+			&& !(sstatus->mode&MD_BOSS) && (src->type == BL_PC || status_get_lv(src) <= 80) )
+		{	//Works on players or mobs with level under 80.
+			clif_specialeffect(bl, 438, AREA);
 			if (--sc->data[SC_KAITE].val2 <= 0)
 				status_change_end(bl, SC_KAITE, -1);
+			clif_skill_nodamage(bl,src,skillid,skilllv,1);
 			bl = src; //Just make the skill attack yourself @.@
 			sc = status_get_sc(bl);
 			tsd = (bl->type == BL_PC)?(TBL_PC*)bl:NULL;
@@ -2010,7 +2011,7 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 			if (ud && ud->skilltarget == bl->id)
 				dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, (lv!=0)?lv:skilllv, type);
 			else
-				dmg.dmotion = clif_skill_damage(dsrc,bl,tick,dmg.amotion,dmg.dmotion, damage, dmg.div_, skillid, -1, 5); //TODO: Check whether it's better to send -1 in skilllv or also send 0 as skillid, maybe even change this to a clif_damage packet?
+				dmg.dmotion = clif_damage(src,bl,tick,dmg.amotion,dmg.dmotion,damage,dmg.div_,8,dmg.damage2); // can't know why 8, but it works for all skills...
 			break;
 		}
 	case PA_GOSPEL: //Should look like Holy Cross [Skotlex]
@@ -2081,7 +2082,10 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 
 	//Only knockback if it's still alive, otherwise a "ghost" is left behind. [Skotlex]
 	if (dmg.blewcount > 0 && !status_isdead(bl))
-		skill_blown(dsrc,bl,dmg.blewcount);
+	{
+		if ( skillid != NJ_TATAMIGAESHI ) skill_blown(dsrc,bl,dmg.blewcount);
+		else skill_blown(src,bl,dmg.blewcount);
+	}
 	
 	//Delayed damage must be dealt after the knockback (it needs to know actual position of target)
 	if (dmg.amotion)
@@ -2824,40 +2828,39 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		break;
 
 	//Splash attack skills.
+	case AS_SPLASHER:
+		if ( (flag&1) && bl->id != skill_area_temp[1] )
+		{
+			skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, 1);
+			break;
+		}
 	case AS_GRIMTOOTH:
 	case MC_CARTREVOLUTION:	
 	case NPC_SPLASHATTACK:
-	case AC_SHOWER:	//Targetted skill implementation.
+	case AC_SHOWER:	
+	case MG_NAPALMBEAT:
+	case MG_FIREBALL:
+	case HW_NAPALMVULCAN:
+	case HT_BLITZBEAT:
+	case NJ_HUUMA:
 	case NJ_BAKUENRYU:
-		if(flag&1){
-			if(bl->id!=skill_area_temp[1]){
-				skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,
-					0x0500);				
-			}
+		if (flag & 1) {	//Invoked from map_foreachinarea, skill_area_temp[0] holds number of targets to divide damage by.
+			skill_attack(skill_get_type(skillid), src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
 		} else {
-			skill_area_temp[1]=bl->id;
+			if ( skillid == NJ_BAKUENRYU ) clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			skill_area_temp[0] = 0;
+			skill_area_temp[1] = bl->id;
+			if ( (skill_get_nk(skillid)&NK_SPLASHSPLIT) || (skillid==HT_BLITZBEAT && flag&0xf00000) ) //Warning, 0x100000 is currently BCT_NEUTRAL, so don't mix it when asking for the enemy. [Skotlex]
+				map_foreachinrange(skill_area_sub, bl, 
+					skill_get_splash(skillid, skilllv), BL_CHAR,
+					src, skillid, skilllv, tick, flag|BCT_ENEMY, skill_area_sub_count);
 			map_foreachinrange(skill_area_sub, bl,
 				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
+				src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
 				skill_castend_damage_id);
-			//Skill-attack at the end in case it has knockback. [Skotlex]
-			skill_attack(skill_get_type(skillid),src,src,bl,skillid,skilllv,tick,0);
 		}
 		break;
 
-	case AS_SPLASHER:
-		if (flag & 1) {	//Invoked from map_foreachinarea, skill_area_temp[0] holds number of targets to divide damage by.
-			if (bl->id != skill_area_temp[0])
-				skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, 1);
-		} else {
-			skill_area_temp[0] = bl->id;
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, BCT_ENEMY|1,
-				skill_castend_damage_id);
-			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, 0);
-		}
-		break;
 	case SM_MAGNUM:
 		if(flag&1)
 			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
@@ -3020,56 +3023,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 			skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, flag);
 	break;
 
-	case MG_NAPALMBEAT:
-	case MG_FIREBALL:
-		if (flag & 1) {
-			if (bl->id == skill_area_temp[1])
-				break;
-			if(skillid == MG_FIREBALL) //Store distance.	
-				skill_area_temp[0] = distance_blxy(bl, skill_area_temp[2], skill_area_temp[3]);
-			skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, skill_area_temp[0]| 0x0500);
-		} else {
-			skill_area_temp[0]=0;
-			skill_area_temp[1]=bl->id;
-			switch (skillid) {
-				case MG_NAPALMBEAT:
-					map_foreachinrange(skill_area_sub, bl,
-						skill_get_splash(skillid, skilllv),BL_CHAR,
-						src,skillid,skilllv,tick,flag|BCT_ENEMY,
-						skill_area_sub_count);
-					break;
-				case MG_FIREBALL:
-					skill_area_temp[2]=bl->x;
-					skill_area_temp[3]=bl->y;
-					break;
-			}
-			skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick, skill_area_temp[0]);
-			map_foreachinrange(skill_area_sub,bl,
-				skill_get_splash(skillid, skilllv),BL_CHAR,
-				src,skillid,skilllv,tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
-
-	case HW_NAPALMVULCAN: // Fixed By SteelViruZ
-		if (flag & 1) {
-			if (bl->id != skill_area_temp[1])
-				skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-		} else {
-			skill_area_temp[0] = 0;
-			skill_area_temp[1] = bl->id;
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY,
-				skill_area_sub_count);
-			skill_attack(BF_MAGIC, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
-
 	case SL_STIN:
 	case SL_STUN:
 	case SL_SMA:
@@ -3080,22 +3033,6 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 		}
 		skill_attack(BF_MAGIC,src,src,bl,skillid,skilllv,tick,flag);
 		break;
-		
-	case HT_BLITZBEAT:
-		if (flag & 1) {	//Invoked from map_foreachinarea, skill_area_temp[0] holds number of targets to divide damage by.
-			skill_attack(BF_MISC, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-		} else {
-			skill_area_temp[0] = 0;
-			if (flag & 0xf00000) //Warning, 0x100000 is currently BCT_NEUTRAL, so don't mix it when asking for the enemy. [Skotlex]
-				map_foreachinrange(skill_area_sub, bl, 
-					skill_get_splash(skillid, skilllv), BL_CHAR,
-					src, skillid, skilllv, tick, BCT_ENEMY, skill_area_sub_count);
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
 
 	case NPC_DARKBREATH:
 		clif_emotion(src,7);
@@ -3162,33 +3099,18 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, int
 				skill_castend_damage_id);
 		}
 		break;
-	case NJ_HUUMA:
-		if (flag & 1) {
-			skill_attack(BF_WEAPON, src, src, bl, skillid, skilllv, tick, skill_area_temp[0]);
-		} else {
-			skill_area_temp[0] = 0;
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY,
-				skill_area_sub_count);
-			map_foreachinrange(skill_area_sub, bl,
-				skill_get_splash(skillid, skilllv), BL_CHAR,
-				src, skillid, skilllv, tick, flag|BCT_ENEMY|1,
-				skill_castend_damage_id);
-		}
-		break;
+
 	case NJ_KASUMIKIRI:
 		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
 		sc_start(src,SC_HIDING,100,skilllv,skill_get_time(skillid,skilllv));
 		break;
 	case NJ_KIRIKAGE:
-		status_change_end(src, SC_HIDING, -1);
-		skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
-		if (unit_movepos(src, bl->x, bl->y, 0, 0))
-		{	//FIXME: Why are you sending a packet to LIE about where the character is?
-			//If you want to place yourself adjacent to the target, do the proper coding..?
-			int dir = unit_getdir(src);
-			clif_slide(src,src->x - dirx[dir],src->y - diry[dir]);
+		{
+			int dir = map_calc_dir(src,bl->x,bl->y);
+			status_change_end(src, SC_HIDING, -1);
+			skill_attack(BF_WEAPON,src,src,bl,skillid,skilllv,tick,flag);
+			if (unit_movepos(src, bl->x - dirx[dir], bl->y - diry[dir], 0, 0)) // fixed... sorry for this o_O
+				clif_slide(src,bl->x - dirx[dir],bl->y - diry[dir]);
 		}
 		break;
 	case NJ_ISSEN:
@@ -4065,6 +3987,9 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, in
 			skill_castend_damage_id);
 		break;
 
+	case NJ_HYOUSYOURAKU:
+	case NJ_RAIGEKISAI:
+		clif_skill_nodamage(src,bl,skillid,skilllv,1);
 	case WZ_FROSTNOVA:
 		map_foreachinrange(skill_attack_area, src,
 			skill_get_splash(skillid, skilllv), BL_CHAR,
@@ -6706,7 +6631,7 @@ struct skill_unit_group *skill_unitsetting (struct block_list *src, int skillid,
 		if (sd) val1 = sd->status.child;
 		break;
 	case NJ_KAENSIN:
-		skill_clear_group(src, 4); //Delete previous Kaensins
+		skill_clear_group(src, 1); //Delete previous Kaensins
 		val2 = (skilllv+1)/2 + 4;
 		break;
 
@@ -7231,6 +7156,17 @@ int skill_unit_onplace_timer (struct skill_unit *src, struct block_list *bl, uns
 		}
 
 		case UNT_TATAMIGAESHI:
+		{
+			struct skill_unit_group *sug; // better name needed :D
+
+			if ( (sug = map_find_skill_unit_oncell(bl,bl->x,bl->y,NJ_TATAMIGAESHI,NULL)->group) != NULL )
+			{
+				if ( DIFF_TICK(gettick(), sug->tick) <= skill_get_time2(sg->skill_id, sg->skill_lv) )
+					skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
+ 			}
+			break;
+		}
+
 		case UNT_DEMONSTRATION:
 			skill_attack(BF_WEAPON,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0);
 			break;
@@ -9207,11 +9143,8 @@ int skill_clear_group (struct block_list *bl, int flag)
 			case SA_VIOLENTGALE:
 			case SA_LANDPROTECTOR:
 			case NJ_SUITON:
-				if (flag&1)
-					group[count++]= ud->skillunit[i];
-				break;
 			case NJ_KAENSIN:
-				if (flag&4)
+				if (flag&1)
 					group[count++]= ud->skillunit[i];
 				break;
 			default:
@@ -9322,11 +9255,15 @@ int skill_landprotector (struct block_list *bl, va_list ap)
 		case SA_VOLCANO:
 		case SA_DELUGE:
 		case SA_VIOLENTGALE:
+		case NJ_SUITON:
+		case NJ_KAENSIN:
 			switch (unit->group->skill_id)
 			{	//These override each other.
 				case SA_VOLCANO:
 				case SA_DELUGE:
 				case SA_VIOLENTGALE:
+				case NJ_SUITON:
+				case NJ_KAENSIN:
 					(*alive) = 0;
 					return 1;
 			}
@@ -10856,6 +10793,15 @@ void skill_init_unit_layout (void)
 				memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
 				break;
 			}
+			case NJ_KAENSIN:
+			{
+				static const int dx[] = {-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,-2,-1, 1, 2,-2,-1, 0, 1, 2,-2,-1, 0, 1, 2,};
+				static const int dy[] = { 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0,-1,-1,-1,-1,-1,-2,-2,-2,-2,-2,};
+				skill_unit_layout[pos].count = 24;
+				memcpy(skill_unit_layout[pos].dx,dx,sizeof(dx));
+				memcpy(skill_unit_layout[pos].dy,dy,sizeof(dy));
+				break;
+			}
 			case NJ_TATAMIGAESHI:
 			{
 				//Level 1 (count 4, cross of 3x3)
diff --git a/src/map/skill.h b/src/map/skill.h
index 48e88033df..b9e082a768 100644
--- a/src/map/skill.h
+++ b/src/map/skill.h
@@ -23,7 +23,8 @@
 //Constants to identify a skill's nk value.
 //The NK value applies only to non INF_GROUND_SKILL skills.
 #define NK_NO_DAMAGE 0x1
-#define NK_SPLASH 0x2
+#define NK_SPLASH (0x2|0x4) // 0x4 = splash & split
+#define NK_SPLASHSPLIT 0x4
 //A skill with 3 would be no damage + splash: area of effect.
 //Constants to identify a skill's inf2 value.
 #define INF2_QUEST_SKILL 1
@@ -938,9 +939,9 @@ enum {
 	UNT_SPIDERWEB,
 	UNT_GRAVITATION,
 	UNT_HERMODE,
-	UNT_TATAMIGAESHI, //0xba //Temporary setting until correct value is found.
+	UNT_DESPERADO, //0xba //Temporary setting until correct value is found.
 	UNT_SUITON = 0xbb,
-	UNT_DESPERADO, //NJ_TATAMIGAESHI is 0xbc as well?
+	UNT_TATAMIGAESHI,
 	UNT_KAENSIN,
 	//0xbe, 0xc0, 0xc1 //Maybe the other elements of Ground Drift?
 	UNT_GROUNDDRIFT = 0xc2,
diff --git a/src/map/status.c b/src/map/status.c
index 5ecb9a93b7..9d8d5ac295 100644
--- a/src/map/status.c
+++ b/src/map/status.c
@@ -357,7 +357,7 @@ void initChangeTables(void) {
 	add_sc(NJ_HYOUSYOURAKU, SC_FREEZE);
 	set_sc(NJ_NEN, SC_NEN, SI_NEN, SCB_STR|SCB_INT);
 	set_sc(NJ_UTSUSEMI, SC_UTSUSEMI, SI_UTSUSEMI,SCB_NONE);
-	set_sc(NJ_BUNSINJYUTSU, SC_BUNSINJYUTSU, SI_BLANK, SCB_NONE);
+	set_sc(NJ_BUNSINJYUTSU, SC_BUNSINJYUTSU, SI_BUNSINJYUTSU, SCB_NONE);
 	set_sc(CR_SHRINK, SC_SHRINK, SI_SHRINK, SCB_NONE);
 	set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE2, SI_CLOSECONFINE2, SCB_NONE);
 	set_sc(RG_CLOSECONFINE, SC_CLOSECONFINE, SI_CLOSECONFINE, SCB_FLEE);
diff --git a/src/map/status.h b/src/map/status.h
index d35832836b..ae30b54152 100644
--- a/src/map/status.h
+++ b/src/map/status.h
@@ -395,7 +395,7 @@ enum {
 	SI_GATLINGFEVER		= 204,
 	SI_TKREST = 205, // 205 = Gloria again (but TK- Happy State looks like it)
 	SI_UTSUSEMI			= 206,
-	// 207 = crash (corresponds to SI_BUNSINJYUTSU). Must be fixed.
+	SI_BUNSINJYUTSU		= 207,
 	SI_NEN				= 208,
 	SI_ADJUSTMENT		= 209,
 	SI_ACCURACY			= 210