diff --git a/ProyectoAndroid/ChessTrack/AndroidManifest.xml b/ProyectoAndroid/ChessTrack/AndroidManifest.xml
index ec4ede675a0383c7122aaaf4a7ddd40d99822091..634c447944e1dd3b5cf8d3de60f0387c4f3200ea 100644
--- a/ProyectoAndroid/ChessTrack/AndroidManifest.xml
+++ b/ProyectoAndroid/ChessTrack/AndroidManifest.xml
@@ -3,8 +3,6 @@
     android:versionCode="1"
     android:versionName="1.0" >
 
-   
-
 <!--     <application -->
 <!--         android:allowBackup="true" -->
 <!--         android:icon="@drawable/ic_launcher" -->
@@ -12,8 +10,6 @@
 <!--         android:theme="@style/AppTheme" > -->
 <!--     </application> -->
  
- 
- 
     <application
          android:allowBackup="true"
         android:label="@string/app_name"
@@ -30,22 +26,21 @@
             </intent-filter>
         </activity>
     </application>
-
-  
        
     <supports-screens android:resizeable="true"
                       android:smallScreens="true"
                       android:normalScreens="true"
                       android:largeScreens="true"
                       android:anyDensity="true" />
-   
      
      <uses-sdk
         android:minSdkVersion="9"
         android:targetSdkVersion="10" />
     
-     <uses-permission android:name="android.permission.CAMERA"/>
-
+    <uses-permission android:name="android.permission.INTERNET"/>
+	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.CAMERA"/>
+	
     <uses-feature android:name="android.hardware.camera" android:required="false"/>
     <uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
     <uses-feature android:name="android.hardware.camera.front" android:required="false"/>
diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/chesstrack/communication/Client.java b/ProyectoAndroid/ChessTrack/src/uy/edu/chesstrack/communication/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..246e230a49ef3e9a966d389905a67a1d1790df60
--- /dev/null
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/chesstrack/communication/Client.java
@@ -0,0 +1,84 @@
+package uy.edu.chesstrack.communication;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+
+import android.util.Log;
+
+public class Client {
+
+	private static final String TAG = "CLIENT";
+	private static Client _clientInstance;
+
+	private Socket serverSocket;
+	private int _serverPort;
+	private String _serverIp;
+
+	//private BufferedReader input;
+	private DataOutputStream output;
+
+	protected Client(){
+
+	}
+
+	public static Client getInstance(){
+		if(_clientInstance == null){
+			_clientInstance = new Client();
+		}
+		return _clientInstance;
+	}
+
+	public void EstablishConnection(String serverIp, int serverPort) {
+		Log.i(TAG, "init client-server communication");
+		this._serverIp = serverIp;
+		this._serverPort = serverPort;
+
+		try {
+			InetAddress serverAddr = InetAddress.getByName(this._serverIp);
+			serverSocket = new Socket(serverAddr, _serverPort);
+			Log.i(TAG, "Server on " + this._serverIp + ":" + _serverPort);
+
+			// get stream to send data
+			this.output = new DataOutputStream(this.serverSocket.getOutputStream());
+
+			// get stream to receive data
+			//this.input = new BufferedReader(new InputStreamReader(this.serverSocket.getInputStream()));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void SendData(String msg) {
+		try {
+			Log.i(TAG, "sending="+ msg);
+			this.output.writeBytes(msg);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/*
+ 	public String ReceiveData() {
+		try {
+			String read = input.readLine();
+			Log.i(TAG, "received="+ read);
+			return read;
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	*/
+
+	public void Stop() {
+		try {
+			//input.close();
+			output.close();
+			serverSocket.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java
index 85591d80a12eeedfaf9f33692f6030a18ca8d9a4..13aa38ac6dcc49b504d4189a7ac14e52df2f70ac 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/ChessTrackActivity.java
@@ -8,30 +8,44 @@ import org.opencv.android.JavaCameraView;
 import org.opencv.android.LoaderCallbackInterface;
 import org.opencv.android.OpenCVLoader;
 import org.opencv.core.Mat;
-
+import uy.edu.fing.chesstrack.communication.Client;
 import uy.edu.fing.chesstrack.modulomodelador.Modelador;
 import uy.edu.fing.chesstrack.modulovision.Adquisicion;
 import uy.edu.fing.chesstrack.modulovision.Calibracion;
 import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
 import android.media.AudioManager;
 import android.media.ToneGenerator;
 import android.os.Bundle;
+import android.text.Editable;
 import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.SurfaceView;
 import android.view.WindowManager;
+import android.widget.Button;
+import android.widget.EditText;
 
 public class ChessTrackActivity extends Activity implements CvCameraViewListener {
 
 	private static final String TAG = "CHESSTRACK::Activity";
+	private static final String IPV4_REGEX ="^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$";
+	private static final String PORT_REGEX ="^(\\d{4,5})$";
+	private static final String welcomeMSG = ""
+			+ "--------------------------------------------------------------------------\n"
+			+ "  .:: CHESSTRACK ::. seguimiento de una partida de Ajedrez\n"
+			+ "\n"
+			+ "                                           Aylen Ricca - Nicolas Furquez\n"
+			+ "--------------------------------------------------------------------------\n";
 
 	private CameraBridgeViewBase mOpenCvCameraView;
 	//private JavaCameraView mOpenCvCameraView;
 
 	private Adquisicion adq;
 	private Calibracion calibrar;
-
+	private Button btnCalibrar;
+	private Client ClientCommunication;
 	private MenuItem mItemCalibrar;
 	//TODO es chancho pero ver luego
 	private Mat frame;
@@ -75,7 +89,6 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 
 		Modelador.getInstance();
 		try {
-
 			isUsed = false;
 			isCalibrada =false;
 
@@ -83,9 +96,72 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
-
+		getServerIp();
 	}
 
+	public void getServerIp(){
+		AlertDialog.Builder alert = new AlertDialog.Builder(this);
+		alert.setTitle("Communication Setup");
+		alert.setMessage("Set server ip");
+
+		final EditText input = new EditText(this);
+		alert.setView(input);
+
+		alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+			public void onClick(DialogInterface dialog, int whichButton) {
+				Editable value = input.getText();
+				if (value == null || value.toString().equals("") || !value.toString().matches(IPV4_REGEX)) {
+					Log.i(TAG,"INPUT= not valid IP" + value.toString());
+					getServerIp();
+				} else {
+					Log.i(TAG,"INPUT=" + value.toString());
+					
+					Log.i(TAG,"IP=" + value.toString());
+					getServerPort(value.toString());
+				}
+		  	}
+		});
+
+		/*
+		alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
+			public void onClick(DialogInterface dialog, int whichButton) {
+			    // no server communication -- FIXME do not send info to client 
+			}
+		});
+		*/
+
+		alert.show();
+	}
+	
+	public void getServerPort(final String ip){
+		AlertDialog.Builder alert = new AlertDialog.Builder(this);
+		alert.setTitle("Communication Setup");
+		alert.setMessage("Set server port");
+
+		final EditText input = new EditText(this);
+		alert.setView(input);
+
+		alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
+			public void onClick(DialogInterface dialog, int whichButton) {
+				Editable value = input.getText();
+				Log.i(TAG,"INPUT=" + value.toString());
+				if (value == null || value.toString().equals("") || !value.toString().matches(PORT_REGEX)) {
+					Log.i(TAG,"INPUT= not valid PORT" + value.toString());
+					getServerPort(ip);
+				} else {
+					Log.i(TAG,"INPUT=" + value.toString());
+
+					int port = Integer.parseInt(value.toString());
+					Log.i(TAG,"PORT=" + port);
+					//ClientCommunication = Client.getInstance();
+					//ClientCommunication.EstablishConnection(ip, port);
+					//ClientCommunication.SendData(welcomeMSG);
+				}
+		  	}
+		});
+		
+		alert.show();
+	}
 	@Override
 	public boolean onCreateOptionsMenu(Menu menu) {
 		Log.i(TAG, "called onCreateOptionsMenu");
@@ -122,8 +198,6 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 	}
 
 
-
-
 	@Override
 	public void onPause()
 	{
@@ -139,6 +213,9 @@ public class ChessTrackActivity extends Activity implements CvCameraViewListener
 		if (mOpenCvCameraView != null) {
 			mOpenCvCameraView.disableView();
 		}
+		if (this.ClientCommunication != null) {
+			this.ClientCommunication.Stop();
+		}
 	}
 
 	@Override
diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java
new file mode 100644
index 0000000000000000000000000000000000000000..4645609897eaa13110c1949ad4a0e0828bed87c4
--- /dev/null
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/communication/Client.java
@@ -0,0 +1,84 @@
+package uy.edu.fing.chesstrack.communication;
+
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.Socket;
+
+import android.util.Log;
+
+public class Client {
+
+	private static final String TAG = "CLIENT";
+	private static Client _clientInstance;
+
+	private Socket serverSocket;
+	private int _serverPort;
+	private String _serverIp;
+
+	//private BufferedReader input;
+	private DataOutputStream output;
+
+	protected Client(){
+
+	}
+
+	public static Client getInstance(){
+		if(_clientInstance == null){
+			_clientInstance = new Client();
+		}
+		return _clientInstance;
+	}
+
+	public void EstablishConnection(String serverIp, int serverPort) {
+		Log.i(TAG, "init client-server communication");
+		this._serverIp = serverIp;
+		this._serverPort = serverPort;
+
+		try {
+			Log.i(TAG, "Server on " + this._serverIp + ":" + _serverPort);
+			InetAddress serverAddr = InetAddress.getByName(this._serverIp);
+			serverSocket = new Socket(serverAddr, _serverPort);
+
+			// get stream to send data
+			this.output = new DataOutputStream(this.serverSocket.getOutputStream());
+
+			// get stream to receive data
+			//this.input = new BufferedReader(new InputStreamReader(this.serverSocket.getInputStream()));
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public void SendData(String msg) {
+		try {
+			Log.i(TAG, "sending="+ msg);
+			this.output.writeBytes(msg);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+
+	/*
+ 	public String ReceiveData() {
+		try {
+			String read = input.readLine();
+			Log.i(TAG, "received="+ read);
+			return read;
+		} catch (IOException e) {
+			e.printStackTrace();
+			return null;
+		}
+	}
+	*/
+
+	public void Stop() {
+		try {
+			//input.close();
+			output.close();
+			serverSocket.close();
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
+}
diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java
index 6f67c0ed5c26c9a7ddb91f0b44c4875a65bbbf04..f0cd93c45a6b1580f7c2af83409276c9b208c4f5 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/Adquisicion.java
@@ -7,6 +7,7 @@ import java.util.List;
 
 import org.opencv.core.Mat;
 
+import uy.edu.fing.chesstrack.modulovision.imgproc.BackgroundSupress;
 import uy.edu.fing.chesstrack.modulovision.imgproc.Homografia;
 import uy.edu.fing.chesstrack.modulovision.imgproc.ImgProcInterface;
 import android.util.Log;
diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java
index 7ff5a30f367498dd395c6a113b805b4fb8a86a4b..697c72730d70804dde9c720ea56bbf23efec8ba2 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/BackgroundSupress.java
@@ -17,6 +17,7 @@ import org.opencv.video.BackgroundSubtractorMOG;
 import org.opencv.video.BackgroundSubtractorMOG2;
 import org.opencv.imgproc.*;
 
+import uy.edu.fing.chesstrack.communication.Client;
 import android.graphics.SumPathEffect;
 import android.media.AudioManager;
 import android.media.ToneGenerator;
@@ -26,12 +27,16 @@ import android.util.Log;
 public class BackgroundSupress implements ImgProcInterface {
 
 	private static final String TAG = "CHESSTRACK::BackgroundSupress";
+	private static int e = 0;
 	private final  Mat fgMaskMOG;
-	private final  Mat fgMaskMOG2;
+	private Mat fgMaskMOG2;
 	private final Mat morphKernel;
 	private final BackgroundSubtractorMOG pMOG;
-	private final BackgroundSubtractorMOG2 pMOG2;
-	private final List<MatOfPoint> contours;
+	private BackgroundSubtractorMOG2 pMOG2;
+	//private final List<MatOfPoint> contours;
+	private Client communicator;
+	private int estadoANTERIOR = 0;
+	private int estadoACTUAL = 0;
 
 	public BackgroundSupress() {
 		super();
@@ -41,7 +46,9 @@ public class BackgroundSupress implements ImgProcInterface {
 		pMOG = new BackgroundSubtractorMOG(); //MOG approach
 		pMOG2 = new BackgroundSubtractorMOG2(); //MOG approach
 		Log.i(TAG, "at background supress constructor");
-		contours = new ArrayList<MatOfPoint>();
+		//contours = new ArrayList<MatOfPoint>();
+		
+		communicator = Client.getInstance();
 	}
 
 	@Override
@@ -62,8 +69,8 @@ public class BackgroundSupress implements ImgProcInterface {
 		Imgproc.threshold(fgMaskMOG2, fgMaskMOG2, 200, 255, Imgproc.THRESH_BINARY);
 		Log.i(TAG, "Apply threshold");
 
-		Imgproc.dilate(fgMaskMOG2, fgMaskMOG2, morphKernel);
-		Log.i(TAG, "Apply dilate");
+		//Imgproc.dilate(fgMaskMOG2, fgMaskMOG2, morphKernel);
+		//Log.i(TAG, "Apply dilate");
 
 		Scalar suma = Core.sumElems(fgMaskMOG2);
 		Log.i(TAG, "SUMA = " + suma);
@@ -87,12 +94,28 @@ public class BackgroundSupress implements ImgProcInterface {
 		}*/
 
 		if (suma.val[0] > 100000){
+            estadoANTERIOR = estadoACTUAL;
+            estadoACTUAL = 1;
+
 			Log.i(TAG, "MANO !!!");
+			communicator.SendData("1\n");
             Core.putText(fgMaskMOG2, "MANO !!!", new Point(50, 50),Core.FONT_HERSHEY_SIMPLEX, 0.8 , new Scalar(255,255,0));
 //			ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 50);
 //			toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); // 200 is duration in ms
         } else {
+            estadoANTERIOR = estadoACTUAL;
+            if (estadoANTERIOR == 1){
+                // estado transicion
+            	
+                estadoACTUAL = 3;
+            }
+            if (estadoANTERIOR == 3){
+                // estado estable
+                estadoACTUAL = 2;
+                pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach
+            }
 			Log.i(TAG, "ESTABLE !!!");
+			communicator.SendData("0\n");
             Core.putText(fgMaskMOG2, "ESTABLE !!!", new Point(50, 50),Core.FONT_HERSHEY_SIMPLEX, 0.5 , new Scalar(255,255,0));
         }
 
diff --git a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java
index b79fe452eefd1cc9a433da884561d42b688ff22b..63830f24c1a84e09d8964d217ae3fd4a4bb2509f 100644
--- a/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java
+++ b/ProyectoAndroid/ChessTrack/src/uy/edu/fing/chesstrack/modulovision/imgproc/Homografia.java
@@ -57,11 +57,13 @@ public class Homografia implements ImgProcInterface {
 	@Override
 	public Mat procesarImagen(Mat inputFrame) {
 
-		Imgproc.warpPerspective(inputFrame,inputFrame, matrizTransformada, inputFrame.size(),(Imgproc.INTER_LINEAR |  Imgproc.CV_WARP_FILL_OUTLIERS));
+		Log.i(TAG, "before");
+		Imgproc.warpPerspective(inputFrame,inputFrame, matrizTransformada, inputFrame.size());
 		Mat subMat = inputFrame.submat(rectPOI);
 		Mat tmp = Mat.zeros(inputFrame.size(), CvType.CV_8UC4);
 		Mat matTMP = tmp.submat(rectPOI);
 		subMat.copyTo(matTMP);
+		Log.i(TAG, "after");
 		return tmp;
 	}
 
diff --git a/cte-serv/cliente.java b/cte-serv/cliente.java
new file mode 100644
index 0000000000000000000000000000000000000000..a4809101ce8b421265ad67cf3d61ceb5a63c62b7
--- /dev/null
+++ b/cte-serv/cliente.java
@@ -0,0 +1,32 @@
+import java.io.*; 
+import java.net.*; 
+class TCPClient { 
+
+    public static void main(String argv[]) throws Exception 
+    { 
+        String sentence; 
+        String modifiedSentence; 
+
+        BufferedReader inFromUser = 
+          new BufferedReader(new InputStreamReader(System.in)); 
+
+        Socket clientSocket = new Socket("192.168.1.21", 5555); 
+
+        DataOutputStream outToServer = 
+          new DataOutputStream(clientSocket.getOutputStream()); 
+	        BufferedReader inFromServer = 
+          new BufferedReader(new
+          InputStreamReader(clientSocket.getInputStream())); 
+
+        sentence = inFromUser.readLine(); 
+
+        outToServer.writeBytes(sentence + '\n'); 
+
+        modifiedSentence = inFromServer.readLine(); 
+
+        System.out.println("FROM SERVER: " + modifiedSentence); 
+
+        clientSocket.close(); 
+                   
+    } 
+} 
diff --git a/cte-serv/server.java b/cte-serv/server.java
new file mode 100644
index 0000000000000000000000000000000000000000..c06b878fc13a6378065787f6a3c8e4769106f5bd
--- /dev/null
+++ b/cte-serv/server.java
@@ -0,0 +1,34 @@
+import java.io.*; 
+import java.net.*; 
+
+class TCPServer { 
+
+  public static void main(String argv[]) throws Exception 
+    { 
+      String clientSentence; 
+      String capitalizedSentence; 
+
+      ServerSocket welcomeSocket = new ServerSocket(5556); 
+    
+      Socket connectionSocket = welcomeSocket.accept(); 
+
+      BufferedReader inFromClient = 
+       new BufferedReader(new InputStreamReader(connectionSocket.getInputStream())); 
+
+      DataOutputStream  outToClient = 
+       new DataOutputStream(connectionSocket.getOutputStream()); 
+
+      while(true) { 
+
+           clientSentence = inFromClient.readLine(); 
+
+           //capitalizedSentence = clientSentence.toUpperCase() + '\n'; 
+           //outToClient.writeBytes(capitalizedSentence); 
+
+           if (clientSentence != null){
+                System.out.println(clientSentence);
+           }
+        } 
+    } 
+} 
+ 
diff --git a/samples/SubsBackground.cpp b/samples/SubsBackground.cpp
index 999950d2b40bcc104dd4a0ea57ebc78acdde206b..fd2d0ab5093317b4966330ef10e72b313d0177e1 100644
--- a/samples/SubsBackground.cpp
+++ b/samples/SubsBackground.cpp
@@ -66,7 +66,7 @@ int main(int argc, char* argv[])
 
     //create GUI windows
     namedWindow("Frame");
-    namedWindow("FG Mask MOG");
+    //namedWindow("FG Mask MOG");
     namedWindow("FG Mask MOG 2");
 
     //create Background Subtractor objects
@@ -99,6 +99,10 @@ int main(int argc, char* argv[])
 void processVideo(char* videoFilename) {
     int estadoANTERIOR = 0;
     int estadoACTUAL = 0;
+    int c = 0;
+    char buffer [15];
+
+
     //create the capture object
     VideoCapture capture(videoFilename);
     if(!capture.isOpened()){
@@ -142,7 +146,7 @@ void processVideo(char* videoFilename) {
 
 //        cerr << suma.val[0] << endl;
 
-		if (suma.val[0] > 1000000){
+		if (suma.val[0] > 1250000){
                 // estado oclusion
             estadoANTERIOR = estadoACTUAL;
             estadoACTUAL = 1;
@@ -158,6 +162,12 @@ void processVideo(char* videoFilename) {
             if (estadoANTERIOR == 3){
                 // estado estable
                 estadoACTUAL = 2;
+                imshow("ESTABLE", frame);
+
+                int b = sprintf (buffer, "tablero%d.png", c);
+                imwrite(buffer, frame);
+                c++;
+
                 pMOG= new BackgroundSubtractorMOG(); //MOG approach
                 pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach
             }
@@ -184,7 +194,7 @@ void processVideo(char* videoFilename) {
 
         //show the current frame and the fg masks
         imshow("Frame", frame);
-        imshow("FG Mask MOG", fgMaskMOG);
+      //  imshow("FG Mask MOG", fgMaskMOG);
         imshow("FG Mask MOG 2", fgMaskMOG2);
         //get the input from the keyboard
         keyboard = waitKey( 30 );