diff --git a/Aggregation/AbstractAggregation.php b/Aggregation/AbstractAggregation.php
index e9106db331047a227ba6bf64486379669f06ee75..88f786f2bb7829f9772bd3d1199c941c41d0d097 100644
--- a/Aggregation/AbstractAggregation.php
+++ b/Aggregation/AbstractAggregation.php
@@ -11,13 +11,16 @@
 
 namespace ONGR\ElasticsearchBundle\DSL\Aggregation;
 
-use ONGR\ElasticsearchBundle\DSL\BuilderInterface;
+use ONGR\ElasticsearchBundle\DSL\FriendlyBuilderBag;
+use ONGR\ElasticsearchBundle\DSL\FriendlyBuilderInterface;
 
 /**
  * AbstractAggregation class.
  */
-abstract class AbstractAggregation implements BuilderInterface
+abstract class AbstractAggregation implements FriendlyBuilderInterface
 {
+    const PREFIX = 'agg_';
+
     /**
      * @var string
      */
@@ -29,7 +32,7 @@ abstract class AbstractAggregation implements BuilderInterface
     protected $name;
 
     /**
-     * @var Aggregations
+     * @var FriendlyBuilderBag
      */
     public $aggregations;
 
@@ -58,7 +61,7 @@ abstract class AbstractAggregation implements BuilderInterface
     public function __construct($name)
     {
         $this->name = $name;
-        $this->aggregations = new Aggregations();
+        $this->aggregations = new FriendlyBuilderBag();
     }
 
     /**
@@ -78,11 +81,11 @@ abstract class AbstractAggregation implements BuilderInterface
     }
 
     /**
-     * @return string
+     * {@inheritdoc}
      */
     public function getName()
     {
-        return Aggregations::PREFIX . $this->name;
+        return self::PREFIX . $this->name;
     }
 
     /**
diff --git a/Aggregation/Aggregations.php b/Aggregation/Aggregations.php
deleted file mode 100644
index c7885abbc0027d1bb8a7f20007da622fd1d49e68..0000000000000000000000000000000000000000
--- a/Aggregation/Aggregations.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?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\ElasticsearchBundle\DSL\Aggregation;
-
-/**
- * Aggregations class.
- */
-class Aggregations
-{
-    const PREFIX = 'agg_';
-
-    /**
-     * @var array
-     */
-    private $aggregations = [];
-
-    /**
-     * @param AbstractAggregation $agg
-     */
-    public function addAggregation(AbstractAggregation $agg)
-    {
-        $this->aggregations[$agg->getName()] = $agg;
-    }
-
-    /**
-     * Checks if aggregation is set.
-     *
-     * @param string $name
-     *
-     * @return bool
-     */
-    public function has($name)
-    {
-        return isset($this->aggregations[$name]);
-    }
-
-    /**
-     * Removes aggregation by it's name.
-     *
-     * @param string $name
-     */
-    public function remove($name)
-    {
-        unset($this->aggregations[$name]);
-    }
-
-    /**
-     * Gets aggregation by it's name.
-     *
-     * @param string $name
-     *
-     * @return AbstractAggregation
-     */
-    public function get($name)
-    {
-        return $this->aggregations[$name];
-    }
-
-    /**
-     * Returns all aggregations.
-     *
-     * @param string|null $type
-     *
-     * @return AbstractAggregation[]
-     */
-    public function all($type = null)
-    {
-        return array_filter(
-            $this->aggregations,
-            function ($aggregation) use ($type) {
-                /** @var AbstractAggregation $aggregation */
-
-                return $type === null || $aggregation->getType() == $type;
-            }
-        );
-    }
-}
diff --git a/FriendlyBuilderBag.php b/FriendlyBuilderBag.php
new file mode 100644
index 0000000000000000000000000000000000000000..dd90e94d741af1b7a8b500a014d1cd841e68e4f1
--- /dev/null
+++ b/FriendlyBuilderBag.php
@@ -0,0 +1,114 @@
+<?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\ElasticsearchBundle\DSL;
+
+/**
+ * Container for friendly builders.
+ */
+class FriendlyBuilderBag
+{
+    /**
+     * @var FriendlyBuilderInterface[]
+     */
+    private $bag = [];
+
+    /**
+     * @param FriendlyBuilderInterface[] $builders
+     */
+    public function __construct(array $builders = [])
+    {
+        $this->set($builders);
+    }
+
+    /**
+     * Replaces builders with new ones.
+     *
+     * @param FriendlyBuilderInterface[] $builders
+     */
+    public function set(array $builders)
+    {
+        foreach ($builders as $builder) {
+            $this->add($builder);
+        }
+    }
+
+    /**
+     * Adds a builder.
+     *
+     * @param FriendlyBuilderInterface $builder
+     */
+    public function add(FriendlyBuilderInterface $builder)
+    {
+        $this->bag[$builder->getName()] = $builder;
+    }
+
+    /**
+     * Checks if builder is set by name.
+     *
+     * @param string $name Builder name.
+     *
+     * @return bool
+     */
+    public function has($name)
+    {
+        return isset($this->bag[$name]);
+    }
+
+    /**
+     * Removes a builder by name.
+     *
+     * @param string $name Builder name.
+     */
+    public function remove($name)
+    {
+        unset($this->bag[$name]);
+    }
+
+    /**
+     * Clears contained builders.
+     */
+    public function clear()
+    {
+        $this->bag = [];
+    }
+
+    /**
+     * Returns a builder by name.
+     *
+     * @param string $name Builder name.
+     *
+     * @return FriendlyBuilderInterface
+     */
+    public function get($name)
+    {
+        return $this->bag[$name];
+    }
+
+    /**
+     * Returns all builders contained.
+     *
+     * @param string|null $name Builder name.
+     *
+     * @return FriendlyBuilderInterface[]
+     */
+    public function all($name = null)
+    {
+        return array_filter(
+            $this->bag,
+            function ($builder) use ($name) {
+                /** @var FriendlyBuilderInterface $builder */
+
+                return $name === null || $builder->getName() == $name;
+            }
+        );
+    }
+}
diff --git a/FriendlyBuilderInterface.php b/FriendlyBuilderInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..a4e1e4b31fd89d59953509a114972fbb05f9308c
--- /dev/null
+++ b/FriendlyBuilderInterface.php
@@ -0,0 +1,25 @@
+<?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\ElasticsearchBundle\DSL;
+
+/**
+ * Interface used by builders with names.
+ */
+interface FriendlyBuilderInterface extends BuilderInterface
+{
+    /**
+     * Returns builder name.
+     *
+     * @return string
+     */
+    public function getName();
+}
diff --git a/Search.php b/Search.php
index 94316a4dd4ebfc1dc1bc15b90ed718d4f131eb9a..0328cf6a83df7e8b455a36e92186335c52277e7a 100644
--- a/Search.php
+++ b/Search.php
@@ -12,7 +12,6 @@
 namespace ONGR\ElasticsearchBundle\DSL;
 
 use ONGR\ElasticsearchBundle\DSL\Aggregation\AbstractAggregation;
-use ONGR\ElasticsearchBundle\DSL\Aggregation\Aggregations;
 use ONGR\ElasticsearchBundle\DSL\Bool\Bool;
 use ONGR\ElasticsearchBundle\DSL\Filter\PostFilter;
 use ONGR\ElasticsearchBundle\DSL\Highlight\Highlight;
@@ -21,7 +20,6 @@ use ONGR\ElasticsearchBundle\DSL\Query\Query;
 use ONGR\ElasticsearchBundle\DSL\Sort\AbstractSort;
 use ONGR\ElasticsearchBundle\DSL\Sort\Sorts;
 use ONGR\ElasticsearchBundle\DSL\Suggester\AbstractSuggester;
-use ONGR\ElasticsearchBundle\DSL\Suggester\Suggesters;
 
 /**
  * Search object that can be executed by a manager.
@@ -91,7 +89,7 @@ class Search
     private $scriptFields;
 
     /**
-     * @var Suggesters
+     * @var FriendlyBuilderBag
      */
     private $suggesters;
 
@@ -116,7 +114,7 @@ class Search
     private $stats;
 
     /**
-     * @var Aggregations
+     * @var FriendlyBuilderBag
      */
     private $aggregations;
 
@@ -361,9 +359,9 @@ class Search
     public function addAggregation($agg)
     {
         if ($this->aggregations === null) {
-            $this->aggregations = new Aggregations();
+            $this->aggregations = new FriendlyBuilderBag();
         }
-        $this->aggregations->addAggregation($agg);
+        $this->aggregations->add($agg);
 
         return $this;
     }
@@ -406,7 +404,7 @@ class Search
     public function addSuggester(AbstractSuggester $suggester)
     {
         if ($this->suggesters === null) {
-            $this->suggesters = new Suggesters();
+            $this->suggesters = new FriendlyBuilderBag();
         }
         $this->suggesters->add($suggester);
 
@@ -475,7 +473,7 @@ class Search
     }
 
     /**
-     * @return Aggregations
+     * @return FriendlyBuilderBag
      */
     public function getAggregations()
     {
@@ -611,7 +609,7 @@ class Search
     }
 
     /**
-     * @return Suggesters
+     * @return FriendlyBuilderBag
      */
     public function getSuggesters()
     {
diff --git a/Suggester/AbstractSuggester.php b/Suggester/AbstractSuggester.php
index 922aec13bcb05ba8f79c3725bb7af3a258e12a9e..ecef664b2ffe4aef9868a0b3f0daa4a8c02ee5a8 100644
--- a/Suggester/AbstractSuggester.php
+++ b/Suggester/AbstractSuggester.php
@@ -11,12 +11,12 @@
 
 namespace ONGR\ElasticsearchBundle\DSL\Suggester;
 
-use ONGR\ElasticsearchBundle\DSL\BuilderInterface;
+use ONGR\ElasticsearchBundle\DSL\FriendlyBuilderInterface;
 
 /**
  * AbstractSuggester class.
  */
-abstract class AbstractSuggester implements BuilderInterface
+abstract class AbstractSuggester implements FriendlyBuilderInterface
 {
     /**
      * @var string
@@ -96,7 +96,7 @@ abstract class AbstractSuggester implements BuilderInterface
     }
 
     /**
-     * @return string
+     * {@inheritdoc}
      */
     public function getName()
     {
diff --git a/Suggester/Suggesters.php b/Suggester/Suggesters.php
deleted file mode 100644
index dcfdca0c7936e037deee180b329391e759eec6c6..0000000000000000000000000000000000000000
--- a/Suggester/Suggesters.php
+++ /dev/null
@@ -1,86 +0,0 @@
-<?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\ElasticsearchBundle\DSL\Suggester;
-
-/**
- * Suggesters class.
- */
-class Suggesters
-{
-    /**
-     * @var AbstractSuggester
-     */
-    private $suggesters = [];
-
-    /**
-     * Adds a suggester.
-     *
-     * @param AbstractSuggester $suggester
-     */
-    public function add(AbstractSuggester $suggester)
-    {
-        $this->suggesters[$suggester->getName()] = $suggester;
-    }
-
-    /**
-     * Checks if suggester is set.
-     *
-     * @param string $name
-     *
-     * @return bool
-     */
-    public function has($name)
-    {
-        return isset($this->suggesters[$name]);
-    }
-
-    /**
-     * Removes suggester.
-     *
-     * @param string $name
-     */
-    public function remove($name)
-    {
-        unset($this->suggesters[$name]);
-    }
-
-    /**
-     * Gets a suggester by it's name.
-     *
-     * @param string $name
-     *
-     * @return AbstractSuggester
-     */
-    public function get($name)
-    {
-        return $this->suggesters[$name];
-    }
-
-    /**
-     * Gets all suggesters.
-     *
-     * @param string|null $name
-     *
-     * @return AbstractSuggester[]
-     */
-    public function all($name = null)
-    {
-        return array_filter(
-            $this->suggesters,
-            function ($build) use ($name) {
-                /** @var AbstractSuggester $suggester */
-
-                return $name === null || $suggester->getName() == $name;
-            }
-        );
-    }
-}