public List<Tuple<Integer,Integer>> getPath ( Tuple<Integer,Integer> start, Tuple<Integer,Integer> goal ) {
		List<Tuple<Integer,Integer>> o = new ArrayList<Tuple<Integer,Integer>>();

		// Don't run A* for a trivial case
		if ( start.equals(goal) ) {
			o.add(goal);
			return o;
		}
		
		// Check to see if we already have this path on file
		Point2D.Double startPoint = new Point2D.Double(start.x, start.y);
		Point2D.Double goalPoint = new Point2D.Double(goal.x, goal.y);
		Line2D.Double pathLine = new Line2D.Double(startPoint,goalPoint);
		if ( this.pathMap.containsKey(pathLine)) {
			return this.pathMap.get(pathLine);
		}
		
		log.debug("Goal" + goal + " is valid? " + this.validBoard[goal.x][goal.y]);
		
		// shrink the wall buffer and endpoint buffers -- there must be a way from point A to point B on a valid board
		double wallBuffer = 0;
		getValidBoard(wallBuffer);

		// shrink endpoint buffer
		for ( int a = 0; a <= this.defaultEndpointBufferSize; a++ ) {
			this.currentEndpointBufferSize = this.defaultEndpointBufferSize-a;
			o = aStar(start,goal);
			if ( o != null ) {
				return o;
			}
		}
		this.currentEndpointBufferSize = this.defaultEndpointBufferSize;
		
		return o;
	}