diff --git a/core/src/main/assets/dm300.png b/core/src/main/assets/dm300.png
index 791b33b9f..4a6377aba 100644
Binary files a/core/src/main/assets/dm300.png and b/core/src/main/assets/dm300.png differ
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewDM300.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewDM300.java
index a347ece5e..4431be0e5 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewDM300.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/actors/mobs/NewDM300.java
@@ -454,7 +454,7 @@ public class NewDM300 extends Mob {
 		spend(3f);
 		yell(Messages.get(this, "charging"));
 		sprite.showStatus(CharSprite.POSITIVE, Messages.get(this, "invulnerable"));
-		sprite.resetColor();
+		((DM300Sprite)sprite).charge();
 		chargeAnnounced = false;
 
 		GLog.h(Messages.get(this, "charging_hint"));
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM300Sprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM300Sprite.java
index d00ea5c0a..6ef5f3634 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM300Sprite.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/DM300Sprite.java
@@ -35,6 +35,7 @@ import com.watabou.utils.Callback;
 
 public class DM300Sprite extends MobSprite {
 
+	private Animation charge;
 	private Animation slam;
 
 	private Emitter superchargeSparks;
@@ -44,25 +45,39 @@ public class DM300Sprite extends MobSprite {
 		
 		texture( Assets.DM300 );
 		
-		TextureFilm frames = new TextureFilm( texture, 22, 20 );
-		
-		idle = new Animation( 10, true );
-		idle.frames( frames, 0, 1 );
-		
-		run = new Animation( 10, true );
-		run.frames( frames, 2, 3 );
-		
+		setAnimations(false);
+	}
+
+	private void setAnimations( boolean enraged ){
+		int c = enraged ? 10 : 0;
+
+		TextureFilm frames = new TextureFilm( texture, 25, 22 );
+
+		idle = new Animation( enraged ? 15 : 10, true );
+		idle.frames( frames, c+0, c+1 );
+
+		run = new Animation( enraged ? 15 : 10, true );
+		run.frames( frames, c+0, c+2 );
+
 		attack = new Animation( 15, false );
-		attack.frames( frames, 4, 5, 6 );
+		attack.frames( frames, c+3, c+4, c+5 );
 
-		slam = attack.clone();
+		//unaffected by enrage state
 
-		zap = attack.clone();
+		if (charge == null) {
+			charge = new Animation(4, true);
+			charge.frames(frames, 0, 10);
 
-		die = new Animation( 20, false );
-		die.frames( frames, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 0, 7, 8 );
-		
-		play( idle );
+			slam = attack.clone();
+
+			zap = new Animation(15, false);
+			zap.frames(frames, 6, 7, 7, 6);
+
+			die = new Animation(20, false);
+			die.frames(frames, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10, 0, 10);
+		}
+
+		if (curAnim != charge) play(idle);
 	}
 
 	public void zap( int cell ) {
@@ -83,6 +98,10 @@ public class DM300Sprite extends MobSprite {
 		Sample.INSTANCE.play( Assets.SND_PUFF );
 	}
 
+	public void charge(){
+		play( charge );
+	}
+
 	public void slam( int cell ){
 		turnTo( ch.pos , cell );
 		play( slam );
@@ -108,10 +127,17 @@ public class DM300Sprite extends MobSprite {
 		if (anim == die && !exploded) {
 			exploded = true;
 			Sample.INSTANCE.play(Assets.SND_BLAST);
-			emitter().burst( BlastParticle.FACTORY, 25 );
+			emitter().burst( BlastParticle.FACTORY, 100 );
+			killAndErase();
 		}
 	}
 
+	@Override
+	public void place(int cell) {
+		if (parent != null) parent.bringToFront(this);
+		super.place(cell);
+	}
+
 	@Override
 	public void link(Char ch) {
 		super.link(ch);
@@ -122,7 +148,7 @@ public class DM300Sprite extends MobSprite {
 		superchargeSparks.on = false;
 
 		if (ch instanceof NewDM300 && ((NewDM300) ch).isSupercharged()){
-			tint(1, 0, 0, 0.33f);
+			setAnimations(true);
 			superchargeSparks.on = true;
 		}
 	}
@@ -133,8 +159,10 @@ public class DM300Sprite extends MobSprite {
 
 		if (superchargeSparks != null){
 			superchargeSparks.visible = visible;
-			if (ch instanceof NewDM300){
+			if (ch instanceof NewDM300
+					&& ((NewDM300) ch).isSupercharged() != superchargeSparks.on){
 				superchargeSparks.on = ((NewDM300) ch).isSupercharged();
+				setAnimations(((NewDM300) ch).isSupercharged());
 			}
 		}
 	}
@@ -155,14 +183,6 @@ public class DM300Sprite extends MobSprite {
 		}
 	}
 
-	@Override
-	public void resetColor() {
-		super.resetColor();
-		if (ch instanceof NewDM300 && ((NewDM300) ch).isSupercharged()){
-			tint(1, 0, 0, 0.33f);
-		}
-	}
-
 	@Override
 	public int blood() {
 		return 0xFFFFFF88;
diff --git a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PylonSprite.java b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PylonSprite.java
index ae91c1dde..61f7e499b 100644
--- a/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PylonSprite.java
+++ b/core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites/PylonSprite.java
@@ -64,10 +64,15 @@ public class PylonSprite extends MobSprite {
 		if (ch instanceof Pylon && ch.alignment == Char.Alignment.ENEMY){
 			activate();
 		}
-		if (parent != null) parent.bringToFront(this);
 		renderShadow = false;
 	}
 
+	@Override
+	public void place(int cell) {
+		if (parent != null) parent.bringToFront(this);
+		super.place(cell);
+	}
+
 	public void activate(){
 		idle = activeIdle.clone();
 		idle();