diff --git a/dat/outfit.xml b/dat/outfit.xml
index 83da37a..c306f39 100644
--- a/dat/outfit.xml
+++ b/dat/outfit.xml
@@ -9,6 +9,7 @@
     <specific type="1">
       <gfx>lasergreen</gfx>
 			<sound>laser</sound>
+			<spfx>ExpS</spfx>
       <delay>500</delay>
       <speed>550</speed>
       <range>300</range>
@@ -39,6 +40,7 @@
     <specific type="6">
       <gfx>missile</gfx>
 			<sound>missile</sound>
+			<spfx>ExmM</spfx>
       <duration>5</duration>
       <thrust>1200</thrust>
       <turn>200</turn>
diff --git a/gfx/spfx/expl.png b/gfx/spfx/expl.png
new file mode 100644
index 0000000..f6d2d46
Binary files /dev/null and b/gfx/spfx/expl.png differ
diff --git a/gfx/spfx/expm.png b/gfx/spfx/expm.png
new file mode 100644
index 0000000..9686080
Binary files /dev/null and b/gfx/spfx/expm.png differ
diff --git a/src/outfit.c b/src/outfit.c
index 282ed0d..386ffaf 100644
--- a/src/outfit.c
+++ b/src/outfit.c
@@ -7,6 +7,7 @@
 #include "log.h"
 #include "pack.h"
 #include "xml.h"
+#include "spfx.h"
 #include "outfit.h"
 
 #define outfit_setProp(o,p) ((o)->properties |= p)
@@ -110,6 +111,8 @@ static void outfit_parseSWeapon(Outfit* tmp, const xmlNodePtr parent) {
       snprintf(str, strlen(xml_get(node))+sizeof(OUTFIT_GFX)+4, OUTFIT_GFX"%s.png", xml_get(node));
       tmp->gfx_space = gl_newSprite(str, 6, 6);
     }
+		else if(xml_isNode(node, "spfx"))
+			tmp->spfx = spfx_get(xml_get(node));
 		else if(xml_isNode(node, "sound"))
 			tmp->sound = sound_get(xml_get(node));
     else if(xml_isNode(node, "damage")) {
@@ -167,6 +170,8 @@ static void outfit_parseSAmmo(Outfit* tmp, const xmlNodePtr parent) {
             OUTFIT_GFX"%s.png", xml_get(node));
       tmp->gfx_space = gl_newSprite(str, 6, 6);
     }
+		else if(xml_isNode(node, "spfx"))
+			tmp->spfx = spfx_get(xml_get(node));
 		else if(xml_isNode(node, "sound"))
 			tmp->sound = sound_get(xml_get(node));
     else if(xml_isNode(node, "damage")) {
diff --git a/src/outfit.h b/src/outfit.h
index 7649e36..b27233d 100644
--- a/src/outfit.h
+++ b/src/outfit.h
@@ -48,6 +48,7 @@ typedef struct Outfit_ {
 
       glTexture* gfx_space;
 			ALuint sound; // Sound to play.
+			int spfx; // Special effect on hit.
     };
     struct { // Launcher.
       //unsigned int delay; // Delay between shots.
diff --git a/src/spfx.c b/src/spfx.c
index 4478673..e8872cc 100644
--- a/src/spfx.c
+++ b/src/spfx.c
@@ -66,9 +66,20 @@ static void spfx_base_free(SPFX_Base* effect) {
 	if(effect->gfx) gl_freeTexture(effect->gfx);
 }
 
+int spfx_get(char* name) {
+	int i;
+	for(i = 0; i < spfx_neffects; i++)
+		if(strcmp(spfx_effects[i].name, name)==0)
+			return i;
+	WARN("SPFX '%s' not found!", name);
+	return 0;
+}
+
 // Load/Unload.
 int spfx_load(void) {
-	spfx_base_load("ExpS", 600, "exps.png", 6, 5);
+	spfx_base_load("ExpS", 400, "exps.png", 6, 5);
+	spfx_base_load("ExpM", 450, "expm.png", 6, 5);
+	spfx_base_load("ExpL", 500, "expl.png", 6, 5);
 	return 0;
 }
 
diff --git a/src/spfx.h b/src/spfx.h
index c8fd61f..920a556 100644
--- a/src/spfx.h
+++ b/src/spfx.h
@@ -4,10 +4,12 @@
 #define SPFX_LAYER_FRONT 	0
 #define SPFX_LAYER_BACK 	1
 
+// Stack manipulation.
+int spfx_get(char* name);
 void spfx_add(const int effect,
 			const Vec2* pos, const Vec2* vel, const int layer);
 
-// Stack manipulation functions.
+// Stack mass manipulation functions.
 void spfx_update(const double dt);
 void spfx_render(const int layer);
 void spfx_clear(void);
diff --git a/src/weapon.c b/src/weapon.c
index 7f7c568..80b1f13 100644
--- a/src/weapon.c
+++ b/src/weapon.c
@@ -239,9 +239,9 @@ static void weapon_hit(Weapon* w, Pilot* p, WeaponLayer layer) {
   // Someone should let the ai know it's been attacked.
   if(!pilot_isPlayer(p)) {
     ai_attacked(p, w->parent);
-		spfx_add(0, &w->solid->pos, &p->solid->vel, SPFX_LAYER_BACK);
+		spfx_add(w->outfit->spfx, &w->solid->pos, &p->solid->vel, SPFX_LAYER_BACK);
 	} else
-		spfx_add(0, &w->solid->pos, &p->solid->vel, SPFX_LAYER_FRONT);
+		spfx_add(w->outfit->spfx, &w->solid->pos, &p->solid->vel, SPFX_LAYER_FRONT);
   if(w->parent == PLAYER_ID)
     // Make hostile to player.
     pilot_setFlag(p, PILOT_HOSTILE);