diff --git a/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java b/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
index 0be35b2..9adcbca 100644
--- a/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
+++ b/scrplugin/ds-annotations/src/main/java/org/apache/felix/scrplugin/ds/DSAnnotationProcessor.java
@@ -206,7 +206,7 @@
 
         // configuration pid
         component.setConfigurationPid(cad.getStringValue("configurationPid", null));
-        component.setCreatePid(cad.getBooleanValue("createPid", true));
+        component.setCreatePid(false);
 
         // no inheritance
         component.setInherit(false);
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
index 9a621e1..a4968af 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
@@ -156,7 +156,7 @@
         final MetaData metaData = new MetaData();
         metaData.setLocalization(MetaTypeService.METATYPE_DOCUMENTS_LOCATION + "/metatype");
 
-        final List<ComponentContainer> processedComponents = new ArrayList<ComponentContainer>();
+        final List<ComponentContainer> processedContainers = new ArrayList<ComponentContainer>();
         for (final ClassDescription desc : scannedDescriptions) {
             this.logger.debug("Processing component class " + desc.getSource());
 
@@ -166,24 +166,20 @@
                              " Check the annotations and merge the definitions to a single definition.",
                                 desc.getSource());
             } else {
-                try {
-                    final ComponentContainer comp = this.createComponent(desc, metaData, iLog);
-                    if (comp.getComponentDescription().getSpecVersion() != null) {
-                        if ( specVersion == null ) {
-                            specVersion = comp.getComponentDescription().getSpecVersion();
-                            logger.debug("Setting used spec version to " + specVersion);
-                        } else if (comp.getComponentDescription().getSpecVersion().ordinal() > specVersion.ordinal() && this.options.getSpecVersion() != null) {
-                            // if a spec version has been configured and a component requires a higher
-                            // version, this is considered an error!
-                            iLog.addError("Component " + comp + " requires spec version " + comp.getComponentDescription().getSpecVersion().name()
-                                            + " but plugin is configured to use version " + this.options.getSpecVersion(),
-                                            desc.getSource());
-                        }
+                final ComponentContainer container = this.createComponent(desc, metaData, iLog);
+                if (container.getComponentDescription().getSpecVersion() != null) {
+                    if ( specVersion == null ) {
+                        specVersion = container.getComponentDescription().getSpecVersion();
+                        logger.debug("Setting used spec version to " + specVersion);
+                    } else if (container.getComponentDescription().getSpecVersion().ordinal() > specVersion.ordinal() && this.options.getSpecVersion() != null) {
+                        // if a spec version has been configured and a component requires a higher
+                        // version, this is considered an error!
+                        iLog.addError("Component " + container + " requires spec version " + container.getComponentDescription().getSpecVersion().name()
+                                        + " but plugin is configured to use version " + this.options.getSpecVersion(),
+                                        desc.getSource());
                     }
-                    processedComponents.add(comp);
-                } catch (final SCRDescriptorException sde) {
-                    iLog.addError(sde.getMessage(), sde.getSourceLocation());
                 }
+                processedContainers.add(container);
             }
         }
         // if spec version is still not set, we're using lowest available
@@ -197,16 +193,16 @@
         // now check for abstract components and fill components objects
         final DescriptionContainer module = new DescriptionContainer(this.options);
 
-        for (final ComponentContainer comp : processedComponents) {
+        for (final ComponentContainer container : processedContainers) {
             final int errorCount = iLog.getNumberOfErrors();
 
-            final Validator validator = new Validator(comp, project, options, iLog);
+            final Validator validator = new Validator(container, project, options, iLog);
 
             if ( this.options.isGenerateAccessors() ) {
                 // before we can validate we should check the references for bind/unbind method
                 // in order to create them if possible
 
-                for (final ReferenceDescription ref : comp.getReferences().values()) {
+                for (final ReferenceDescription ref : container.getReferences().values()) {
                     // if this is a field with a single cardinality,
                     // we look for the bind/unbind methods
                     // and create them if they are not availabe
@@ -231,7 +227,7 @@
                             createUnbind = true;
                         }
                         if (createBind || createUnbind) {
-                            ClassModifier.addMethods(comp.getClassDescription().getDescribedClass().getName(),
+                            ClassModifier.addMethods(container.getClassDescription().getDescribedClass().getName(),
                                             name,
                                             ref.getField().getName(),
                                             type,
@@ -246,11 +242,11 @@
 
             // ignore component if it has errors
             if (iLog.getNumberOfErrors() == errorCount) {
-                if (!comp.getComponentDescription().isCreateDs()) {
-                    logger.debug("Ignoring descriptor for DS : " + comp);
-                } else if (!comp.getComponentDescription().isAbstract()) {
-                    this.logger.debug("Adding descriptor for DS : " + comp);
-                    module.addComponent(comp);
+                if (!container.getComponentDescription().isCreateDs()) {
+                    logger.debug("Ignoring descriptor for DS : " + container);
+                } else if (!container.getComponentDescription().isAbstract()) {
+                    this.logger.debug("Adding descriptor for DS : " + container);
+                    module.add(container);
                 }
             }
         }
@@ -319,8 +315,7 @@
      */
     private ComponentContainer createComponent(final ClassDescription desc,
                     final MetaData metaData,
-                    final IssueLog iLog)
-    throws SCRDescriptorException, SCRDescriptorFailureException {
+                    final IssueLog iLog) {
         final ComponentDescription componentDesc = desc.getDescription(ComponentDescription.class);
 
         // configuration pid in 1.2
@@ -410,7 +405,13 @@
             if ( !inherit || current.getDescribedClass().getSuperclass() == null ) {
                 current = null;
             } else {
-                current = this.scanner.getDescription(current.getDescribedClass().getSuperclass());
+                try {
+                    current = this.scanner.getDescription(current.getDescribedClass().getSuperclass());
+                } catch ( final SCRDescriptorFailureException sde) {
+                    iLog.addError(sde.getMessage(), current.getSource());
+                } catch ( final SCRDescriptorException sde) {
+                    iLog.addError(sde.getMessage(), sde.getSourceLocation());
+                }
             }
         } while ( inherit && current != null);
 
@@ -430,8 +431,7 @@
     /**
      * Process service directives
      */
-    private void processServices(final ClassDescription current, final ComponentContainer component)
-    throws SCRDescriptorException, SCRDescriptorFailureException {
+    private void processServices(final ClassDescription current, final ComponentContainer component) {
 
         final ServiceDescription serviceDesc = current.getDescription(ServiceDescription.class);
         if ( serviceDesc != null ) {
@@ -456,8 +456,7 @@
     private void processProperties(
                     final ClassDescription current,
                     final ComponentContainer component,
-                    final OCD ocd)
-    throws SCRDescriptorException, SCRDescriptorFailureException {
+                    final OCD ocd) {
         for(final PropertyDescription pd : current.getDescriptions(PropertyDescription.class)) {
 
             // metatype - is this property private?
@@ -581,8 +580,7 @@
      * Process reference directives
      */
     private void processReferences(final ClassDescription current,
-                    final ComponentContainer component)
-    throws SCRDescriptorException, SCRDescriptorFailureException {
+                    final ComponentContainer component) {
         for(final ReferenceDescription rd : current.getDescriptions(ReferenceDescription.class)) {
             if ( rd.getPolicyOption() != ReferencePolicyOption.RELUCTANT ) {
                 component.getComponentDescription().setSpecVersion(SpecVersion.VERSION_1_2);
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ComponentContainer.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ComponentContainer.java
index 4fc6976..b016a82 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ComponentContainer.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/ComponentContainer.java
@@ -36,7 +36,6 @@
  * - the service descriptor
  * - reference descriptors
  * - property descriptors
- *
  */
 public class ComponentContainer {
 
@@ -92,15 +91,29 @@
         return this.allReferences;
     }
 
+    /**
+     * Get all properties.
+     * The properties are put into the map by name.
+     * This map can be modified by clients.
+     * @return The map of properties
+     */
     public Map<String, PropertyDescription> getProperties() {
         return this.allProperties;
     }
 
+    /**
+     * Get the service description.
+     * @return The service description or <code>null</code>
+     */
     public ServiceDescription getServiceDescription() {
         return serviceDescription;
     }
 
-    public void setServiceDescription(ServiceDescription serviceDescription) {
+    /**
+     * Set the service description
+     * @param serviceDescription The new service description
+     */
+    public void setServiceDescription(final ServiceDescription serviceDescription) {
         this.serviceDescription = serviceDescription;
     }
 
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/DescriptionContainer.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/DescriptionContainer.java
index 9b94282..eff6797 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/DescriptionContainer.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/DescriptionContainer.java
@@ -18,50 +18,54 @@
  */
 package org.apache.felix.scrplugin.helper;
 
-import java.awt.Component;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.felix.scrplugin.Options;
-import org.apache.felix.scrplugin.description.ComponentDescription;
 
 /**
- * <code>DescriptionContainer</code>...
- *
- * A description container is a collection of {@link ComponentDescription}s.
+ * The description container holds all {@link ComponentContainer}s.
  */
 public class DescriptionContainer {
 
     /** The options. */
     private final Options options;
 
-    /** The list of {@link Component}s. */
-    private final List<ComponentContainer> components = new ArrayList<ComponentContainer>();
+    /** The list of {@link ComponentContainer}s. */
+    private final List<ComponentContainer> containers = new ArrayList<ComponentContainer>();
 
+    /**
+     * Constructor
+     * @param options The options for this module
+     */
     public DescriptionContainer(final Options options) {
         this.options = options;
     }
 
+    /**
+     * Get the options
+     * @return The options
+     */
     public Options getOptions() {
         return this.options;
     }
 
     /**
-     * Return the list of {@link Component}s.
+     * Return the list of {@link ComponentContainer}s.
      */
     public List<ComponentContainer> getComponents() {
-        return this.components;
+        return this.containers;
     }
 
     /**
-     * Add a component to the list.
+     * Add a container to the list.
      */
-    public void addComponent(ComponentContainer component) {
-        this.components.add(component);
+    public void add(final ComponentContainer c) {
+        this.containers.add(c);
     }
 
     @Override
     public String toString() {
-        return "DescriptionContainer [options=" + options + ", components=" + components + "]";
+        return "DescriptionContainer [options=" + options + ", containers=" + containers + "]";
     }
 }
