docs: public boolean put(
      SIMPMessage msg,
      TransactionCommon transaction,
      InputHandlerStore inputHandlerStore,
      boolean storedByIH)
      throws SIResourceException
    {
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
        SibTr.entry(
          tc,
          "put",
          new Object[] {
            msg,
            transaction,
            inputHandlerStore,
            new Boolean(storedByIH)});
      
      // Get the JsMessage as we need to update the Guaranteed fields
      JsMessage jsMsg = msg.getMessage();
      SIMPUtils.setGuaranteedDeliveryProperties(jsMsg,
          messageProcessor.getMessagingEngineUuid(), 
          transmissionItemStream.getLocalizingMEUuid(),
          null,
          null,
          destinationHandler.getUuid(),
          ProtocolType.UNICASTINPUT,
          GDConfig.PROTOCOL_VERSION);
      
      // Remember if the original user transaction was a real one or not
      ((MessageItem)msg).setTransacted(!transaction.isAutoCommit());
  
      try
      {
        // Optimitically add the message to the sourceStreamManager before adding
        // the item to the itemstream, as this ensures the required GD fields are
        // initialised without having to initialise them to dummy values.
        boolean addedToStream = sourceStreamManager.addMessage(msg);
  
        // If this message was not added to the stream (the message is best effort)
        // there is no need to add it to the itemStream as there will be no possibility
        // for recovery at a later date.
        if(!addedToStream)
        {
          // If the stream was guessed and we are best effort then discard
          // (Also avoids NPE for PK36530)
          if (!msg.getStreamIsGuess())
          {
            // If the destination in a Link add Link specific properties to message
            if( isLink )
            {
              // Prevent any concurrent serialization of the JsMessage that could fail
              // due to having one property set but not the other
              synchronized(((MessageItem)msg).getSynchUpdateLock())
              {
                jsMsg = addLinkProps(jsMsg);
              }
            }
  
            // If the message was not transacted we can send it now
            if(!msg.isTransacted())
            {
              if (TraceComponent.isAnyTracingEnabled() && UserTrace.tc_mt.isDebugEnabled())
                UserTrace.traceOutboundSend(jsMsg, 
                                         routingMEUuid, 
                                         destinationHandler.getName(),
                                         destinationHandler.isForeignBus() || destinationHandler.isLink(),
                                         destinationHandler.isMQLink(),
                                         destinationHandler.isTemporary());
            
              //  Send message using MPIO
              mpio.sendToMe(routingMEUuid,
                            msg.getPriority(),
                            jsMsg);
            }
            // Otherwise we wait for the transaction to commit
            else
              msg.registerMessageEventListener(MessageEvents.POST_COMMITTED_TRANSACTION, this);
          }
        }
        else
        {
          LocalTransaction siTran = null;
        
          if(!msg.isTransacted())
          { 
            //Use a local transaction as code is driven from the commit callback
            siTran = messageProcessor.getTXManager().createLocalTransaction(false);
            transaction = siTran;
          }
        
          Transaction msTran = messageProcessor.resolveAndEnlistMsgStoreTransaction(transaction);
          
          // Add the item, but don't lock it until we are ready to send it 
          try 
          {
            transmissionItemStream.addItem((MessageItem) msg, msTran);
          }
          catch (OutOfCacheSpace e)
          {
            // No FFDC code needed
            //If the add failed, remove the message from the sourceStreamManager
            sourceStreamManager.removeMessage(msg);
            throw e;       
          }
          catch (MessageStoreException e)
          {
            // FFDC
            FFDCFilter.processException(
              e,
              "com.ibm.ws.sib.processor.impl.PtoPOutputHandler.put",
              "1:505:1.241",
              this);
            //If the add failed, remove the message from the sourceStreamManager
            sourceStreamManager.removeMessage(msg);
            throw e;
          }                    
      
          registerForEvents(msg);
  
          if (siTran != null)
          {
            try
            {
              siTran.commit();
            }
            catch (SIConnectionLostException e)
            {
              // No FFDC code needed
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "put", "SIResourceException");
              throw new SIResourceException(e);
            }
            catch (SIIncorrectCallException e)
            {
              // No FFDC code needed
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "put", "SIResourceException");
              throw new SIResourceException(e);
            }
            catch (SIErrorException e)
            {
              // No FFDC code needed
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "put", "SIResourceException");
              throw new SIResourceException(e);
            }      
          }
        }
      }
      catch (OutOfCacheSpace e)
      {
        // No FFDC code needed
        SibTr.exception(tc, e);
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(tc, "put", e);
        
        throw new SIResourceException(e);       
      }
      catch (MessageStoreException e)
      {
        // MessageStoreException shouldn't occur so FFDC.
        FFDCFilter.processException(
          e,
          "com.ibm.ws.sib.processor.impl.PtoPOutputHandler.put",
          "1:555:1.241",
          this);
  
        SibTr.exception(tc, e);
  
        if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
          SibTr.exit(tc, "put", e);
        
        SibTr.error(tc, "INTERNAL_MESSAGING_ERROR_CWSIP0002",
          new Object[] { 
            "com.ibm.ws.sib.processor.impl.PtoPOutputHandler", "1:565:1.241", e });
  
        throw new SIResourceException(
          nls.getFormattedMessage(
            "INTERNAL_MESSAGING_ERROR_CWSIP0002",
            new Object[] { 
              "com.ibm.ws.sib.processor.impl.PtoPOutputHandler", "1:571:1.241", e },
            null),
          e);
      }
  
      if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
         SibTr.exit(tc, "put", new Boolean(storedByIH));
  
      return storedByIH;
    }