diff --git a/dlls/gravgun.cpp b/dlls/gravgun.cpp
index c9f7f2e3..5ad28f51 100644
--- a/dlls/gravgun.cpp
+++ b/dlls/gravgun.cpp
@@ -49,7 +49,7 @@ public:
 	int iItemSlot(void) { return 4; }
 	int GetItemInfo(ItemInfo *p);
 	int AddToPlayer(CBasePlayer *pPlayer);
-	bool m_bHold = false;
+	int m_iStage = 0;
 	BOOL Deploy(void);
 	void Holster(int skiplocal = 0);
 	int m_iGrabFailures = 0;
@@ -66,7 +66,7 @@ public:
 	void WeaponIdle(void);
 	void Pull(CBaseEntity* ent, float force);
 	void GravAnim(int iAnim, int skiplocal, int body);
-	float mytime = gpGlobals->time;
+	float m_flNextGravgunAttack = gpGlobals->time;
 	float m_flAmmoUseTime;// since we use < 1 point of ammo per update, we subtract ammo on a timer.
 
 
@@ -163,8 +163,8 @@ void CGrav::Holster(int skiplocal /* = 0 */)
 	if (m_AimentEntity) { m_AimentEntity->pev->velocity = Vector(0, 0, 0); }
 	m_AimentEntity = NULL;
 	EndAttack();
-	m_bHold = false;
-	mytime = gpGlobals->time + 0.5;
+	m_iStage = 0;
+	m_flNextGravgunAttack = gpGlobals->time + 0.5;
 	m_pPlayer->m_flNextAttack = gpGlobals->time + 0.5;
 	GravAnim(GAUSS_HOLSTER,0,0);
 	SetThink(NULL);
@@ -202,6 +202,7 @@ void CGrav::Attack(void)
 {
 	if (m_AimentEntity) { m_AimentEntity = NULL; }
 	pev->nextthink = gpGlobals->time + 1.1;
+	m_flNextGravgunAttack - gpGlobals->time + 0.5;
 
 	UTIL_MakeVectors(m_pPlayer->pev->v_angle + m_pPlayer->pev->punchangle);
 	Vector vecAiming = gpGlobals->v_forward;
@@ -219,7 +220,7 @@ void CGrav::Attack(void)
 		m_flTimeWeaponIdle = gpGlobals->time + 0.04;
 		pev->fuser1 = gpGlobals->time + 0.1;
 		
-		m_bHold = false;
+		m_iStage = 0;
 		m_fireState = FIRE_CHARGE;
 	}
 	break;
@@ -241,7 +242,7 @@ void CGrav::Attack(void)
 		crosent = FindEntityForward4(m_pPlayer, 1000);
 		int oc = 0;
 		if (crosent) {
-			mytime = gpGlobals->time + 0.8;
+			m_flNextGravgunAttack = gpGlobals->time + 0.8;
 			oc = crosent->ObjectCaps();
 
 			int propc = (CBaseEntity::ObjectCaps() & ~FCAP_ACROSS_TRANSITION) | FCAP_IMPULSE_USE | FCAP_CONTINUOUS_USE;
@@ -269,9 +270,9 @@ void CGrav::Attack(void)
 				EMIT_SOUND_DYN(ENT(pev), CHAN_VOICE, GRAV_SOUND_FAILRUN, 0.6, ATTN_NORM, 0, 70 + RANDOM_LONG(0, 34));
 			}
 		}
-		if (gpGlobals->time >= mytime)
+		if (gpGlobals->time >= m_flNextGravgunAttack)
 		{
-			mytime = gpGlobals->time + 0.7;
+			m_flNextGravgunAttack = gpGlobals->time + 0.7;
 			EndAttack();
 		}
 		if (m_fireMode = FIRE_NARROW) { EndAttack(); }
@@ -279,7 +280,7 @@ void CGrav::Attack(void)
 
 	}
 	
-		mytime = gpGlobals->time + 0.5;
+		m_flNextGravgunAttack = gpGlobals->time + 0.5;
 	
 	break;
 	}
@@ -425,7 +426,7 @@ void CGrav::GrabThink()
 
 	if (( m_iGrabFailures < 50 )&& m_AimentEntity && !m_AimentEntity->pev->deadflag)
 	{
-			if( ( m_AimentEntity->pev->origin - m_pPlayer->pev->origin).Length() > 250 )
+			if( ( m_AimentEntity->pev->origin - m_pPlayer->pev->origin).Length() > 150 )
 				m_iGrabFailures++;
 			else
 				m_iGrabFailures = 0;
@@ -446,7 +447,7 @@ void CGrav::GrabThink()
 			m_AimentEntity = NULL;
 		}
 		EndAttack();
-		m_bHold = false;
+		m_iStage = 0;
 	}
 
 
@@ -461,16 +462,31 @@ void CGrav::Pull(CBaseEntity* ent,float force){
 
 	Vector target = m_pPlayer->pev->origin + gpGlobals->v_forward * 75;
 	target.z += 32;
-	if ((target - VecBModelOrigin(ent->pev)).Length()>60){
+	if ((target - VecBModelOrigin(ent->pev)).Length() > 60){
 		target = m_pPlayer->pev->origin + gpGlobals->v_forward * 110 ;
 
 		target.z += 60;
 		
 
-		ALERT(at_console, "%s 1 : %f\n", STRING(ent->pev->classname), ((target - VecBModelOrigin(ent->pev)).Length()));
+		ALERT(at_console, "%s 1 %d : %f\n", STRING(ent->pev->classname), m_iStage, ((target - VecBModelOrigin(ent->pev)).Length()));
+
 	
-		ent->pev->velocity = (target - VecBModelOrigin(ent->pev)).Normalize()*300;
-		pev->velocity.z += 20;
+		if( !m_iStage )
+		{
+			ent->pev->velocity = (target - VecBModelOrigin( ent->pev )).Normalize()*300;
+			pev->velocity.z += 10;
+			if( (target - VecBModelOrigin( ent->pev )).Length() < 150 )
+			{
+				m_iStage = 1;
+				SetThink( &CGrav::GrabThink );
+				pev->nextthink = gpGlobals->time + 0.001;
+			}
+		}
+		else
+		{
+			ent->pev->velocity = (target - VecBModelOrigin(ent->pev)).Normalize()*550;
+			pev->velocity.z += 15;
+		}
 		ent->pev->velocity = ent->pev->velocity + m_pPlayer->pev->velocity;
 			/////
 #ifdef BEAMS
@@ -487,7 +503,7 @@ void CGrav::Pull(CBaseEntity* ent,float force){
 
 		
 		/////
-		ALERT(at_console, "%s 2: %f\n", STRING(ent->pev->classname), ent->pev->velocity.Length());
+		ALERT(at_console, "%s 2: %f\n", STRING(ent->pev->classname), m_iStage, ent->pev->velocity.Length());
 	}
 	else
 	{
@@ -505,9 +521,9 @@ void CGrav::Pull(CBaseEntity* ent,float force){
 		if(ent->pev->velocity.Length()>900)
 			ent->pev->velocity = (target - VecBModelOrigin(ent->pev)).Normalize() * 900;
 		ent->pev->velocity = ent->pev->velocity + m_pPlayer->pev->velocity;
-		m_bHold = true;
-		pev->nextthink = gpGlobals->time + 0.0001;
-		SetThink(&CGrav::GrabThink);
+		m_iStage = 2;
+		SetThink( &CGrav::GrabThink );
+		pev->nextthink = gpGlobals->time + 0.001;
 	}
 
 	
@@ -520,7 +536,7 @@ void CGrav::Pull(CBaseEntity* ent,float force){
 
 void CGrav::PrimaryAttack(void)
 {
-	if (mytime < gpGlobals->time)
+	if (m_flNextGravgunAttack < gpGlobals->time)
 	{
 	
 	
@@ -534,9 +550,9 @@ void CGrav::PrimaryAttack(void)
 
 void CGrav::SecondaryAttack(void)
 {
-	if (mytime < gpGlobals->time)
+	if (m_flNextGravgunAttack < gpGlobals->time)
 	{
-		if (m_bHold)
+		if (m_iStage)
 		{
 			if( m_fireState != FIRE_OFF )
 			{
@@ -544,9 +560,10 @@ void CGrav::SecondaryAttack(void)
 			}
 			EndAttack();
 			SetThink(NULL);
-			mytime = gpGlobals->time + 0.1;
+			m_flNextGravgunAttack = gpGlobals->time + 1.5;
 			//m_flTimeWeaponIdle = gpGlobals->time + 0.1;
-			m_bHold = false;
+
+			m_iStage = 0;
 			if( m_AimentEntity )
 			{
 				m_AimentEntity->pev->velocity = Vector(0,0,0);
@@ -714,7 +731,7 @@ void CGrav::EndAttack(void)
 	ALERT( at_console, "EndAttack()\n");
 	if (m_fireState != FIRE_OFF) //Checking the button just in case!.
 		bMakeNoise = true;
-	mytime = gpGlobals->time + 0.1;
+	m_flNextGravgunAttack = gpGlobals->time + 0.1;
 	m_flTimeWeaponIdle = gpGlobals->time + 0.2;
 
 	m_fireState = FIRE_OFF;