public void update(double timeDifference){
		for (int i=transfer.size()-1; i>=0; i--){
			Aircraft b = transfer.get(i);
			b.update(timeDifference);

			//handle completed transfer path
			if (b.isFinished()){
				Aircraft a = transferStore.remove(i);
				transfer.remove(i);
				if (b.getFlightPlan().getOrigin() == wLeftTop){
					right.add(a);
				} else {
					left.add(a);
				}
			}
		}

		//wind += ( (float)Math.cos(wind/7) +(float)Math.sin(wind/13) ) *20 *timeDifference;
		for (int i=features.size()-1; i>=0; i--){
			Feature f = features.get(i);
			f.scale += f.scaleDrift * timeDifference;
			f.x += wind * timeDifference;
			f.y += f.yDrift * timeDifference;

			//remove features that are no longer visible
			if (f.x -f.image.width()*f.scale > width+20){
				features.remove(i);
				continue;
			}
			if (f.x +f.image.width()*f.scale +20 < 0){
				features.remove(i);
				continue;
			}

		}

		//generate a new feature ~ every second
		if (Math.random() < timeDifference){
			Image image = clouds[RandomNumber.randInclusiveInt(0, clouds.length-1)];
			int	w = (int)Math.ceil(image.width()),
				h = (int)Math.ceil(image.height());
			double scale = ((double)height/h) * (Math.random() +1);
			double scaleDrift = (Math.random()*0.05 -0.025)*scale;
			double xPos = (wind > 0) ? -w*scale : width +w*scale;
			double yPos = (height + 2*h*scale)*Math.random()
					-h*scale;
			double yDrift = Math.random()*0.02*height -0.01*height;

			Feature f = new Feature(image, scale, scaleDrift,
					xPos, yPos, yDrift);
			features.add(f);
			//System.out.println(features.size() +"+\t" +f.toString());
		}

	}