private void internalRemove(PacketInfo packetInfo)
    {
        if (packetInfo.next != null)
        {
            packetInfo.next.previous = packetInfo.previous;
        }

        if (packetInfo.previous != null)
        {
            packetInfo.previous.next = packetInfo.next;
        }

        if (packetInfo.equals(head))
        {
            head = packetInfo.next;
        }

        if (packetInfo.equals(tail))
        {
            tail = packetInfo.previous;
        }

        this.nPackets = this.nPackets - 1;

        if(packetInfo.hasNoRef())
        {
            manager.deleteOutgoingPacket(packetInfo.packet);
            
            // For GC
            packetInfo.packet = null;
            packetInfo.previous = null;
            packetInfo.next = null;
            packetInfo.killKey = null;
        }
        else
        {
            removedList.add(packetInfo);
            packetInfo.blnWaitingForRemoval = true;
        }
    }