 				_tempCoord.zoom = higherQualZoomLevel;
 		}
 		
-		private function getTileUrls(coord:Coordinate):String
-		{
-			if(!wmsURL || !wmsURL.value)
+		private function getTileUrl(coord:Coordinate, data:IBounds2D, screen:IBounds2D):String
+		{
+			if (!wmsURL || !wmsURL.value)
 				return null;
 			
-			var url:String = wmsURL.value;
-			
-			url= url.replace('{z}','{0}');
-			url= url.replace('{x}','{1}');
-			url= url.replace('{y}','{2}');
-			
-			url = StringUtil.substitute(url,coord.zoom.toString(),coord.column.toString(),coord.row.toString());
-			
-			return url;
+			return StandardLib.replace(wmsURL.value, 
+				'{x}', String(coord.column),
+				'{y}', String(coord.row),
+				'{z}', String(coord.zoom),
+				'{bbox}', [data.getXMin(), data.getYMin(), data.getXMax(), data.getYMax()].join(','),
+				'{size}', [screen.getXCoverage(), screen.getYCoverage()].join(',')
+			);
 		}
 		
 		/**

		{
			if(_currentTileIndex == null || !wmsURL.value || !imageAttributesSet)
				return [];
			var i:int
			var copyDataBounds:Bounds2D = _tempBounds3;
			var latLonCopyDataBounds:Bounds2D = _tempBounds4;
			
			
			// first determine zoom level using all of the data bounds in lat/lon
			setTempCoordZoomLevel(dataBounds, screenBounds, preferLowerQuality); // this sets _tempCoord.zoom 

			if(!wmsURL.value)
				return;
			
			//http://tiles.domain.com/layer/{z}/{x}/{y}.png
			getAllowedBounds(_tempBounds);
			_tempBounds2.setBounds(0, 0, 256, 256);
			
			var basicReq:String = getTileUrl(new Coordinate(0,0,0), _tempBounds, _tempBounds2);
			var instance:CustomWMS = this;
			WeaveAPI.URLRequestUtils.getContent(
				this,
