diff --git a/protocols/bgp/packet/bgp.go b/protocols/bgp/packet/bgp.go
index f75ce7a0c4403e8d1530c198099d2cbefa605923..c6776ace6c41f6ccbfd8e2b126f38fc5c16d4798 100644
--- a/protocols/bgp/packet/bgp.go
+++ b/protocols/bgp/packet/bgp.go
@@ -140,8 +140,3 @@ type PathAttribute struct {
 	Value          interface{}
 	Next           *PathAttribute
 }
-
-type Aggretator struct {
-	Addr uint32
-	ASN  uint16
-}
diff --git a/protocols/bgp/packet/decoder_test.go b/protocols/bgp/packet/decoder_test.go
index b2ee41a00cd2fbb88e71e48cc4c7c4e525fdf497..a874ba1041d35c3ca3476251096cef5320dbbc70 100644
--- a/protocols/bgp/packet/decoder_test.go
+++ b/protocols/bgp/packet/decoder_test.go
@@ -1195,9 +1195,9 @@ func TestDecodeUpdateMsg(t *testing.T) {
 											ExtendedLength: false,
 											Length:         6,
 											TypeCode:       7,
-											Value: Aggretator{
-												ASN:  uint16(258),
-												Addr: strAddr("10.11.12.13"),
+											Value: types.Aggregator{
+												ASN:     uint16(258),
+												Address: strAddr("10.11.12.13"),
 											},
 										},
 									},
diff --git a/protocols/bgp/packet/path_attributes.go b/protocols/bgp/packet/path_attributes.go
index 56eb039c21907c6d580dadc57459a5a2f03bb505..f6400f80369ed472bd90cf7889ecd63ada32cb0e 100644
--- a/protocols/bgp/packet/path_attributes.go
+++ b/protocols/bgp/packet/path_attributes.go
@@ -224,7 +224,7 @@ func (pa *PathAttribute) decodeLocalPref(buf *bytes.Buffer) error {
 }
 
 func (pa *PathAttribute) decodeAggregator(buf *bytes.Buffer) error {
-	aggr := Aggretator{}
+	aggr := types.Aggregator{}
 	p := uint16(0)
 
 	err := decode(buf, []interface{}{&aggr.ASN})
@@ -241,7 +241,7 @@ func (pa *PathAttribute) decodeAggregator(buf *bytes.Buffer) error {
 	if n != 4 {
 		return fmt.Errorf("Unable to read next hop: buf.Read read %d bytes", n)
 	}
-	aggr.Addr = fourBytesToUint32(addr)
+	aggr.Address = fourBytesToUint32(addr)
 
 	pa.Value = aggr
 	p += 4
@@ -622,33 +622,39 @@ func (pa *PathAttribute) AddOptionalPathAttributes(p *route.Path) *PathAttribute
 }
 
 // PathAttributes converts a path object into a linked list of path attributes
-func PathAttributes(p *route.Path) (*PathAttribute, error) {
+func PathAttributes(p *route.Path, iBGP bool) (*PathAttribute, error) {
 	asPath := &PathAttribute{
 		TypeCode: ASPathAttr,
 		Value:    p.BGPPath.ASPath,
 	}
+	last := asPath
 
 	origin := &PathAttribute{
 		TypeCode: OriginAttr,
 		Value:    p.BGPPath.Origin,
 	}
-	asPath.Next = origin
+	last.Next = origin
+	last = origin
 
 	nextHop := &PathAttribute{
 		TypeCode: NextHopAttr,
 		Value:    p.BGPPath.NextHop,
 	}
-	origin.Next = nextHop
+	last.Next = nextHop
+	last = nextHop
 
-	localPref := &PathAttribute{
-		TypeCode: LocalPrefAttr,
-		Value:    p.BGPPath.LocalPref,
+	if iBGP {
+		localPref := &PathAttribute{
+			TypeCode: LocalPrefAttr,
+			Value:    p.BGPPath.LocalPref,
+		}
+		last.Next = localPref
+		last = localPref
 	}
-	nextHop.Next = localPref
 
-	optionals := localPref.AddOptionalPathAttributes(p)
+	optionals := last.AddOptionalPathAttributes(p)
 
-	last := optionals
+	last = optionals
 	for _, unknownAttr := range p.BGPPath.UnknownAttributes {
 		last.Next = &PathAttribute{
 			TypeCode:   unknownAttr.TypeCode,
diff --git a/protocols/bgp/packet/path_attributes_test.go b/protocols/bgp/packet/path_attributes_test.go
index 93a0b2e515f0dfb9f0a0dde543085a37fb3c52c3..793bd29850cd6aa83342c59c4a315589c83a6d13 100644
--- a/protocols/bgp/packet/path_attributes_test.go
+++ b/protocols/bgp/packet/path_attributes_test.go
@@ -563,9 +563,9 @@ func TestDecodeAggregator(t *testing.T) {
 			wantFail: false,
 			expected: &PathAttribute{
 				Length: 6,
-				Value: Aggretator{
-					ASN:  222,
-					Addr: strAddr("10.20.30.40"),
+				Value: types.Aggregator{
+					ASN:     222,
+					Address: strAddr("10.20.30.40"),
 				},
 			},
 		},
diff --git a/protocols/bgp/server/fsm_established.go b/protocols/bgp/server/fsm_established.go
index 99fb64e52ce1bf05b99231b80e9f257c8bfc1c1f..66ea139fb5b35b3dff2d493bd2a58b5a9d5140ba 100644
--- a/protocols/bgp/server/fsm_established.go
+++ b/protocols/bgp/server/fsm_established.go
@@ -244,6 +244,10 @@ func (s *establishedState) processAttributes(attrs *packet.PathAttribute, path *
 		case packet.ASPathAttr:
 			path.BGPPath.ASPath = pa.Value.(types.ASPath)
 			path.BGPPath.ASPathLen = path.BGPPath.ASPath.Length()
+		case packet.AggregatorAttr:
+			path.BGPPath.Aggregator = pa.Value.(types.Aggregator)
+		case packet.AtomicAggrAttr:
+			path.BGPPath.AtomicAggregate = true
 		case packet.CommunitiesAttr:
 			path.BGPPath.Communities = pa.Value.([]uint32)
 		case packet.LargeCommunitiesAttr:
diff --git a/protocols/bgp/server/update_sender.go b/protocols/bgp/server/update_sender.go
index d7c32fd1dcdbeb362ab20799456a014725ba2c31..dedae8ef54a63f3afc73a355636534150c69492a 100644
--- a/protocols/bgp/server/update_sender.go
+++ b/protocols/bgp/server/update_sender.go
@@ -86,7 +86,7 @@ func (u *UpdateSender) sender(aggrTime time.Duration) {
 
 		for key, pathNLRIs := range u.toSend {
 			budget = packet.MaxLen - packet.HeaderLen - packet.MinUpdateLen - int(pathNLRIs.path.BGPPath.Length())
-			pathAttrs, err = packet.PathAttributes(pathNLRIs.path)
+			pathAttrs, err = packet.PathAttributes(pathNLRIs.path, u.iBGP)
 			if err != nil {
 				log.Errorf("Unable to get path attributes: %v", err)
 				continue
diff --git a/route/bgp_path.go b/route/bgp_path.go
index 9945739b62a2318dca4e7553a2487f9527c70b2e..443850e40f864e26dd95ad5eb3b22024868a45c2 100644
--- a/route/bgp_path.go
+++ b/route/bgp_path.go
@@ -19,6 +19,8 @@ type BGPPath struct {
 	Origin            uint8
 	MED               uint32
 	EBGP              bool
+	AtomicAggregate   bool
+	Aggregator        types.Aggregator
 	BGPIdentifier     uint32
 	Source            uint32
 	Communities       []uint32