diff --git a/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php b/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php
new file mode 100644
index 0000000000000000000000000000000000000000..632f0b59f778b641fd0ed66bcff4cc83a4e91f1a
--- /dev/null
+++ b/src/Aggregation/Bucketing/AdjacencyMatrixAggregation.php
@@ -0,0 +1,81 @@
+<?php
+
+/*
+ * This file is part of the ONGR package.
+ *
+ * (c) NFQ Technologies UAB <info@nfq.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace ONGR\ElasticsearchDSL\Aggregation\Bucketing;
+
+use ONGR\ElasticsearchDSL\Aggregation\AbstractAggregation;
+use ONGR\ElasticsearchDSL\Aggregation\Type\BucketingTrait;
+use ONGR\ElasticsearchDSL\BuilderInterface;
+
+/**
+ * Class representing adjacency matrix aggregation.
+ *
+ * @link https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-adjacency-matrix-aggregation.html
+ */
+class AdjacencyMatrixAggregation extends AbstractAggregation
+{
+    const FILTERS = 'filters';
+
+    use BucketingTrait;
+
+    /**
+     * @var BuilderInterface[]
+     */
+    private $filters = [
+        self::FILTERS => []
+    ];
+
+    /**
+     * Inner aggregations container init.
+     *
+     * @param string             $name
+     * @param BuilderInterface[] $filters
+     */
+    public function __construct($name, $filters = [])
+    {
+        parent::__construct($name);
+
+        foreach ($filters as $name => $filter) {
+            $this->addFilter($name, $filter);
+        }
+    }
+
+    /**
+     * @param string           $name
+     * @param BuilderInterface $filter
+     *
+     * @throws \LogicException
+     *
+     * @return self
+     */
+    public function addFilter($name, BuilderInterface $filter)
+    {
+        $this->filters[self::FILTERS][$name] = $filter->toArray();
+
+        return $this;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getArray()
+    {
+        return $this->filters;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function getType()
+    {
+        return 'adjacency_matrix';
+    }
+}
diff --git a/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php b/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..b39c638ad23377ccd925472247d3b6316f070fc8
--- /dev/null
+++ b/tests/Unit/Aggregation/Bucketing/AdjacencyMatrixAggregationTest.php
@@ -0,0 +1,134 @@
+<?php
+
+/*
+ * This file is part of the ONGR package.
+ *
+ * (c) NFQ Technologies UAB <info@nfq.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace ONGR\ElasticsearchDSL\Tests\Unit\Bucketing\Aggregation;
+
+use ONGR\ElasticsearchDSL\Aggregation\Bucketing\AdjacencyMatrixAggregation;
+use ONGR\ElasticsearchDSL\BuilderInterface;
+
+/**
+ * Unit test for adjacency matrix aggregation.
+ */
+class AdjacencyMatrixAggregationTest extends \PHPUnit\Framework\TestCase
+{
+//    /**
+//     * Test if exception is thrown when not anonymous filter is without name.
+//     *
+//     * @expectedException \LogicException
+//     * @expectedExceptionMessage In not anonymous filters filter name must be set.
+//     */
+//    public function testIfExceptionIsThrown()
+//    {
+//        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+//        $aggregation = new FiltersAggregation('test_agg');
+//        $aggregation->addFilter($mock);
+//    }
+
+    /**
+     * Test GetArray method.
+     */
+    public function testFiltersAggregationGetArray()
+    {
+        $mock = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')->getMock();
+        $aggregation = new AdjacencyMatrixAggregation('test_agg');
+        $aggregation->addFilter('name', $mock);
+        $result = $aggregation->getArray();
+        $this->assertArrayHasKey('filters', $result);
+    }
+
+    /**
+     * Tests getType method.
+     */
+    public function testFiltersAggregationGetType()
+    {
+        $aggregation = new AdjacencyMatrixAggregation('foo');
+        $result = $aggregation->getType();
+        $this->assertEquals('adjacency_matrix', $result);
+    }
+
+    /**
+     * Test for filter aggregation toArray() method.
+     */
+    public function testToArray()
+    {
+        $aggregation = new AdjacencyMatrixAggregation('test_agg');
+        $filter = $this->getMockBuilder('ONGR\ElasticsearchDSL\BuilderInterface')
+            ->setMethods(['toArray', 'getType'])
+            ->getMockForAbstractClass();
+        $filter->expects($this->any())
+            ->method('toArray')
+            ->willReturn(['test_field' => ['test_value' => 'test']]);
+
+        $aggregation->addFilter('first', $filter );
+        $aggregation->addFilter('second', $filter );
+
+        $results = $aggregation->toArray();
+        $expected = [
+            'adjacency_matrix' => [
+                'filters' => [
+                    'first' => [
+                        'test_field' => [
+                            'test_value' => 'test',
+                        ],
+                    ],
+                    'second' => [
+                        'test_field' => [
+                            'test_value' => 'test',
+                        ],
+                    ],
+                ],
+            ],
+        ];
+        $this->assertEquals($expected, $results);
+    }
+
+    /**
+     * Tests if filters can be passed to the constructor.
+     */
+    public function testFilterConstructor()
+    {
+        /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface1 */
+        $builderInterface1 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
+        /** @var BuilderInterface|\PHPUnit_Framework_MockObject_MockObject $builderInterface2 */
+        $builderInterface2 = $this->getMockForAbstractClass('ONGR\ElasticsearchDSL\BuilderInterface');
+
+        $aggregation = new AdjacencyMatrixAggregation(
+            'test',
+            [
+                'filter1' => $builderInterface1,
+                'filter2' => $builderInterface2,
+            ]
+        );
+
+        $this->assertSame(
+            [
+                'adjacency_matrix' => [
+                    'filters' => [
+                        'filter1' => null,
+                        'filter2' => null,
+                    ],
+                ],
+            ],
+            $aggregation->toArray()
+        );
+
+        $aggregation = new AdjacencyMatrixAggregation('test');
+
+        $this->assertSame(
+            [
+                'adjacency_matrix' => [
+                    'filters' => [],
+                ],
+            ],
+            $aggregation->toArray()
+        );
+    }
+}