@Override
  public Collection<SourcedDeviceUpnp> getDeviceList() {
    // horribly unoptimal impl!
    Map<String, SourcedDeviceUpnp> baseXmpp =
        convertToSourcedDimmableLightMap(mXmppConnector.getDeviceList(), Source.XMPP);
    Map<String, SourcedDeviceUpnp> baseLocal =
        convertToSourcedDimmableLightMap(mLocalConnector.getDeviceList(), Source.LOCAL);

    Multimap<String, SourcedDeviceUpnp> multiMap = ArrayListMultimap.create();
    multiMap.putAll(Multimaps.forMap(baseXmpp));
    multiMap.putAll(Multimaps.forMap(baseLocal));

    Iterable<SourcedDeviceUpnp> lights =
        Iterables.transform(
            multiMap.asMap().values(),
            new Function<Collection<SourcedDeviceUpnp>, SourcedDeviceUpnp>() {
              @Override
              public SourcedDeviceUpnp apply(Collection<SourcedDeviceUpnp> lightsCollection) {
                EnumSet<Source> sources = EnumSet.noneOf(Source.class);
                for (SourcedDeviceUpnp light : lightsCollection) {
                  sources.addAll(light.getSources());
                }
                // we make srong assumption here that all sources on list have same state
                // (name/switch state/brightness)
                SourcedDeviceUpnp first = Iterables.getFirst(lightsCollection, null);
                first.setSources(sources);
                return first;
              }
            });

    return Lists.newArrayList(lights);
  }
 @Override
 public void refresh() {
   mXmppConnector.refresh();
   mLocalConnector.refresh();
 }