protected DeviceTivo foundTiVo(
      InetAddress address, String uid, String classification, String machine) {
    uid = "tivo:" + uid;

    DeviceImpl[] devices = device_manager.getDevices();

    String server_name = device_manager.getLocalServiceName();

    for (DeviceImpl device : devices) {

      if (device instanceof DeviceTivo) {

        DeviceTivo tivo = (DeviceTivo) device;

        if (device.getID().equals(uid)) {

          if (classification != null) {

            String existing_classification = device.getClassification();

            if (!classification.equals(existing_classification)) {

              device.setPersistentStringProperty(DeviceImpl.PP_REND_CLASSIFICATION, classification);
            }
          }

          tivo.found(this, address, server_name, machine);

          return (tivo);
        }
      }
    }

    // unfortunately we can't deduce the series from the browse request so start off with a series 3
    // this will be corrected later if we receive a beacon which *does* contain the series details

    if (classification == null) {

      classification = "tivo.series3";
    }

    DeviceTivo new_device = new DeviceTivo(device_manager, uid, classification);

    DeviceTivo result = (DeviceTivo) device_manager.addDevice(new_device);

    // possible race here so handle case where device already present

    if (result == new_device) {

      new_device.found(this, address, server_name, machine);
    }

    return (result);
  }