 		}
 
 		/**
-		 * The default handler for admin IQ messages.
-		 * Dispatches the adminError event if anything went wrong.
-		 */
-		private function finish_admin( iq:IQ ):void
-		{
-			if ( iq.type == IQ.TYPE_ERROR )
-			{
-				var event:RoomEvent = new RoomEvent( RoomEvent.ADMIN_ERROR );
-				event.errorCondition = iq.errorCondition;
-				event.errorMessage = iq.errorMessage;
-				event.errorType = iq.errorType;
-				event.errorCode = iq.errorCode;
-				dispatchEvent( event );
-			}
-		}
-
-		/**
-		 * IQ callback when configuration is complete.
-		 */
-		private function finish_configure( iq:IQ ):void
-		{
-			if( iq.type == IQ.TYPE_ERROR )
-			{
-				finish_admin( iq );
-				return;
-			}
-
+		 * @private
+		 *
+		 * The default error handler for admin IQ messages.
+		 * Dispatches the adminError event.
+		 */
+		private function admin_error( iq:IQ ):void
+		{
+			var event:RoomEvent = new RoomEvent( RoomEvent.ADMIN_ERROR );
+			event.errorCondition = iq.errorCondition;
+			event.errorMessage = iq.errorMessage;
+			event.errorType = iq.errorType;
+			event.errorCode = iq.errorCode;
+			dispatchEvent( event );
+		}
+
+		/**
+		 * @private
+		 *
+		 * The default response handler for admin IQ messages.
+		 */
+		private function admin_response( iq:IQ ):void
+		{
+		}
+
+		/**
+		 * @private
+		 */
+		private function ban_error( iq:IQ ):void
+		{
+			admin_error( iq );
+		}
+
+		/**
+		 * @private
+		 */
+		private function ban_response( iq:IQ ):void
+		{
+		}
+
+		/**
+		 * @private
+		 */
+		private function configure_error( iq:IQ ):void
+		{
+			admin_error( iq );
+		}
+
+		/**
+		 * @private
+		 */
+		private function configure_response( iq:IQ ):void
+		{
 			var event:RoomEvent = new RoomEvent( RoomEvent.CONFIGURE_ROOM_COMPLETE );
 			dispatchEvent( event );
 		}
 
 		/**
-		 * IQ callback when grant is complete.
-		 */
-		private function finish_grant( iq:IQ ):void
-		{
-			if( iq.type == IQ.TYPE_ERROR )
-			{
-				finish_admin( iq );
-				return;
-			}
-
+		 * @private
+		 */
+		private function grant_error( iq:IQ ):void
+		{
+			if( affiliationExtension is MUCAdminExtension && affiliationArgs.length > 0 )
+			{
+				affiliationExtension = new MUCOwnerExtension();
+				grant.apply( null, affiliationArgs );
+			}
+			else
+			{
+				affiliationArgs = [];
+
+				admin_error( iq );
+			}
+		}
+
+		/**
+		 * @private
+		 */
+		private function grant_response( iq:IQ ):void
+		{
+			affiliationArgs = [];
+			
 			var event:RoomEvent = new RoomEvent( RoomEvent.AFFILIATION_CHANGE_COMPLETE );
 			dispatchEvent( event );
 		}
 
 		/**
-		 * IQ callback when affiliate request is complete.
-		 */
-		private function finish_requestAffiliates( iq:IQ ):void
-		{
-			finish_admin( iq );
-			if ( iq.type == IQ.TYPE_RESULT )
-			{
-				var adminExt:MUCAdminExtension = iq.getAllExtensionsByNS( MUCAdminExtension.NS )[ 0 ];
-				var items:Array = adminExt.getAllItems();
-				// trace("Affiliates: " + items);
-				var event:RoomEvent = new RoomEvent( RoomEvent.AFFILIATIONS );
-				event.data = items;
-				dispatchEvent( event );
-			}
-		}
-
-		/**
-		 * IQ callback when form is ready.
-		 */
-		private function finish_requestConfiguration( iq:IQ ):void
-		{
-			if ( iq.type == IQ.TYPE_ERROR )
-			{
-				finish_admin( iq );
-				return;
-			}
-
-			var ownerExt:MUCOwnerExtension = iq.getAllExtensionsByNS( MUCOwnerExtension.NS )[ 0 ];
-			var form:FormExtension = ownerExt.getAllExtensionsByNS( FormExtension.NS )[ 0 ];
-
-			if ( form.type == FormExtension.TYPE_REQUEST )
-			{
-				var event:RoomEvent = new RoomEvent( RoomEvent.CONFIGURE_ROOM );
-				event.data = form;
-				dispatchEvent( event );
-			}
-		}
-
-		/**
+		 * @private
 		 *
 		 * @param	eventObj
 		 */
 		private function handleEvent( eventObj:Object ):void
 		{
 			var userExt:MUCUserExtension;
-			
+
 			switch ( eventObj.type )
 			{
 				case "message":

					occupant.affiliation = item.affiliation;
					occupant.role = item.role;
					occupant.show = aPresence.show;
					
					// Notify listeners that a user's presence has been updated
					roomEvent = new RoomEvent( RoomEvent.USER_PRESENCE_CHANGE );
					roomEvent.nickname = userNickname;

		 */
		public function configure( fieldmap:Object ):void
		{
			var iq:IQ = new IQ( roomJID.escaped, IQ.TYPE_SET, null, configure_response, configure_error );
			var ownerExt:MUCOwnerExtension = new MUCOwnerExtension();
			var form:FormExtension;

