 			if ( event.code == 'LOGGING' ) {
 				trace( '[AirDeviceId] ' + event.level );
 			}
+			else if ( event.code == 'IDFA_VALUE' ) {
+				
+				_idfa = null;
+
+				var callbacks : Vector.<Function> = _idfaCallbacks.slice();
+				_idfaCallbacks.length = 0;
+				
+				for each ( var callback:Function in callbacks ) {
+					callback( _idfa == '00000000-0000-0000-0000-000000000000' ? null : _idfa );
+				}
+			}
 		}
 	}
 }

		private var _id 	: String = null;
		private var _idfv	: String = null;
		private var _idfa	: String = null;
		
		/**
		 * AirDeviceId constructor

		
		/**
		 * 
		 * @param 	salt		a developer specific salt
		 * @param	callback	
		 * @return				unique id for this device
		 */
		public function getID( salt:String, callback:Function ) : void {
			
			if ( !this.isOnDevice ) {
				
				callback( 'simulator' );
				return;
			}
			
			if ( !_id ) {
				_id = _extCtx.call( 'getID', salt ) as String;
			}
			
			callback( _id );
		}
		
		/**
		 * @param	callback	d
		 * @return 				vendor id or null on unavailable/Android
		 */
		public function getIDFV( callback:Function ) : void {
			
			if ( !this.isOnDevice ) {
			
				callback( null );
				return;
			}
			
			if ( !_idfv ) {
				_idfv = _extCtx.call( 'getIDFV' ) as String;
			}
			else {
				_extCtx.call( 'getIDFV' );
			}
			
			callback( _idfv == '00000000-0000-0000-0000-000000000000' ? null : _idfv );
		}
		
		/**
		 * @param	callback	d
		 * @return 				advertiser id
		 */
		public function getIDFA( callback:Function ) : void {
			
			if ( !this.isOnDevice ) {
				
				callback( null );
				return;
			}
			
			if ( _idfa ) {
				callback( _idfa == '00000000-0000-0000-0000-000000000000' ? null : _idfa );
			}
			else if ( isOnIOS ) {
				
				_idfa = _extCtx.call( 'getIDFA' ) as String;
				callback( _idfa == '00000000-0000-0000-0000-000000000000' ? null : _idfa );
			}
			else {
				
				if ( _idfaCallbacks.length == 0 ) {
					_extCtx.call( 'getIDFA' );
				}
				
				_idfaCallbacks.push( callback );
			}
		}
		
		/**
