public void sendBundle(Bundle bundle) {
        ServalNode uplinkNode = null;

        if (!capabilities.isEmpty()) {
            // Elect ourselves to send it
            uplinkNode = this;
        }
        else {
            // Check if anybody in the mesh (i.e. neighbours) have the capability to transmit it
            List<ServalNode> capableNeighbours = new ArrayList<>();
            for (ServalNode neighbor : mesh.getNodes()) {
                if (!neighbor.capabilities.isEmpty()) {
                    capableNeighbours.add(neighbor);
                }
            }

            // Sunshine scenario: a neighbour can upload the packet immediately
            if (!capableNeighbours.isEmpty()) {
                // Choose a random neighbour
                uplinkNode = capableNeighbours.get(new Random().nextInt(capableNeighbours.size()));
            }
        }

        // Upload the packet immediately
        if (uplinkNode != null) {
            sendBundleOverUplink(bundle);
        }
        // Otherwise try store-and-forwarding it to an uplink
        else {
            mesh.broadcast(bundle);
        }
    }