diff --git a/bgpd/bgp_clist.c b/bgpd/bgp_clist.c
index 0b6a2e8..3cf1d2e 100644
--- a/bgpd/bgp_clist.c
+++ b/bgpd/bgp_clist.c
@@ -42,12 +42,12 @@
       case COMMUNITY_LIST_STANDARD:
       case COMMUNITY_LIST_EXPANDED:
       case COMMUNITY_LIST_AUTO:
-	return &ch->community_list;
-	break;
+        return &ch->community_list;
+        break;
       case EXTCOMMUNITY_LIST_STANDARD:
       case EXTCOMMUNITY_LIST_EXPANDED:
       case EXTCOMMUNITY_LIST_AUTO:
-	return &ch->extcommunity_list;
+        return &ch->extcommunity_list;
       }
   return NULL;
 }
@@ -71,22 +71,22 @@
     {
     case COMMUNITY_LIST_STANDARD:
       if (entry->u.com)
-	community_free (entry->u.com);
+        community_free (entry->u.com);
       break;
     case EXTCOMMUNITY_LIST_STANDARD:
       /* In case of standard extcommunity-list, configuration string
-	 is made by ecommunity_ecom2str().  */
+         is made by ecommunity_ecom2str().  */
       if (entry->config)
-	XFREE (MTYPE_ECOMMUNITY_STR, entry->config);
+        XFREE (MTYPE_ECOMMUNITY_STR, entry->config);
       if (entry->u.ecom)
-	ecommunity_free (entry->u.ecom);
+        ecommunity_free (entry->u.ecom);
       break;
     case COMMUNITY_LIST_EXPANDED:
     case EXTCOMMUNITY_LIST_EXPANDED:
       if (entry->config)
-	XFREE (MTYPE_COMMUNITY_LIST_CONFIG, entry->config);
+        XFREE (MTYPE_COMMUNITY_LIST_CONFIG, entry->config);
       if (entry->reg)
-	bgp_regex_free (entry->reg);
+        bgp_regex_free (entry->reg);
     default:
       break;
     }
@@ -115,7 +115,7 @@
 
 struct community_list *
 community_list_insert (struct community_list_handler *ch,
-		       char *name, int style)
+                       char *name, int style)
 {
   int i;
   long number;
@@ -126,7 +126,7 @@
 
   /* Lookup community-list master.  */
   cm = community_list_master_lookup (ch, style);
-  if (! cm)
+  if (!cm)
     return NULL;
 
   /* Allocate new community_list and copy given name. */
@@ -138,9 +138,9 @@
   for (number = 0, i = 0; i < strlen (name); i++)
     {
       if (isdigit ((int) name[i]))
-	number = (number * 10) + (name[i] - '0');
+        number = (number * 10) + (name[i] - '0');
       else
-	break;
+        break;
     }
 
   /* In case of name is all digit character */
@@ -152,8 +152,8 @@
       list = &cm->num;
 
       for (point = list->head; point; point = point->next)
-	if (atol (point->name) >= number)
-	  break;
+        if (atol (point->name) >= number)
+          break;
     }
   else
     {
@@ -161,11 +161,11 @@
 
       /* Set access_list to string list. */
       list = &cm->str;
-  
+
       /* Set point to insertion point. */
       for (point = list->head; point; point = point->next)
-	if (strcmp (point->name, name) >= 0)
-	  break;
+        if (strcmp (point->name, name) >= 0)
+          break;
     }
 
   /* Link to upper list.  */
@@ -209,16 +209,16 @@
 
 struct community_list *
 community_list_lookup (struct community_list_handler *ch,
-		       char *name, int style)
+                       char *name, int style)
 {
   struct community_list *list;
   struct community_list_master *cm;
 
-  if (! name)
+  if (!name)
     return NULL;
 
   cm = community_list_master_lookup (ch, style);
-  if (! cm)
+  if (!cm)
     return NULL;
 
   for (list = cm->num.head; list; list = list->next)
@@ -237,7 +237,7 @@
   struct community_list *list;
 
   list = community_list_lookup (ch, name, style);
-  if (! list)
+  if (!list)
     list = community_list_insert (ch, name, style);
   return list;
 }
@@ -269,7 +269,7 @@
   community_list_free (list);
 }
 
-int 
+int
 community_list_empty_p (struct community_list *list)
 {
   return (list->head == NULL && list->tail == NULL) ? 1 : 0;
@@ -277,8 +277,8 @@
 
 /* Add community-list entry to the list.  */
 static void
-community_list_entry_add (struct community_list *list, 
-			  struct community_entry *entry)
+community_list_entry_add (struct community_list *list,
+                          struct community_entry *entry)
 {
   entry->next = NULL;
   entry->prev = list->tail;
@@ -293,7 +293,7 @@
 /* Delete community-list entry from the list.  */
 static void
 community_list_entry_delete (struct community_list *list,
-			     struct community_entry *entry, int style)
+                             struct community_entry *entry, int style)
 {
   if (entry->next)
     entry->next->prev = entry->prev;
@@ -314,30 +314,30 @@
 /* Lookup community-list entry from the list.  */
 static struct community_entry *
 community_list_entry_lookup (struct community_list *list, void *arg,
-			     int direct)
+                             int direct)
 {
   struct community_entry *entry;
 
   for (entry = list->head; entry; entry = entry->next)
     {
       switch (entry->style)
-	{
-	case COMMUNITY_LIST_STANDARD:
-	  if (community_cmp (entry->u.com, arg))
-	    return entry;
-	  break;
-	case EXTCOMMUNITY_LIST_STANDARD:
-	  if (ecommunity_cmp (entry->u.ecom, arg))
-	    return entry;
-	  break;
-	case COMMUNITY_LIST_EXPANDED:
-	case EXTCOMMUNITY_LIST_EXPANDED:
-	  if (strcmp (entry->config, arg) == 0)
-	    return entry;
-	  break;
-	default:
-	  break;
-	}
+        {
+        case COMMUNITY_LIST_STANDARD:
+          if (community_cmp (entry->u.com, arg))
+            return entry;
+          break;
+        case EXTCOMMUNITY_LIST_STANDARD:
+          if (ecommunity_cmp (entry->u.ecom, arg))
+            return entry;
+          break;
+        case COMMUNITY_LIST_EXPANDED:
+        case EXTCOMMUNITY_LIST_EXPANDED:
+          if (strcmp (entry->config, arg) == 0)
+            return entry;
+          break;
+        default:
+          break;
+        }
     }
   return NULL;
 }
@@ -345,7 +345,7 @@
 /* Internal function to perform regular expression match for community
    attribute.  */
 static int
-community_regexp_match (struct community *com, regex_t *reg)
+community_regexp_match (struct community *com, regex_t * reg)
 {
   char *str;
 
@@ -364,10 +364,30 @@
   return 0;
 }
 
+static int
+ecommunity_regexp_match (struct ecommunity *ecom, regex_t * reg)
+{
+  char *str;
+
+  /* When there is no communities attribute it is treated as empty
+     string.  */
+  if (ecom == NULL || ecom->size == 0)
+    str = "";
+  else
+    str = ecommunity_str (ecom);
+
+  /* Regular expression match.  */
+  if (regexec (reg, str, 0, NULL, 0) == 0)
+    return 1;
+
+  /* No match.  */
+  return 0;
+}
+
 /* Delete community attribute using regular expression match.  Return
    modified communites attribute.  */
 static struct community *
-community_regexp_delete (struct community *com, regex_t *reg)
+community_regexp_delete (struct community *com, regex_t * reg)
 {
   int i;
   u_int32_t comval;
@@ -375,7 +395,7 @@
   char c[12];
   char *str;
 
-  if (! com)
+  if (!com)
     return NULL;
 
   i = 0;
@@ -385,29 +405,29 @@
       comval = ntohl (comval);
 
       switch (comval)
-	{
-	case COMMUNITY_INTERNET:
-	  str = "internet";
-	  break;
-	case COMMUNITY_NO_EXPORT:
-	  str = "no-export";
-	  break;
-	case COMMUNITY_NO_ADVERTISE:
-	  str = "no-advertise";
-	  break;
-	case COMMUNITY_LOCAL_AS:
-	  str = "local-AS";
-	  break;
-	default:
-	  sprintf (c, "%d:%d", (comval >> 16) & 0xFFFF, comval & 0xFFFF);
-	  str = c;
-	  break;
-	}
+        {
+        case COMMUNITY_INTERNET:
+          str = "internet";
+          break;
+        case COMMUNITY_NO_EXPORT:
+          str = "no-export";
+          break;
+        case COMMUNITY_NO_ADVERTISE:
+          str = "no-advertise";
+          break;
+        case COMMUNITY_LOCAL_AS:
+          str = "local-AS";
+          break;
+        default:
+          sprintf (c, "%d:%d", (comval >> 16) & 0xFFFF, comval & 0xFFFF);
+          str = c;
+          break;
+        }
 
       if (regexec (reg, str, 0, NULL, 0) == 0)
-	community_del_val (com, com_nthval (com, i));
+        community_del_val (com, com_nthval (com, i));
       else
-	i++;
+        i++;
     }
   return com;
 }
@@ -422,21 +442,45 @@
   for (entry = list->head; entry; entry = entry->next)
     {
       if (entry->any)
-	return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
 
       if (entry->style == COMMUNITY_LIST_STANDARD)
-	{
-	  if (community_include (entry->u.com, COMMUNITY_INTERNET))
-	    return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        {
+          if (community_include (entry->u.com, COMMUNITY_INTERNET))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
 
-	  if (community_match (com, entry->u.com))
-	    return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
-	}
+          if (community_match (com, entry->u.com))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        }
       else if (entry->style == COMMUNITY_LIST_EXPANDED)
-	{
-	  if (community_regexp_match (com, entry->reg))
-	    return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
-	}
+        {
+          if (community_regexp_match (com, entry->reg))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        }
+    }
+  return 0;
+}
+
+int
+ecommunity_list_match (struct ecommunity *ecom, struct community_list *list)
+{
+  struct community_entry *entry;
+
+  for (entry = list->head; entry; entry = entry->next)
+    {
+      if (entry->any)
+        return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+
+      if (entry->style == EXTCOMMUNITY_LIST_STANDARD)
+        {
+          if (ecommunity_match (ecom, entry->u.ecom))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        }
+      else if (entry->style == EXTCOMMUNITY_LIST_EXPANDED)
+        {
+          if (ecommunity_regexp_match (ecom, entry->reg))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        }
     }
   return 0;
 }
@@ -444,61 +488,62 @@
 /* Perform exact matching.  In case of expanded community-list, do
    same thing as community_list_match().  */
 int
-community_list_exact_match (struct community *com, struct community_list *list)
+community_list_exact_match (struct community *com,
+                            struct community_list *list)
 {
   struct community_entry *entry;
 
   for (entry = list->head; entry; entry = entry->next)
     {
       if (entry->any)
-	return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
 
       if (entry->style == COMMUNITY_LIST_STANDARD)
-	{
-	  if (community_include (entry->u.com, COMMUNITY_INTERNET))
-	    return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        {
+          if (community_include (entry->u.com, COMMUNITY_INTERNET))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
 
-	  if (community_cmp (com, entry->u.com))
-	    return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
-	}
+          if (community_cmp (com, entry->u.com))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        }
       else if (entry->style == COMMUNITY_LIST_EXPANDED)
-	{
-	  if (community_regexp_match (com, entry->reg))
-	    return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
-	}
+        {
+          if (community_regexp_match (com, entry->reg))
+            return entry->direct == COMMUNITY_PERMIT ? 1 : 0;
+        }
     }
   return 0;
 }
 
-/* Delete all permitted communities in the list from com1 */
+/* Delete all permitted communities in the list from com.  */
 struct community *
 community_list_match_delete (struct community *com,
-			     struct community_list *list)
+                             struct community_list *list)
 {
   struct community_entry *entry;
 
   for (entry = list->head; entry; entry = entry->next)
     {
       if (entry->any && entry->direct == COMMUNITY_PERMIT)
-	{
-	  /* This is a tricky part.  Currently only
-	     route_set_community_delete() uses this function.  In the
-	     function com->size is zero, it free the community
-	     structure.  */
-	  com->size = 0;
-	  return com;
-	}
+        {
+          /* This is a tricky part.  Currently only
+             route_set_community_delete() uses this function.  In the
+             function com->size is zero, it free the community
+             structure.  */
+          com->size = 0;
+          return com;
+        }
 
       if (entry->style == COMMUNITY_LIST_STANDARD)
-	{
-	  if (entry->direct == COMMUNITY_PERMIT)
-	    community_delete (com, entry->u.com);
-	}
+        {
+          if (entry->direct == COMMUNITY_PERMIT)
+            community_delete (com, entry->u.com);
+        }
       else if (entry->style == COMMUNITY_LIST_EXPANDED)
-	{
-	  if (entry->direct == COMMUNITY_PERMIT)
-	    community_regexp_delete (com, entry->reg);
-	}
+        {
+          if (entry->direct == COMMUNITY_PERMIT)
+            community_regexp_delete (com, entry->reg);
+        }
     }
   return com;
 }
@@ -506,43 +551,43 @@
 /* To avoid duplicated entry in the community-list, this function
    compares specified entry to existing entry.  */
 int
-community_list_dup_check (struct community_list *list, 
-			  struct community_entry *new)
+community_list_dup_check (struct community_list *list,
+                          struct community_entry *new)
 {
   struct community_entry *entry;
-  
+
   for (entry = list->head; entry; entry = entry->next)
     {
       if (entry->style != new->style)
-	continue;
+        continue;
 
       if (entry->direct != new->direct)
-	continue;
+        continue;
 
       if (entry->any != new->any)
-	continue;
+        continue;
 
       if (entry->any)
-	return 1;
+        return 1;
 
       switch (entry->style)
-	{
-	case COMMUNITY_LIST_STANDARD:
-	  if (community_cmp (entry->u.com, new->u.com))
-	    return 1;
-	  break;
-	case EXTCOMMUNITY_LIST_STANDARD:
-	  if (ecommunity_cmp (entry->u.ecom, new->u.ecom))
-	    return 1;
-	  break;
-	case COMMUNITY_LIST_EXPANDED:
-	case EXTCOMMUNITY_LIST_EXPANDED:
-	  if (strcmp (entry->config, new->config) == 0)
-	    return 1;
-	  break;
-	default:
-	  break;
-	}
+        {
+        case COMMUNITY_LIST_STANDARD:
+          if (community_cmp (entry->u.com, new->u.com))
+            return 1;
+          break;
+        case EXTCOMMUNITY_LIST_STANDARD:
+          if (ecommunity_cmp (entry->u.ecom, new->u.ecom))
+            return 1;
+          break;
+        case COMMUNITY_LIST_EXPANDED:
+        case EXTCOMMUNITY_LIST_EXPANDED:
+          if (strcmp (entry->config, new->config) == 0)
+            return 1;
+          break;
+        default:
+          break;
+        }
     }
   return 0;
 }
@@ -550,7 +595,7 @@
 /* Set community-list.  */
 int
 community_list_set (struct community_list_handler *ch,
-		    char *name, char *str, int direct, int style)
+                    char *name, char *str, int direct, int style)
 {
   struct community_entry *entry;
   struct community_list *list;
@@ -565,72 +610,72 @@
   /* When community-list already has entry, new entry should have same
      style.  If you want to have mixed style community-list, you can
      comment out this check.  */
-  if (! community_list_empty_p (list))
+  if (!community_list_empty_p (list))
     {
       struct community_entry *first;
 
       first = list->head;
 
       if (style == COMMUNITY_LIST_AUTO)
-	style = first->style;
+        style = first->style;
       else if (style != first->style)
-	{
-	  return (first->style == COMMUNITY_LIST_STANDARD
-		  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
-		  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
-	}
+        {
+          return (first->style == COMMUNITY_LIST_STANDARD
+                  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
+                  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
+        }
     }
 
   /* When str is NULL, it is matches any.  */
-  if (! str)
+  if (!str)
     {
       entry = community_entry_new ();
       entry->direct = direct;
       entry->any = 1;
       if (style == COMMUNITY_LIST_AUTO)
-	entry->style = COMMUNITY_LIST_STANDARD;
+        entry->style = COMMUNITY_LIST_STANDARD;
       else
-	entry->style = style;
+        entry->style = style;
     }
   else
     {
       /* Standard community-list parse.  String must be converted into
-	 community structure without problem.  */
+         community structure without problem.  */
       if (style == COMMUNITY_LIST_STANDARD || style == COMMUNITY_LIST_AUTO)
-	{
-	  com = community_str2com (str);
-	  if (com)
-	    {
-	      entry = community_entry_new ();
-	      entry->u.com = com;
-	      entry->direct = direct;
-	      entry->style = COMMUNITY_LIST_STANDARD;
-	    }
-	  else if (style == COMMUNITY_LIST_STANDARD)
-	    return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-	  
-	  /* We can't convert string into communities value.  When
-	     community-list type is auto, fall dawn to regular expression
-	     match.  */
-	}
+        {
+          com = community_str2com (str);
+          if (com)
+            {
+              entry = community_entry_new ();
+              entry->u.com = com;
+              entry->direct = direct;
+              entry->style = COMMUNITY_LIST_STANDARD;
+            }
+          else if (style == COMMUNITY_LIST_STANDARD)
+            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+
+          /* We can't convert string into communities value.  When
+             community-list type is auto, fall dawn to regular expression
+             match.  */
+        }
 
       /* Expanded community-list parse.  String may include regular
-	 expression.  */
-      if (! entry && (style == COMMUNITY_LIST_EXPANDED
-		      || style == COMMUNITY_LIST_AUTO))
-	{
-	  regex = bgp_regcomp (str);
-	  if (regex)
-	    {
-	      entry = community_entry_new ();
-	      entry->reg = regex;
-	      entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
-	      entry->direct = direct;
-	      entry->style = COMMUNITY_LIST_EXPANDED;
-	    }
-	  else
-	    return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-	}
+         expression.  */
+      if (!entry && (style == COMMUNITY_LIST_EXPANDED
+                     || style == COMMUNITY_LIST_AUTO))
+        {
+          regex = bgp_regcomp (str);
+          if (regex)
+            {
+              entry = community_entry_new ();
+              entry->reg = regex;
+              entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
+              entry->direct = direct;
+              entry->style = COMMUNITY_LIST_EXPANDED;
+            }
+          else
+            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+        }
     }
 
   /* Do not put duplicated community entry.  */
@@ -646,7 +691,7 @@
    community-list entry belongs to the specified name.  */
 int
 community_list_unset (struct community_list_handler *ch,
-		      char *name, char *str, int direct, int style)
+                      char *name, char *str, int direct, int style)
 {
   struct community_entry *entry;
   struct community_list *list;
@@ -661,7 +706,7 @@
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
 
   /* Delete all of entry belongs to this community-list.  */
-  if (! str)
+  if (!str)
     {
       community_list_delete (list);
       return 0;
@@ -673,33 +718,33 @@
     {
       com = community_str2com (str);
       if (com)
-	{
-	  entry = community_list_entry_lookup (list, com, direct);
-	  community_free (com);
-	}
+        {
+          entry = community_list_entry_lookup (list, com, direct);
+          community_free (com);
+        }
       else if (style == COMMUNITY_LIST_STANDARD)
-	return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
 
       /* If we can't convert string into community and community-list
-	 type is auto, fall dawn to expanded community-list.  */
+         type is auto, fall dawn to expanded community-list.  */
     }
 
   /* Expanded community-list parse.  String may include regular
      expression.  */
-  if (! entry 
+  if (!entry
       && (style == COMMUNITY_LIST_EXPANDED || style == COMMUNITY_LIST_AUTO))
     {
       regex = bgp_regcomp (str);
       if (regex)
-	{
-	  entry = community_list_entry_lookup (list, str, direct);
-	  bgp_regex_free (regex);
-	}
+        {
+          entry = community_list_entry_lookup (list, str, direct);
+          bgp_regex_free (regex);
+        }
       else
-	return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
     }
 
-  if (! entry)
+  if (!entry)
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
 
   community_list_entry_delete (list, entry, style);
@@ -710,7 +755,7 @@
 /* Set extcommunity-list.  */
 int
 extcommunity_list_set (struct community_list_handler *ch,
-		       char *name, char *str, int direct, int style)
+                       char *name, char *str, int direct, int style)
 {
   struct community_entry *entry;
   struct community_list *list;
@@ -725,77 +770,79 @@
   /* When community-list already has entry, new entry should have same
      style.  If you want to have mixed style community-list, you can
      comment out this check.  */
-  if (! community_list_empty_p (list))
+  if (!community_list_empty_p (list))
     {
       struct community_entry *first;
 
       first = list->head;
 
       if (style == EXTCOMMUNITY_LIST_AUTO)
-	style = first->style;
+        style = first->style;
       else if (style != first->style)
-	{
-	  return (first->style == EXTCOMMUNITY_LIST_STANDARD
-		  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
-		  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
-	}
+        {
+          return (first->style == EXTCOMMUNITY_LIST_STANDARD
+                  ? COMMUNITY_LIST_ERR_STANDARD_CONFLICT
+                  : COMMUNITY_LIST_ERR_EXPANDED_CONFLICT);
+        }
     }
 
   /* When str is NULL, it is matches any.  */
-  if (! str)
+  if (!str)
     {
       entry = community_entry_new ();
       entry->direct = direct;
       entry->any = 1;
       if (style == EXTCOMMUNITY_LIST_AUTO)
-	entry->style = EXTCOMMUNITY_LIST_STANDARD;
+        entry->style = EXTCOMMUNITY_LIST_STANDARD;
       else
-	entry->style = style;
+        entry->style = style;
     }
   else
     {
       /* Standard extcommunity-list parse.  String is converted into
-	 ecommunity structure.  */
+         ecommunity structure.  */
       if (style == EXTCOMMUNITY_LIST_STANDARD
-	  || style == EXTCOMMUNITY_LIST_AUTO)
-	{
-	  /* Type is unknown.  String includes keyword.  */
-	  ecom = ecommunity_str2com (str, 0, 1);
-	  if (ecom)
-	    {
-	      entry = community_entry_new ();
-	      entry->config 
-		= ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_COMMUNITY_LIST);
-	      ecom->str = ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_DISPLAY);
-	      entry->u.ecom = ecom;
-	      entry->direct = direct;
-	      entry->style = EXTCOMMUNITY_LIST_STANDARD;
-	    }
-	  else if (style == EXTCOMMUNITY_LIST_STANDARD)
-	    return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+          || style == EXTCOMMUNITY_LIST_AUTO)
+        {
+          /* Type is unknown.  String includes keyword.  */
+          ecom = ecommunity_str2com (str, 0, 1);
+          if (ecom)
+            {
+              entry = community_entry_new ();
+              entry->config
+                =
+                ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_COMMUNITY_LIST);
+              ecom->str =
+                ecommunity_ecom2str (ecom, ECOMMUNITY_FORMAT_DISPLAY);
+              entry->u.ecom = ecom;
+              entry->direct = direct;
+              entry->style = EXTCOMMUNITY_LIST_STANDARD;
+            }
+          else if (style == EXTCOMMUNITY_LIST_STANDARD)
+            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
 
-	  /* We can't convert string into communities value.  When
-	     community-list type is auto, fall dawn to regular expression
-	     match.  */
-	}
+          /* We can't convert string into communities value.  When
+             community-list type is auto, fall dawn to regular expression
+             match.  */
+        }
 
       /* Expanded extcommunity-list parse.  String may include regular
-	 expression.  */
-      if (! entry && (style == EXTCOMMUNITY_LIST_EXPANDED
-		      || style == EXTCOMMUNITY_LIST_AUTO))
-	{
-	  regex = bgp_regcomp (str);
-	  if (regex)
-	    {
-	      entry = community_entry_new ();
-	      entry->reg = regex;
-	      entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
-	      entry->direct = direct;
-	      entry->style = EXTCOMMUNITY_LIST_EXPANDED;
-	    }
-	  else
-	    return COMMUNITY_LIST_ERR_MALFORMED_VAL;
-	}
+         expression.  */
+      if (!entry && (style == EXTCOMMUNITY_LIST_EXPANDED
+                     || style == EXTCOMMUNITY_LIST_AUTO))
+        {
+          regex = bgp_regcomp (str);
+          if (regex)
+            {
+              entry = community_entry_new ();
+              entry->reg = regex;
+              entry->config = XSTRDUP (MTYPE_COMMUNITY_LIST_CONFIG, str);
+              entry->direct = direct;
+              entry->style = EXTCOMMUNITY_LIST_EXPANDED;
+            }
+          else
+            return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+        }
     }
 
   /* Do not put duplicated community entry.  */
@@ -811,7 +858,7 @@
    extcommunity-list entry belongs to the specified name.  */
 int
 extcommunity_list_unset (struct community_list_handler *ch,
-			 char *name, char *str, int direct, int style)
+                         char *name, char *str, int direct, int style)
 {
   struct community_entry *entry;
   struct community_list *list;
@@ -826,7 +873,7 @@
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
 
   /* Delete all of entry belongs to this extcommunity-list.  */
-  if (! str)
+  if (!str)
     {
       community_list_delete (list);
       return 0;
@@ -838,33 +885,33 @@
     {
       ecom = ecommunity_str2com (str, 0, 1);
       if (ecom)
-	{
-	  entry = community_list_entry_lookup (list, ecom, direct);
-	  ecommunity_free (ecom);
-	}
+        {
+          entry = community_list_entry_lookup (list, ecom, direct);
+          ecommunity_free (ecom);
+        }
       else if (style == COMMUNITY_LIST_STANDARD)
-	return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
 
       /* If we can't convert string into community and community-list
-	 type is auto, fall dawn to expanded community-list.  */
+         type is auto, fall dawn to expanded community-list.  */
     }
 
   /* Expanded community-list parse.  String may include regular
      expression.  */
-  if (! entry 
+  if (!entry
       && (style == COMMUNITY_LIST_EXPANDED || style == COMMUNITY_LIST_AUTO))
     {
       regex = bgp_regcomp (str);
       if (regex)
-	{
-	  entry = community_list_entry_lookup (list, str, direct);
-	  bgp_regex_free (regex);
-	}
+        {
+          entry = community_list_entry_lookup (list, str, direct);
+          bgp_regex_free (regex);
+        }
       else
-	return COMMUNITY_LIST_ERR_MALFORMED_VAL;
+        return COMMUNITY_LIST_ERR_MALFORMED_VAL;
     }
 
-  if (! entry)
+  if (!entry)
     return COMMUNITY_LIST_ERR_CANT_FIND_LIST;
 
   community_list_entry_delete (list, entry, style);
@@ -878,7 +925,7 @@
 {
   struct community_list_handler *ch;
   ch = XCALLOC (MTYPE_COMMUNITY_LIST_HANDLER,
-		sizeof (struct community_list_handler));
+                sizeof (struct community_list_handler));
   return ch;
 }
 
