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 29ce548..b1fb78b 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
@@ -224,7 +224,7 @@
         }
 
         // and generate files
-        result.setMetatypeFiles(MetaTypeIO.generateDescriptors(module, this.options, this.logger));
+        result.setMetatypeFiles(MetaTypeIO.generateDescriptors(module, this.project, this.options, this.logger));
         result.setScrFiles(ComponentDescriptorIO.generateDescriptorFiles(module, this.options, logger));
 
         return result;
@@ -310,13 +310,9 @@
             ocd.setId( componentDesc.getName() );
             if ( componentDesc.getLabel() != null ) {
                 ocd.setName( componentDesc.getLabel() );
-            } else {
-                ocd.setName( "%" + componentDesc.getName() + ".name");
             }
             if ( componentDesc.getDescription() != null ) {
                 ocd.setDescription( componentDesc.getDescription() );
-            } else {
-                ocd.setDescription( "%" + componentDesc.getName() + ".description");
             }
 
             // Factory pid
@@ -525,13 +521,9 @@
 
                         if (pd.getLabel() != null ) {
                             ad.setName(pd.getLabel());
-                        } else {
-                            ad.setName("%" + pd.getName() + ".name");
                         }
                         if (pd.getDescription() != null ) {
                             ad.setDescription(pd.getDescription());
-                        } else {
-                            ad.setDescription("%" + pd.getName() + ".description");
                         }
 
                         if ( pd.getUnbounded() == PropertyUnbounded.DEFAULT ) {
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java
index e9c9ca9..49b55e8 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/xml/MetaTypeIO.java
@@ -31,6 +31,7 @@
 
 import org.apache.felix.scrplugin.Log;
 import org.apache.felix.scrplugin.Options;
+import org.apache.felix.scrplugin.Project;
 import org.apache.felix.scrplugin.SCRDescriptorException;
 import org.apache.felix.scrplugin.helper.ComponentContainer;
 import org.apache.felix.scrplugin.helper.ComponentContainerUtil;
@@ -78,6 +79,7 @@
     private static final String OPTION_ELEMENT_QNAME = OPTION_ELEMENT;
 
     public static List<String> generateDescriptors(final DescriptionContainer module,
+            final Project project,
             final Options options,
             final Log logger)
     throws SCRDescriptorException {
@@ -93,6 +95,9 @@
         final File parentDir = mtDir.getParentFile();
 
         if (components.size() > 0) {
+            // check for metatype.properties
+            final File mtProps = new File(project.getClassesDirectory(), "OSGI-INF" + File.separator + "metatype" + File.separator + "metatype.properties");
+            final boolean oldStyle = mtProps.exists();
             mtDir.mkdirs();
 
             final List<String> fileNames = new ArrayList<String>();
@@ -107,16 +112,44 @@
                 for(final ComponentContainer cc : ccc.components) {
                     final MetatypeContainer mc = cc.getMetatypeContainer();
 
+                    if ( mc.getName() == null ) {
+                        if ( oldStyle ) {
+                            mc.setName( "%" + cc.getComponentDescription().getName() + ".name");
+                        } else {
+                            mc.setName("Component " + cc.getComponentDescription().getName());
+                        }
+                    }
                     if ( mc.getName() != null && mc.getName().startsWith("%") ) {
                         allInlined = false;
                     }
+                    if ( mc.getDescription() == null ) {
+                        if ( oldStyle ) {
+                            mc.setDescription("%" + cc.getComponentDescription().getName() + ".description");
+                        } else {
+                            mc.setDescription("Description for " + cc.getComponentDescription().getName());
+                        }
+                    }
                     if ( mc.getDescription() != null && mc.getDescription().startsWith("%") ) {
                         allInlined = false;
                     }
                     for(final MetatypeAttributeDefinition mad : mc.getProperties()) {
+                        if ( mad.getName() == null ) {
+                            if ( oldStyle ) {
+                                mad.setName("%" + mad.getId() + ".name");
+                            } else {
+                                mad.setName("Property " + mad.getId());
+                            }
+                        }
                         if ( mad.getName() != null && mad.getName().startsWith("%") ) {
                             allInlined = false;
                         }
+                        if ( mad.getDescription() == null ) {
+                            if ( oldStyle ) {
+                                mad.setDescription("%" + mad.getId() + ".description");
+                            } else {
+                                mad.setDescription("Description for " + mad.getId());
+                            }
+                        }
                         if ( mad.getDescription() != null && mad.getDescription().startsWith("%") ) {
                             allInlined = false;
                         }
