diff --git a/src/es/markse/Muelle.java b/src/es/markse/Muelle.java
index 74ed1c31aa8dcc989e6af95cd8165ae3de7e9376..c8e01da4c83b72ebae257c8ef8ca477bb952fa72 100644
--- a/src/es/markse/Muelle.java
+++ b/src/es/markse/Muelle.java
@@ -5,6 +5,7 @@
 package es.markse;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.regex.Pattern;
 
 import es.uva.inf.poo.maps.GPSCoordinate;
 
@@ -14,17 +15,18 @@ import es.uva.inf.poo.maps.GPSCoordinate;
  * @author victorm
  */
 public class Muelle {
-	private Plaza[] plazas;
-	private String identificador;
-	private boolean operativo;
-	private GPSCoordinate cord;
-	private int plazasVacias;
-	private int plazasLlenas = 0;
-	private int plazasSemillenas = 0;
+	private final Plaza[] plazas;
+	private final String identificador;
+	private enum estado{
+		OPERATIVO, FUERA_DE_SERVICIO
+	}
+	private estado estadoActual;
+	private final GPSCoordinate cord;
+	private final Pattern IDENTIFICADOR_REGUEX = Pattern.compile("^\\d{2}$");
 	
 	private static class Plaza {
 		private int altura;
-		private List<Contenedor> contenedores = new ArrayList<>();
+		private final List<Contenedor> contenedores = new ArrayList<>();
 		
 		/**
 		 * Constructor del objeto Plaza
@@ -40,7 +42,7 @@ public class Muelle {
 		 * @return true si contiene ese contenedor en la Plaza o false si no lo tiene
 		 */
 		public boolean contieneContenedor(String codigo) {
-	        return this.contenedores.stream().anyMatch(c -> c.getCodigo().equals(codigo));
+	        return (this.nivelContenedor(codigo)!=-1) ? true : false;
 	    }
 		
 		/**
@@ -57,7 +59,6 @@ public class Muelle {
 		    return -1;
 		}
 		
-		
 		/**
 		 *Metodo que sirve para colar el contenedor en una plaza (apilarlo si esppsible)
 		 * @param codigo: Codigo del contenedor
@@ -117,6 +118,22 @@ public class Muelle {
 		public int altura() {
 			return this.altura;
 		}
+		
+		/**
+		 * Metodo que devuelve si una plaza esta vacia o no
+		 * @return true si esta vacia o false si no lo esta
+		 */
+		public boolean plazaVacia() {
+			return (this.contenedores.size() == 0) ? true : false;
+		}
+		
+		/**
+		 * Metodo que devuelve si una plaza esta llena o no
+		 * @return true si la plaza esta llena o si no lo esta
+		 */
+		public boolean plazaLlena() {
+			return (this.contenedores.size() == this.altura || this.ultimoContenedor().tieneTecho()) ? true : false;
+		}
 	}
 	
 	/**
@@ -127,14 +144,19 @@ public class Muelle {
 	 * @param plazas Numero de plazas totales que tiene el Muelle
 	 * @param altura numero maximo de contenedores que se pueden apilar encima de otro
 	 */
+	//CHANGE BOOLEAN OPERATIVO FOR AN STATE OF ESTADO 
 	public Muelle (String identificador, GPSCoordinate cord, boolean operativo, int plazas, int altura) {
-		comprobarValoresNulos(identificador, cord);
-		comprobarValoresMuelle(identificador, plazas, altura);
+		if(!comprobarValoresNulos(identificador, cord))
+			throw new IllegalArgumentException("Los valores del identificador y coordenada no pueden ser nulos");
+		if(!comprobarTamanyoAlturaPlazas(plazas, altura))
+			throw new IllegalArgumentException("Los tamaños (altura y plaza) no puedne ser menores a 1");
+		if (!comprobarIdentificador(identificador))
+			throw new IllegalArgumentException("El formato del identificador es incorrecto");
+		
 		this.identificador = identificador;
 		this.cord = cord;
-		this.plazasVacias = plazas;
 		this.plazas = new Plaza[plazas];
-		this.operativo = operativo;
+		this.estadoActual = operativo ? estado.OPERATIVO : estado.FUERA_DE_SERVICIO;
 		
 		//Inicializamos el array de las plazas
 		for (int i = 0; i < plazas; i++) {
@@ -144,64 +166,38 @@ public class Muelle {
 	}
 	
 	/**
-	 * Metodo para comporbar que los valores no sean nulos a la hora de crear un Objeto de tipo Muelle
+	 * Metodo para comporbar que los valores no sean nulos
 	 * @param identificador Identificador del muelle
 	 * @param cord Coordenadas de muelle (clase GPSCoordinate)
-	 * @throws IllegalArgumentException si el identificador o la coordenada son nulos
+	 * @return true si los valores son nulos o false si no lo son
 	 */
-	private void comprobarValoresNulos(String identificador, GPSCoordinate cord) {
-		if (identificador == null) throw new IllegalArgumentException("Identificador no puede ser nulo");
-		if (cord == null) throw new IllegalArgumentException("Identificador no puede ser nulo");
+	private boolean comprobarValoresNulos(String identificador, GPSCoordinate cord) {
+		if (identificador == null || cord == null) return true;
+		else return false;
 	}
 	
 	/**
-	 * Metodo que comprueba si el identificador es correcto (2 digitos)
-	 * @param identificador identificador del muelle
-	 * @throws IllegalArgumentException si la altura o la plaza son menores que 1, o si el identificador
-	 * no es correcto
+	 * Metodo que sirve para comprobar si son correctas el tamaño de las plazas
+	 * @param plazas El numero de plazas del muelle
+	 * @param altura El tamaño de la altura del muelle
+	 * @return true si el tamaño es correcto, false si no lo es
 	 */
-	private void comprobarValoresMuelle(String identificador, int plazas, int altura) {
-		if (plazas<1) throw new IllegalArgumentException("Numero de plazas debe ser 1 o mas");
-		if (altura<1) throw new IllegalArgumentException("La altura debe ser 1 o mayor");
-		if (identificador.length() != 2 || !identificador.matches("\\d{2}")) {
-		    throw new IllegalArgumentException("Formato incorrecto. Debe ser un entero de 2 dígitos numéricos (por ejemplo, 04, 15, 65)");
-		}
+	private boolean comprobarTamanyoAlturaPlazas (int plazas, int altura) {
+		return (plazas<1 || altura <1)? false : true;
 	}
 	
 	/**
-	 * Metodo que sirve para si un codigo de contenedor es correcto
-	 * @param codigo Codigo del contenedor que se comprueba
-	 * @throws IllegalArgumentException si el codigo es nulo o no corresponde a un codigo correcto
-	 */
-	private void comprobarCodigoContenedor(String codigo) {
-		if (codigo == null) throw new IllegalArgumentException("Codigo no puede ser nulo");
-		if (!codigo.matches("[A-Z]{4}\\d{7}")) throw new IllegalArgumentException("El codigo no pertenece a un codigo de contenedor");
-	}
-	
-	/**
-	 * Metodo que devuelve el identificador de un muelle. Este identificador sera de 2 digitos.
-	 * @return identificador del muelle
-	 */
-	public String getIdentificador() {
-		return this.identificador;
-	}
-	
-	/**
-	 * Metodo que indica si el Muelle esta operativo o no
-	 * @return Si esta operativo (true) o no (false)
+	 * Metodo que comprueba si el identificador es correcto
+	 * @param identificador Identificador del muelle
+	 * @return true si es correcto o false si no lo es
 	 */
-	public boolean estaOperativo() {
-	    return this.operativo;
+	private boolean comprobarIdentificador(String identificador) {
+		return (IDENTIFICADOR_REGUEX.matcher(identificador).matches()) ? true : false;
 	}
 	
-	/**
-	 * Metodo que devuelve el punto de coordenadas del muelle
-	 * Este punto pertenece a la clase GPSCoordinate
-	 * @return coordenadas del muelle;
-	 */
-	public GPSCoordinate getGPSCoordinate() {
-		return this.cord;
-	}
+	/***************************************
+	 * EMPLEACION DE LOS METODOS QUE PIDEN *
+	 ****************************************/
 	
 	/**
 	 * 1.1.7 Metodo que devuelve el numero de plazas totales que tiene el muelle
@@ -217,26 +213,35 @@ public class Muelle {
 	 * @return numero de plazas vacias.
 	 */
 	public int plazasVacias() {
-		return this.plazasVacias;
+		int c = 0;
+		for (Plaza p : this.plazas)
+			if(p.plazaVacia()) c++;
+		return c;
 	}
 	
 	/**
 	 * 1.1.8 Metodo que devuelve el numero de plazas llenas. Una plaza llena es la que:
 	 * - Se encuentran con el numero máximo de contenedores apilados en la plaza
 	 * - El contenedor o el ultimo contenedor apilado no tiene techo, lo que no se peden colocar más.
-	 * @return plazasLlenas
+	 * @return numero de plazas llenas
 	 */
 	public int plazasLlenas() {
-		return this.plazasLlenas;
+		int c = 0;
+		for (Plaza p: this.plazas) 
+			if (p.plazaLlena()) c++;
+		return c;
 	}
 	
 	/**
 	 * 1.1.8 Metodo que devuelve el numero de plazas semillenas. Las plazas semillenas son aquellas que
 	 * contienen un contenedor y se puede apilar mas encima de el (tiene techo)
-	 * @return plazasSemillenas
+	 * @return numero de plazas semillenas
 	 */
 	public int plazasSemillenas() {
-		return this.plazasSemillenas;
+		int c = 0;
+		for (Plaza p: this.plazas) 
+			if (!p.plazaLlena() && !p.plazaVacia()) c++;
+		return c;
 	}
 	
 	/**
@@ -292,14 +297,9 @@ public class Muelle {
 			throw new IllegalArgumentException("El Contenedor esta en transito, no se puede colocar");
 		}
 		
-	    Contenedor ultimo = this.plazas[plaza].ultimoContenedor();
 	    // Verificar si hay un último contenedor y si tiene techo
-	    boolean teniaTecho = (ultimo != null && ultimo.tieneTecho());
 	    if (this.plazas[plaza].colocarContenedor(contenedor)) {
 	    	contenedor.cambiarEstadoApilado();
-	        int plazasDespues = this.plazas[plaza].numeroContenedores();
-	        int plazasAntes = plazasDespues - 1;
-	        this.actualizarPlazas(plazasAntes, plazasDespues, this.plazas[plaza], teniaTecho);
 	    }
 	    else {
 	    	if (!this.plazas[plaza].ultimoContenedor().tieneTecho())
@@ -314,7 +314,6 @@ public class Muelle {
 	 * @throws IllegalArgumentException si el contenedor es nulo, si no se encuentra apilado en ningun sitio o
 	 * si el contenedor no se encuentra en la ultima posicion (no se podria desapilar)
 	 */
-	
 	public void sacarContenedorDePlaza(Contenedor contenedor) {
 		if (contenedor == null) throw new IllegalArgumentException("El Ccontenedor no puede ser nulo");
 		if (!contenedor.estadoApilado()) throw new IllegalArgumentException("El Contenedor no esta en ninguna plaza. Se encuentra en transito o en recogida");
@@ -322,12 +321,8 @@ public class Muelle {
 		for (Plaza plaza : this.plazas) {
 			if (plaza.contieneContenedor(contenedor.getCodigo())) {
 		        if (plaza.estaEnUltimoNivel(contenedor.getCodigo())) {
-		        	int plazasAntes = plaza.numeroContenedores();
-		        	boolean teniaTecho = plaza.ultimoContenedor().tieneTecho();
 		        	plaza.desapilarContenedor();
 		        	contenedor.cambiarEstadoDesapilado();
-		        	int plazasDespues = plaza.numeroContenedores();
-		        	this.actualizarPlazas(plazasAntes, plazasDespues, plaza, teniaTecho);
 		        }
 		        else {
 		        	throw new IllegalArgumentException("El Contenedor No esta en el ultimo nivel");
@@ -337,123 +332,45 @@ public class Muelle {
 	}
 	
 	/**
-	 * Metodo que cambia el techo a un contenedor comprobando que este sea el ultimo de la plaza para evitar
-	 * problemas, ya que no se puede cambiar el techo a un contenedor que tenga apilado otro encima
-	 * @param contenedor Contenedor que se cambia el techo
-	 * @throws IllegalArgumentException si el contenedero es nulo, si el contenedor no se encuentra en la ultima
-	 * plaza (no se puede cambiar el techo) o si el contenedor no se encuentra en el muelle
+	 * Metodo para alternar si esta operativo o no (Test)
 	 */
-	public void alternarTechoContenedor(Contenedor contenedor) {
-		if (contenedor == null) throw new IllegalArgumentException("El contenedor no puede ser nulo");
-		String codigo = contenedor.getCodigo();
-		boolean encontrado = false;
-		for (Plaza plaza: this.plazas) {
-			if (plaza.contieneContenedor(codigo)) {
-				encontrado = true;
-				//Si el contenedor esta en el ultimo nivel de una plaza se puede cambiar el techo
-				if (plaza.estaEnUltimoNivel(codigo)) {
-					plaza.ultimoContenedor().alternarTecho();
-					//Si la cantidad de contenedores es menor a la altura, hay cambios en el numero de plazas
-					if (plaza.numeroContenedores() < plaza.altura()) {
-						//Si ahora tiene techo, las llenas son uno mas y semillenas uno menos
-						if (plaza.ultimoContenedor().tieneTecho()) { 
-							this.plazasLlenas--; 
-							this.plazasSemillenas++;
-						}
-						//Si ahora no lo tiene, las llenas son una mas y semillenas uno menos
-						else { 
-							this.plazasLlenas++; 
-							this.plazasSemillenas--;
-						}
-					}
-				}
-				//No se encuentra en la ultima plaza
-				else {
-					throw new IllegalArgumentException("El contenedor no esta en la ultima plaza (no se puede cambiar el techo");
-				}
-			}
-		}
-		if(!encontrado) throw new IllegalArgumentException("No se en cuentra el contenedor");
+	public void alternarOperativo() {
+		this.estadoActual = (this.estadoActual == estado.OPERATIVO) ? estado.FUERA_DE_SERVICIO : estado.OPERATIVO;
+    }	
+	
+	/**
+	 * Metodo que sirve para si un codigo de contenedor es correcto
+	 * @param codigo Codigo del contenedor que se comprueba
+	 * @throws IllegalArgumentException si el codigo es nulo o no corresponde a un codigo correcto
+	 */
+	private void comprobarCodigoContenedor(String codigo) {
+		if (codigo == null) throw new IllegalArgumentException("Codigo no puede ser nulo");
+		if (!codigo.matches("[A-Z]{4}\\d{7}")) throw new IllegalArgumentException("El codigo no pertenece a un codigo de contenedor");
 	}
 	
 	/**
-	 * Metodo para alternar si esta operativo o no (Test)
+	 * Metodo que devuelve el identificador de un muelle. Este identificador sera de 2 digitos.
+	 * @return identificador del muelle
 	 */
-	public void alternarOperativo() {
-        this.operativo = !this.operativo;
-    }
+	public String getIdentificador() {
+		return this.identificador;
+	}
 	
 	/**
-	 * Metodo que actualiza el numero de plazas (vacias, llenas, semillenas) al añadir o eliminar un contenedor
-	 * @param plazasAntes El numero de plazas antes de añadir o eliminar un contenedor
-	 * @param plazasDespues El numero despues
-	 * @param plaza La plaza donde se ha realizado una de esas 2 acciones (eliminar/añadir)
+	 * Metodo que indica si el Muelle esta operativo o no
+	 * @return Si esta operativo (true) o no (false)
 	 */
-	private void actualizarPlazas(int plazasAntes, int plazasDespues, Plaza plaza, boolean teniaTecho) {
-	    int alturaMaxima = plaza.altura();
-	    boolean esVacio = plazasDespues == 0;
-	    boolean esPrimerContenedor = plazasDespues == 1;
-	    boolean esPenultimoContenedor = plazasDespues == (alturaMaxima - 1);
-	    boolean esLleno = plazasDespues == alturaMaxima;
-	    
-	    // Eliminación de contenedor
-	    if (plazasDespues < plazasAntes) {
-	    	//Plaza queda vacia
-	        if (esVacio) {
-	            if (alturaMaxima == 1 || !teniaTecho) {
-	                this.plazasLlenas--;
-	                this.plazasVacias++;
-	            } 
-	            else {
-	                this.plazasSemillenas--;
-	                this.plazasVacias++;
-	            }
-	        }
-	        //Se queda con el penultimo contenedor
-	        else if (esPenultimoContenedor) {
-	        	this.plazasLlenas--;
-	        	this.plazasSemillenas++;
-	        }
-	        
-	        //Se elimina un contenedor que no sea ni el primero ni el ultimo
-	        else {
-	        	//Si el contenedor eliminado tenia no techo Llenas a Semillenas
-	        	if (!teniaTecho) {
-	        		this.plazasLlenas--;
-	        		this.plazasSemillenas++;
-	        	}
-	        }
-	        
-	    }
-	    // Adición de contenedor
-	    else {
-	    	//Si coloca el ultimo contenedor
-	        if (esLleno) {
-	            if (alturaMaxima == 1) {
-	                plazasVacias--;
-	                plazasLlenas++;
-	            } 
-	            else {
-	                plazasSemillenas--;
-	                plazasLlenas++;
-	            }
-	        }
-	        //Si coloca el primer contenedor
-	        else if (esPrimerContenedor) {
-	            if (plaza.ultimoContenedor().tieneTecho()) {
-	                plazasVacias--;
-	                plazasSemillenas++;
-	            } 
-	            else {
-	                plazasVacias--;
-	                plazasLlenas++;
-	            }
-	        } 
-	        //Resto de contenedores sin ser el primero ni el ultimo
-	        else if (!plaza.ultimoContenedor().tieneTecho()) {
-	            plazasSemillenas--;
-	            plazasLlenas++;
-	        }
-	    }
-	}	
-}
\ No newline at end of file
+	public boolean estaOperativo() {
+		return this.estadoActual == estado.OPERATIVO;
+	}
+	
+	/**
+	 * Metodo que devuelve el punto de coordenadas del muelle
+	 * Este punto pertenece a la clase GPSCoordinate
+	 * @return coordenadas del muelle;
+	 */
+	public GPSCoordinate getGPSCoordinate() {
+		return this.cord;
+	}
+}
+
diff --git a/src/es/markse/Puerto.java b/src/es/markse/Puerto.java
index 8eea05d957d5c3420f58f8092d67b51391137a9b..f90506a6be70a2044c1832150d66970460743f62 100644
--- a/src/es/markse/Puerto.java
+++ b/src/es/markse/Puerto.java
@@ -20,8 +20,8 @@ public class Puerto {
 	private final String pais;
 	private final String ciudad;
 	private final List<Muelle> muelles = new ArrayList<>();
-	private final String PAIS_REGUEX ="[A-Za-z]{2}";
-	private final String CIUDAD_REGUEX ="[A-Za-z]{3}";
+	private final Pattern PAIS_REGUEX = Pattern.compile("[A-Za-z]{2}");
+	private final Pattern CIUDAD_REGUEX = Pattern.compile("[A-Za-z]{2}");
 	
 	
 	/**
@@ -55,9 +55,7 @@ public class Puerto {
 	 * @return true si es el formto correcto o false si no lo es
 	 */
 	private boolean comprobarIdentifiadores(String pais, String ciudad) {
-		Pattern paisPattern = Pattern.compile(this.PAIS_REGUEX);
-		Pattern ciudadPattern = Pattern.compile(this.CIUDAD_REGUEX);
-		return (paisPattern.matcher(pais).matches() && ciudadPattern.matcher(ciudad).matches()) ? true: false;
+		return (PAIS_REGUEX.matcher(pais).matches() && CIUDAD_REGUEX.matcher(ciudad).matches()) ? true: false;
 	}
 	
 	/**
@@ -75,7 +73,7 @@ public class Puerto {
 	}
 	
 	/**
-	 * 1.1.2 Método que elimina un muelle del puerto.
+	 * 1.1.2 Método que elimina un muelle del puerto. Si encuentra uno con el mismo ID, lo elimina
 	 * @param id : Identificador del muelle que se elimina
 	 * @return true si se ha eliminado el muelle y false si no se ha eliminado ninguno (n)
 	 */
@@ -85,15 +83,15 @@ public class Puerto {
 	}
 	
 	/**
-	 * Metodo para comprobar si un muelle esta en ese puerto o no, para agregarle, ya que solo puede haber un muelle con el mismo
-	 * identificador para cada puerto.
+	 * Metodo para comprobar si un muelle esta en ese puerto o no, para agregarle, 
+	 * ya que solo puede haber un muelle con el mismo identificador para cada puerto.
 	 * @param m obtejo Muelle
 	 * @return true si esta, y false si no se encuentra en el puerto
 	 */
 	public boolean comprobarMuelleEnPuerto(Muelle m) {
 	    String id = m.getIdentificador();
 	    GPSCoordinate cord = m.getGPSCoordinate();
-	    //Para daca muelle comprobamos si ya esta entro de este puerto
+	    //Para daca muelle comprobamos si hay alguno con el mismo id o las mismas coordenadas
 	    for (Muelle muelle : this.muelles) {
 	        if (id.equals(muelle.getIdentificador())|| (cord.getDistanceTo(muelle.getGPSCoordinate())==0)) {
 	            return true;