diff --git a/src/tools/Keywords.cpp b/src/tools/Keywords.cpp
index da623d5f7809414eeffe0dc36fb3cf09d9489a21..84d2db6b77d34a1f5f3b1002bd9a518d041ddf77 100644
--- a/src/tools/Keywords.cpp
+++ b/src/tools/Keywords.cpp
@@ -295,19 +295,42 @@ void Keywords::print_html( const bool isaction ) const {
 
 // This is the part that outputs the details of the components
   if( cnames.size()>0 ){
-      if( ckey.find(cnames[0])->second=="default" ){
+      unsigned ndef=0; 
+      for(unsigned i=0;i<cnames.size();++i){
+         if(ckey.find(cnames[i])->second=="default") ndef++;
+      }
+
+      if( ndef>0 ){
          std::cout<<"\\par Description of components\n\n";
          std::cout<<cstring<<"\n\n";
          std::cout<<" <table align=center frame=void width=95%% cellpadding=5%%> \n";
          printf("<tr> <td width=5%%> <b> Quantity </b> </td> <td> <b> Description </b> </td> </tr>\n");
+         unsigned nndef=0;
          for(unsigned i=0;i<cnames.size();++i){
-            plumed_assert( ckey.find(cnames[i])->second=="default" );
+            //plumed_assert( ckey.find(cnames[i])->second=="default" );
+            if( ckey.find(cnames[i])->second!="default" ){ nndef++; continue; }
             printf("<tr>\n");
             printf("<td width=15%%> <b> %s </b></td>\n",cnames[i].c_str() );
             printf("<td> %s </td>\n",(cdocs.find(cnames[i])->second).c_str() );
             printf("</tr>\n");
          }
          std::cout<<"</table>\n\n";
+         if( nndef>0 ){
+             std::cout<<"In addition the following quantities can be calculated by employing the keywords listed below"<<std::endl;
+             std::cout<<"\n\n";
+             std::cout<<" <table align=center frame=void width=95%% cellpadding=5%%> \n";
+             printf("<tr> <td width=5%%> <b> Quantity </b> </td> <td> <b> Keyword </b> </td> <td> <b> Description </b> </td> </tr>\n");
+             for(unsigned i=0;i<cnames.size();++i){
+                if( ckey.find(cnames[i])->second!="default"){
+                    printf("<tr>\n");
+                    printf("<td width=5%%> <b> %s </b></td> <td width=10%%> <b> %s </b> </td> \n",
+                      cnames[i].c_str(),(ckey.find(cnames[i])->second).c_str() );
+                    printf("<td> %s </td>\n",(cdocs.find(cnames[i])->second).c_str() );
+                    printf("</tr>\n");
+                }
+             }
+             std::cout<<"</table>\n\n"; 
+         }
       } else {
          unsigned nregs=0;
          for(unsigned i=0;i<cnames.size();++i){
@@ -316,7 +339,7 @@ void Keywords::print_html( const bool isaction ) const {
          if( nregs>0 ){
             std::cout<<"\\par Description of components\n\n";
             std::cout<<cstring<<"\n\n";
-            std::cout<<" <table align=center frame=void width=60%% cellpadding=5%%> \n";
+            std::cout<<" <table align=center frame=void width=95%% cellpadding=5%%> \n";
             printf("<tr> <td width=5%%> <b> Quantity </b> </td> <td> <b> Keyword </b> </td> <td> <b> Description </b> </td> </tr>\n");
             for(unsigned i=0;i<cnames.size();++i){
                if( exists(ckey.find(cnames[i])->second) ){
@@ -572,8 +595,8 @@ void Keywords::addOutputComponent( const std::string& name, const std::string& k
 bool Keywords::outputComponentExists( const std::string& name, const bool& custom ) const {
   if( custom && cstring.find("customizable")!=std::string::npos ) return true;
 
-  std::string sname; std::size_t num=name.find_first_of("0123456789");
-  if( num!=std::string::npos ) sname=name.substr(0,num-1);
+  std::string sname; std::size_t num=name.find_first_of("-");
+  if( num!=std::string::npos ) sname=name.substr(0,num);
   else sname=name;
 
   for(unsigned i=0;i<cnames.size();++i){