[java-identity-provider] 26/51: IDP-1121 Make AttributeDependencies and DataConnector dependencies different

Rod Widdowson rdw at steadingsoftware.com
Wed Feb 6 08:42:57 EST 2019


This is an automated email from the git hooks/post-receive script.

rdw pushed a commit to branch master
in repository java-identity-provider.

View the commit online:
http://git.shibboleth.net/view/?p=java-identity-provider.git;a=commit;h=03e296c48aea650ad3daeac09fd55379bde71f40

commit 03e296c48aea650ad3daeac09fd55379bde71f40
Author: Rod Widdowson <rdw at steadingsoftware.com>
AuthorDate: Tue Jan 22 13:59:24 2019 +0000

    IDP-1121 Make AttributeDependencies and DataConnector dependencies different
    
    https://issues.shibboleth.net/jira/browse/IDP-1121
    
    A simple, but wide ranging change.  Instead of single sets of
    dependenies we have two, one for attribute definitions and one
    for data connectors.
    
    This simplifies a huge amount of complex code (for instance
    DependencySupport) at the cost of a lot of boiler plate.
---
 .../resolver/AbstractAttributeDefinition.java      |  11 --
 .../attribute/resolver/AbstractResolverPlugin.java |  84 ++++++----
 .../MultipleResultAnErrorResolutionException.java  |   2 +-
 .../NoResultAnErrorResolutionException.java        |   2 +-
 .../resolver/PluginDependencySupport.java          | 177 +++++++++------------
 .../resolver/ResolvedAttributeDefinition.java      |   9 +-
 .../attribute/resolver/ResolvedDataConnector.java  |   9 +-
 .../resolver/ResolverDataConnectorDependency.java  |  37 ++---
 .../idp/attribute/resolver/ResolverPlugin.java     |  15 +-
 .../context/AttributeResolverWorkContext.java      |   2 +-
 .../resolver/AbstractAttributeDefinitionTest.java  |  32 ++--
 .../resolver/AbstractResolverPluginTest.java       | 117 +++++++++-----
 .../idp/attribute/resolver/MockDataConnector.java  |   9 +-
 .../resolver/PluginDependencySupportTest.java      |  31 ++--
 .../resolver/ResolvedAttributeDefinitionTest.java  |  10 +-
 .../resolver/ResolvedDataConnectorTest.java        |  14 +-
 .../ad/impl/PrescopedAttributeDefinition.java      |  10 +-
 .../ad/impl/RegexSplitAttributeDefinition.java     |   7 +-
 .../ad/impl/ScopedAttributeDefinition.java         |   7 +-
 .../ad/impl/ScriptedAttributeDefinition.java       |   4 +-
 .../ad/impl/SimpleAttributeDefinition.java         |   7 +-
 .../ad/impl/TemplateAttributeDefinition.java       |  32 ++--
 .../ad/mapped/impl/MappedAttributeDefinition.java  |   7 +-
 .../dc/impl/AbstractSearchDataConnector.java       |   4 +-
 .../resolver/dc/impl/ScriptedDataConnector.java    |   4 +-
 .../resolver/impl/AttributeResolverImpl.java       |  79 +++++----
 .../resolver/ad/impl/PrescopedAtributeTest.java    |  29 ++--
 .../resolver/ad/impl/RegexAtributeTest.java        |  31 ++--
 ...SAML1NameIdentifierAttributeDefinitionTest.java |  30 ++--
 .../impl/SAML2NameIDAttributeDefinitionTest.java   |  22 +--
 .../resolver/ad/impl/ScopedAttributeTest.java      |  22 +--
 .../resolver/ad/impl/ScriptedAttributeTest.java    |  26 +--
 .../resolver/ad/impl/SimpleAttributeTest.java      |  26 +--
 .../resolver/ad/impl/TemplateAttributeTest.java    |  40 ++---
 .../ad/mapped/impl/MappedAttributeTest.java        |  33 ++--
 .../dc/impl/ComputedIDDataConnectorTest.java       |  29 ++--
 .../resolver/impl/AttributeResolverImplTest.java   |  81 +++++-----
 ...ava => BaseResolverPluginDependencyParser.java} |  33 +---
 .../resolver/spring/BaseResolverPluginParser.java  |  18 ++-
 .../impl/AbstractResolverPluginFactoryBean.java    |  57 +++++--
 .../impl/AttributeResolverNamespaceHandler.java    |   3 +-
 .../impl/InputAttributeDefinitionParser.java       |   4 +-
 .../spring/impl/InputDataConnectorParser.java      |   4 +-
 .../resolver/spring/DependencyTypesTest.java       |   3 +-
 .../spring/ad/SimpleAttributeParserTest.java       |  32 ++--
 .../spring/dc/StoredIDDataConnectorParserTest.java |  13 +-
 .../impl/AbstractPersistentIdDataConnector.java    |  55 +++----
 .../SAML1NameIdentifierAttributeDefinition.java    |   5 +-
 .../impl/SAML2NameIDAttributeDefinition.java       |   5 +-
 .../impl/TransientIdAttributeDefinitionTest.java   |   8 +-
 .../net/shibboleth/idp/saml/impl/TestSources.java  |  17 +-
 .../idp/saml/nameid/impl/TransientDecoderTest.java |   2 +-
 52 files changed, 738 insertions(+), 612 deletions(-)

diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java
index 7d9856b..c335c91 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinition.java
@@ -212,17 +212,6 @@ public abstract class AbstractAttributeDefinition extends AbstractResolverPlugin
 
         // Set up the dependencies first. Then the initialize in the parent
         // will correctly rehash the dependencies.
-        if (null != getSourceAttributeId()) {
-            for (final ResolverPluginDependency depends : getDependencies()) {
-                if (depends instanceof ResolverAttributeDefinitionDependency) {
-                    // No work needed.  The name is the reference 
-                } else if (depends instanceof ResolverDataConnectorDependency) {
-                    // No work needed.  The names are stored elsewhere 
-                } else {
-                    depends.setDependencyAttributeId(getSourceAttributeId());
-                }
-            }
-        }
         super.doInitialize();
         // The Id is now definitive. Just in case it was used prior to that, reset the getPrefixCache
         logPrefix = null;
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
index c676de2..0290705 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPlugin.java
@@ -28,8 +28,18 @@ import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.ThreadSafe;
 
+import org.opensaml.messaging.context.navigate.ParentContextLookup;
+import org.opensaml.profile.context.MetricContext;
+import org.opensaml.profile.context.ProfileRequestContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.DisposableBean;
+
+import com.google.common.base.Predicates;
+
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
+import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.NullableElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.Unmodifiable;
@@ -39,16 +49,6 @@ import net.shibboleth.utilities.java.support.component.ComponentInitializationEx
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 import net.shibboleth.utilities.java.support.logic.Constraint;
 
-import org.opensaml.messaging.context.navigate.ParentContextLookup;
-import org.opensaml.profile.context.MetricContext;
-import org.opensaml.profile.context.ProfileRequestContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.DisposableBean;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableSet;
-
 /**
  * Base class for all {@link ResolverPlugin}s.
  * 
@@ -71,8 +71,14 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
     /** Criterion that must be met for this plugin to be active for the given request. */
     @Nullable private Predicate<ProfileRequestContext> activationCondition;
 
-    /** IDs of the {@link ResolverPlugin}s this plug-in depends on. */
-    @Nonnull @NonnullElements private Set<ResolverPluginDependency> dependencies = Collections.emptySet();
+    /** The {@link ResolverAttributeDefinitionDependency}s this plug-in depends on. */
+    @Nonnull @NonnullElements private Set<ResolverAttributeDefinitionDependency> attributeDependencies =
+            Collections.emptySet();
+    
+    /** The {@link ResolverDataConnectorDependency}s this plug-in depends on. */
+    @Nonnull @NonnullElements private Set<ResolverDataConnectorDependency> dataConnectorDependencies =
+            Collections.emptySet();
+
 
     /** {@inheritDoc} */
     @Override public boolean isPropagateResolutionExceptions() {
@@ -124,31 +130,60 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
     public void setActivationCondition(@Nonnull final Predicate<ProfileRequestContext> pred) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
-        activationCondition = Constraint.isNotNull(pred, "Activiation condition cannot be null");
+        activationCondition = Constraint.isNotNull(pred, "Activation condition cannot be null");
     }
 
     /**
+     * Gets the unmodifiable list of attributeDependencies for this plugin.
+     * 
+     * @return unmodifiable list of dependencies for this plugin, never null
+     */
+    @Override @NonnullAfterInit @NonnullElements @Unmodifiable public Set<ResolverAttributeDefinitionDependency>
+            getAttributeDependencies() {
+        return attributeDependencies;
+    }
+    
+    /**
      * Gets the unmodifiable list of dependencies for this plugin.
      * 
      * @return unmodifiable list of dependencies for this plugin, never null
      */
-    @Override @Nonnull @NonnullElements @Unmodifiable public Set<ResolverPluginDependency> getDependencies() {
-        return dependencies;
+    @Override @NonnullAfterInit @NonnullElements @Unmodifiable public Set<ResolverDataConnectorDependency>
+            getDataConnectorDependencies() {
+        return dataConnectorDependencies;
     }
 
+
     /**
      * Sets the list of dependencies for this plugin.
      * 
-     * @param pluginDependencies unmodifiable list of dependencies for this plugin
+     * @param dependencies unmodifiable list of dependencies for this plugin
      */
-    public void setDependencies(@Nullable @NullableElements final Set<ResolverPluginDependency> pluginDependencies) {
+    public void setAttributeDependencies(@Nullable @NullableElements
+            final Set<ResolverAttributeDefinitionDependency> dependencies) {
         ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
 
-        final HashSet<ResolverPluginDependency> checkedDeps = new HashSet<>();
-        CollectionSupport.addIf(checkedDeps, pluginDependencies, Predicates.notNull());
-        dependencies = Collections.unmodifiableSet(checkedDeps);
+        final HashSet<ResolverAttributeDefinitionDependency> checkedDeps = new HashSet<>();
+        CollectionSupport.addIf(checkedDeps, dependencies, Predicates.notNull());
+        attributeDependencies = Collections.unmodifiableSet(checkedDeps);
     }
+    
+    /**
+     * Sets the list of dependencies for this plugin.
+     * 
+     * @param dependencies unmodifiable list of dependencies for this plugin
+     */
+    public void setDataConnectorDependencies(@Nullable @NullableElements
+            final Set<ResolverDataConnectorDependency> dependencies) {
+        ComponentSupport.ifInitializedThrowUnmodifiabledComponentException(this);
+        ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
+
+        final HashSet<ResolverDataConnectorDependency> checkedDeps = new HashSet<>();
+        CollectionSupport.addIf(checkedDeps, dependencies, Predicates.notNull());
+        dataConnectorDependencies = Collections.unmodifiableSet(checkedDeps);
+    }
+
 
     /**
      * Performs the attribute resolution for this plugin.
@@ -226,19 +261,14 @@ public abstract class AbstractResolverPlugin<ResolvedType> extends AbstractIdent
     /** {@inheritDoc} */
     @Override protected void doDestroy() {
         activationCondition = Predicates.alwaysFalse();
-        dependencies = Collections.emptySet();
-
+        attributeDependencies = Collections.emptySet();
+        dataConnectorDependencies = Collections.emptySet();
         super.doDestroy();
     }
 
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
-
-        // rebuild the hash set - we may have modified the dependencies in the
-        // child class initialization.
-        final HashSet<ResolverPluginDependency> checkedDeps = new HashSet<>(dependencies);
-        dependencies = ImmutableSet.copyOf(checkedDeps);
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/MultipleResultAnErrorResolutionException.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/MultipleResultAnErrorResolutionException.java
index 3a359b4..dd1437b 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/MultipleResultAnErrorResolutionException.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/MultipleResultAnErrorResolutionException.java
@@ -19,7 +19,7 @@ package net.shibboleth.idp.attribute.resolver;
 
 /**
  * A special ResolutionException which is thrown if multiple results were resolved 
- * by a dataconnector and the deployer specified "MultipleResultsAnError". 
+ * by a data connector and the deployer specified "MultipleResultsAnError". 
  */
 public class MultipleResultAnErrorResolutionException extends ResolutionException {
 
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/NoResultAnErrorResolutionException.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/NoResultAnErrorResolutionException.java
index 796b322..2b0b783 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/NoResultAnErrorResolutionException.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/NoResultAnErrorResolutionException.java
@@ -19,7 +19,7 @@ package net.shibboleth.idp.attribute.resolver;
 
 /**
  * A special ResolutionException which is thrown if no results were resolved 
- * by a dataconnector and the deployer specified "NoResultsAnError". 
+ * by a data connector and the deployer specified "NoResultsAnError". 
  */
 public class NoResultAnErrorResolutionException extends ResolutionException {
 
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java
index d08e8fe..774ec1b 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupport.java
@@ -19,7 +19,6 @@ package net.shibboleth.idp.attribute.resolver;
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -59,88 +58,63 @@ public final class PluginDependencySupport {
      * </p>
      * 
      * @param workContext current attribute resolver work context
-     * @param dependencies set of dependencies
+     * @param attributeDependencies set of dependencies on attribute definitions
+     * @param dataConnectorDependencies set of dependencies on data connector definitions
      * @param attributeDefinitionId the attributeID that these values will be associated with.
      * @return the merged value set. Returns an empty set if we were given a DataConnector as a dependency, but not
      *         attribute name
      */
+    // Checkstyle: MethodLength|CyclomaticComplexity OFF
     @Nonnull @NonnullElements public static List<IdPAttributeValue<?>> getMergedAttributeValues(
             @Nonnull final AttributeResolverWorkContext workContext,
-            @Nonnull @NonnullElements final Collection<ResolverPluginDependency> dependencies,
+            @Nonnull @NonnullElements final Collection<ResolverAttributeDefinitionDependency> attributeDependencies,
+            @Nonnull @NonnullElements final Collection<ResolverDataConnectorDependency> dataConnectorDependencies,
             @Nonnull final String attributeDefinitionId) {
         Constraint.isNotNull(workContext, "Attribute resolution context cannot be null");
-        Constraint.isNotNull(dependencies, "Resolver dependency collection cannot be null");
+        Constraint.isNotNull(attributeDependencies, "Resolver dependency collection cannot be null");
 
         final List<IdPAttributeValue<?>> values = new ArrayList<>();
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("GetMergedAttribute Values for {}", attributeDefinitionId);
+        }
 
-        for (final ResolverPluginDependency dependency : dependencies) {
-            Constraint.isNotNull(dependency, "Resolver dependency cannot be null");
+        for (final ResolverAttributeDefinitionDependency attributeDependency : attributeDependencies) {
+            Constraint.isNotNull(attributeDependency, "Resolver attribute dependency cannot be null");
 
-            final String pluginId = dependency.getDependencyPluginId();
+            final String attributeId = attributeDependency.getDependencyPluginId();
+            final ResolvedAttributeDefinition attributeDefinition =
+                    workContext.getResolvedIdPAttributeDefinitions().get(attributeId);
+            final IdPAttribute resolvedAttribute = attributeDefinition.getResolvedAttribute();
+            if (LOG.isTraceEnabled()) {
+                LOG.trace("Merging Attribute Values from Attribute {}", attributeId);
+            }
+            mergeAttributeValues(resolvedAttribute, values);
+        }
 
-            if (dependency instanceof ResolverAttributeDefinitionDependency) {
-                final ResolvedAttributeDefinition attributeDefinition =
-                        workContext.getResolvedIdPAttributeDefinitions().get(pluginId);
-                final IdPAttribute resolvedAttribute = attributeDefinition.getResolvedAttribute();
-                mergeAttributeValues(resolvedAttribute, values);
-            } else if (dependency instanceof ResolverDataConnectorDependency) {
-                // Merge all specified attribute values.
-                final ResolverDataConnectorDependency dataConnectorDependency =
-                        (ResolverDataConnectorDependency) dependency;
-                final ResolvedDataConnector dataConnector =
-                        workContext.getResolvedDataConnectors().get(dependency.getDependencyPluginId());
-                if (dataConnector != null) { 
-                    final Map<String, IdPAttribute> resolvedAttrs = dataConnector.getResolvedAttributes();
-                    if (null != resolvedAttrs) {
-                        for (final Entry<String, IdPAttribute> entry : resolvedAttrs.entrySet()) {
-                            if (dataConnectorDependency.isAllAttributes()
-                                    || dataConnectorDependency.getAttributeNames().contains(entry.getKey())) {
-                                mergeAttributeValues(entry.getValue(), values);
-                            }
+        for (final ResolverDataConnectorDependency dataConnectorDependency : dataConnectorDependencies) {
+            Constraint.isNotNull(dataConnectorDependency, "Resolver data connector dependency cannot be null");
+
+            final String dataConnectorId = dataConnectorDependency.getDependencyPluginId();
+            final ResolvedDataConnector dataConnector = workContext.getResolvedDataConnectors().get(dataConnectorId);
+            if (dataConnector != null) {
+                final Map<String, IdPAttribute> resolvedAttrs = dataConnector.getResolvedAttributes();
+                if (null != resolvedAttrs) {
+                    for (final Entry<String, IdPAttribute> entry : resolvedAttrs.entrySet()) {
+                        if (dataConnectorDependency.isAllAttributes()
+                                || dataConnectorDependency.getAttributeNames().contains(entry.getKey())) {
+                            mergeAttributeValues(entry.getValue(), values);
+                        }
+                        if (LOG.isTraceEnabled()) {
+                            LOG.trace("Merging Attribute {} from DataConnecteor {}",
+                                    entry.getValue(), dataConnectorId);
                         }
-                    }
-                }
-            } else {
-                final ResolvedAttributeDefinition attributeDefinition =
-                        workContext.getResolvedIdPAttributeDefinitions().get(pluginId);
-                final String dependencyAttributeId = dependency.getDependencyAttributeId();
-                if (attributeDefinition != null) {
-                    if (null == dependencyAttributeId) {
-                        LOG.warn("Plugin '{}' was defined without a sourceAttributeID,  but attribute '{}', specified" +
-                                " as a <Dependency> will be used.", attributeDefinitionId, pluginId);
-                    } else if (!dependencyAttributeId.equals(pluginId)) {
-                        LOG.warn("Plugin '{}' was defined with a sourceAttributeID '{}', " +
-                                "but the attribute definition '{}', specified as a <Dependency> will be used as well.",
-                                attributeDefinitionId, dependencyAttributeId, pluginId);
-                    }
-    
-                    final IdPAttribute resolvedAttribute = attributeDefinition.getResolvedAttribute();
-                    mergeAttributeValues(resolvedAttribute, values);
-                    continue;
-                }
-    
-                final ResolvedDataConnector dataConnector =
-                        workContext.getResolvedDataConnectors().get(dependency.getDependencyPluginId());
-                if (dataConnector != null) {
-                    if (dependency.getDependencyAttributeId() == null) {
-                        LOG.error("Attribute definition '{}' has a data connector"
-                                + " dependency '{}' but no sourceAttributeID.", attributeDefinitionId,
-                                dataConnector.getId());
-                        return Collections.EMPTY_LIST;
-                    }
-    
-                    if (null != dataConnector.getResolvedAttributes()) {
-                        final IdPAttribute resolvedAttribute =
-                                dataConnector.getResolvedAttributes().get(dependency.getDependencyAttributeId());
-                        mergeAttributeValues(resolvedAttribute, values);
-                        continue;
                     }
                 }
             }
         }
-
         return values;
     }
+    // Checkstyle: MethodLength|CyclomaticComplexity ON
 
     /**
      * Gets the values from all dependencies. Attributes, with the same identifier but from different resolver plugins,
@@ -155,63 +129,62 @@ public final class PluginDependencySupport {
      * </p>
      * 
      * @param workContext current attribute resolver work context
-     * @param dependencies set of dependencies
+     * @param dataConnectorDependencies set of dependencies on data connector definitions
+     * @param attributeDependencies set of dependencies
      * 
      * @return the merged value set
      */
+    // Checkstyle: MethodLength|CyclomaticComplexity OFF
     public static Map<String, List<IdPAttributeValue<?>>> getAllAttributeValues(
             @Nonnull final AttributeResolverWorkContext workContext,
-            @Nonnull final Collection<ResolverPluginDependency> dependencies) {
+            @Nonnull final Collection<ResolverAttributeDefinitionDependency> attributeDependencies,
+            @Nonnull @NonnullElements final Collection<ResolverDataConnectorDependency> dataConnectorDependencies) {
 
         final HashMap<String, List<IdPAttributeValue<?>>> result = new HashMap<>();
+        if (LOG.isTraceEnabled()) {
+            LOG.trace("Getting all Attribute Values");
+        }
 
-        for (final ResolverPluginDependency dependency : dependencies) {
-            Constraint.isNotNull(dependency, "Resolver dependency cannot be null");
+        for (final ResolverAttributeDefinitionDependency dependency : attributeDependencies) {
+            Constraint.isNotNull(dependency, "Attribute Definition dependency cannot be null");
 
-            if (dependency instanceof ResolverAttributeDefinitionDependency) {
-                final ResolvedAttributeDefinition attributeDefinition =
-                        workContext.getResolvedIdPAttributeDefinitions().get(dependency.getDependencyPluginId());
-                if (attributeDefinition != null) {
-                    addAttribute(attributeDefinition.getResolvedAttribute(), result);
+            final String attributeId = dependency.getDependencyPluginId();
+            final ResolvedAttributeDefinition attributeDefinition =
+                    workContext.getResolvedIdPAttributeDefinitions().get(attributeId);
+            if (attributeDefinition != null) {
+                if (LOG.isTraceEnabled()) {
+                    LOG.trace("Adding Attribute {}", attributeId);
                 }
-            } else if (dependency instanceof ResolverDataConnectorDependency) {
-                // Just add those attributes specified
-                final ResolverDataConnectorDependency dataConnectorDependency =
-                        (ResolverDataConnectorDependency) dependency;
-                final ResolvedDataConnector dataConnector =
-                        workContext.getResolvedDataConnectors().get(dependency.getDependencyPluginId());
-                if (dataConnector != null) { 
-                    final Map<String, IdPAttribute> resolvedAttrs = dataConnector.getResolvedAttributes();
-                    if (null != resolvedAttrs) {
-                        for (final Entry<String, IdPAttribute> entry : resolvedAttrs.entrySet()) {
-                            if (dataConnectorDependency.isAllAttributes()
-                                    || dataConnectorDependency.getAttributeNames().contains(entry.getKey())) {
-                                addAttribute(entry.getValue(), result);
+                addAttribute(attributeDefinition.getResolvedAttribute(), result);
+            }
+        }
+        
+        for (final ResolverDataConnectorDependency dataConnectorDependency : dataConnectorDependencies) {
+            Constraint.isNotNull(dataConnectorDependency, "Data Connector dependency cannot be null");
+
+            // Just add those attributes specified
+            final String dataConnectorId = dataConnectorDependency.getDependencyPluginId();
+            final ResolvedDataConnector dataConnector =
+                    workContext.getResolvedDataConnectors().get(dataConnectorId);
+            if (dataConnector != null) { 
+                final Map<String, IdPAttribute> resolvedAttrs = dataConnector.getResolvedAttributes();
+                if (null != resolvedAttrs) {
+                    for (final Entry<String, IdPAttribute> entry : resolvedAttrs.entrySet()) {
+                        if (dataConnectorDependency.isAllAttributes()
+                                || dataConnectorDependency.getAttributeNames().contains(entry.getKey())) {
+                            addAttribute(entry.getValue(), result);
+                            if (LOG.isTraceEnabled()) {
+                                LOG.trace("Adding Attribute {} from Data Connector {}",
+                                        entry.getValue(), dataConnectorId);
                             }
                         }
                     }
                 }
-            } else {
-                // deprecated behavior
-                final ResolvedAttributeDefinition attributeDefinition =
-                        workContext.getResolvedIdPAttributeDefinitions().get(dependency.getDependencyPluginId());
-                if (attributeDefinition != null) {
-                    addAttribute(attributeDefinition.getResolvedAttribute(), result);
-                    continue;
-                }
-    
-                final ResolvedDataConnector dataConnector =
-                        workContext.getResolvedDataConnectors().get(dependency.getDependencyPluginId());
-                if (dataConnector != null) {
-                    if (null != dataConnector.getResolvedAttributes()) {
-                        mergeAttributes(dataConnector.getResolvedAttributes(), result);
-                    }
-                }
             }
         }
-
         return result;
     }
+    // Checkstyle: MethodLength|CyclomaticComplexity ON
 
     /**
      * Adds the values of the attributes to the target collection of attribute values indexes by attribute ID.
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java
index 7650f9c..43e35d6 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinition.java
@@ -83,8 +83,13 @@ public final class ResolvedAttributeDefinition extends AbstractAttributeDefiniti
     }
 
     /** {@inheritDoc} */
-    @Override @Nonnull @NonnullElements public Set<ResolverPluginDependency> getDependencies() {
-        return resolvedDefinition.getDependencies();
+    @Override @Nonnull @NonnullElements public Set<ResolverAttributeDefinitionDependency> getAttributeDependencies() {
+        return resolvedDefinition.getAttributeDependencies();
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nonnull @NonnullElements public Set<ResolverDataConnectorDependency> getDataConnectorDependencies() {
+        return resolvedDefinition.getDataConnectorDependencies();
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
index c92f685..e6adb2d 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnector.java
@@ -76,8 +76,13 @@ public final class ResolvedDataConnector extends AbstractDataConnector {
     }
 
     /** {@inheritDoc} */
-    @Override @Nonnull @NonnullElements public Set<ResolverPluginDependency> getDependencies() {
-        return resolvedConnector.getDependencies();
+    @Override @Nonnull @NonnullElements public Set<ResolverAttributeDefinitionDependency> getAttributeDependencies() {
+        return resolvedConnector.getAttributeDependencies();
+    }
+
+    /** {@inheritDoc} */
+    @Override @Nonnull @NonnullElements public Set<ResolverDataConnectorDependency> getDataConnectorDependencies() {
+        return resolvedConnector.getDataConnectorDependencies();
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
index 4ce58bb..58dd8c4 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverDataConnectorDependency.java
@@ -23,20 +23,21 @@ import java.util.HashSet;
 import java.util.Set;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
 
 import net.shibboleth.utilities.java.support.annotation.ParameterName;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.NotEmpty;
-import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
-import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.ObjectType;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 /**
  * A Dependency that references to an Data Connector.
  */
-public final class ResolverDataConnectorDependency extends ResolverPluginDependency {
+public final class ResolverDataConnectorDependency  {
 
+    /** ID of the plugin that will produce the attribute. */
+    @Nonnull @NotEmpty private final String dependencyPluginId;
+
+    
     /** Whether to depend on all the connector's attributes. */
     private boolean allAttributes;
     
@@ -49,11 +50,21 @@ public final class ResolverDataConnectorDependency extends ResolverPluginDepende
      * @param pluginId ID of dependency
      */
     public ResolverDataConnectorDependency(@ParameterName(name="pluginId") final String pluginId) {
-        super(pluginId);
-        
+        dependencyPluginId = pluginId;
         allAttributes = false;
         attributeNames = Collections.emptySet();
     }
+    
+    /**
+     * Gets the ID of the plugin that will produce the attribute.
+     * 
+     * @return ID of the plugin that will produce the attribute, never null or empty
+     */
+    @Nonnull public String getDependencyPluginId() {
+        return dependencyPluginId;
+    }
+
+
 
     /**
      * Get whether all the connector's attributes are part of the dependency.
@@ -90,18 +101,4 @@ public final class ResolverDataConnectorDependency extends ResolverPluginDepende
     public void setAttributeNames(@Nonnull @NotEmpty final Collection<String> names) {
         attributeNames = new HashSet<>(StringSupport.normalizeStringCollection(names));
     }
-   
-    /**
-     * {@inheritDoc}
-     *
-     * @deprecated Use {@link #setAttributeNames} instead
-     * @see        #setAttributeNames
-     */
-    @Override @Deprecated public void setDependencyAttributeId(@Nullable final String attributeId) {
-        DeprecationSupport.warn(ObjectType.METHOD,
-                "ResolverDataConnectorDependency#setDependencyAttributeId(String)",
-                null, "#setAttributeNames(Collection<String>)");
-        super.setDependencyAttributeId(attributeId);
-    }
-
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
index f01c1e4..632a70d 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/ResolverPlugin.java
@@ -60,11 +60,20 @@ public interface ResolverPlugin<ResolvedType> extends UnmodifiableComponent,
     @Nullable Predicate<ProfileRequestContext> getActivationCondition();
 
     /**
-     * Get the unmodifiable list of dependencies for this plugin.
+     * Get the unmodifiable list of attribute dependencies for this plugin.
      * 
-     * @return unmodifiable list of dependencies for this plugin, never null
+     * @return unmodifiable list of attribute dependencies for this plugin, never null
      */
-    @NonnullAfterInit @NonnullElements @Unmodifiable Set<ResolverPluginDependency> getDependencies();
+    @NonnullAfterInit @NonnullElements @Unmodifiable Set<ResolverAttributeDefinitionDependency>
+        getAttributeDependencies();
+
+    /**
+     * Get the unmodifiable list of data connector dependencies for this plugin.
+     * 
+     * @return unmodifiable list of data connector dependencies for this plugin, never null
+     */
+    @NonnullAfterInit @NonnullElements @Unmodifiable Set<ResolverDataConnectorDependency>
+        getDataConnectorDependencies();
 
     /**
      * Perform the attribute resolution for this plugin.
diff --git a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
index 830967e..7a5a8ee 100644
--- a/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
+++ b/idp-attribute-resolver-api/src/main/java/net/shibboleth/idp/attribute/resolver/context/AttributeResolverWorkContext.java
@@ -125,7 +125,7 @@ public class AttributeResolverWorkContext extends BaseContext {
     }
 
     /**
-     * Transfer the attributes from a failover dataconnector to a failed one. This allows up stream processing to
+     * Transfer the attributes from a failover data connector to a failed one. This allows up stream processing to
      * pretend that the failed connector worked OK. The inherent duplication is OK since the code which exploits this
      * does the dedupe.
      *
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinitionTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinitionTest.java
index d69932c..e124afc 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinitionTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractAttributeDefinitionTest.java
@@ -189,31 +189,31 @@ public class AbstractAttributeDefinitionTest {
 
     }
     
+    
     @Test
     public void dependencies() throws ComponentInitializationException {
         MockAttributeDefinition definition = new MockAttributeDefinition("foo", null);
         
-        definition.setDependencies(Collections.singleton((ResolverPluginDependency) new ResolverAttributeDefinitionDependency("plugin")));
+        final ResolverDataConnectorDependency dc  = new ResolverDataConnectorDependency("dc");
+        dc.setAttributeNames(Collections.singletonList("da"));
+        definition.setDataConnectorDependencies(Collections.singleton(dc));
+        definition.setAttributeDependencies(Collections.singleton(new ResolverAttributeDefinitionDependency("ad")));
         definition.initialize();
         
-        Set<ResolverPluginDependency> depends = definition.getDependencies();
+        final Set<ResolverDataConnectorDependency> dDepends = definition.getDataConnectorDependencies();
         
-        Assert.assertEquals(depends.size(), 1);
+        Assert.assertEquals(dDepends.size(), 1);
         Assert.assertNull(definition.getSourceAttributeId());
-        Assert.assertNull(depends.iterator().next().getDependencyAttributeId());
-        
-        definition = new MockAttributeDefinition("foo", null);
-        definition.setSourceAttributeId("source");
-        definition.setDependencies(Collections.singleton((ResolverPluginDependency) new ResolverAttributeDefinitionDependency("source")));
-        definition.initialize();
-        
-        Assert.assertEquals(definition.getSourceAttributeId(), "source");
-        
-        depends = definition.getDependencies();
-        
-        Assert.assertEquals(depends.size(), 1);
-        Assert.assertEquals(depends.iterator().next().getDependencyPluginId(), "source");
+        Assert.assertTrue(dDepends.iterator().next().getAttributeNames().contains("da"));
+        Assert.assertEquals(dDepends.iterator().next().getDependencyPluginId(), "dc");
+
+        final Set<ResolverAttributeDefinitionDependency> aDepends = definition.getAttributeDependencies();
+        Assert.assertEquals(aDepends.size(), 1);
+        Assert.assertNull(definition.getSourceAttributeId());
+        Assert.assertEquals(aDepends.iterator().next().getDependencyPluginId(), "ad");
+
     }
+
     
     private void testInvalidName(@Nonnull MockAttributeDefinition attrdef) {
         try {
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java
index d175ab0..e5e07f5 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/AbstractResolverPluginTest.java
@@ -17,12 +17,15 @@
 
 package net.shibboleth.idp.attribute.resolver;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.function.Function;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import net.shibboleth.idp.attribute.IdPAttribute;
+import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
@@ -39,18 +42,20 @@ public class AbstractResolverPluginTest {
 
     /** Test an instantiated object has the proper state. */
     @Test public void instantiation() {
-        MockBaseResolverPlugin plugin = new MockBaseResolverPlugin(" foo ", "bar");
+        MockBaseAttributeResolver plugin = new MockBaseAttributeResolver(" foo ", "bar");
 
         Assert.assertEquals(plugin.getId(), "foo");
         Assert.assertTrue(plugin.isPropagateResolutionExceptions());
         Assert.assertNull(plugin.getActivationCondition());
-        Assert.assertNotNull(plugin.getDependencies());
-        Assert.assertTrue(plugin.getDependencies().isEmpty());
+        Assert.assertNotNull(plugin.getDataConnectorDependencies());
+        Assert.assertTrue(plugin.getDataConnectorDependencies().isEmpty());
+        Assert.assertNotNull(plugin.getAttributeDependencies());
+        Assert.assertTrue(plugin.getAttributeDependencies().isEmpty());
     }
 
     /** Test get/set activation criteria. */
     @Test public void activationCriteria() {
-        MockBaseResolverPlugin plugin = new MockBaseResolverPlugin(" foo ", "bar");
+        MockBaseAttributeResolver plugin = new MockBaseAttributeResolver(" foo ", "bar");
 
         plugin.setActivationCondition(Predicates.<ProfileRequestContext> alwaysFalse());
         Assert.assertEquals(plugin.getActivationCondition(), Predicates.alwaysFalse());
@@ -63,7 +68,7 @@ public class AbstractResolverPluginTest {
     }
     
     @Test public void nativation() {
-        MockBaseResolverPlugin plugin = new MockBaseResolverPlugin(" foo ", "bar");
+        MockBaseAttributeResolver plugin = new MockBaseAttributeResolver(" foo ", "bar");
         Assert.assertEquals(plugin.getProfileContextStrategy().getClass(), ParentContextLookup.class);
         plugin.setProfileContextStrategy(new TestFunc());
         Assert.assertEquals(plugin.getProfileContextStrategy().getClass(), TestFunc.class);
@@ -71,7 +76,7 @@ public class AbstractResolverPluginTest {
 
     /** Test setters to {@link AbstractResolverPlugin#setPropagateResolutionExceptions(boolean)}. */
     @Test public void propogateSetters() {
-        MockBaseResolverPlugin plugin = new MockBaseResolverPlugin("foo", "bar");
+        MockBaseAttributeResolver plugin = new MockBaseAttributeResolver("foo", "bar");
 
         plugin.setPropagateResolutionExceptions(true);
         Assert.assertTrue(plugin.isPropagateResolutionExceptions());
@@ -85,37 +90,68 @@ public class AbstractResolverPluginTest {
 
     /** Test add, removing, setting dependencies. */
     @Test public void dependencies() {
-        MockBaseResolverPlugin plugin = new MockBaseResolverPlugin("foo", "bar");
+        MockBaseAttributeResolver plugin = new MockBaseAttributeResolver("foo", "bar");
+
+        plugin.setAttributeDependencies(null);
+        plugin.setDataConnectorDependencies(null);
+        Assert.assertNotNull(plugin.getAttributeDependencies());
+        Assert.assertTrue(plugin.getAttributeDependencies().isEmpty());
+        Assert.assertNotNull(plugin.getDataConnectorDependencies());
+        Assert.assertTrue(plugin.getDataConnectorDependencies().isEmpty());
+
+        plugin.setAttributeDependencies(new HashSet<ResolverAttributeDefinitionDependency>());
+        plugin.setDataConnectorDependencies(new HashSet<ResolverDataConnectorDependency>());
+        Assert.assertNotNull(plugin.getAttributeDependencies());
+        Assert.assertTrue(plugin.getAttributeDependencies().isEmpty());
+        Assert.assertNotNull(plugin.getDataConnectorDependencies());
+        Assert.assertTrue(plugin.getDataConnectorDependencies().isEmpty());
+
+        plugin.setAttributeDependencies(Collections.<ResolverAttributeDefinitionDependency>singleton(null));
+        plugin.setDataConnectorDependencies(Collections.<ResolverDataConnectorDependency>singleton(null));
+        Assert.assertNotNull(plugin.getAttributeDependencies());
+        Assert.assertTrue(plugin.getAttributeDependencies().isEmpty());
+        Assert.assertNotNull(plugin.getDataConnectorDependencies());
+        Assert.assertTrue(plugin.getDataConnectorDependencies().isEmpty());
+
+        final ResolverAttributeDefinitionDependency dep1 = new ResolverAttributeDefinitionDependency("foo");
+        dep1.setDependencyAttributeId("bar");
+        final ResolverAttributeDefinitionDependency dep2 = new ResolverAttributeDefinitionDependency("foo2");
+        dep2.setDependencyAttributeId("baz");
 
-        plugin.setDependencies(null);
-        Assert.assertNotNull(plugin.getDependencies());
-        Assert.assertTrue(plugin.getDependencies().isEmpty());
+        final ResolverDataConnectorDependency depd1 = new ResolverDataConnectorDependency("food");
+        dep1.setDependencyAttributeId("bard");
+        final ResolverDataConnectorDependency depd2 = new ResolverDataConnectorDependency("food2");
+        dep2.setDependencyAttributeId("bazd");
 
-        HashSet<ResolverPluginDependency> depdencies = new HashSet<>();
-        plugin.setDependencies(depdencies);
-        Assert.assertNotNull(plugin.getDependencies());
-        Assert.assertTrue(plugin.getDependencies().isEmpty());
+        final HashSet<ResolverAttributeDefinitionDependency> adeps = new HashSet<>();
+        final HashSet<ResolverDataConnectorDependency> ddeps = new HashSet<>();
+        
 
-        depdencies.add(null);
-        plugin.setDependencies(depdencies);
-        Assert.assertNotNull(plugin.getDependencies());
-        Assert.assertTrue(plugin.getDependencies().isEmpty());
+        adeps.add(dep1);
+        adeps.add(dep1);
+        adeps.add(dep2);
 
-        ResolverPluginDependency dep1 = new ResolverAttributeDefinitionDependency("foo");
-        dep1.setDependencyAttributeId("bar");
-        ResolverPluginDependency dep2 = new ResolverAttributeDefinitionDependency("foo");
-        dep2.setDependencyAttributeId("baz");
+        ddeps.add(depd1);
+        ddeps.add(depd1);
+        ddeps.add(depd2);
 
-        depdencies.add(dep1);
-        depdencies.add(dep1);
-        depdencies.add(dep2);
+        plugin.setAttributeDependencies(adeps);
+        plugin.setDataConnectorDependencies(ddeps);
+        
+        Assert.assertNotNull(plugin.getAttributeDependencies());
+        Assert.assertTrue(plugin.getAttributeDependencies().size() == 2);
 
-        plugin.setDependencies(depdencies);
-        Assert.assertNotNull(plugin.getDependencies());
-        Assert.assertTrue(plugin.getDependencies().size() == 2);
+        Assert.assertNotNull(plugin.getDataConnectorDependencies());
+        Assert.assertTrue(plugin.getDataConnectorDependencies().size() == 2);
 
         try {
-            plugin.getDependencies().add(dep1);
+            plugin.getAttributeDependencies().add(dep1);
+            Assert.fail("able to add entry to supossedly unmodifiable collection");
+        } catch (UnsupportedOperationException e) {
+            // expected this
+        }
+        try {
+            plugin.getDataConnectorDependencies().add(depd1);
             Assert.fail("able to add entry to supossedly unmodifiable collection");
         } catch (UnsupportedOperationException e) {
             // expected this
@@ -126,13 +162,13 @@ public class AbstractResolverPluginTest {
     @Test public void resolver() throws Exception {
         AttributeResolutionContext context = new AttributeResolutionContext();
         context.getSubcontext(AttributeResolverWorkContext.class, true);
-        MockBaseResolverPlugin plugin = new MockBaseResolverPlugin("foo", "bar");
+        MockBaseAttributeResolver plugin = new MockBaseAttributeResolver("foo", "bar");
         plugin.initialize();
 
-        Assert.assertEquals(plugin.resolve(context), "bar");
+        Assert.assertEquals(plugin.resolve(context).getId(), "foo");
 
         context = new AttributeResolutionContext();
-        plugin = new MockBaseResolverPlugin(" foo ", "bar");
+        plugin = new MockBaseAttributeResolver(" foo ", "bar");
         plugin.setActivationCondition(Predicates.<ProfileRequestContext> alwaysFalse());
 
         plugin.initialize();
@@ -144,10 +180,10 @@ public class AbstractResolverPluginTest {
      * This class implements the minimal level of functionality and is meant only as a means of testing the abstract
      * {@link ResolverPlugin}.
      */
-    private static final class MockBaseResolverPlugin extends AbstractResolverPlugin<String> {
+    private static final class MockBaseAttributeResolver extends AbstractAttributeDefinition  {
 
         /** Static value return by resolution. */
-        private String resolverValue;
+        private final IdPAttribute resolverValue;
 
         /**
          * Constructor.
@@ -155,16 +191,23 @@ public class AbstractResolverPluginTest {
          * @param id id of this plugin
          * @param value value returned by resolution
          */
-        public MockBaseResolverPlugin(String id, String value) {
+        public MockBaseAttributeResolver(String id, String value) {
+            resolverValue = new IdPAttribute(id);
             setId(id);
-            resolverValue = value;
+            resolverValue.setValues(Collections.singleton(new StringAttributeValue(value)));
         }
 
         /** {@inheritDoc} */
-        @Override @Nullable protected String doResolve(@Nonnull final AttributeResolutionContext resolutionContext,
+        @Override @Nullable protected IdPAttribute doResolve(@Nonnull final AttributeResolutionContext resolutionContext,
                 @Nonnull final AttributeResolverWorkContext workContext) throws ResolutionException {
             return resolverValue;
         }
+
+        /** {@inheritDoc} */
+        protected IdPAttribute doAttributeDefinitionResolve(AttributeResolutionContext resolutionContext,
+                AttributeResolverWorkContext workContext) throws ResolutionException {
+            return resolverValue;
+        }
     }
 
     static class TestFunc implements Function<AttributeResolutionContext, ProfileRequestContext> {
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockDataConnector.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockDataConnector.java
index 8697028..09744f3 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockDataConnector.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/MockDataConnector.java
@@ -65,8 +65,13 @@ public class MockDataConnector extends AbstractDataConnector {
      * @param newHashSet
      * @throws ComponentInitializationException 
      */
-    public MockDataConnector(String id, Map<String, IdPAttribute> connectorValues, Set<ResolverPluginDependency> newHashSet) throws ComponentInitializationException {
-        setDependencies(newHashSet);
+    public MockDataConnector(String id, 
+            Map<String, IdPAttribute> connectorValues, 
+            Set<ResolverAttributeDefinitionDependency> attrDepends, 
+            Set<ResolverDataConnectorDependency> dcDepends
+            ) throws ComponentInitializationException {
+        setAttributeDependencies(attrDepends);
+        setDataConnectorDependencies(dcDepends);
         setId(id);
         values = connectorValues;
         initialize();
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupportTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupportTest.java
index 79b91a2..626465e 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupportTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/PluginDependencySupportTest.java
@@ -63,7 +63,8 @@ public class PluginDependencySupportTest {
 
         final List<IdPAttributeValue<?>> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.singletonList((ResolverPluginDependency) new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.<ResolverDataConnectorDependency>emptyList(),
                         ResolverTestSupport.EPA_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -81,7 +82,8 @@ public class PluginDependencySupportTest {
 
         final List<IdPAttributeValue<?>> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Collections.singletonList((ResolverPluginDependency)new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.<ResolverDataConnectorDependency>emptyList(),
                         ResolverTestSupport.EPA_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -102,7 +104,9 @@ public class PluginDependencySupportTest {
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
         depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPE_ATTRIB_ID));
         final List<IdPAttributeValue<?>> result =
-                PluginDependencySupport.getMergedAttributeValues(workContext, Collections.singletonList((ResolverPluginDependency) depend),
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
+                        Collections.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -124,7 +128,9 @@ public class PluginDependencySupportTest {
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
         depend.setAttributeNames(Collections.singleton(ResolverTestSupport.EPE_ATTRIB_ID));
         final List<IdPAttributeValue<?>> result =
-                PluginDependencySupport.getMergedAttributeValues(workContext, Collections.singletonList((ResolverPluginDependency)depend),
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
+                        Collections.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -147,7 +153,9 @@ public class PluginDependencySupportTest {
         depend.setAttributeNames(Lists.newArrayList(ResolverTestSupport.EPE_ATTRIB_ID, ResolverTestSupport.EPA_ATTRIB_ID));
 
         final List<IdPAttributeValue<?>> result =
-                PluginDependencySupport.getMergedAttributeValues(workContext, Collections.singletonList((ResolverPluginDependency)depend),
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
+                        Collections.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -171,7 +179,9 @@ public class PluginDependencySupportTest {
         final ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
         depend.setAllAttributes(true);
         final List<IdPAttributeValue<?>> result =
-                PluginDependencySupport.getMergedAttributeValues(workContext, Collections.singletonList((ResolverPluginDependency)depend),
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        Collections.<ResolverAttributeDefinitionDependency>emptyList(),
+                        Collections.singletonList(depend),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -203,7 +213,8 @@ public class PluginDependencySupportTest {
         dependConnector.setAttributeNames(Collections.singleton(ResolverTestSupport.EPA_ATTRIB_ID));
         final List<IdPAttributeValue<?>> result =
                 PluginDependencySupport.getMergedAttributeValues(workContext,
-                        Arrays.asList(dependConnector, new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.singletonList(dependConnector),
                         ResolverTestSupport.EPE_ATTRIB_ID);
 
         Assert.assertNotNull(result);
@@ -234,7 +245,8 @@ public class PluginDependencySupportTest {
 
         final Map<String, List<IdPAttributeValue<?>>> result =
                 PluginDependencySupport.getAllAttributeValues(workContext,
-                        Arrays.asList(depend, new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)));
+                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.singletonList(depend));
 
         Assert.assertNotNull(result);
         Assert.assertEquals(result.size(), 2);
@@ -273,7 +285,8 @@ public class PluginDependencySupportTest {
         depend.setAttributeNames(Collections.singleton(ResolverTestSupport.EPA_ATTRIB_ID));
         final Map<String, List<IdPAttributeValue<?>>> result =
                 PluginDependencySupport.getAllAttributeValues(workContext,
-                        Arrays.asList(depend, new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)));
+                        Collections.singletonList(new ResolverAttributeDefinitionDependency(ResolverTestSupport.EPA_ATTRIB_ID)),
+                        Collections.singletonList(depend));
 
         Assert.assertNotNull(result);
         Assert.assertEquals(result.size(), 1);
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinitionTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinitionTest.java
index 1f15dcd..9424a89 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinitionTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedAttributeDefinitionTest.java
@@ -93,9 +93,12 @@ public class ResolvedAttributeDefinitionTest {
         MockStaticAttributeDefinition attrDef = new MockStaticAttributeDefinition();
         attrDef.setValue(attribute);
         attrDef.setId("Defn");
-        ResolverPluginDependency dep = new ResolverAttributeDefinitionDependency("doo");
+        final ResolverAttributeDefinitionDependency dep = new ResolverAttributeDefinitionDependency("doo");
         dep.setDependencyAttributeId("foo");
-        attrDef.setDependencies(Collections.singleton(dep));
+        attrDef.setAttributeDependencies(Collections.singleton(dep));
+        final ResolverDataConnectorDependency ddep = new ResolverDataConnectorDependency("ddoo");
+        ddep.setAttributeNames(Collections.singletonList("foo"));
+        attrDef.setDataConnectorDependencies(Collections.singleton(ddep));
         attrDef.setPropagateResolutionExceptions(false);
         attrDef.initialize();
 
@@ -103,7 +106,8 @@ public class ResolvedAttributeDefinitionTest {
                 new ResolvedAttributeDefinition(attrDef, new IdPAttribute("foo"));
         resolvedAttributeDefinition.getActivationCondition();
 
-        Assert.assertEquals(resolvedAttributeDefinition.getDependencies(), attrDef.getDependencies());
+        Assert.assertEquals(resolvedAttributeDefinition.getAttributeDependencies(), attrDef.getAttributeDependencies());
+        Assert.assertEquals(resolvedAttributeDefinition.getDataConnectorDependencies(), attrDef.getDataConnectorDependencies());
         Assert.assertNull(resolvedAttributeDefinition.getActivationCondition());
         Assert.assertFalse(resolvedAttributeDefinition.isPropagateResolutionExceptions());
 
diff --git a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnectorTest.java b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnectorTest.java
index 34dd4de..d7583b2 100644
--- a/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnectorTest.java
+++ b/idp-attribute-resolver-api/src/test/java/net/shibboleth/idp/attribute/resolver/ResolvedDataConnectorTest.java
@@ -97,9 +97,14 @@ public class ResolvedDataConnectorTest {
         MockStaticDataConnector dc = new MockStaticDataConnector();
         dc.setValues(Arrays.asList(new IdPAttribute("attr")));
         dc.setId("Defn");
-        ResolverDataConnectorDependency dep = new ResolverDataConnectorDependency("doo");
-        dep.setAttributeNames(Collections.singletonList("foo"));
-        dc.setDependencies(Collections.singleton((ResolverPluginDependency) dep));
+        
+        final ResolverAttributeDefinitionDependency dep = new ResolverAttributeDefinitionDependency("doo");
+        dep.setDependencyAttributeId("foo");
+        dc.setAttributeDependencies(Collections.singleton(dep));
+        final ResolverDataConnectorDependency ddep = new ResolverDataConnectorDependency("ddoo");
+        ddep.setAttributeNames(Collections.singletonList("foo"));
+        dc.setDataConnectorDependencies(Collections.singleton(ddep));
+
         dc.setPropagateResolutionExceptions(false);
         dc.initialize();
         ResolvedDataConnector resolvedDataConnector = new ResolvedDataConnector(dc, resolvedData);
@@ -110,7 +115,8 @@ public class ResolvedDataConnectorTest {
         Assert.assertEquals(resolvedDataConnector.getResolvedConnector(), dc);
         Assert.assertTrue(resolvedDataConnector.isInitialized());
 
-        Assert.assertEquals(resolvedDataConnector.getDependencies(), dc.getDependencies());
+        Assert.assertEquals(resolvedDataConnector.getAttributeDependencies(), dc.getAttributeDependencies());
+        Assert.assertEquals(resolvedDataConnector.getDataConnectorDependencies(), dc.getDataConnectorDependencies());
         Assert.assertNull(resolvedDataConnector.getActivationCondition());
         Assert.assertFalse(resolvedDataConnector.isPropagateResolutionExceptions());
 
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAttributeDefinition.java
index 3539b50..fc77a96 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAttributeDefinition.java
@@ -91,9 +91,11 @@ public class PrescopedAttributeDefinition extends AbstractAttributeDefinition {
         final IdPAttribute resultantAttribute = new IdPAttribute(getId());
 
         final List<IdPAttributeValue<?>> dependencyValues =
-                PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
-        log.debug("{} Dependencies {} provided unmapped values of {}", getLogPrefix(), getDependencies(),
-                dependencyValues);
+                PluginDependencySupport.getMergedAttributeValues(workContext, 
+                        getAttributeDependencies(), 
+                        getDataConnectorDependencies(), 
+                        getId());
+        log.debug("{} Dependencies provided unmapped values of {}", getLogPrefix(), dependencyValues);
 
         final List<IdPAttributeValue<?>> valueList = new ArrayList<>(dependencyValues.size());
         for (final IdPAttributeValue<?> dependencyValue : dependencyValues) {
@@ -145,7 +147,7 @@ public class PrescopedAttributeDefinition extends AbstractAttributeDefinition {
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
 
-        if (getDependencies().isEmpty()) {
+        if (getDataConnectorDependencies().isEmpty() && getAttributeDependencies().isEmpty()) {
             throw new ComponentInitializationException(getLogPrefix() + " no dependencies were configured");
         }
     }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexSplitAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexSplitAttributeDefinition.java
index e3733c9..1c1d366 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexSplitAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexSplitAttributeDefinition.java
@@ -92,7 +92,10 @@ public class RegexSplitAttributeDefinition extends AbstractAttributeDefinition {
         final IdPAttribute resultantAttribute = new IdPAttribute(getId());
 
         final List<IdPAttributeValue<?>> dependencyValues =
-                PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
+                PluginDependencySupport.getMergedAttributeValues(workContext, 
+                        getAttributeDependencies(), 
+                        getDataConnectorDependencies(), 
+                        getId());
 
         for (final IdPAttributeValue dependencyValue : dependencyValues) {
             final String inputValue;
@@ -139,7 +142,7 @@ public class RegexSplitAttributeDefinition extends AbstractAttributeDefinition {
                     + "': no regular expression was configured");
         }
 
-        if (getDependencies().isEmpty()) {
+        if (getDataConnectorDependencies().isEmpty() && getAttributeDependencies().isEmpty()) {
             throw new ComponentInitializationException("Attribute definition '" + getId()
                     + "': no dependencies were configured");
         }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java
index eb712de..8715195 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeDefinition.java
@@ -89,7 +89,10 @@ public class ScopedAttributeDefinition extends AbstractAttributeDefinition {
         final IdPAttribute resultantAttribute = new IdPAttribute(getId());
 
         final List<IdPAttributeValue<?>> dependencyValues =
-                PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        getAttributeDependencies(), 
+                        getDataConnectorDependencies(), 
+                        getId());
 
         final List<StringAttributeValue> valueList = new ArrayList<>(dependencyValues.size());
 
@@ -120,7 +123,7 @@ public class ScopedAttributeDefinition extends AbstractAttributeDefinition {
             throw new ComponentInitializationException(getLogPrefix() + "': no scope was configured");
         }
 
-        if (getDependencies().isEmpty()) {
+        if (getDataConnectorDependencies().isEmpty() && getAttributeDependencies().isEmpty()) {
             throw new ComponentInitializationException(getLogPrefix() + "': no dependencies were configured");
         }
     }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
index 24fed88..43e3a38 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeDefinition.java
@@ -234,7 +234,9 @@ public class ScriptedAttributeDefinition extends AbstractAttributeDefinition {
 
             final Map<String, List<IdPAttributeValue<?>>> dependencyAttributes =
                     PluginDependencySupport.getAllAttributeValues(
-                            (AttributeResolverWorkContext) input[1], getDependencies());
+                            (AttributeResolverWorkContext) input[1], 
+                            getAttributeDependencies(), 
+                            getDataConnectorDependencies());
 
             if (dependencyAttributes.containsKey(getId())) {
                 log.debug("{} The attribute ID to be populated is a dependency, not created", getLogPrefix());
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeDefinition.java
index a290f59..f828709 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeDefinition.java
@@ -43,7 +43,10 @@ public class SimpleAttributeDefinition extends AbstractAttributeDefinition {
         Constraint.isNotNull(workContext, "AttributeResolverWorkContext cannot be null");
 
         final IdPAttribute result = new IdPAttribute(getId());
-        result.setValues(PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId()));
+        result.setValues(PluginDependencySupport.getMergedAttributeValues(workContext,
+                getAttributeDependencies(), 
+                getDataConnectorDependencies(), 
+                getId()));
 
         return result;
     }
@@ -52,7 +55,7 @@ public class SimpleAttributeDefinition extends AbstractAttributeDefinition {
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
 
-        if (getDependencies().isEmpty()) {
+        if (getDataConnectorDependencies().isEmpty() && getAttributeDependencies().isEmpty()) {
             throw new ComponentInitializationException(getLogPrefix() + " no dependencies were configured");
         }
     }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java
index 96f5907..26e59f9 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeDefinition.java
@@ -173,7 +173,7 @@ public class TemplateAttributeDefinition extends AbstractAttributeDefinition {
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
     
-        if (getDependencies().isEmpty()) {
+        if (getAttributeDependencies().isEmpty() && getDataConnectorDependencies().isEmpty()) {
             throw new ComponentInitializationException(getLogPrefix() + " no dependencies were configured");
         }
     
@@ -209,19 +209,22 @@ public class TemplateAttributeDefinition extends AbstractAttributeDefinition {
             return;
         }
 
-        final Set<String> dependencyAttributeNames = new HashSet<>(getDependencies().size());
-        for (final ResolverPluginDependency dependency: getDependencies()) {
-            if (dependency instanceof ResolverAttributeDefinitionDependency) {
-                dependencyAttributeNames.add( dependency.getDependencyPluginId());
-            } else if (dependency instanceof ResolverDataConnectorDependency) {
-                final ResolverDataConnectorDependency dc = (ResolverDataConnectorDependency) dependency;
-                if (dc.isAllAttributes()) {
-                    return;
-                }
-                dependencyAttributeNames.addAll(dc.getAttributeNames());
+        final Set<String> dependencyAttributeNames = new HashSet<>(getAttributeDependencies().size() +
+                getDataConnectorDependencies().size());
+
+        for (final ResolverAttributeDefinitionDependency attrDep: getAttributeDependencies()) {
+            dependencyAttributeNames.add(attrDep.getDependencyPluginId());
+        }
+        
+        for (final ResolverDataConnectorDependency dcDep: getDataConnectorDependencies()) {
+            if (dcDep.isAllAttributes()) {
+                // No sensible check can be made if wild carding
+                return;
             }
+            dependencyAttributeNames.addAll(dcDep.getAttributeNames());
         }
 
+        
         for (final String s: sourceAttributes) {
             if (!dependencyAttributeNames.contains(s)) {
                 log.warn("{} Source Attribute {} is not provided as a dependency", getLogPrefix(),s);
@@ -338,8 +341,11 @@ public class TemplateAttributeDefinition extends AbstractAttributeDefinition {
             @Nonnull @NonnullElements final Map<String,Iterator<IdPAttributeValue<?>>> sourceValues)
                     throws ResolutionException {
 
-        final Map<String, List<IdPAttributeValue<?>>> dependencyAttributes =
-                PluginDependencySupport.getAllAttributeValues(workContext, getDependencies());
+        final Map<String, List<IdPAttributeValue<?>>> dependencyAttributes = 
+                PluginDependencySupport.getAllAttributeValues(workContext,
+                                                              getAttributeDependencies(), 
+                                                              getDataConnectorDependencies());
+
         int valueCount = 0;
 
         if (getSourceAttributes().isEmpty()) {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
index 53c9e4d..11395f9 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeDefinition.java
@@ -198,7 +198,10 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
         Constraint.isNotNull(resolutionContext, "Attribute resolution context can not be null");
 
         final List<IdPAttributeValue<?>> unmappedResults =
-                PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        getAttributeDependencies(),
+                        getDataConnectorDependencies(),
+                        getId());
         log.debug("Attribute Definition '{}': Attempting to map the following values: {}", getId(), unmappedResults);
 
         // Bucket for results
@@ -241,7 +244,7 @@ public class MappedAttributeDefinition extends AbstractAttributeDefinition {
     @Override protected void doInitialize() throws ComponentInitializationException {
         super.doInitialize();
 
-        if (getDependencies().isEmpty()) {
+        if (getAttributeDependencies().isEmpty() && getDataConnectorDependencies().isEmpty()) {
             throw new ComponentInitializationException("Attribute definition '" + getId()
                     + "': no dependencies were configured");
         }
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
index d343573..2ecc43b 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/AbstractSearchDataConnector.java
@@ -174,7 +174,9 @@ public abstract class AbstractSearchDataConnector<T1 extends ExecutableSearch,T2
         ComponentSupport.ifNotInitializedThrowUninitializedComponentException(this);
 
         final Map<String, List<IdPAttributeValue<?>>> dependsAttributes =
-                PluginDependencySupport.getAllAttributeValues(workContext, getDependencies());
+                PluginDependencySupport.getAllAttributeValues(workContext,
+                        getAttributeDependencies(),
+                        getDataConnectorDependencies());
         final T1 executable = searchBuilder.build(resolutionContext, dependsAttributes);
         Map<String, IdPAttribute> resolvedAttributes = null;
         if (resultsCache != null && resolutionContext.getAllowCachedResults()) {
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
index 68baf0f..4aea98e 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/dc/impl/ScriptedDataConnector.java
@@ -251,7 +251,9 @@ public class ScriptedDataConnector extends AbstractDataConnector {
 
             final Map<String, List<IdPAttributeValue<?>>> dependencyAttributes =
                     PluginDependencySupport.getAllAttributeValues(
-                            (AttributeResolverWorkContext) input[1], getDependencies());
+                            (AttributeResolverWorkContext) input[1],
+                            getAttributeDependencies(),
+                            getDataConnectorDependencies());
 
             for (final Entry<String,List<IdPAttributeValue<?>>> dependencyAttribute : dependencyAttributes.entrySet()) {
                 log.trace("{} Adding dependent attribute '{}' with the following values to the script context: {}",
diff --git a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
index 326f654..57bd840 100644
--- a/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
+++ b/idp-attribute-resolver-impl/src/main/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImpl.java
@@ -52,10 +52,8 @@ import net.shibboleth.idp.attribute.resolver.ResolvedAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPlugin;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
-import net.shibboleth.idp.authn.context.SubjectCanonicalizationContext;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullAfterInit;
 import net.shibboleth.utilities.java.support.annotation.constraint.NonnullElements;
 import net.shibboleth.utilities.java.support.annotation.constraint.NullableElements;
@@ -414,29 +412,15 @@ public class AttributeResolverImpl extends AbstractServiceableComponent<Attribut
         Constraint.isNotNull(plugin, "Plugin dependency can not be null");
         Constraint.isNotNull(resolutionContext, "Attribute resolution context cannot be null");
 
-        if (plugin.getDependencies().isEmpty()) {
-            return;
-        }
-
         log.debug("{} Resolving dependencies for '{}'", logPrefix, plugin.getId());
 
-        for (final ResolverPluginDependency dependency : plugin.getDependencies()) {
-            final String pluginId = dependency.getDependencyPluginId();
-            if (dependency instanceof ResolverAttributeDefinitionDependency) {
-                resolveAttributeDefinition(pluginId, resolutionContext);                
-            } else if (dependency instanceof ResolverDataConnectorDependency) {
-                resolveDataConnector(pluginId, resolutionContext);
-            } else if (attributeDefinitions.containsKey(pluginId)) {
-                resolveAttributeDefinition(pluginId, resolutionContext);
-            } else if (dataConnectors.containsKey(pluginId)) {
-                resolveDataConnector(pluginId, resolutionContext);
-            } else {
-                // This will not happen for as long as we test this in initialization
-                throw new ResolutionException("Plugin '" + plugin.getId() + "' contains a dependency on plugin '"
-                        + pluginId + "' which does not exist.");
-            }
+        for (final ResolverAttributeDefinitionDependency attrDependency : plugin.getAttributeDependencies()) {
+            resolveAttributeDefinition(attrDependency.getDependencyPluginId(), resolutionContext);                
         }
 
+        for (final ResolverDataConnectorDependency dependency : plugin.getDataConnectorDependencies()) { 
+            resolveDataConnector(dependency.getDependencyPluginId(), resolutionContext);
+        }
         log.debug("{} Finished resolving dependencies for '{}'", logPrefix, plugin.getId());
     }
 
@@ -559,40 +543,53 @@ public class AttributeResolverImpl extends AbstractServiceableComponent<Attribut
             final Set<String> checkedPlugins) throws ComponentInitializationException {
         final String pluginId = plugin.getId();
 
-        ResolverPlugin<?> dependencyPlugin;
-        for (final ResolverPluginDependency dependency : plugin.getDependencies()) {
+        for (final ResolverAttributeDefinitionDependency attrDependency : plugin.getAttributeDependencies()) {
+            final AttributeDefinition dependencyAttribute;
             if (checkedPlugins.contains(pluginId)) {
                 continue;
             }
 
-            if (circularCheckPluginId.equals(dependency.getDependencyPluginId())) {
+            if (circularCheckPluginId.equals(attrDependency.getDependencyPluginId())) {
                 throw new ComponentInitializationException(logPrefix + " Plugin '" + circularCheckPluginId
-                        + "' and plugin '" + dependency.getDependencyPluginId()
+                        + "' and attribute definition '" + attrDependency.getDependencyPluginId()
                         + "' have a circular dependency on each other.");
             }
-            final String dependencyType;
-            if (dependency instanceof ResolverAttributeDefinitionDependency) {
-                dependencyPlugin = attributeDefinitions.get(dependency.getDependencyPluginId());
-                dependencyType = "Attribute Definition";
-            } else if (dependency instanceof ResolverDataConnectorDependency) {
-                dependencyPlugin = dataConnectors.get(dependency.getDependencyPluginId());                
-                dependencyType = "Data Connector";
-            } else {
-                dependencyPlugin = attributeDefinitions.get(dependency.getDependencyPluginId());
-                if (dependencyPlugin == null) {
-                    dependencyPlugin = dataConnectors.get(dependency.getDependencyPluginId());
-                }
-                dependencyType = "Deprecated ";
+            
+            dependencyAttribute = attributeDefinitions.get(attrDependency.getDependencyPluginId());
+            if (dependencyAttribute == null) {
+                throw new ComponentInitializationException(logPrefix + " Plugin '" + plugin.getId()
+                        + "' has a dependency on attribute definition '" + attrDependency.getDependencyPluginId()
+                        + "' which doesn't exist");
             }
-            if (dependencyPlugin == null) {
+
+            checkPlugInDependencies(circularCheckPluginId, dependencyAttribute, checkedPlugins);
+            checkedPlugins.add(pluginId);
+        }
+        
+        for (final ResolverDataConnectorDependency dependency : plugin.getDataConnectorDependencies()) {
+            final ResolverPlugin<?> dependencyDataConnector;
+            
+            if (checkedPlugins.contains(pluginId)) {
+                continue;
+            }
+
+            if (circularCheckPluginId.equals(dependency.getDependencyPluginId())) {
+                throw new ComponentInitializationException(logPrefix + " Plugin '" + circularCheckPluginId
+                        + "' and data connector '" + dependency.getDependencyPluginId()
+                        + "' have a circular dependency on each other.");
+            }
+            dependencyDataConnector = dataConnectors.get(dependency.getDependencyPluginId());                
+
+            if (dependencyDataConnector == null) {
                 throw new ComponentInitializationException(logPrefix + " Plugin '" + plugin.getId()
-                        + "' has a " + dependencyType + " dependency on plugin '" + dependency.getDependencyPluginId()
+                        + "' has a dependency on data connector '" + dependency.getDependencyPluginId()
                         + "' which doesn't exist");
             }
 
-            checkPlugInDependencies(circularCheckPluginId, dependencyPlugin, checkedPlugins);
+            checkPlugInDependencies(circularCheckPluginId, dependencyDataConnector, checkedPlugins);
             checkedPlugins.add(pluginId);
         }
+
     }
 
     /** {@inheritDoc} */
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
index fdf758b..7ca96d8 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/PrescopedAtributeTest.java
@@ -23,6 +23,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
 import net.shibboleth.idp.attribute.ByteAttributeValue;
 import net.shibboleth.idp.attribute.EmptyAttributeValue;
 import net.shibboleth.idp.attribute.EmptyAttributeValue.EmptyType;
@@ -34,7 +37,6 @@ import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
@@ -46,9 +48,6 @@ import net.shibboleth.utilities.java.support.component.DestroyedComponentExcepti
 import net.shibboleth.utilities.java.support.component.UninitializedComponentException;
 import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 /**
  * Test for prescoped attribute definitions.
  */
@@ -69,14 +68,12 @@ public class PrescopedAtributeTest {
     @Test public void preScoped() throws ResolutionException, ComponentInitializationException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME);
         depend.setAttributeNames(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
-        dependencySet.add(depend);
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScopeDelimiter("-");
-        attrDef.setDependencies(dependencySet);
+        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
         attrDef.initialize();
 
         // And resolve
@@ -107,14 +104,14 @@ public class PrescopedAtributeTest {
     @Test public void preScopedNoValues() throws ResolutionException, ComponentInitializationException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME);
         depend.setAttributeNames(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
         dependencySet.add(depend);
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScopeDelimiter(DELIMITER);
-        attrDef.setDependencies(dependencySet);
+        attrDef.setDataConnectorDependencies(dependencySet);
         attrDef.initialize();
 
         // And resolve
@@ -148,7 +145,7 @@ public class PrescopedAtributeTest {
         attrDef.setScopeDelimiter("@");
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
         depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
-        attrDef.setDependencies(Collections.singleton((ResolverPluginDependency) depend));
+        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
         attrDef.initialize();
 
         try {
@@ -178,7 +175,7 @@ public class PrescopedAtributeTest {
         final PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScopeDelimiter("@");
-        attrDef.setDependencies(Collections.singleton((ResolverPluginDependency) depend));
+        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
         attrDef.initialize();
         final IdPAttribute result = attrDef.resolve(resolutionContext);
         
@@ -193,7 +190,7 @@ public class PrescopedAtributeTest {
 
     @Test public void emptyValueType() throws ResolutionException, ComponentInitializationException {
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency(TestSources.STATIC_CONNECTOR_NAME);
         depend.setAttributeNames(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
         dependencySet.add(depend);
@@ -201,7 +198,7 @@ public class PrescopedAtributeTest {
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         // delimiter that will produce an empty value
         attrDef.setScopeDelimiter("at1-");
-        attrDef.setDependencies(dependencySet);
+        attrDef.setDataConnectorDependencies(dependencySet);
         attrDef.initialize();
 
         // And resolve
@@ -229,8 +226,8 @@ public class PrescopedAtributeTest {
         PrescopedAttributeDefinition attrDef = new PrescopedAttributeDefinition();
         final  ResolverDataConnectorDependency depend = new ResolverDataConnectorDependency("connector1");
         depend.setAttributeNames(Collections.singletonList(ResolverTestSupport.EPA_ATTRIB_ID));
-        final Set<ResolverPluginDependency> pluginDependencies = Collections.singleton((ResolverPluginDependency)depend);
-        attrDef.setDependencies(pluginDependencies);
+        final Set<ResolverDataConnectorDependency> pluginDependencies = Collections.singleton(depend);
+        attrDef.setDataConnectorDependencies(pluginDependencies);
         attrDef.setId(TEST_ATTRIBUTE_NAME);
 
         try {
@@ -250,7 +247,7 @@ public class PrescopedAtributeTest {
         } catch (final ComponentInitializationException e) {
             // OK
         }
-        attrDef.setDependencies(pluginDependencies);
+        attrDef.setDataConnectorDependencies(pluginDependencies);
 
         try {
             attrDef.resolve(new AttributeResolutionContext());
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
index 30fe0f6..e2a156b 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/RegexAtributeTest.java
@@ -36,6 +36,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
@@ -68,13 +69,13 @@ public class RegexAtributeTest {
     @Test public void regex() throws ResolutionException, ComponentInitializationException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
-        final  ResolverPluginDependency depend = TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR);
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
+        final  ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR);
         dependencySet.add(depend);
         final RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setRegularExpression(TestSources.CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN);
-        attrDef.setDependencies(dependencySet);
+        attrDef.setDataConnectorDependencies(dependencySet);
         attrDef.initialize();
 
         // And resolve
@@ -107,13 +108,13 @@ public class RegexAtributeTest {
 
         final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
 
 
         final RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setRegularExpression(TestSources.CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN);
-        attrDef.setDependencies(Collections.singleton(depend));
+        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
         attrDef.initialize();
 
         final IdPAttribute result = attrDef.resolve(resolutionContext);
@@ -135,8 +136,8 @@ public class RegexAtributeTest {
         final RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setRegularExpression(TestSources.CONNECTOR_ATTRIBUTE_VALUE_REGEXP_PATTERN);
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
-        attrDef.setDependencies(Collections.singleton(depend));
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        attrDef.setDataConnectorDependencies(Collections.singleton(depend));
         attrDef.initialize();
 
         try {
@@ -149,14 +150,15 @@ public class RegexAtributeTest {
 
     @Test public void emptyValueType() throws ResolutionException, ComponentInitializationException {
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME, TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR);
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
+        final ResolverDataConnectorDependency depend = 
+                TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME, TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR);
         dependencySet.add(depend);
         final RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         // regex where the first group doesn't match
         attrDef.setRegularExpression(Pattern.compile("([zZ]*)at1-(.+)or"));
-        attrDef.setDependencies(dependencySet);
+        attrDef.setDataConnectorDependencies(dependencySet);
         attrDef.initialize();
 
         // And resolve
@@ -180,9 +182,10 @@ public class RegexAtributeTest {
     @Test public void initDestroyParms() throws ResolutionException, ComponentInitializationException {
 
         RegexSplitAttributeDefinition attrDef = new RegexSplitAttributeDefinition();
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
-        final Set<ResolverPluginDependency> pluginDependencies = Collections.singleton(depend);
-        attrDef.setDependencies(pluginDependencies);
+        final ResolverDataConnectorDependency depend = 
+                TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        final Set<ResolverDataConnectorDependency> pluginDependencies = Collections.singleton(depend);
+        attrDef.setDataConnectorDependencies(pluginDependencies);
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         try {
             attrDef.initialize();
@@ -207,7 +210,7 @@ public class RegexAtributeTest {
         } catch (final ComponentInitializationException e) {
             // OK
         }
-        attrDef.setDependencies(pluginDependencies);
+        attrDef.setDataConnectorDependencies(pluginDependencies);
 
         try {
             attrDef.resolve(new AttributeResolutionContext());
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML1NameIdentifierAttributeDefinitionTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML1NameIdentifierAttributeDefinitionTest.java
index 8095e1b..177322b 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML1NameIdentifierAttributeDefinitionTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML1NameIdentifierAttributeDefinitionTest.java
@@ -32,6 +32,8 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
@@ -66,7 +68,7 @@ public class SAML1NameIdentifierAttributeDefinitionTest extends OpenSAMLInitBase
     @Test public void empty() throws ResolutionException, ComponentInitializationException {
         final SAML1NameIdentifierAttributeDefinition defn = new SAML1NameIdentifierAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         defn.initialize();
 
         final IdPAttribute result =
@@ -79,9 +81,9 @@ public class SAML1NameIdentifierAttributeDefinitionTest extends OpenSAMLInitBase
         final SAML1NameIdentifierAttributeDefinition defn = new SAML1NameIdentifierAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        defn.setDependencies(dependencySet);
+        defn.setAttributeDependencies(dependencySet);
         defn.initialize();
 
         // And resolve
@@ -120,13 +122,13 @@ public class SAML1NameIdentifierAttributeDefinitionTest extends OpenSAMLInitBase
         final IdPAttribute attr = new IdPAttribute(ResolverTestSupport.EPA_ATTRIB_ID);
         attr.setValues(values);
         
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
 
         
         final SAML1NameIdentifierAttributeDefinition defn = new SAML1NameIdentifierAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
         // Set the dependency on the data connector
-        defn.setDependencies(Collections.singleton(depend));
+        defn.setDataConnectorDependencies(Collections.singleton(depend));
         defn.initialize();
 
         // And resolve
@@ -159,12 +161,12 @@ public class SAML1NameIdentifierAttributeDefinitionTest extends OpenSAMLInitBase
     @Test public void nullIssuerID() throws ComponentInitializationException {
         final SAML1NameIdentifierAttributeDefinition defn = new SAML1NameIdentifierAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        defn.setDependencies(dependencySet);
+        defn.setAttributeDependencies(dependencySet);
         defn.initialize();
         final Set<AttributeDefinition> am = new LazySet<>();
         am.add(defn);
@@ -186,12 +188,12 @@ public class SAML1NameIdentifierAttributeDefinitionTest extends OpenSAMLInitBase
 
         final SAML1NameIdentifierAttributeDefinition defn2 = new SAML1NameIdentifierAttributeDefinition();
         defn2.setId(SECOND_ATTRIBUTE_NAME);
-        defn2.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn2.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TEST_ATTRIBUTE_NAME));
-        defn2.setDependencies(dependencySet);
+        defn2.setAttributeDependencies(dependencySet);
         defn2.initialize();
 
         // And resolve
@@ -215,12 +217,12 @@ public class SAML1NameIdentifierAttributeDefinitionTest extends OpenSAMLInitBase
     @Test public void singleValueWithOptions() throws ResolutionException, ComponentInitializationException {
         final SAML1NameIdentifierAttributeDefinition defn = new SAML1NameIdentifierAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        defn.setDependencies(dependencySet);
+        defn.setAttributeDependencies(dependencySet);
         defn.setNameIdFormat(ALTERNATIVE_FORMAT);
         defn.setNameIdQualifier(ALTERNATE_QUALIFIER);
         defn.initialize();
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML2NameIDAttributeDefinitionTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML2NameIDAttributeDefinitionTest.java
index edcb6a2..4c6323e 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML2NameIDAttributeDefinitionTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SAML2NameIDAttributeDefinitionTest.java
@@ -34,6 +34,8 @@ import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolvedAttributeDefinition;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
@@ -69,7 +71,7 @@ public class SAML2NameIDAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
     @Test public void testEmpty() throws ResolutionException, ComponentInitializationException {
         final SAML2NameIDAttributeDefinition defn = new SAML2NameIDAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("bar")));
+        defn.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("bar")));
         defn.initialize();
 
         final IdPAttribute attr = new IdPAttribute("bar");
@@ -94,9 +96,9 @@ public class SAML2NameIDAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         defn.setId(TEST_ATTRIBUTE_NAME);
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        defn.setDependencies(dependencySet);
+        defn.setAttributeDependencies(dependencySet);
         defn.initialize();
 
         // And resolve
@@ -140,13 +142,13 @@ public class SAML2NameIDAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         final IdPAttribute attr = new IdPAttribute(ResolverTestSupport.EPA_ATTRIB_ID);
         attr.setValues(values);
         
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
 
         
         final SAML2NameIDAttributeDefinition defn = new SAML2NameIDAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
         // Set the dependency on the data connector
-        defn.setDependencies(Collections.singleton(depend));
+        defn.setDataConnectorDependencies(Collections.singleton(depend));
         defn.setNameIdSPQualifier("doo");
         defn.initialize();
 
@@ -209,9 +211,9 @@ public class SAML2NameIDAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         defn2.setId(SECOND_ATTRIBUTE_NAME);
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TEST_ATTRIBUTE_NAME));
-        defn2.setDependencies(dependencySet);
+        defn2.setAttributeDependencies(dependencySet);
         defn2.initialize();
 
         // And resolve
@@ -237,12 +239,12 @@ public class SAML2NameIDAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
             ComponentInitializationException {
         final SAML2NameIDAttributeDefinition defn = new SAML2NameIDAttributeDefinition();
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("bar")));
+        defn.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("bar")));
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        defn.setDependencies(dependencySet);
+        defn.setAttributeDependencies(dependencySet);
         defn.setNameIdFormat(ALTERNATIVE_FORMAT);
         defn.setNameIdQualifier(ALTERNATE_QUALIFIER);
         defn.setNameIdSPQualifier(ALTERNATE_SP_QUALIFIER);
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
index d5a3c8a..ce52775 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScopedAttributeTest.java
@@ -25,6 +25,9 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
 import net.shibboleth.idp.attribute.ByteAttributeValue;
 import net.shibboleth.idp.attribute.EmptyAttributeValue;
 import net.shibboleth.idp.attribute.EmptyAttributeValue.EmptyType;
@@ -35,7 +38,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.impl.AttributeResolverImpl;
@@ -47,9 +50,6 @@ import net.shibboleth.utilities.java.support.component.DestroyedComponentExcepti
 import net.shibboleth.utilities.java.support.component.UninitializedComponentException;
 import net.shibboleth.utilities.java.support.logic.ConstraintViolationException;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 /**
  * Tester for {@link ScopedAttributeDefinition}.
  */
@@ -70,14 +70,14 @@ public class ScopedAttributeTest {
     @Test public void scopes() throws ResolutionException, ComponentInitializationException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
 
         final ScopedAttributeDefinition scoped = new ScopedAttributeDefinition();
         scoped.setScope(TEST_SCOPE);
         scoped.setId(TEST_ATTRIBUTE_NAME);
-        scoped.setDependencies(dependencySet);
+        scoped.setDataConnectorDependencies(dependencySet);
         scoped.initialize();
 
         // And resolve
@@ -116,7 +116,7 @@ public class ScopedAttributeTest {
         final ScopedAttributeDefinition attrDef = new ScopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScope(TEST_SCOPE);
-        attrDef.setDependencies(new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("connector1",
+        attrDef.setDataConnectorDependencies(new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID))));
         attrDef.initialize();
 
@@ -144,7 +144,7 @@ public class ScopedAttributeTest {
         final ScopedAttributeDefinition attrDef = new ScopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         attrDef.setScope(TEST_SCOPE);
-        attrDef.setDependencies(new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("connector1",
+        attrDef.setDataConnectorDependencies(new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID))));
         attrDef.initialize();
 
@@ -162,10 +162,10 @@ public class ScopedAttributeTest {
     @Test public void initDestroyParms() throws ResolutionException, ComponentInitializationException {
 
         ScopedAttributeDefinition attrDef = new ScopedAttributeDefinition();
-        final Set<ResolverPluginDependency> pluginDependencies =
+        final Set<ResolverDataConnectorDependency> pluginDependencies =
                 new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("connector1",
                         ResolverTestSupport.EPA_ATTRIB_ID)));
-        attrDef.setDependencies(pluginDependencies);
+        attrDef.setDataConnectorDependencies(pluginDependencies);
         attrDef.setId(TEST_ATTRIBUTE_NAME);
 
         try {
@@ -188,7 +188,7 @@ public class ScopedAttributeTest {
         attrDef = new ScopedAttributeDefinition();
         attrDef.setId(TEST_ATTRIBUTE_NAME);
         Assert.assertNull(attrDef.getScope());
-        attrDef.setDependencies(pluginDependencies);
+        attrDef.setDataConnectorDependencies(pluginDependencies);
         try {
             attrDef.initialize();
             Assert.fail("no Scope - should fail");
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
index 4143657..6f23be8 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/ScriptedAttributeTest.java
@@ -40,6 +40,8 @@ import net.shibboleth.idp.attribute.XMLObjectAttributeValue;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
@@ -350,12 +352,12 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
             IOException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(TEST_ATTRIBUTE_NAME);
         scripted.setScript(new EvaluableScript(SCRIPT_LANGUAGE, getScript("attributes.script")));
-        scripted.setDependencies(ds);
+        scripted.setAttributeDependencies(ds);
         scripted.initialize();
 
         // And resolve
@@ -383,12 +385,12 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
             IOException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(TEST_ATTRIBUTE_NAME);
         scripted.setScript(new EvaluableScript(SCRIPT_LANGUAGE, getScript("work.script")));
-        scripted.setDependencies(ds);
+        scripted.setAttributeDependencies(ds);
         scripted.initialize();
 
         // And resolve
@@ -431,12 +433,12 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
 
         final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
 
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(TEST_ATTRIBUTE_NAME);
         scripted.setScript(new EvaluableScript(SCRIPT_LANGUAGE, getScript("attributes.script")));
-        scripted.setDependencies(Collections.singleton(depend));
+        scripted.setDataConnectorDependencies(Collections.singleton(depend));
         scripted.initialize();
 
         final IdPAttribute result = scripted.resolve(resolutionContext);
@@ -452,13 +454,13 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
             IOException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_SECOND_ATTRIBUTE_NAME));
 
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(TEST_ATTRIBUTE_NAME);
         scripted.setScript(new EvaluableScript(SCRIPT_LANGUAGE, getScript("attributes2.script")));
-        scripted.setDependencies(ds);
+        scripted.setAttributeDependencies(ds);
         scripted.initialize();
 
         // And resolve
@@ -497,14 +499,14 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
             IOException {
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverDataConnectorDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
 
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(TEST_ATTRIBUTE_NAME);
         scripted.setScript(new EvaluableScript(SCRIPT_LANGUAGE, getScript("context.script", false)));
-        scripted.setDependencies(ds);
+        scripted.setDataConnectorDependencies(ds);
         scripted.initialize();
 
         // And resolve
@@ -540,13 +542,13 @@ public class ScriptedAttributeTest extends XMLObjectBaseTestCase {
         connector.setAttributesStrategy(new Locator(exampleData));
         connector.setId("Connector");
 
-        final Set<ResolverPluginDependency> ds =
+        final Set<ResolverDataConnectorDependency> ds =
                 Collections.singleton(TestSources.makeResolverPluginDependency("Connector", null));
 
         final ScriptedAttributeDefinition scripted = new ScriptedAttributeDefinition();
         scripted.setId(attributeName);
         scripted.setScript(new EvaluableScript(SCRIPT_LANGUAGE, getScript(exampleScript, false)));
-        scripted.setDependencies(ds);
+        scripted.setDataConnectorDependencies(ds);
 
         final Set<DataConnector> dataDefinitions = Collections.singleton((DataConnector) connector);
         final Set<AttributeDefinition> attrDefinitions = Collections.singleton((AttributeDefinition) scripted);
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
index 963fa21..6cdb79b 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/SimpleAttributeTest.java
@@ -30,6 +30,8 @@ import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
@@ -64,7 +66,7 @@ public class SimpleAttributeTest {
         } catch (final ComponentInitializationException e) {
             //OK
         }
-        simple.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         simple.initialize();
 
         final AttributeResolutionContext context = new AttributeResolutionContext();
@@ -85,10 +87,10 @@ public class SimpleAttributeTest {
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(TEST_ATTRIBUTE_NAME);
 
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
-        simple.setDependencies(dependencySet);
+        simple.setDataConnectorDependencies(dependencySet);
         simple.initialize();
 
         // And resolve
@@ -126,9 +128,9 @@ public class SimpleAttributeTest {
         simple.setId(TEST_ATTRIBUTE_NAME);
 
         // Set the dependency on the data connector
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        simple.setDependencies(dependencySet);
+        simple.setAttributeDependencies(dependencySet);
         simple.initialize();
 
         // And resolve
@@ -170,11 +172,11 @@ public class SimpleAttributeTest {
 
        final AttributeResolutionContext resolutionContext =
                 ResolverTestSupport.buildResolutionContext(ResolverTestSupport.buildDataConnector("connector1", attr));
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(TEST_ATTRIBUTE_NAME);
-        simple.setDependencies(Collections.singleton(depend));
+        simple.setDataConnectorDependencies(Collections.singleton(depend));
         simple.initialize();
 
         final IdPAttribute result = simple.resolve(resolutionContext);
@@ -198,11 +200,11 @@ public class SimpleAttributeTest {
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(TEST_ATTRIBUTE_NAME);
 
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
-        dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
-                TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
-        simple.setDependencies(dependencySet);
+        simple.setAttributeDependencies(Collections.singleton(
+                TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
+        simple.setDataConnectorDependencies(Collections.singleton(
+                TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
+                        TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR)));
         simple.initialize();
 
         // And resolve
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
index 9b4500e..e38de45 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/impl/TemplateAttributeTest.java
@@ -34,6 +34,7 @@ import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
@@ -109,7 +110,7 @@ public class TemplateAttributeTest {
         TemplateAttributeDefinition attr = new TemplateAttributeDefinition();
         attr.setId(name);
         Assert.assertNull(attr.getTemplate());
-        attr.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        attr.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         try {
             attr.initialize();
             Assert.fail("No template");
@@ -121,7 +122,7 @@ public class TemplateAttributeTest {
         Assert.assertNull(attr.getTemplateText());
         attr.setTemplateText(TEST_ATTRIBUTES_TEMPLATE_ATTR);
         Assert.assertNull(attr.getVelocityEngine());
-        attr.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        attr.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         try {
             attr.initialize();
             Assert.fail("engine");
@@ -141,7 +142,7 @@ public class TemplateAttributeTest {
         }
         Assert.assertNotNull(attr.getTemplateText());
 
-        attr.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        attr.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         
         attr.initialize();
         Assert.assertNotNull(attr.getTemplate());
@@ -156,7 +157,7 @@ public class TemplateAttributeTest {
         attr.setId(name);
         attr.setVelocityEngine(getEngine());
         attr.setTemplateText(TEST_ATTRIBUTES_TEMPLATE_ATTR);
-        attr.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        attr.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         
         attr.setSourceAttributes(Collections.singletonList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         attr.initialize();
@@ -170,7 +171,7 @@ public class TemplateAttributeTest {
         attr = new TemplateAttributeDefinition();
         attr.setId(name);
         attr.setVelocityEngine(getEngine());
-        attr.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
+        attr.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
         try {
             attr.initialize();
             Assert.fail("No Text or attributes");
@@ -200,9 +201,9 @@ public class TemplateAttributeTest {
         templateDef.setVelocityEngine(getEngine());
         templateDef.setTemplateText(TEST_SIMPLE_TEMPLATE);
 
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        templateDef.setDependencies(ds);
+        templateDef.setAttributeDependencies(ds);
         templateDef.initialize();
 
         final Set<AttributeDefinition> attrDefinitions = new LazySet<>();
@@ -262,15 +263,16 @@ public class TemplateAttributeTest {
         templateDef.setVelocityEngine(getEngine());
         templateDef.setTemplateText(TEST_ATTRIBUTES_TEMPLATE_CONNECTOR);
 
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         if (setSources) {
             ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR+"2"));
         }
-        ds.add(TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
-                TestSources.DEPENDS_ON_SECOND_ATTRIBUTE_NAME));
-        templateDef.setDependencies(ds);
+        templateDef.setAttributeDependencies(ds);
+        templateDef.setDataConnectorDependencies(Collections.singleton(
+                TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
+                            TestSources.DEPENDS_ON_SECOND_ATTRIBUTE_NAME)));
         if (setSources) {
             templateDef.setSourceAttributes(Arrays.asList(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR,
                     TestSources.DEPENDS_ON_SECOND_ATTRIBUTE_NAME));
@@ -309,9 +311,9 @@ public class TemplateAttributeTest {
         templateDef.setVelocityEngine(getEngine());
         templateDef.setTemplateText("Att ${at1}");
 
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        templateDef.setDependencies(ds);
+        templateDef.setAttributeDependencies(ds);
         templateDef.initialize();
 
         final List<IdPAttributeValue<?>> values = new ArrayList<>();
@@ -350,10 +352,10 @@ public class TemplateAttributeTest {
         templateDef.setTemplateText(TEST_ATTRIBUTES_TEMPLATE_CONNECTOR);
         final String otherAttrName = TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR + "2";
 
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         ds.add(TestSources.makeResolverPluginDependency(otherAttrName));
-        templateDef.setDependencies(ds);
+        templateDef.setAttributeDependencies(ds);
         templateDef.initialize();
 
         final Set<AttributeDefinition> attrDefinitions = new LazySet<>();
@@ -382,10 +384,10 @@ public class TemplateAttributeTest {
         templateDef.setTemplateText(TEST_ATTRIBUTES_TEMPLATE_CONNECTOR);
         final String otherAttrName = TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR + "2";
 
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
         ds.add(TestSources.makeResolverPluginDependency(otherAttrName));
-        templateDef.setDependencies(ds);
+        templateDef.setAttributeDependencies(ds);
         templateDef.initialize();
 
         final Set<AttributeDefinition> attrDefinitions = new LazySet<>();
@@ -408,9 +410,9 @@ public class TemplateAttributeTest {
         templateDef.setVelocityEngine(getEngine());
         templateDef.setTemplateText(TEST_ATTRIBUTES_TEMPLATE_ATTR);
 
-        final Set<ResolverPluginDependency> ds = new LazySet<>();
+        final Set<ResolverAttributeDefinitionDependency> ds = new LazySet<>();
         ds.add(TestSources.makeResolverPluginDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR));
-        templateDef.setDependencies(ds);
+        templateDef.setAttributeDependencies(ds);
         
         templateDef.initialize();
 
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
index 696d004..be7d8b3 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/ad/mapped/impl/MappedAttributeTest.java
@@ -20,11 +20,14 @@ package net.shibboleth.idp.attribute.resolver.ad.mapped.impl;
 import java.util.Collections;
 import java.util.Set;
 
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
 import net.shibboleth.idp.attribute.ByteAttributeValue;
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.StringAttributeValue;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.saml.impl.TestSources;
@@ -32,9 +35,6 @@ import net.shibboleth.utilities.java.support.collection.LazySet;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.DestroyedComponentException;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 /** Test the mapped attribute type. */
 public class MappedAttributeTest {
 
@@ -54,10 +54,10 @@ public class MappedAttributeTest {
             // expected this
         }
 
-        final Set<ResolverPluginDependency> dependencySet = new LazySet<>();
+        final Set<ResolverDataConnectorDependency> dependencySet = new LazySet<>();
         dependencySet.add(TestSources.makeResolverPluginDependency(TestSources.STATIC_CONNECTOR_NAME,
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR));
-        definition.setDependencies(dependencySet);
+        definition.setDataConnectorDependencies(dependencySet);
 
         try {
             definition.initialize();
@@ -96,7 +96,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 "NoSuchAttribute")));
         definition.setValueMaps(Collections.singleton(substringValueMapping("foo", false, "foo")));
         definition.initialize();
@@ -115,7 +115,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 "NoSuchAttribute")));
         definition.setValueMaps(Collections.singleton(substringValueMapping("foo", false, "foo")));
         definition.setDefaultValue("");
@@ -140,7 +140,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         definition.setValueMaps(Collections.singleton(substringValueMapping("student", false, "student")));
         definition.initialize();
@@ -163,7 +163,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         Assert.assertTrue(definition.getValueMaps().isEmpty());
         definition.setValueMaps(Collections.singleton(substringValueMapping("student", false, "student")));
@@ -185,7 +185,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         Assert.assertTrue(definition.getValueMaps().isEmpty());
         definition.setValueMaps(Collections.singleton(substringValueMapping("student", false, "student")));
@@ -209,7 +209,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         Assert.assertTrue(definition.getValueMaps().isEmpty());
         definition.setValueMaps(Collections.singleton(substringValueMapping("elephant", false, "banana")));
@@ -236,7 +236,7 @@ public class MappedAttributeTest {
 
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         Assert.assertTrue(definition.getValueMaps().isEmpty());
         definition.setValueMaps(Collections.singleton(substringValueMapping("elephant", false, "banana")));
@@ -273,7 +273,7 @@ public class MappedAttributeTest {
         
         final MappedAttributeDefinition definition = new MappedAttributeDefinition();
         definition.setId(TEST_ATTRIBUTE_NAME);
-        definition.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
+        definition.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("connector1",
                 ResolverTestSupport.EPA_ATTRIB_ID)));
         
         definition.setValueMaps(Collections.singleton(valueMap));
@@ -285,10 +285,7 @@ public class MappedAttributeTest {
                                 ResolverTestSupport.EPE1_VALUES), ResolverTestSupport.buildAttribute(
                                 ResolverTestSupport.EPA_ATTRIB_ID, "Val", "val")));
         
-        final IdPAttribute result = definition.resolve(resolutionContext);
-        
-        
-
+        definition.resolve(resolutionContext);
     }
     
 }
\ No newline at end of file
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java
index 4a3ba82..f4168a6 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/dc/impl/ComputedIDDataConnectorTest.java
@@ -33,6 +33,7 @@ import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.AttributeResolver;
 import net.shibboleth.idp.attribute.resolver.DataConnector;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverTestSupport;
 import net.shibboleth.idp.attribute.resolver.ad.impl.SimpleAttributeDefinition;
@@ -84,7 +85,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         final ComputedIDDataConnector connector = new ComputedIDDataConnector();
 
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
+        connector.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
         testInit(connector, "No salt");
         connector.setSalt(salt);
@@ -93,8 +94,8 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
-                TEST_ATTRIBUTE_NAME)));
+        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
+        		TEST_ATTRIBUTE_NAME)));
 
         final Set<AttributeDefinition> set = new HashSet<>(2);
         set.add(simple);
@@ -122,7 +123,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
     @Test public void getters() throws ComponentInitializationException {
         final ComputedIDDataConnector connector = new ComputedIDDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
+        connector.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
         connector.setSalt(smallSalt);
         connector.setSourceAttributeId(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
@@ -151,7 +152,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
     protected static AttributeResolver constructResolver(final ComputedIDDataConnector connector, final int values, final boolean noSalt)
             throws ComponentInitializationException {
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
+        connector.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
                 TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR)));
         connector.setSourceAttributeId(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
         if (!noSalt) {
@@ -160,7 +161,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
+        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
                 TEST_CONNECTOR_NAME)));
         simple.initialize();
 
@@ -180,13 +181,13 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
     protected static AttributeResolver constructResolverWithNonString(final ComputedIDDataConnector connector,
             final String dependantOn) throws ComponentInitializationException {
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(dependantOn)));
+        connector.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(dependantOn)));
         connector.setSalt(salt);
         connector.setSourceAttributeId(dependantOn);
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
+        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
                 TEST_CONNECTOR_NAME)));
         simple.initialize();
         final Set<AttributeDefinition> set = new HashSet<>(3);
@@ -297,7 +298,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final ComputedIDDataConnector connector = new ComputedIDDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
+        connector.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(
                 TestSources.STATIC_CONNECTOR_NAME, TestSources.DEPENDS_ON_ATTRIBUTE_NAME_CONNECTOR)));
         connector.setSalt(salt);
         connector.setGeneratedAttributeId("wibble");
@@ -309,7 +310,7 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
 
         final SimpleAttributeDefinition simple = new SimpleAttributeDefinition();
         simple.setId(OUTPUT_ATTRIBUTE_NAME);
-        simple.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
+        simple.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency(TEST_CONNECTOR_NAME,
                 "wibble")));
         simple.initialize();
 
@@ -344,12 +345,12 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         resolutionContext.setAttributeRecipientID(TestSources.SP_ENTITY_ID);
         resolutionContext.setPrincipal(TestSources.PRINCIPAL_ID);
 
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
 
 
         final ComputedIDDataConnector connector = new ComputedIDDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(depend));
+        connector.setDataConnectorDependencies(Collections.singleton(depend));
         connector.setSourceAttributeId(ResolverTestSupport.EPA_ATTRIB_ID);
         connector.setSalt(salt);
         connector.setGeneratedAttributeId("wibble");
@@ -374,12 +375,12 @@ public class ComputedIDDataConnectorTest extends OpenSAMLInitBaseTestCase {
         resolutionContext.setAttributeRecipientID(TestSources.SP_ENTITY_ID);
         resolutionContext.setPrincipal(TestSources.PRINCIPAL_ID);
 
-        final ResolverPluginDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
+        final ResolverDataConnectorDependency depend = TestSources.makeResolverPluginDependency("connector1", ResolverTestSupport.EPA_ATTRIB_ID);
 
 
         final ComputedIDDataConnector connector = new ComputedIDDataConnector();
         connector.setId(TEST_CONNECTOR_NAME);
-        connector.setDependencies(Collections.singleton(depend));
+        connector.setDataConnectorDependencies(Collections.singleton(depend));
         connector.setSourceAttributeId(ResolverTestSupport.EPA_ATTRIB_ID);
         connector.setSalt(salt);
         connector.setGeneratedAttributeId("wibble");
diff --git a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java
index 513d0ef..2a4e47a 100644
--- a/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java
+++ b/idp-attribute-resolver-impl/src/test/java/net/shibboleth/idp/attribute/resolver/impl/AttributeResolverImplTest.java
@@ -255,15 +255,15 @@ public class AttributeResolverImplTest {
         final ResolverDataConnectorDependency dep1 = new ResolverDataConnectorDependency("dc1");
         dep1.setAllAttributes(true);
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
-        ad1.setDependencies(Collections.singleton((ResolverPluginDependency) dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
         final MockAttributeDefinition ad2 = new MockAttributeDefinition("ad2", attr);
 
-        final ResolverPluginDependency dep2 = new ResolverAttributeDefinitionDependency("ad1");
-        final ResolverPluginDependency dep3 = new ResolverAttributeDefinitionDependency("ad2");
+        final ResolverAttributeDefinitionDependency dep2 = new ResolverAttributeDefinitionDependency("ad1");
+        final ResolverAttributeDefinitionDependency dep3 = new ResolverAttributeDefinitionDependency("ad2");
         final MockAttributeDefinition ad0 = new MockAttributeDefinition("ad0", attr);
-        ad0.setDependencies(new HashSet<>(Arrays.asList(dep2, dep3)));
+        ad0.setAttributeDependencies(new HashSet<>(Arrays.asList(dep2, dep3)));
         ad0.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
@@ -298,9 +298,9 @@ public class AttributeResolverImplTest {
         dc1.initialize();
         //
 
-        final ResolverPluginDependency dep1 = TestSources.makeResolverPluginDependency("dc1", null);
+        final ResolverDataConnectorDependency dep1 = TestSources.makeResolverPluginDependency("dc1", null);
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton(dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
@@ -330,8 +330,8 @@ public class AttributeResolverImplTest {
         final MockDataConnector dc1 = new MockDataConnector("dc1", Collections.singletonMap("Atr", i1Val));
         final SimpleAttributeDefinition ad = new SimpleAttributeDefinition();
         ad.setId("output");
-        final ResolverPluginDependency dep1 = TestSources.makeResolverPluginDependency("dc1","Atr");
-        ad.setDependencies(Collections.singleton(dep1));
+        final ResolverDataConnectorDependency dep1 = TestSources.makeResolverPluginDependency("dc1","Atr");
+        ad.setDataConnectorDependencies(Collections.singleton(dep1));
         ad.initialize();
         
         final IdPAttribute i2Val = new IdPAttribute("Atr");
@@ -387,9 +387,9 @@ public class AttributeResolverImplTest {
         dc1.setFailure(true);
         dc1.initialize();
 
-        final ResolverPluginDependency dep1 = TestSources.makeResolverPluginDependency("dc1", null);
+        final ResolverDataConnectorDependency dep1 = TestSources.makeResolverPluginDependency("dc1", null);
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton(dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
 
         final LazySet<DataConnector> connectors = new LazySet<>();
         connectors.add(dc1);
@@ -416,17 +416,17 @@ public class AttributeResolverImplTest {
         final MockDataConnector dc1 = new MockDataConnector("dc1", (Map) null);
         dc1.initialize();
 
-        final ResolverPluginDependency dep1 = TestSources.makeResolverPluginDependency("dc1", null);
+        final ResolverDataConnectorDependency dep1 = TestSources.makeResolverPluginDependency("dc1", null);
         IdPAttribute attr = new IdPAttribute("test1");
         attr.setValues(Collections.singletonList(new StringAttributeValue("value1")));
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
-        ad1.setDependencies(Collections.singleton(dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
         attr = new IdPAttribute("test2");
         attr.setValues(Collections.singletonList(new StringAttributeValue("value2")));
         final MockAttributeDefinition ad2 = new MockAttributeDefinition("ad2", attr);
-        ad2.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("dc1", null)));
+        ad2.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("dc1", null)));
         ad2.initialize();
 
         LazySet<DataConnector> connectors = new LazySet<>();
@@ -462,13 +462,13 @@ public class AttributeResolverImplTest {
         connectors.add(dcfail2);
 
         final MockAttributeDefinition ad10 = new MockAttributeDefinition("ad10", new IdPAttribute("ten"));
-        ad10.setDependencies(Collections.singleton((ResolverPluginDependency) depFail1));
+        ad10.setDataConnectorDependencies(Collections.singleton(depFail1));
         ad10.setPropagateResolutionExceptions(false);
         ad10.initialize();
 
 
         final MockAttributeDefinition ad11 = new MockAttributeDefinition("ad11", new IdPAttribute("eleven"));
-        ad11.setDependencies(Collections.singleton((ResolverPluginDependency) depFail2));
+        ad11.setDataConnectorDependencies(Collections.singleton(depFail2));
         ad11.setPropagateResolutionExceptions(false);
         ad11.initialize();
 
@@ -490,11 +490,11 @@ public class AttributeResolverImplTest {
         final MockDataConnector dc1 = new MockDataConnector("dc1", values);
         dc1.initialize();
 
-        final ResolverPluginDependency dep1 = TestSources.makeResolverPluginDependency("dc1", "SubAttribute");
+        final ResolverDataConnectorDependency dep1 = TestSources.makeResolverPluginDependency("dc1", "SubAttribute");
         attr = new IdPAttribute("test1");
         attr.setValues(Collections.singletonList(new StringAttributeValue("value1")));
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
-        ad1.setDependencies(Collections.singleton(dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
@@ -525,7 +525,7 @@ public class AttributeResolverImplTest {
         attr = new IdPAttribute("test1");
         attr.setValues(Collections.singletonList(new StringAttributeValue("value1")));
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", attr);
-        ad1.setDependencies(Collections.singleton((ResolverPluginDependency)dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
@@ -661,14 +661,14 @@ public class AttributeResolverImplTest {
 
     /** Test that validation fails when a plugin depends on a non-existent plugin. */
     @Test public void badPluginIdInitialize() throws Exception {
-        final ResolverPluginDependency dep1 = new ResolverDataConnectorDependency("dc1");
+        final ResolverDataConnectorDependency dep1 = new ResolverDataConnectorDependency("dc1");
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton(dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
-        final ResolverPluginDependency dep2 = new ResolverAttributeDefinitionDependency("ad1");
+        final ResolverAttributeDefinitionDependency dep2 = new ResolverAttributeDefinitionDependency("ad1");
         MockAttributeDefinition ad0 = new MockAttributeDefinition("ad0", new IdPAttribute("test"));
-        ad0.setDependencies(Collections.singleton(dep2));
+        ad0.setAttributeDependencies(Collections.singleton(dep2));
         ad0.initialize();
 
         LazySet<AttributeDefinition> definitions = new LazySet<>();
@@ -683,9 +683,9 @@ public class AttributeResolverImplTest {
             // OK
         }
 
-        final ResolverPluginDependency dep3 = new ResolverAttributeDefinitionDependency("ad0");
+        final ResolverAttributeDefinitionDependency dep3 = new ResolverAttributeDefinitionDependency("ad0");
         ad0 = new MockAttributeDefinition("ad0", new IdPAttribute("test"));
-        ad0.setDependencies(Collections.singleton(dep3));
+        ad0.setAttributeDependencies(Collections.singleton(dep3));
         definitions = new LazySet<>();
         definitions.add(ad0);
         ad0.initialize();
@@ -702,14 +702,14 @@ public class AttributeResolverImplTest {
     
     /** Test that validation fails when a plugin depends on a non-existent plugin. */
     @Test public void badPluginIdInitializeOld() throws Exception {
-        final ResolverPluginDependency dep1 = TestSources.makeResolverPluginDependency("dc1", "test");
+        final ResolverDataConnectorDependency dep1 = TestSources.makeResolverPluginDependency("dc1", "test");
         final MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton(dep1));
+        ad1.setDataConnectorDependencies(Collections.singleton(dep1));
         ad1.initialize();
 
-        final ResolverPluginDependency dep2 = TestSources.makeResolverPluginDependency("ad1");
+        final ResolverAttributeDefinitionDependency dep2 = TestSources.makeResolverPluginDependency("ad1");
         MockAttributeDefinition ad0 = new MockAttributeDefinition("ad0", new IdPAttribute("test"));
-        ad0.setDependencies(Collections.singleton(dep2));
+        ad0.setAttributeDependencies(Collections.singleton(dep2));
         ad0.initialize();
 
         LazySet<AttributeDefinition> definitions = new LazySet<>();
@@ -724,9 +724,9 @@ public class AttributeResolverImplTest {
             // OK
         }
 
-        final ResolverPluginDependency dep3 = TestSources.makeResolverPluginDependency("ad0");
+        final ResolverAttributeDefinitionDependency dep3 = TestSources.makeResolverPluginDependency("ad0");
         ad0 = new MockAttributeDefinition("ad0", new IdPAttribute("test"));
-        ad0.setDependencies(Collections.singleton(dep3));
+        ad0.setAttributeDependencies(Collections.singleton(dep3));
         definitions = new LazySet<>();
         definitions.add(ad0);
         ad0.initialize();
@@ -744,7 +744,7 @@ public class AttributeResolverImplTest {
     /** Test that validation fails when there are circular dependencies between plugins. */
     @Test public void circularDependencyInitializeOld() throws Exception {
         MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("ad1")));
+        ad1.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("ad1")));
 
         LazySet<AttributeDefinition> definitions = new LazySet<>();
         definitions.add(ad1);
@@ -758,18 +758,18 @@ public class AttributeResolverImplTest {
             // OK
         }
 
-        final MockDataConnector dc1 = new MockDataConnector("dc1", null, Collections.singleton(TestSources.makeResolverPluginDependency("ad0")));
+        final MockDataConnector dc1 = new MockDataConnector("dc1", null, Collections.singleton(TestSources.makeResolverPluginDependency("ad0")), null);
 
         ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("dc1")));
+        ad1.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("dc1")));
         ad1.initialize();
 
         final MockAttributeDefinition ad2 = new MockAttributeDefinition("ad2", new IdPAttribute("test"));
-        ad2.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("dc1")));
+        ad2.setAttributeDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("dc1")));
         ad2.initialize();
 
         final MockAttributeDefinition ad0 = new MockAttributeDefinition("ad0", new IdPAttribute("test"));
-        ad0.setDependencies(new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("ad1"), TestSources.makeResolverPluginDependency("ad2"))));
+        ad0.setAttributeDependencies(new HashSet<>(Arrays.asList(TestSources.makeResolverPluginDependency("ad1"), TestSources.makeResolverPluginDependency("ad2"))));
         ad0.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
@@ -793,7 +793,7 @@ public class AttributeResolverImplTest {
     /** Test that validation fails when there are circular dependencies between plugins. */
     @Test public void circularDependencyInitialize() throws Exception {
         MockAttributeDefinition ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton((ResolverPluginDependency)new ResolverAttributeDefinitionDependency("ad1")));
+        ad1.setAttributeDependencies(Collections.singleton(new ResolverAttributeDefinitionDependency("ad1")));
 
         LazySet<AttributeDefinition> definitions = new LazySet<>();
         definitions.add(ad1);
@@ -807,18 +807,19 @@ public class AttributeResolverImplTest {
             // OK
         }
 
-        final MockDataConnector dc1 = new MockDataConnector("dc1", null, Collections.singleton((ResolverPluginDependency)new ResolverAttributeDefinitionDependency("ad0")));
+        final MockDataConnector dc1 = new MockDataConnector("dc1", null, 
+                Collections.singleton(new ResolverAttributeDefinitionDependency("ad0")), null);
 
         ad1 = new MockAttributeDefinition("ad1", new IdPAttribute("test"));
-        ad1.setDependencies(Collections.singleton((ResolverPluginDependency)new ResolverDataConnectorDependency("dc1")));
+        ad1.setDataConnectorDependencies(Collections.singleton(new ResolverDataConnectorDependency("dc1")));
         ad1.initialize();
 
         final MockAttributeDefinition ad2 = new MockAttributeDefinition("ad2", new IdPAttribute("test"));
-        ad2.setDependencies(Collections.singleton((ResolverPluginDependency)new ResolverDataConnectorDependency("dc1")));
+        ad2.setDataConnectorDependencies(Collections.singleton(new ResolverDataConnectorDependency("dc1")));
         ad2.initialize();
 
         final MockAttributeDefinition ad0 = new MockAttributeDefinition("ad0", new IdPAttribute("test"));
-        ad0.setDependencies(new HashSet<>(Arrays.asList((ResolverPluginDependency)new ResolverAttributeDefinitionDependency("ad1"), new ResolverAttributeDefinitionDependency("ad2"))));
+        ad0.setAttributeDependencies(new HashSet<>(Arrays.asList(new ResolverAttributeDefinitionDependency("ad1"), new ResolverAttributeDefinitionDependency("ad2"))));
         ad0.initialize();
 
         final LazySet<DataConnector> connectors = new LazySet<>();
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ResolverPluginDependencyParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginDependencyParser.java
similarity index 59%
rename from idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ResolverPluginDependencyParser.java
rename to idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginDependencyParser.java
index 0ce7933..3dc5161 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/ResolverPluginDependencyParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginDependencyParser.java
@@ -18,16 +18,6 @@
 package net.shibboleth.idp.attribute.resolver.spring;
 
 import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.xml.namespace.QName;
-
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
-import net.shibboleth.idp.attribute.resolver.spring.impl.AttributeResolverNamespaceHandler;
-import net.shibboleth.idp.attribute.resolver.spring.impl.InputAttributeDefinitionParser;
-import net.shibboleth.idp.attribute.resolver.spring.impl.InputDataConnectorParser;
-import net.shibboleth.utilities.java.support.primitive.DeprecationSupport;
-import net.shibboleth.utilities.java.support.primitive.StringSupport;
-import net.shibboleth.utilities.java.support.primitive.DeprecationSupport.ObjectType;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -36,32 +26,19 @@ import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser;
 import org.springframework.beans.factory.xml.ParserContext;
 import org.w3c.dom.Element;
 
-/** Bean definition parser for a {@link ResolverPluginDependency}. */
-public class ResolverPluginDependencyParser extends AbstractSingleBeanDefinitionParser {
+import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
+import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
-    /** Element name. */
-    @Nonnull public static final QName ELEMENT_NAME =
-            new QName(AttributeResolverNamespaceHandler.NAMESPACE, "Dependency");
+/** Bean definition parser for a {@link ResolverPluginDependency}. */
+public abstract class BaseResolverPluginDependencyParser extends AbstractSingleBeanDefinitionParser {
 
     /** Class logger. */
-    @Nonnull private final Logger log = LoggerFactory.getLogger(ResolverPluginDependencyParser.class);
-
-    /** {@inheritDoc} */
-    @Override protected Class<? extends ResolverPluginDependency> getBeanClass(@Nullable final Element element) {
-        return ResolverPluginDependency.class;
-    }
+    @Nonnull private final Logger log = LoggerFactory.getLogger(BaseResolverPluginDependencyParser.class);
 
     /** {@inheritDoc} */
     @Override protected void doParse(@Nonnull final Element config, @Nonnull final ParserContext parserContext,
             @Nonnull final BeanDefinitionBuilder builder) {
 
-        if (ELEMENT_NAME.getLocalPart().equals(config.getLocalName())) {
-            DeprecationSupport.warnOnce(ObjectType.ELEMENT, ELEMENT_NAME.toString(),
-                    parserContext.getReaderContext().getResource().getDescription(),
-                    InputDataConnectorParser.ELEMENT_NAME.toString()  + " or "
-                            + InputAttributeDefinitionParser.ELEMENT_NAME.toString());
-        }
-        
         final String pluginId = StringSupport.trimOrNull(config.getAttributeNS(null, "ref"));
         log.info("Parsing configuration for {} with pluginId: {}", config.getLocalName(), pluginId);
         builder.addConstructorArgValue(pluginId);
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java
index bafb36a..a651861 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/BaseResolverPluginParser.java
@@ -94,13 +94,12 @@ public abstract class BaseResolverPluginParser extends AbstractSingleBeanDefinit
                     StringSupport.trimOrNull(config.getAttributeNS(null, "propagateResolutionExceptions")));
         }
 
-        final List<Element> dependencyElements =
-                ElementSupport.getChildElements(config, ResolverPluginDependencyParser.ELEMENT_NAME);
-        dependencyElements.addAll(
-                ElementSupport.getChildElements(config, InputAttributeDefinitionParser.ELEMENT_NAME));
-        dependencyElements.addAll(
-                ElementSupport.getChildElements(config, InputDataConnectorParser.ELEMENT_NAME));
-        if (null != dependencyElements && !dependencyElements.isEmpty()) {
+        final List<Element> attributeDependencyElements =
+                ElementSupport.getChildElements(config, InputAttributeDefinitionParser.ELEMENT_NAME);
+        final List<Element> dataConnectorDependencyElements =
+                ElementSupport.getChildElements(config, InputDataConnectorParser.ELEMENT_NAME);       
+        if ((null != attributeDependencyElements && !attributeDependencyElements.isEmpty()) ||
+            (null != dataConnectorDependencyElements && !dataConnectorDependencyElements.isEmpty())) {
             if (failOnDependencies()) {
                 log.error("{} Dependencies are not allowed.", getLogPrefix());
                 throw new BeanCreationException(getLogPrefix() + " has meaningless Dependencies statements");
@@ -109,7 +108,10 @@ public abstract class BaseResolverPluginParser extends AbstractSingleBeanDefinit
                 log.warn("{} Dependencies are not allowed.", getLogPrefix());
             }
         }
-        builder.addPropertyValue("dependencies", SpringSupport.parseCustomElements(dependencyElements, parserContext));
+        builder.addPropertyValue("attributeDependencies", 
+                SpringSupport.parseCustomElements(attributeDependencyElements, parserContext));
+        builder.addPropertyValue("dataConnectorDependencies", 
+                SpringSupport.parseCustomElements(dataConnectorDependencyElements, parserContext));
     }
 // Checkstyle: CyclomaticComplexity ON
     
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
index 39265dc..239aa80 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AbstractResolverPluginFactoryBean.java
@@ -26,6 +26,8 @@ import javax.annotation.Nullable;
 
 import net.shibboleth.ext.spring.factory.AbstractComponentAwareFactoryBean;
 import net.shibboleth.idp.attribute.resolver.AbstractResolverPlugin;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 
@@ -42,17 +44,20 @@ public abstract class AbstractResolverPluginFactoryBean<T extends AbstractResolv
     /** The component Id. */
     @Nullable private String componentId;
     
-    /** Data Connector property "propagateResolutionExceptions". */
+    /** Plugin property "propagateResolutionExceptions". */
     @Nullable private Boolean propagateResolutionExceptions;
 
-    /** Data Connector property "profileContextStrategy". */
+    /** Plugin property "profileContextStrategy". */
     @Nullable private Function<AttributeResolutionContext, ProfileRequestContext> profileContextStrategy;
 
-    /** Data Connector property "activationCondition". */
+    /** Plugin property "activationCondition". */
     @Nullable private Predicate<ProfileRequestContext> activationCondition;
 
-    /** Data Connector property "dependencies". */
-    @Nullable private Set<ResolverPluginDependency> dependencies;
+    /** Plugin property "attributeDependencies". */
+    @Nullable private Set<ResolverAttributeDefinitionDependency> attributeDependencies;
+
+    /** Plugin property "dataConnectorDependencies". */
+    @Nullable private Set<ResolverDataConnectorDependency> dataConnectorDependencies;
 
     /** Get the component Id.
      * @return the id.
@@ -124,22 +129,41 @@ public abstract class AbstractResolverPluginFactoryBean<T extends AbstractResolv
     }
 
     /**
-     * Bean setter in support of {@link AbstractResolverPlugin#setDependencies(Set)}.
+     * Bean setter in support of {@link AbstractResolverPlugin#setAttributeDependencies(Set)}.
+     * 
+     * @param dependencies value to set
+     */
+    public void setAttributeDependencies(@Nullable final Set<ResolverAttributeDefinitionDependency> dependencies) {
+
+        attributeDependencies = dependencies;
+    }
+    
+    /**
+     * Bean setter in support of {@link AbstractResolverPlugin#setDataConnectorDependencies(Set)}.
      * 
-     * @param pluginDependencies value to set
+     * @param dependencies value to set
      */
-    public void setDependencies(@Nullable final Set<ResolverPluginDependency> pluginDependencies) {
+    public void setDataConnectorDependencies(@Nullable final Set<ResolverDataConnectorDependency> dependencies) {
 
-        dependencies = pluginDependencies;
+        dataConnectorDependencies = dependencies;
     }
 
     /**
-     * Bean getter in support of {@link AbstractResolverPlugin#setActivationCondition(Predicate)}.
+     * Bean getter in support of {@link AbstractResolverPlugin#setAttributeDependencies(Set)}.
      * 
-     * @return The value to be set
+     * @return The value
      */
-    @Nullable public Set<ResolverPluginDependency> getDependencies() {
-        return dependencies;
+    @Nullable public Set<ResolverAttributeDefinitionDependency> getAttributeDependencies() {
+        return attributeDependencies;
+    }
+
+    /**
+     * Bean getter in support of {@link AbstractResolverPlugin#setDataConnectorDependencies(Set)}.
+     * 
+     * @return The value
+     */
+    @Nullable public Set<ResolverDataConnectorDependency> getDataConnectorDependencies() {
+        return dataConnectorDependencies;
     }
 
     /** 
@@ -153,8 +177,11 @@ public abstract class AbstractResolverPluginFactoryBean<T extends AbstractResolv
         if (null != getActivationCondition()) {
             what.setActivationCondition(getActivationCondition());
         }
-        if (null != getDependencies()) {
-            what.setDependencies(getDependencies());
+        if (null != getAttributeDependencies()) {
+            what.setAttributeDependencies(getAttributeDependencies());
+        }
+        if (null != getDataConnectorDependencies()) {
+            what.setDataConnectorDependencies(getDataConnectorDependencies());
         }
         if (null != getProfileContextStrategy()) {
             what.setProfileContextStrategy(getProfileContextStrategy());
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java
index b3f6c0d..eab45c3 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/AttributeResolverNamespaceHandler.java
@@ -20,7 +20,7 @@ package net.shibboleth.idp.attribute.resolver.spring.impl;
 import javax.annotation.Nonnull;
 
 import net.shibboleth.ext.spring.util.BaseSpringNamespaceHandler;
-import net.shibboleth.idp.attribute.resolver.spring.ResolverPluginDependencyParser;
+import net.shibboleth.idp.attribute.resolver.spring.BaseResolverPluginDependencyParser;
 import net.shibboleth.idp.attribute.resolver.spring.ad.impl.ContextDerivedAttributeDefinitionParser;
 import net.shibboleth.idp.attribute.resolver.spring.ad.impl.CryptoTransientIdAttributeDefinitionParser;
 import net.shibboleth.idp.attribute.resolver.spring.ad.impl.PrescopedAttributeDefinitionParser;
@@ -73,7 +73,6 @@ public class AttributeResolverNamespaceHandler extends BaseSpringNamespaceHandle
 
         registerBeanDefinitionParser(AttributeResolverParser.SCHEMA_TYPE, parser);
         registerBeanDefinitionParser(AttributeResolverParser.ELEMENT_NAME, parser);
-        registerBeanDefinitionParser(ResolverPluginDependencyParser.ELEMENT_NAME, new ResolverPluginDependencyParser());
         registerBeanDefinitionParser(InputDataConnectorParser.ELEMENT_NAME, new InputDataConnectorParser());
         registerBeanDefinitionParser(InputAttributeDefinitionParser.ELEMENT_NAME, new InputAttributeDefinitionParser());
 
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputAttributeDefinitionParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputAttributeDefinitionParser.java
index 24b1e1d..b320a5b 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputAttributeDefinitionParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputAttributeDefinitionParser.java
@@ -23,12 +23,12 @@ import javax.xml.namespace.QName;
 
 import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
-import net.shibboleth.idp.attribute.resolver.spring.ResolverPluginDependencyParser;
+import net.shibboleth.idp.attribute.resolver.spring.BaseResolverPluginDependencyParser;
 
 import org.w3c.dom.Element;
 
 /** Bean definition parser for a {@link ResolverPluginDependency}. */
-public class InputAttributeDefinitionParser extends ResolverPluginDependencyParser {
+public class InputAttributeDefinitionParser extends BaseResolverPluginDependencyParser {
 
     /** Element name. */
     @Nonnull public static final QName ELEMENT_NAME =
diff --git a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java
index 6907116..07cb26f 100644
--- a/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java
+++ b/idp-attribute-resolver-spring/src/main/java/net/shibboleth/idp/attribute/resolver/spring/impl/InputDataConnectorParser.java
@@ -32,11 +32,11 @@ import org.w3c.dom.Element;
 import net.shibboleth.ext.spring.util.SpringSupport;
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
-import net.shibboleth.idp.attribute.resolver.spring.ResolverPluginDependencyParser;
+import net.shibboleth.idp.attribute.resolver.spring.BaseResolverPluginDependencyParser;
 import net.shibboleth.utilities.java.support.primitive.StringSupport;
 
 /** Bean definition parser for a {@link ResolverPluginDependency}. */
-public class InputDataConnectorParser extends ResolverPluginDependencyParser {
+public class InputDataConnectorParser extends BaseResolverPluginDependencyParser {
 
     /** Element name. */
     @Nonnull public static final QName ELEMENT_NAME =
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/DependencyTypesTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/DependencyTypesTest.java
index 7aafb2b..3a26c58 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/DependencyTypesTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/DependencyTypesTest.java
@@ -67,7 +67,8 @@ public class DependencyTypesTest extends BaseAttributeDefinitionParserTest {
     @Test(dependsOnMethods={"attributeInput", "allAttributeDataConnector"}) public void simple() {
         final AttributeDefinition attr =  getBean(BEAN_FILE_PATH + "simpleDependencies.xml", AttributeDefinition.class, new GenericApplicationContext());
         
-        Assert.assertEquals(attr.getDependencies().size(), 2);
+        Assert.assertEquals(attr.getDataConnectorDependencies().size(), 1);
+        Assert.assertEquals(attr.getAttributeDependencies().size(), 1);
     }
 
 }
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/SimpleAttributeParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/SimpleAttributeParserTest.java
index ad6fb3a..7ca613b 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/SimpleAttributeParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/ad/SimpleAttributeParserTest.java
@@ -34,7 +34,8 @@ import org.testng.annotations.Test;
 
 import net.shibboleth.ext.spring.context.FilesystemGenericApplicationContext;
 import net.shibboleth.idp.attribute.resolver.AttributeDefinition;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
+import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
 import net.shibboleth.idp.attribute.resolver.ad.impl.SimpleAttributeDefinition;
 import net.shibboleth.idp.attribute.resolver.spring.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.resolver.spring.ad.impl.SimpleAttributeDefinitionParser;
@@ -58,7 +59,7 @@ public class SimpleAttributeParserTest extends BaseAttributeDefinitionParserTest
         Assert.assertFalse(attrDef.isDependencyOnly(), "isDependencyOnly");
         Assert.assertTrue(attrDef.getDisplayDescriptions().isEmpty(), "getDisplayDescriptions().isEmpty()");
         Assert.assertTrue(attrDef.getDisplayNames().isEmpty(), "getDisplayNames().isEmpty()");
-        Assert.assertEquals(attrDef.getDependencies().size(), 1);
+        Assert.assertEquals(attrDef.getAttributeDependencies().size(), 1);
         Assert.assertTrue(attrDef.getAttributeEncoders().isEmpty(), "getgetAttributeEncoders().isEmpty()");
     }
 
@@ -82,11 +83,16 @@ public class SimpleAttributeParserTest extends BaseAttributeDefinitionParserTest
         Assert.assertEquals(names.get(new Locale("en")), "NameInEnglish");
         Assert.assertEquals(names.get(new Locale("fr")), "NameEnFrancais");
 
-        Set<ResolverPluginDependency> dependencies = attrDef.getDependencies();
-        Assert.assertEquals(dependencies.size(), 3, "getDisplayDescriptions");
-        Assert.assertTrue(dependencies.contains(TestSources.makeResolverPluginDependency("con1", "dep1")));
-        Assert.assertTrue(dependencies.contains(TestSources.makeResolverPluginDependency("dep2")));
-        Assert.assertTrue(dependencies.contains(TestSources.makeResolverPluginDependency("dep3")));
+        Set<ResolverAttributeDefinitionDependency> adDeps = attrDef.getAttributeDependencies();
+        Assert.assertEquals(adDeps.size(), 2, "getAttributeDependencies");
+        Assert.assertTrue(adDeps.contains(TestSources.makeResolverPluginDependency("dep2")));
+        Assert.assertTrue(adDeps.contains(TestSources.makeResolverPluginDependency("dep3")));
+
+        Set<ResolverDataConnectorDependency> dcDeps = attrDef.getDataConnectorDependencies();
+        Assert.assertEquals(dcDeps.size(), 1, "getDataConnectorDependencies");
+        final ResolverDataConnectorDependency dcDep = dcDeps.iterator().next();
+        Assert.assertEquals(dcDep.getDependencyPluginId(), "con1");
+        Assert.assertTrue(dcDep.getAttributeNames().contains("dep1"));
 
         Assert.assertEquals(attrDef.getAttributeEncoders().size(), 1);
         final SAML2StringAttributeEncoder e1 =
@@ -111,12 +117,16 @@ public class SimpleAttributeParserTest extends BaseAttributeDefinitionParserTest
         Assert.assertEquals(names.size(), 1, "getDisplayNames");
         Assert.assertEquals(names.get(new Locale("en")), "NameInAmerican");
 
-        Set<ResolverPluginDependency> dependencies = attrDef.getDependencies();
-        Assert.assertEquals(dependencies.size(), 1, "getDisplayDescriptions");
-        Assert.assertTrue(dependencies.contains(TestSources.makeResolverPluginDependency("dep3")));
+        final Set<ResolverAttributeDefinitionDependency> attrDeps = attrDef.getAttributeDependencies();
+        Assert.assertEquals(attrDeps.size(), 1, "getAttributeDependencies");
+        Assert.assertTrue(attrDeps.contains(TestSources.makeResolverPluginDependency("dep3")));
+
+        final Set<ResolverDataConnectorDependency> dcDeps = attrDef.getDataConnectorDependencies();
+        Assert.assertEquals(dcDeps.size(), 0, "getDataConnectorDependencies");
 
+        
         Assert.assertEquals(attrDef.getAttributeEncoders().size(), 2);
-        List a = new ArrayList(attrDef.getAttributeEncoders());
+        final List a = new ArrayList(attrDef.getAttributeEncoders());
 
         final SAML2StringAttributeEncoder saml2;
         final SAML1StringAttributeEncoder saml1;
diff --git a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java
index ea35fa7..de5c968 100644
--- a/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java
+++ b/idp-attribute-resolver-spring/src/test/java/net/shibboleth/idp/attribute/resolver/spring/dc/StoredIDDataConnectorParserTest.java
@@ -17,17 +17,16 @@
 
 package net.shibboleth.idp.attribute.resolver.spring.dc;
 
+import org.bouncycastle.util.Arrays;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
 import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.spring.BaseAttributeDefinitionParserTest;
 import net.shibboleth.idp.attribute.resolver.spring.dc.impl.StoredIDDataConnectorParser;
 import net.shibboleth.idp.saml.attribute.resolver.impl.StoredIDDataConnector;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 
-import org.bouncycastle.util.Arrays;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 /**
  * test for {@link StoredIDDataConnectorParser}
  */
@@ -47,7 +46,7 @@ public class StoredIDDataConnectorParserTest extends BaseAttributeDefinitionPars
     @Test public void withSalt() throws ComponentInitializationException {
         final StoredIDDataConnector connector = getDataConnector("resolver/stored.xml", StoredIDDataConnector.class);
         
-        ResolverAttributeDefinitionDependency attrib = (ResolverAttributeDefinitionDependency) connector.getDependencies().iterator().next();
+        final ResolverAttributeDefinitionDependency attrib = connector.getAttributeDependencies().iterator().next();
         Assert.assertEquals(attrib.getDependencyPluginId(), "theSourceRemainsTheSame");
         Assert.assertEquals(connector.getSalt(), "abcdefghijklmnopqrst".getBytes());
         testIt(connector);
@@ -55,7 +54,7 @@ public class StoredIDDataConnectorParserTest extends BaseAttributeDefinitionPars
 
     @Test public void withOutSalt() throws ComponentInitializationException {
         final StoredIDDataConnector connector = getDataConnector("resolver/storedNoSalt.xml", StoredIDDataConnector.class);
-        ResolverAttributeDefinitionDependency attrib = (ResolverAttributeDefinitionDependency) connector.getDependencies().iterator().next();
+        final ResolverAttributeDefinitionDependency attrib = connector.getAttributeDependencies().iterator().next();
         Assert.assertEquals(attrib.getDependencyPluginId(), "theSourceRemainsTheSame");
         testIt(connector);
     }
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/AbstractPersistentIdDataConnector.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/AbstractPersistentIdDataConnector.java
index 031fdb0..3bc43cc 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/AbstractPersistentIdDataConnector.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/AbstractPersistentIdDataConnector.java
@@ -118,45 +118,38 @@ public abstract class AbstractPersistentIdDataConnector extends AbstractDataConn
      *
      * @throws ComponentInitializationException if the dependencies are not aligned correctly
      */
- // Checkstyle: CyclomaticComplexity|MethodLength OFF
     private void doDependencyInformation() throws ComponentInitializationException {
         final StringBuilder dependencyInformation = new StringBuilder();
         boolean seenAttribute = false;
-        for (final ResolverPluginDependency depends : getDependencies()) {
+
+        for (final ResolverAttributeDefinitionDependency attrDep : getAttributeDependencies()) {
             if (seenAttribute) {
                 dependencyInformation.append(", ");
             }
-            if (depends instanceof ResolverAttributeDefinitionDependency) {
-                dependencyInformation.append(depends.getDependencyPluginId());
-                // No other work needed.  The name is the reference
-            } else if (depends instanceof ResolverDataConnectorDependency) {
-                final ResolverDataConnectorDependency dataConnectorDependency =
-                        (ResolverDataConnectorDependency) depends;
-                if (dataConnectorDependency.isAllAttributes()) {
-                    dependencyInformation.append(depends.getDependencyPluginId()).append("/*");
-                } else if (dataConnectorDependency.getAttributeNames().isEmpty()) {
-                    throw new ComponentInitializationException(getLogPrefix() + " No source attribute present.");
-                } else if (dataConnectorDependency.getAttributeNames().size() == 1) {
-                    dependencyInformation.append(dataConnectorDependency.getDependencyPluginId()).
-                                          append('/').
-                                          append(dataConnectorDependency.getAttributeNames().iterator().next());
-                } else {
-                    dependencyInformation.append(dataConnectorDependency.getDependencyPluginId()).
-                                          append('/').
-                                          append(dataConnectorDependency.getAttributeNames().toString());
-                }
-                // No work needed.  The names are stored elsewhere
+            dependencyInformation.append(attrDep.getDependencyPluginId());
+            seenAttribute = true;
+        }
+
+        for (final ResolverDataConnectorDependency dataConnectorDependency : getDataConnectorDependencies()) {
+            if (seenAttribute) {
+                dependencyInformation.append(", ");
+            }
+            if (dataConnectorDependency.isAllAttributes()) {
+                dependencyInformation.append(dataConnectorDependency.getDependencyPluginId()).append("/*");
+            } else if (dataConnectorDependency.getAttributeNames().isEmpty()) {
+                throw new ComponentInitializationException(getLogPrefix() + " No source attribute present.");
+            } else if (dataConnectorDependency.getAttributeNames().size() == 1) {
+                dependencyInformation.append(dataConnectorDependency.getDependencyPluginId()).
+                                      append('/').
+                                      append(dataConnectorDependency.getAttributeNames().iterator().next());
             } else {
-                if (null == getSourceAttributeId()) {
-                    throw new ComponentInitializationException(getLogPrefix() + " No source attribute present.");
-                }
-                dependencyInformation.append(depends.getDependencyPluginId()).
+                dependencyInformation.append(dataConnectorDependency.getDependencyPluginId()).
                                       append('/').
-                                      append(getSourceAttributeId());
-                depends.setDependencyAttributeId(getSourceAttributeId());
+                                      append(dataConnectorDependency.getAttributeNames().toString());
             }
             seenAttribute = true;
         }
+        
         if (!seenAttribute) {
             if (null == getSourceAttributeId()) {
                 throw new ComponentInitializationException(getLogPrefix() + " No source attribute present.");
@@ -169,7 +162,6 @@ public abstract class AbstractPersistentIdDataConnector extends AbstractDataConn
         sourceInformation = dependencyInformation.toString();
         log.debug("{} Source for definition: {}", getLogPrefix(), sourceInformation);
     }
- // Checkstyle: CyclomaticComplexity|MethodLength ON
 
     /** {@inheritDoc} */
     @Override protected void doInitialize() throws ComponentInitializationException { 
@@ -197,7 +189,10 @@ public abstract class AbstractPersistentIdDataConnector extends AbstractDataConn
         ComponentSupport.ifDestroyedThrowDestroyedComponentException(this);
 
         final List<IdPAttributeValue<?>> attributeValues =
-                PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
+                PluginDependencySupport.getMergedAttributeValues(workContext,
+                        getAttributeDependencies(),
+                        getDataConnectorDependencies(),
+                        getId());
         if (attributeValues == null || attributeValues.isEmpty()) {
             log.debug("{} Source attribute {} for connector {} provide no values", getLogPrefix(),
                     getSourceAttributeInformation(), getId());
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
index 0e72966..6e929a4 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML1NameIdentifierAttributeDefinition.java
@@ -188,7 +188,10 @@ public class SAML1NameIdentifierAttributeDefinition extends AbstractAttributeDef
         List<? extends IdPAttributeValue<?>> outputValues = null;
         final IdPAttribute result = new IdPAttribute(getId());
 
-        inputValues = PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
+        inputValues = PluginDependencySupport.getMergedAttributeValues(workContext,
+                getAttributeDependencies(),
+                getDataConnectorDependencies(),
+                getId());
 
         if (null != inputValues && !inputValues.isEmpty()) {
             if (1 == inputValues.size()) {
diff --git a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
index 89b3c88..21d0094 100644
--- a/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
+++ b/idp-saml-impl/src/main/java/net/shibboleth/idp/saml/attribute/resolver/impl/SAML2NameIDAttributeDefinition.java
@@ -224,7 +224,10 @@ public class SAML2NameIDAttributeDefinition extends AbstractAttributeDefinition
         List<? extends IdPAttributeValue<?>> outputValues = null;
         final IdPAttribute result = new IdPAttribute(getId());
 
-        inputValues = PluginDependencySupport.getMergedAttributeValues(workContext, getDependencies(), getId());
+        inputValues = PluginDependencySupport.getMergedAttributeValues(workContext,
+                getAttributeDependencies(),
+                getDataConnectorDependencies(),
+                getId());
 
         if (null != inputValues && !inputValues.isEmpty()) {
 
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/resolver/impl/TransientIdAttributeDefinitionTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/resolver/impl/TransientIdAttributeDefinitionTest.java
index 3d4fa33..1732158 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/resolver/impl/TransientIdAttributeDefinitionTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/attribute/resolver/impl/TransientIdAttributeDefinitionTest.java
@@ -67,7 +67,7 @@ public class TransientIdAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         final TransientIdAttributeDefinition defn = newTransientIdAttributeDefinition(strategy);
         defn.setId(TEST_ATTRIBUTE_NAME);
 
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
 
         defn.initialize();
 
@@ -105,7 +105,7 @@ public class TransientIdAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         
         final TransientIdAttributeDefinition defn = newTransientIdAttributeDefinition(strategy);
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         defn.initialize();
         try {
             defn.resolve(TestSources.createResolutionContext(principal, idp, sp));
@@ -133,7 +133,7 @@ public class TransientIdAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         strategy.initialize();
         final TransientIdAttributeDefinition defn = newTransientIdAttributeDefinition(strategy);
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
 
         defn.initialize();
 
@@ -154,7 +154,7 @@ public class TransientIdAttributeDefinitionTest extends OpenSAMLInitBaseTestCase
         final TransientIdAttributeDefinition defn = newTransientIdAttributeDefinition(strategy);
 
         defn.setId(TEST_ATTRIBUTE_NAME);
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         defn.initialize();
 
         IdPAttribute result = defn.resolve(TestSources.createResolutionContext(TestSources.PRINCIPAL_ID,
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java
index 317e9e4..83bbc28 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/impl/TestSources.java
@@ -30,6 +30,10 @@ import java.util.regex.Pattern;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
 
+import org.opensaml.profile.context.ProfileRequestContext;
+
+import com.google.common.collect.ImmutableMap;
+
 import net.shibboleth.idp.attribute.IdPAttribute;
 import net.shibboleth.idp.attribute.IdPAttributeValue;
 import net.shibboleth.idp.attribute.StringAttributeValue;
@@ -40,7 +44,6 @@ import net.shibboleth.idp.attribute.resolver.DataConnectorEx;
 import net.shibboleth.idp.attribute.resolver.ResolutionException;
 import net.shibboleth.idp.attribute.resolver.ResolverAttributeDefinitionDependency;
 import net.shibboleth.idp.attribute.resolver.ResolverDataConnectorDependency;
-import net.shibboleth.idp.attribute.resolver.ResolverPluginDependency;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext;
 import net.shibboleth.idp.attribute.resolver.context.AttributeResolverWorkContext;
 import net.shibboleth.idp.saml.attribute.resolver.impl.SAML2NameIDAttributeDefinition;
@@ -51,10 +54,6 @@ import net.shibboleth.utilities.java.support.collection.LazySet;
 import net.shibboleth.utilities.java.support.component.ComponentInitializationException;
 import net.shibboleth.utilities.java.support.component.ComponentSupport;
 
-import org.opensaml.profile.context.ProfileRequestContext;
-
-import com.google.common.collect.ImmutableMap;
-
 /** Basic data sources for testing the attribute generators. */
 public final class TestSources {
     /** The name we use in this test for the static connector. */
@@ -192,8 +191,8 @@ public final class TestSources {
         defn.setId(name);
 
         // Set the dependency on the data connector
-        ResolverPluginDependency depend = new ResolverAttributeDefinitionDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
-        defn.setDependencies(Collections.singleton(depend));
+        ResolverAttributeDefinitionDependency depend = new ResolverAttributeDefinitionDependency(TestSources.DEPENDS_ON_ATTRIBUTE_NAME_ATTR);
+        defn.setAttributeDependencies(Collections.singleton(depend));
         defn.initialize();
         return defn;
     }
@@ -211,12 +210,12 @@ public final class TestSources {
         return retVal;
     }
 
-    public static ResolverPluginDependency makeResolverPluginDependency(String attributeId) {
+    public static ResolverAttributeDefinitionDependency makeResolverPluginDependency(String attributeId) {
         ResolverAttributeDefinitionDependency retVal = new ResolverAttributeDefinitionDependency(attributeId);
         return retVal;
     }
     
-    public static ResolverPluginDependency makeResolverPluginDependency(@Nonnull String connectorId, @Nullable String attributeId) {
+    public static ResolverDataConnectorDependency makeResolverPluginDependency(@Nonnull String connectorId, @Nullable String attributeId) {
         ResolverDataConnectorDependency retVal = new ResolverDataConnectorDependency(connectorId);
         if (null == attributeId) {
             retVal.setAllAttributes(true);
diff --git a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java
index a983034..6a34e79 100644
--- a/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java
+++ b/idp-saml-impl/src/test/java/net/shibboleth/idp/saml/nameid/impl/TransientDecoderTest.java
@@ -139,7 +139,7 @@ public class TransientDecoderTest extends OpenSAMLInitBaseTestCase {
         
         final TransientIdAttributeDefinition defn = TransientIdAttributeDefinitionTest.newTransientIdAttributeDefinition(strategy);
         defn.setId("id");
-        defn.setDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
+        defn.setDataConnectorDependencies(Collections.singleton(TestSources.makeResolverPluginDependency("foo", "bar")));
         defn.initialize();
     
         final IdPAttribute result =

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the commits mailing list