diff --git a/engine/client/r_part.c b/engine/client/r_part.c
index 22dcb10f9..e45dcd1b5 100644
--- a/engine/client/r_part.c
+++ b/engine/client/r_part.c
@@ -153,8 +153,8 @@ typedef struct part_type_s {
 	float randscale;
 	enum {BM_MERGE, BM_ADD, BM_SUBTRACT} blendmode;
 
-	float rotationstartmin, rotationstartmax;
-	float rotationmin, rotationmax;
+	float rotationstartmin, rotationstartrand;
+	float rotationmin, rotationrand;
 
 	float scaledelta;
 	float count;
@@ -336,9 +336,9 @@ void R_ParticleEffect_f(void)
 	ptype->alphachange = 1;
 	ptype->colorindex = -1;
 	ptype->rotationstartmin = -M_PI;	//start with a random angle
-	ptype->rotationstartmax = M_PI;
+	ptype->rotationstartrand = M_PI-ptype->rotationstartmin;
 	ptype->rotationmin = 0;				//but don't spin
-	ptype->rotationmax = 0;
+	ptype->rotationrand = 0-ptype->rotationmin;
 
 	while(1)
 	{
@@ -362,19 +362,19 @@ void R_ParticleEffect_f(void)
 
 		else if (!strcmp(var, "rotationstart"))
 		{
-			ptype->rotationstartmin = atof(value);
+			ptype->rotationstartmin = atof(value)*M_PI/180;
 			if (Cmd_Argc()>2)
-				ptype->rotationstartmax = atof(Cmd_Argv(2));
+				ptype->rotationstartrand = atof(Cmd_Argv(2))*M_PI/180-ptype->rotationstartmin;
 			else
-				ptype->rotationstartmax = ptype->rotationstartmin;
+				ptype->rotationstartrand = 0;
 		}
 		else if (!strcmp(var, "rotationspeed"))
 		{
-			ptype->rotationmin = atof(value);
+			ptype->rotationmin = atof(value)*M_PI/180;
 			if (Cmd_Argc()>2)
-				ptype->rotationmax = atof(Cmd_Argv(2));
+				ptype->rotationrand = atof(Cmd_Argv(2))*M_PI/180-ptype->rotationmin;
 			else
-				ptype->rotationmax = ptype->rotationmin;
+				ptype->rotationrand = 0;
 		}
 
 		else if (!strcmp(var, "scale"))
@@ -1418,6 +1418,9 @@ int R_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
 				p->color = 0;
 				p->nextemit = particletime + ptype->emitstart - p->die;
 
+				p->rotationspeed = ptype->rotationmin + frandom()*ptype->rotationrand;
+				p->alpha = ptype->rotationstartmin + frandom()*ptype->rotationstartrand;
+
 				if (ptype->colorindex >= 0)
 				{
 					int cidx;
@@ -1489,6 +1492,9 @@ int R_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
 				p->color = 0;
 				p->nextemit = particletime + ptype->emitstart - p->die;
 
+				p->rotationspeed = ptype->rotationmin + frandom()*ptype->rotationrand;
+				p->alpha = ptype->rotationstartmin + frandom()*ptype->rotationstartrand;
+
 				if (ptype->colorindex >= 0)
 				{
 					int cidx;
@@ -1579,6 +1585,9 @@ int R_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
 				p->color = 0;
 				p->nextemit = particletime + ptype->emitstart - p->die;
 
+				p->rotationspeed = ptype->rotationmin + frandom()*ptype->rotationrand;
+				p->alpha = ptype->rotationstartmin + frandom()*ptype->rotationstartrand;
+
 				if (ptype->colorindex >= 0)
 				{
 					int cidx;
@@ -1668,6 +1677,9 @@ int R_RunParticleEffectType (vec3_t org, vec3_t dir, float count, int typenum)
 				p->color = 0;
 				p->nextemit = particletime + ptype->emitstart - p->die;
 
+				p->rotationspeed = ptype->rotationmin + frandom()*ptype->rotationrand;
+				p->alpha = ptype->rotationstartmin + frandom()*ptype->rotationstartrand;
+
 				if (ptype->colorindex >= 0)
 				{
 					int cidx;
@@ -2006,6 +2018,9 @@ float R_RocketTrail (vec3_t start, vec3_t end, int type, float lastdistance)
 		p->color = 0;
 		p->nextemit = particletime + ptype->emitstart - p->die;
 
+		p->rotationspeed = ptype->rotationmin + frandom()*ptype->rotationrand;
+		p->alpha = ptype->rotationstartmin + frandom()*ptype->rotationstartrand;
+
 		if (ptype->spawnmode == SM_TRACER)
 			tcount = (int)(len * ptype->count);