public boolean migrate(int processID, int targetSlaveID) {
		// find the current location of the process
		Integer currentLocation = processSlaveMap.get(processID);
		if (currentLocation.intValue() == targetSlaveID) {
			System.out.println("Process already running/suspending at this location...");
		} else {
			// suspend the signal if its currently running
			if (processStatusMap.get(processID).equals("running")) {
				boolean suspendOK = sendSuspendMsg(processID);
				if (!suspendOK) return false;
			}
			try {
				// contact the slave currently holding the process
				Integer slaveID = processSlaveMap.get(processID);
				outputStream = slaveOutputStreamMap.get(slaveID);	
				outputStream.writeObject("migrate");
				outputStream.writeObject(processID);
				
				// wait for acknowledgement of successful serialization
				inputStream = slaveInputStreamMap.get(slaveID);
				String serializeOK = (String) inputStream.readObject();
				if (!serializeOK.equals("done")) {
					return false;
				}

				// contact the recieving slave
				outputStream = slaveOutputStreamMap.get(targetSlaveID);
				if (outputStream == null) {
					Socket slaveSocket = slavelist.get(targetSlaveID);
					outputStream = new ObjectOutputStream(slaveSocket.getOutputStream());
					inputStream = new ObjectInputStream(slaveSocket.getInputStream());
					slaveOutputStreamMap.put(targetSlaveID, outputStream);
					slaveInputStreamMap.put(targetSlaveID, inputStream);
				}
				outputStream.writeObject("receive");
				outputStream.writeObject(processID);
				inputStream = slaveInputStreamMap.get(targetSlaveID);
				String receiveOK = (String) inputStream.readObject();
				if (receiveOK.equals("fail"))
					return false;				
				// update process location
				processSlaveMap.put(processID, targetSlaveID);
			} catch (IOException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		return true;
	}