(function(d3, fc) {
    'use strict';

    // The multi series does some data-join gymnastics to ensure we don't -
    // * Create unnecessary intermediate DOM nodes
    // * Manipulate the data specified by the user
    // This is achieved by data joining the series array to the container but
    // overriding where the series value is stored on the node (__series__) and
    // forcing the node datum (__data__) to be the user supplied data (via mapping).

    fc.series.multi = function() {

        var xScale = d3.time.scale(),
            yScale = d3.scale.linear(),
            series = [],
            mapping = fc.util.fn.context,
            key = fc.util.fn.index;

        var dataJoin = fc.util.dataJoin()
            .children(true)
            .selector('g.multi')
            .element('g')
            .attrs({'class': 'multi'})
            .key(function(d, i) {
                // This function is invoked twice, the first pass is to pull the key
                // value from the DOM nodes and the second pass is to pull the key
                // value from the data values.
                // As we store the series as an additional property on the node, we
                // look for that first and if we find it assume we're being called
                // during the first pass. Otherwise we assume it's the second pass
                // and pull the series from the data value.
                var series = this.__series__ || d;
                return key.call(this, series, i);
            });

        var multi = function(selection) {

            selection.each(function(data) {

                dataJoin(this, series)
                    .each(function(series, i) {

                        // We must always assign the series to the node, as the order
                        // may have changed. N.B. in such a case the output is most
                        // likely garbage (containers should not be re-used) but by
                        // doing this we at least make it debuggable garbage :)
                        this.__series__ = series;

                        (series.xScale || series.x).call(series, xScale);
                        (series.yScale || series.y).call(series, yScale);

                        d3.select(this)
                            .datum(mapping.call(data, series, i))
                            .call(series);
                    });
            });
        };

        multi.xScale = function(x) {
            if (!arguments.length) {
                return xScale;
            }
            xScale = x;
            return multi;
        };
        multi.yScale = function(x) {
            if (!arguments.length) {
                return yScale;
            }
            yScale = x;
            return multi;
        };
        multi.series = function(x) {
            if (!arguments.length) {
                return series;
            }
            series = x;
            return multi;
        };
        multi.mapping = function(x) {
            if (!arguments.length) {
                return mapping;
            }
            mapping = x;
            return multi;
        };
        multi.key = function(x) {
            if (!arguments.length) {
                return key;
            }
            key = x;
            return multi;
        };

        return multi;
    };
}(d3, fc));

@@ -669,16 +669,56 @@
 fn.index
+,%0A            decorate = fc.util.fn.noop
 ;%0A%0A     
@@ -754,16 +754,43 @@
 aJoin()%0A
+            .selector('g')%0A
         
@@ -826,91 +826,19 @@
    .
-selector('g.multi')%0A            .element('g')%0A            .attrs(%7B'class': 'multi'%7D
+element('g'
 )%0A  
@@ -1615,16 +1615,24 @@
         
+ var g =
  dataJoi
@@ -1646,21 +1646,19 @@
  series)
-%0A    
+;%0A%0A
         
@@ -1665,16 +1665,17 @@
         
+g
 .each(fu
@@ -1690,29 +1690,24 @@
 eries, i) %7B%0A
-%0A    
             
@@ -1796,20 +1796,16 @@
         
- 
-   
 // may h
@@ -1856,20 +1856,16 @@
 is most%0A
-    
         
@@ -1936,20 +1936,16 @@
  but by%0A
-    
         
@@ -2032,20 +2032,16 @@
         
-    
 this.__s
@@ -2059,20 +2059,16 @@
 eries;%0A%0A
-    
         
@@ -2141,36 +2141,32 @@
                 
-  
-  
 (series.yScale %7C
@@ -2196,28 +2196,24 @@
 , yScale);%0A%0A
-    
             
@@ -2260,20 +2260,16 @@
         
-    
 .datum(m
@@ -2322,20 +2322,16 @@
         
- 
-   
 .call(se
@@ -2345,37 +2345,63 @@
                 
-    %7D
+%7D);%0A%0A                decorate(g
 );%0A            %7D
@@ -3300,32 +3300,218 @@
 ulti;%0A        %7D;
+%0A        multi.decorate = function(x) %7B%0A            if (!arguments.length) %7B%0A                return decorate;%0A            %7D%0A            decorate = x;%0A            return multi;%0A        %7D;
 %0A%0A        return

Allow decoration of multi series (fixes #471)