public synchronized static AlienFXController getAlienFXDevice()
		throws AlienFXControllerNotFoundException, AlienFXControllerUnknownDeviceException,
		       AlienFXCommunicationException
	{
		if(controller != null)
			return controller;
		
		int deviceId = LEDController.initialize();
		
		if(deviceId == LEDController.NOT_FOUND)
			throw new AlienFXControllerNotFoundException();
		
		else if (deviceId == LEDController.ALLPOWERFULL_ALIENFX)
			controller = new AlienFXAllPowerFull();
		
		else if(deviceId == LEDController.AREA51_ALIENFX)
			controller = new AlienFXArea51Controller();
		
		else if(deviceId == LEDController.M14XR2_ALIENFX)
			controller = new AlienFXM14xR2Controller();
			
		else if(deviceId == LEDController.M14XR3_ALIENFX)
			controller = new AlienFXM14xR3Controller();

		else if(deviceId == LEDController.M17XR3_ALIENFX)
			controller = new AlienFXM17xController("Alienware M17x R3");

		else if(deviceId == LEDController.M17X_ALIENFX)
			controller = new AlienFXM17xController();

		else if(deviceId == LEDController.M18XR2_ALIENFX)
			controller = new AlienFXM18xR2Controller();

		else throw new AlienFXControllerUnknownDeviceException();

		controller.ping();
		
		return controller;
	}