Index: src/main/groovy/org/gradle/api/artifacts/Configuration.java
===================================================================
--- src/main/groovy/org/gradle/api/artifacts/Configuration.java	(revision 1382)
+++ src/main/groovy/org/gradle/api/artifacts/Configuration.java	(working copy)
@@ -113,6 +113,11 @@
      */
     Configuration setDescription(String description);
 
+    /**
+     * Gets a list including this configuration and all superconfigurations
+     * recursively.
+     * @return the list of all configurations
+     */
     List<Configuration> getHierarchy();
 
     /**
@@ -123,6 +128,12 @@
      */
     Set<File> resolve();
 
+    /**
+     * Resolves this configuration. This locates and downloads the files which make up this configuration, and returns
+     * a ResolveReport that may be used to determine information about the resolve (including errors).
+     *
+     * @return The ResolveReport
+     */
     ResolveReport resolveAsReport();
 
     String getUploadInternalTaskName();
@@ -147,12 +158,36 @@
 
     void publish(List<DependencyResolver> publishResolvers, PublishInstruction publishInstruction);
 
+    /**
+     * Gets the set of dependencies directly contained in this configuration
+     * (ignoring superconfigurations).
+     *
+     * @return the set of dependencies
+     */
     Set<Dependency> getDependencies();
 
+    /**
+     * Gets the complete set of dependencies including those contributed by
+     * superconfigurations.
+     *
+     * @return the set of dependencies
+     */
     Set<Dependency> getAllDependencies();
 
+    /**
+     * Gets the set of Project Dependencies directly contained in this configuration
+     * (ignoring superconfigurations).
+     *
+     * @return the set of Project Dependencies
+     */
     Set<ProjectDependency> getProjectDependencies();
 
+    /**
+     * Gets the complete set of Project Dependencies including those contributed by
+     * superconfigurations.
+     *
+     * @return the set of Project Dependencies
+     */
     Set<ProjectDependency> getAllProjectDependencies();
 
     void addDependency(Dependency dependency);
@@ -169,11 +204,41 @@
 
     Configuration addArtifact(PublishArtifact artifact);
 
+    /**
+     * Creates a copy of this configuration that only contains the dependencies directly in this configuration
+     * (without contributions from superconfigurations).  The new configuation will be in the
+     * UNRESOLVED state, but will retain all other attributes of this configuration except superconfigurations.
+     * {@link #getHierarchy()} for the copy will not include any superconfigurations.
+     * @return copy of this configuration
+     */
     Configuration copy();
 
+    /**
+     * Creates a copy of this configuration that contains the dependencies directly in this configuration
+     * and those derived from superconfigurations.  The new configuation will be in the
+     * UNRESOLVED state, but will retain all other attributes of this configuration except superconfigurations.
+     * {@link #getHierarchy()} for the copy will not include any superconfigurations.
+     * @return copy of this configuration
+     */
     Configuration copyRecursive();
 
+    /**
+     * Creates a copy of this configuration ignoring superconfigurations (see {@link #copy()} but filtering
+     * the dependencies using the dependencySpec.  The dependencySpec may be obtained from
+     * {@link org.gradle.api.artifacts.specs.DependencySpecs DependencySpecs.type()} like
+     * DependencySpecs.type(Type.EXTERNAL)
+     * @param dependencySpec filtering requirements
+     * @return copy of this configuration
+     */
     Configuration copy(Spec<Dependency> dependencySpec);
 
+    /**
+     * Creates a copy of this configuration with dependencies from superconfigurations (see {@link #copyRecursive()})
+     *  but filtering the dependencies using the dependencySpec.  The dependencySpec may be obtained from
+     * {@link org.gradle.api.artifacts.specs.DependencySpecs DependencySpecs.type()} like
+     * DependencySpecs.type(Type.EXTERNAL)
+     * @param dependencySpec filtering requirements
+     * @return copy of this configuration
+     */
     Configuration copyRecursive(Spec<Dependency> dependencySpec);
 }
Index: src/main/groovy/org/gradle/api/internal/artifacts/configurations/DefaultConfiguration.java
===================================================================
--- src/main/groovy/org/gradle/api/internal/artifacts/configurations/DefaultConfiguration.java	(revision 1382)
+++ src/main/groovy/org/gradle/api/internal/artifacts/configurations/DefaultConfiguration.java	(working copy)
@@ -343,6 +343,19 @@
         DefaultConfiguration copiedConfiguration = new DefaultConfiguration("copyOf" + getName(),
                 configurationsProvider, ivyService, resolverProvider, dependencyMetaDataProvider);
         configurationsProvider.setTheOnlyConfiguration(copiedConfiguration);
+        // state, cachedResolveReport, and extendsFrom intentionally not copied - must re-resolve copy
+        // copying extendsFrom could mess up dependencies when copy was re-resolved
+
+        copiedConfiguration.visibility = visibility;
+        copiedConfiguration.transitive = transitive;
+        copiedConfiguration.description = description;
+       
+        for (PublishArtifact artifact : getAllArtifacts()) {
+           copiedConfiguration.addArtifact(artifact);
+        }
+
+        copiedConfiguration.setExcludeRules(getExcludeRules());
+
         for (Dependency dependency : dependencies) {
             copiedConfiguration.addDependency(dependency.copy());
         }
Index: src/test/groovy/org/gradle/api/internal/artifacts/configurations/DefaultConfigurationTest.java
===================================================================
--- src/test/groovy/org/gradle/api/internal/artifacts/configurations/DefaultConfigurationTest.java	(revision 1382)
+++ src/test/groovy/org/gradle/api/internal/artifacts/configurations/DefaultConfigurationTest.java	(working copy)
@@ -481,12 +481,24 @@
     }
 
     private void prepareConfigurationForCopyTest() {
+        configuration.setVisible(false);
+        configuration.setTransitive(false);
+        configuration.setDescription("descript");
+        configuration.exclude(WrapUtil.toMap("org", "value"));
+        configuration.exclude(WrapUtil.toMap("org2", "value2"));
+        configuration.addArtifact(HelperUtil.createPublishArtifact("name1", "ext1", "type1", "classifier1"));
+        configuration.addArtifact(HelperUtil.createPublishArtifact("name2", "ext2", "type2", "classifier2"));
         configuration.addDependency(HelperUtil.createDependency("group1", "name1", "version1"));
         configuration.addDependency(HelperUtil.createDependency("group2", "name2", "version2"));
     }
 
     private void assertThatCopiedConfigurationHasElementsAndName(Configuration copiedConfiguration, Set<Dependency> expectedDependencies) {
         assertThat(copiedConfiguration.getName(), equalTo("copyOf" + configuration.getName()));
+        assertThat(copiedConfiguration.isVisible(), equalTo(configuration.isVisible()));
+        assertThat(copiedConfiguration.isTransitive(), equalTo(configuration.isTransitive()));
+        assertThat(copiedConfiguration.getDescription(), equalTo(configuration.getDescription()));
+        assertThat(copiedConfiguration.getAllArtifacts(), equalTo(configuration.getAllArtifacts()));
+        assertThat(copiedConfiguration.getExcludeRules(), equalTo(configuration.getExcludeRules()));
         assertThat(copiedConfiguration.getDependencies(), equalTo(expectedDependencies));
         assertNotSameInstances(copiedConfiguration.getDependencies(), expectedDependencies);
     }
