diff --git a/protocols/bgp/packet/path_attributes.go b/protocols/bgp/packet/path_attributes.go
index f6400f80369ed472bd90cf7889ecd63ada32cb0e..f592af68c359cae74837725d823d9cac5bc6075a 100644
--- a/protocols/bgp/packet/path_attributes.go
+++ b/protocols/bgp/packet/path_attributes.go
@@ -227,25 +227,12 @@ func (pa *PathAttribute) decodeAggregator(buf *bytes.Buffer) error {
 	aggr := types.Aggregator{}
 	p := uint16(0)
 
-	err := decode(buf, []interface{}{&aggr.ASN})
+	err := decode(buf, []interface{}{&aggr.ASN, &aggr.Address})
 	if err != nil {
 		return err
 	}
-	p += 2
-
-	addr := [4]byte{}
-	n, err := buf.Read(addr[:])
-	if err != nil {
-		return err
-	}
-	if n != 4 {
-		return fmt.Errorf("Unable to read next hop: buf.Read read %d bytes", n)
-	}
-	aggr.Address = fourBytesToUint32(addr)
-
+	p += 6
 	pa.Value = aggr
-	p += 4
-
 	return dumpNBytes(buf, pa.Length-p)
 }
 
@@ -497,10 +484,14 @@ func (pa *PathAttribute) serializeAggregator(buf *bytes.Buffer) uint8 {
 	attrFlags = setTransitive(attrFlags)
 	buf.WriteByte(attrFlags)
 	buf.WriteByte(AggregatorAttr)
-	length := uint8(2)
+	length := uint8(6)
 	buf.WriteByte(length)
-	buf.Write(convert.Uint16Byte(pa.Value.(uint16)))
-	return 5
+
+	aggregator := pa.Value.(types.Aggregator)
+	buf.Write(convert.Uint16Byte(aggregator.ASN))
+	buf.Write(convert.Uint32Byte(aggregator.Address))
+
+	return 9
 }
 
 func (pa *PathAttribute) serializeCommunities(buf *bytes.Buffer) uint8 {
@@ -643,6 +634,23 @@ func PathAttributes(p *route.Path, iBGP bool) (*PathAttribute, error) {
 	last.Next = nextHop
 	last = nextHop
 
+	if p.BGPPath.AtomicAggregate {
+		atomicAggr := &PathAttribute{
+			TypeCode: AtomicAggrAttr,
+		}
+		last.Next = atomicAggr
+		last = atomicAggr
+	}
+
+	if p.BGPPath.Aggregator != nil {
+		aggregator := &PathAttribute{
+			TypeCode: AggregatorAttr,
+			Value:    p.BGPPath.Aggregator,
+		}
+		last.Next = aggregator
+		last = aggregator
+	}
+
 	if iBGP {
 		localPref := &PathAttribute{
 			TypeCode: LocalPrefAttr,
diff --git a/protocols/bgp/packet/path_attributes_test.go b/protocols/bgp/packet/path_attributes_test.go
index 793bd29850cd6aa83342c59c4a315589c83a6d13..dea391e069527f65f33c946c421da91632d37373 100644
--- a/protocols/bgp/packet/path_attributes_test.go
+++ b/protocols/bgp/packet/path_attributes_test.go
@@ -1137,15 +1137,19 @@ func TestSerializeAggregator(t *testing.T) {
 			name: "Test #1",
 			input: &PathAttribute{
 				TypeCode: AggregatorAttr,
-				Value:    uint16(174),
+				Value: types.Aggregator{
+					ASN:     174,
+					Address: strAddr("10.20.30.40"),
+				},
 			},
 			expected: []byte{
 				192,    // Attribute flags
 				7,      // Type
-				2,      // Length
+				6,      // Length
 				0, 174, // Value = 174
+				10, 20, 30, 40,
 			},
-			expectedLen: 5,
+			expectedLen: 9,
 		},
 	}
 
@@ -1510,7 +1514,10 @@ func TestSerialize(t *testing.T) {
 										TypeCode: AtomicAggrAttr,
 										Next: &PathAttribute{
 											TypeCode: AggregatorAttr,
-											Value:    uint16(200),
+											Value: types.Aggregator{
+												ASN:     200,
+												Address: strAddr("10.20.30.40"),
+											},
 										},
 									},
 								},
@@ -1529,7 +1536,7 @@ func TestSerialize(t *testing.T) {
 			},
 			expected: []byte{
 				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-				0, 86, // Length
+				0, 90, // Length
 				2, // Msg Type
 
 				// Withdraws
@@ -1537,7 +1544,7 @@ func TestSerialize(t *testing.T) {
 				8, 10, // Withdraw 10/8
 				16, 192, 168, // Withdraw 192.168/16
 
-				0, 50, // Total Path Attribute Length
+				0, 54, // Total Path Attribute Length
 
 				// ORIGIN
 				64, // Attr. Flags
@@ -1576,8 +1583,9 @@ func TestSerialize(t *testing.T) {
 				// Aggregator
 				192,    // Attr. Flags
 				7,      // Attr. Type Code
-				2,      // Length
+				6,      // Length
 				0, 200, // Aggregator ASN = 200
+				10, 20, 30, 40, // Aggregator Address
 
 				// NLRI
 				24, 8, 8, 8, // 8.8.8.0/24
@@ -1715,7 +1723,10 @@ func TestSerializeAddPath(t *testing.T) {
 										TypeCode: AtomicAggrAttr,
 										Next: &PathAttribute{
 											TypeCode: AggregatorAttr,
-											Value:    uint16(200),
+											Value: types.Aggregator{
+												ASN:     200,
+												Address: strAddr("10.20.30.40"),
+											},
 										},
 									},
 								},
@@ -1734,7 +1745,7 @@ func TestSerializeAddPath(t *testing.T) {
 			},
 			expected: []byte{
 				0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
-				0, 102, // Length
+				0, 106, // Length
 				2, // Msg Type
 
 				// Withdraws
@@ -1744,7 +1755,7 @@ func TestSerializeAddPath(t *testing.T) {
 				0, 0, 0, 0, // Path Identifier
 				16, 192, 168, // Withdraw 192.168/16
 
-				0, 50, // Total Path Attribute Length
+				0, 54, // Total Path Attribute Length
 
 				// ORIGIN
 				64, // Attr. Flags
@@ -1783,8 +1794,9 @@ func TestSerializeAddPath(t *testing.T) {
 				// Aggregator
 				192,    // Attr. Flags
 				7,      // Attr. Type Code
-				2,      // Length
+				6,      // Length
 				0, 200, // Aggregator ASN = 200
+				10, 20, 30, 40, // Aggregator Address
 
 				// NLRI
 				0, 0, 0, 0, // Path Identifier
diff --git a/protocols/bgp/server/fsm_established.go b/protocols/bgp/server/fsm_established.go
index 66ea139fb5b35b3dff2d493bd2a58b5a9d5140ba..9aced1fe480489ed116960262318750f74e7b5ee 100644
--- a/protocols/bgp/server/fsm_established.go
+++ b/protocols/bgp/server/fsm_established.go
@@ -245,7 +245,8 @@ func (s *establishedState) processAttributes(attrs *packet.PathAttribute, path *
 			path.BGPPath.ASPath = pa.Value.(types.ASPath)
 			path.BGPPath.ASPathLen = path.BGPPath.ASPath.Length()
 		case packet.AggregatorAttr:
-			path.BGPPath.Aggregator = pa.Value.(types.Aggregator)
+			aggr := pa.Value.(types.Aggregator)
+			path.BGPPath.Aggregator = &aggr
 		case packet.AtomicAggrAttr:
 			path.BGPPath.AtomicAggregate = true
 		case packet.CommunitiesAttr:
diff --git a/route/bgp_path.go b/route/bgp_path.go
index 443850e40f864e26dd95ad5eb3b22024868a45c2..fbca2255f620b8b49a9d7bc57490754316b412de 100644
--- a/route/bgp_path.go
+++ b/route/bgp_path.go
@@ -20,7 +20,7 @@ type BGPPath struct {
 	MED               uint32
 	EBGP              bool
 	AtomicAggregate   bool
-	Aggregator        types.Aggregator
+	Aggregator        *types.Aggregator
 	BGPIdentifier     uint32
 	Source            uint32
 	Communities       []uint32