diff --git a/src/parser/language.l b/src/parser/language.l
index 30714b6..e8f6b52 100755
--- a/src/parser/language.l
+++ b/src/parser/language.l
@@ -50,6 +50,7 @@ ID|id         yylval.attribType = MSC_ATTR_ID;    return TOK_ATTR_ID;
 \"[^\"]+\"    yylval.string = strdup(yytext + 1); yylval.string[strlen(yylval.string) - 1] = '\0'; return TOK_QSTRING;
 \.\.\.        yylval.arctype = MSC_ARC_DISCO;    return TOK_SPECIAL_ARC;        /* ... */
 ---           yylval.arctype = MSC_ARC_DIVIDER;  return TOK_SPECIAL_ARC;        /* --- */
+\~\>          yylval.arctype = MSC_ARC_BROADCAST_SIGNAL;  return TOK_BROADCAST_SIGNAL;
 -\>           yylval.arctype = MSC_ARC_SIGNAL;   return TOK_REL_SIG_TO;         /* -> */
 \<-           yylval.arctype = MSC_ARC_SIGNAL;   return TOK_REL_SIG_FROM;       /* <- */
 =\>           yylval.arctype = MSC_ARC_METHOD;   return TOK_REL_METHOD_TO;      /* => */
diff --git a/src/parser/language.y b/src/parser/language.y
index 6bc713a..5c1a7f5 100755
--- a/src/parser/language.y
+++ b/src/parser/language.y
@@ -51,7 +51,8 @@ void yyerror(const char *str)
                                       "TOK_ATTR_IDURL","TOK_ATTR_ID",
                                       "TOK_SPECIAL_ARC",
                                       "TOK_STRING",    "TOK_QSTRING",
-                                      "TOK_OPT_HSCALE" };
+                                      "TOK_OPT_HSCALE",
+                                      "TOK_BROADCAST_SIGNAL"};
 
     static const char *tokRepl[] =  { "{",             "}",
                                       "[",             "]",
@@ -62,7 +63,8 @@ void yyerror(const char *str)
                                       "idurl",         "id",
                                       "'...', '---'",
                                       "a string",      "a quoted string",
-                                      "hscale" };
+                                      "hscale",
+                                      "~>"};
     static const int tokArrayLen = sizeof(tokNames) / sizeof(char *);
 
     char *s;
@@ -153,6 +155,7 @@ Msc MscParse(FILE *in)
        TOK_REL_RETVAL_TO   TOK_REL_RETVAL_FROM
        TOK_REL_CALLBACK_TO TOK_REL_CALLBACK_FROM
        TOK_SPECIAL_ARC     TOK_OPT_HSCALE
+       TOK_BROADCAST_SIGNAL
 
 %union
 {
@@ -179,7 +182,7 @@ Msc MscParse(FILE *in)
 %type <arctype>    relation_to relation_from
                    TOK_REL_SIG_TO TOK_REL_METHOD_TO TOK_REL_RETVAL_TO TOK_REL_CALLBACK_TO
                    TOK_REL_SIG_FROM TOK_REL_METHOD_FROM TOK_REL_RETVAL_FROM TOK_REL_CALLBACK_FROM
-                   TOK_SPECIAL_ARC
+                   TOK_SPECIAL_ARC TOK_BROADCAST_SIGNAL
 %type <attrib>     attrlist attr
 %type <attribType> attrval TOK_ATTR_LABEL TOK_ATTR_URL TOK_ATTR_ID TOK_ATTR_IDURL
 %type <string>     string TOK_STRING TOK_QSTRING
@@ -261,6 +264,10 @@ arcrel:       TOK_SPECIAL_ARC
             | string relation_from string
 {
     $$ = MscAllocArc($3, $1, $2);
+}
+            | string TOK_BROADCAST_SIGNAL
+{
+    $$ = MscAllocArc($1, NULL, $2);
 };
 
 relation_to:   TOK_REL_SIG_TO | TOK_REL_METHOD_TO | TOK_REL_RETVAL_TO | TOK_REL_CALLBACK_TO;
diff --git a/src/parser/msc.c b/src/parser/msc.c
index 2dbb50b..8c3c751 100755
--- a/src/parser/msc.c
+++ b/src/parser/msc.c
@@ -245,6 +245,10 @@ struct MscArcTag *MscAllocArc(char       *srcEntity,
     {
         assert(srcEntity == NULL && dstEntity == NULL);
     }
+    if(type == MSC_ARC_BROADCAST_SIGNAL)
+    {
+        assert(dstEntity == NULL);
+    }
 
     a->src  = srcEntity;
     a->dst  = dstEntity;
diff --git a/src/parser/msc.h b/src/parser/msc.h
index eb2d4a0..77cbc10 100755
--- a/src/parser/msc.h
+++ b/src/parser/msc.h
@@ -59,6 +59,7 @@ typedef enum
     MSC_ARC_CALLBACK,
     MSC_ARC_DISCO,      /* ... Discontinuity in time line */
     MSC_ARC_DIVIDER,    /* --- Divider */
+    MSC_ARC_BROADCAST_SIGNAL,
 
     MSC_INVALID_ARC_TYPE
 }
diff --git a/src/renderer/main.c b/src/renderer/main.c
index 27856fd..262b51c 100755
--- a/src/renderer/main.c
+++ b/src/renderer/main.c
@@ -186,6 +186,7 @@ static void arrowR(unsigned int x,
     switch(type)
     {
         case MSC_ARC_SIGNAL: /* Unfilled half */
+        case MSC_ARC_BROADCAST_SIGNAL:
             drw.line(&drw,
                      x, y,
                      x - gOpts.arrowWidth, y + gOpts.arrowHeight);
@@ -227,6 +228,7 @@ static void arrowL(unsigned int x,
     switch(type)
     {
         case MSC_ARC_SIGNAL: /* Unfilled half */
+        case MSC_ARC_BROADCAST_SIGNAL:
             drw.line(&drw,
                      x, y,
                      x + gOpts.arrowWidth, y + gOpts.arrowHeight);
@@ -509,7 +511,7 @@ static void arcText(Msc               m,
             y += drw.textHeight(&drw) / 2;
         }
 
-        if(startCol != endCol)
+        if(startCol != endCol || arcType == MSC_ARC_BROADCAST_SIGNAL)
         {
             /* Produce central aligned text */
             x -= width / 2;
@@ -631,7 +633,17 @@ static void arcLine(Msc               m,
     const unsigned int dx = (endCol * gOpts.entitySpacing) +
                              (gOpts.entitySpacing / 2);
 
-    if(startCol != endCol)
+    if (arcType == MSC_ARC_BROADCAST_SIGNAL)
+    {
+        /* Draw the line */
+        drw.line(&drw, sx - gOpts.entitySpacing / 2, y,
+                       dx + gOpts.entitySpacing / 2, y);
+
+        /* Now the arrow heads */
+        arrowR(dx + gOpts.entitySpacing / 2, y, arcType);
+        arrowL(dx - gOpts.entitySpacing / 2, y, arcType);
+    }
+    else if(startCol != endCol)
     {
         /* Draw the line */
         if(arcType == MSC_ARC_RETVAL)
@@ -949,17 +961,21 @@ int main(const int argc, const char *argv[])
         int                startCol, endCol;
 
         /* Get the entitiy indices */
-        if(arcType != MSC_ARC_DISCO && arcType != MSC_ARC_DIVIDER)
+        if (arcType == MSC_ARC_BROADCAST_SIGNAL)
         {
-            startCol = MscGetEntityIndex(m, MscGetCurrentArcSource(m));
-            endCol   = MscGetEntityIndex(m, MscGetCurrentArcDest(m));
+            startCol = endCol = MscGetEntityIndex(m, MscGetCurrentArcSource(m));
         }
-        else
+        else if(arcType == MSC_ARC_DISCO || arcType == MSC_ARC_DIVIDER)
         {
             /* Discontinuity arc spans whole chart */
             startCol = 0;
             endCol   = MscGetNumEntities(m) - 1;
         }
+        else
+        {
+            startCol = MscGetEntityIndex(m, MscGetCurrentArcSource(m));
+            endCol   = MscGetEntityIndex(m, MscGetCurrentArcDest(m));
+        }
 
 
         /* Check that the start and end columns are known */
