def sendPrivateMessage(self, ph, ack_key, packet, fail_cb):
        # Send an ACK-able direct message to this node

        def cb(tries):

            if tries == 0:
                del self.msgkeys_out[ack_key]
                fail_cb("Timeout")
                return

            ad = Ad().setRawIPPort(self.ipp)
            ph.sendPacket(packet, ad.getAddrTuple())

            # Set timeout for outbound message
            # This will be cancelled if we receive an AK in time.
            dcall = reactor.callLater(1.0, cb, tries-1)
            dcall.pm_fail_cb = fail_cb
            self.msgkeys_out[ack_key] = dcall

        # Send it 3 times, then fail.
        cb(3)