diff --git a/Assets/Gesture/Gesture.cs b/Assets/Gesture/Gesture.cs
index 7fd8b282d34fa93071f05173618c81204d5af575..a439190e8b6841fa5223108f6fe2b5ce51942078 100644
--- a/Assets/Gesture/Gesture.cs
+++ b/Assets/Gesture/Gesture.cs
@@ -5,6 +5,8 @@ using System.IO;
 
 public class Gesture
 {
+	public enum GestureType {Normal, Mean, Variance};
+
 	static string directoryPath = "Assets/Record/Recorded/";
 	public List<GestureState> states;
 	string name;
@@ -14,116 +16,45 @@ public class Gesture
 		states = new List<GestureState> ();
 	}
 
-	public Gesture(string name)
+	public Gesture (string name, GestureType type = GestureType.Normal)
 	{
 		this.name = name;
-		Load ();
-		//VerifyNormalization ();
-		Normalize ();
-		//VerifyNormalization ();
+		if (type == GestureType.Normal)
+			Load ();
+		else if (type == GestureType.Mean)
+			ComputeMean ();
+		else if (type == GestureType.Variance)
+			ComputeVariance ();
 	}
 
-	public void Normalize ()
+	void ComputeMean ()
 	{
-		//set 0 as origin/centroid
-		//find mean position
-		Vector3 meanPosition = new Vector3(0, 0, 0);
-		foreach (GestureState state in states)
-			meanPosition += state.position;
-		meanPosition /= states.Count;
-
-		//subtract mean position to all positions
-		foreach (GestureState state in states)
-			state.position -= meanPosition;
-
-		//have furthest point have distance 1
-		//find furthest point length
-		float furthestDistance = 0;
-		foreach (GestureState state in states)
-		{
-			float length = state.position.magnitude;
-			if (length > furthestDistance)
-				furthestDistance = length;
-		}
-
-		//divide length to all points
-		foreach (GestureState state in states)
-			state.position /= furthestDistance;
-
-
-		//time normalization: have 100 points.
-		int pointNumber = 100;
-		float timeNormalizationFactor = pointNumber * 1.0f / states.Count;
-		Debug.Log ("Time normalization, factor: " + timeNormalizationFactor);
-		List<GestureState> normalizedStates = new List<GestureState>();
-
-		float timestampStep = (states [states.Count - 1].timestamp - states [0].timestamp) / (states.Count - 1);
-		float normalizedTimestamp = states [0].timestamp;
-		for (int i = 0; i < pointNumber; i++)
+		//find and load gestures to compare for the mean
+		List<Gesture> gesturesToMean = new List<Gesture> ();
+		string path = "Assets/Record/Recorded/" + name + "/";
+		foreach (string gesturePath in Directory.GetDirectories (path))
 		{
-			GestureState normalizedState = new GestureState ();
-
-			int stateID = (int)Mathf.Floor(i / timeNormalizationFactor);
-			GestureState currentState = states [stateID];
-			Vector3 normalizedPosition = states [stateID].position;
-			Vector3 normalizedRotation = states [stateID].rotation;
-
-			if (stateID > 0 && stateID < states.Count - 1)
+			if (!gesturePath.Equals (path + "mean.txt") && !gesturePath.Equals (path + "variance.txt"))
 			{
-				GestureState nextState = states [stateID + 1];
-				float smallTimestamp = (normalizedTimestamp - currentState.timestamp);
-				if (smallTimestamp != 0)
-				{
-					float smallFactor = (nextState.timestamp - currentState.timestamp) / smallTimestamp;
-
-					Vector3 positionToNextState = nextState.position - currentState.position;
-					normalizedPosition = currentState.position + positionToNextState * smallFactor;
-
-					Vector4 rotationToNextState = nextState.rotation - currentState.rotation;
-					normalizedRotation = currentState.rotation + rotationToNextState * smallFactor;
-				}
+				Gesture gesture = new Gesture(gesturePath);
+				gesture.Load ();
+				gesturesToMean.Add(gesture);
 			}
-
-			normalizedState.position = normalizedPosition;
-			normalizedState.rotation = normalizedRotation;
-			normalizedState.timestamp = normalizedTimestamp;
-			normalizedStates.Add (normalizedState);
-
-			normalizedTimestamp += timestampStep;
-
-			//Debug.Log ("i: " + i + ", state id: " + stateID + " of " + states.Count);
-			//Debug.Log ("currentstate T: " + currentState.timestamp + ", pos: " + currentState.position);
-			//Debug.Log ("normstate T: " + normalizedState.timestamp + ", pos: " + normalizedState.position);
 		}
-		states = normalizedStates;
 
-		//Debug.Log ("Time normalization done\n");
+		//compute the mean
 	}
 
-	public void VerifyNormalization ()
+	void ComputeVariance ()
 	{
-		Vector3 meanPosition = new Vector3(0, 0, 0);
-		foreach (GestureState state in states)
-			meanPosition += state.position;
-		meanPosition /= states.Count;
-		Debug.Log ("[VerifyNormalization] mean position: " + meanPosition);
-
-		float furthestDistance = -1;
-		foreach (GestureState state in states)
-		{
-			float length = state.position.sqrMagnitude;
-			if (length > furthestDistance)
-				furthestDistance = length;
-		}
-		Debug.Log ("[VerifyNormalization] furthestDistance: " + furthestDistance);
 	}
 
-	public void Load()
+	public void Load ()
 	{
 		states = GestureLoader.Load (FullPath ());
 	}
 
-	private string FullPath()
+	private string FullPath ()
 	{
 		return directoryPath + name + ".txt";
 	}
diff --git a/Assets/Replay/Replay.cs b/Assets/Replay/Replay.cs
index 5857d79fd41b1920d47da58962b09a914c90e6bd..d53a9387224533ab5e12df71c19646b0faea9a87 100644
--- a/Assets/Replay/Replay.cs
+++ b/Assets/Replay/Replay.cs
@@ -46,7 +46,7 @@ public class Replay: MonoBehaviour
 
 	public void UpdateSelectedGesture(int id)
 	{
-		gestureToReplay = new Gesture (replays[id] + "/0");
+		gestureToReplay = new Gesture (replays[id], Gesture.GestureType.Mean);
 		currentFrame = 0;
 		ApplyCurrentFrameToModel ();
 	}