docs: public int doRecordChange(FieldInfo field, int iChangeType, boolean bDisplayOption)
      {
          int iErrorCode = super.doRecordChange(field, iChangeType, bDisplayOption);
          if (iChangeType == DBConstants.AFTER_UPDATE_TYPE)
          {
              MessageManager messageManager = ((Application)this.getOwner().getTask().getApplication()).getMessageManager();
              if (messageManager != null)
              {
                  BaseMessageHeader messageHeader = m_message.getMessageHeader();
                  String strQueueType = messageHeader.getQueueType();
                  String strQueueName = messageHeader.getQueueName();
                  if (MessageConstants.LOCAL_QUEUE.equalsIgnoreCase(strQueueType))
                  {
                      BaseMessageReceiver messageReceiver = (BaseMessageReceiver)messageManager.getMessageQueue(strQueueName, strQueueType).getMessageReceiver();
                      if (!messageReceiver.getFilterList(messageHeader).hasNext())
                      {   // First time, make sure this receiver can handle my messages\
                          BaseMessageFilter messageFilter = new BaseMessageFilter(strQueueName, strQueueType, null, null);
                          String strProcessClass = null;
                          Map<String,Object> properties = null;
                          // Set up the trx message hander in my local message listener
                          BaseApplication application = (BaseApplication)this.getOwner().getTask().getApplication();
                          // Note: By adding this to the message app, I don't have to worry about a message being added to a freed app.
                          application = (BaseApplication)application.getEnvironment().getMessageApplication(true, application.getProperties());
                          new TrxMessageListener(messageFilter, application, strProcessClass, properties);   // This listener was added to the filter
                          messageReceiver.addMessageFilter(messageFilter);
                      }
                  }
                  if (MessageTransportModel.DIRECT.equalsIgnoreCase((String)messageHeader.get(MessageTransportModel.SEND_MESSAGE_BY_PARAM)))
                  {
                      if (this.getOwner().getTask() instanceof SyncPage)
                      {   // Since this may be time-consuming, display the hour glass (and lock the window, since I'm using your task).
                          Map<String,Object> map = new HashMap<String,Object>();
                          map.put("message", m_message);
                          map.put("transport", getDirectMessageTransport(this.getOwner().getTask()));
                          SyncNotify syncNotify = new SyncNotifyAdapter()
                          {
                              public void done()
                              {
                                  BaseRecordOwner transport = (BaseRecordOwner)this.get("transport");
                                  BaseMessage message = (BaseMessage)this.get("message");
                                  ((MessageSender)transport).sendMessage(message);
                                  transport.free();
                              }                            
                          };
                          TaskScheduler.startPageWorker((SyncPage)this.getOwner().getTask(), syncNotify, null, map, true);
                      }
                      else
                      {
                          BaseRecordOwner transport = getDirectMessageTransport(this.getOwner().getTask());
                          ((MessageSender)transport).sendMessage(m_message);                    
                          transport.free();
                      }
                  }
                  else
                      messageManager.sendMessage(m_message);
              }
              m_message = null;
              
              this.getOwner().removeListener(this, true);    // ONE TIME SHOT
          }
          return iErrorCode;
      }