diff --git a/docs/InnerHits/Nested.md b/docs/InnerHits/Nested.md
index 76b6990436d21e561c96ae695bb5aa092ed76892..1aef8df4303aa80eb26d60befad9220e2d2b8900 100644
--- a/docs/InnerHits/Nested.md
+++ b/docs/InnerHits/Nested.md
@@ -37,7 +37,9 @@ And now the query via DSL:
 ```php
 $matchQuery = new MatchQuery('comments.message', '[different query]');
 $nestedQuery = new NestedQuery('comments', $matchQuery);
-$innerHit = new NestedInnerHit('comment', 'comments', $matchQuery);
+$searchQuery = new Search();
+$searchQuery->add($matchQuery);
+$innerHit = new NestedInnerHit('comment', 'comments', $searchQuery);
 
 $search = new Search();
 $search->addQuery(new MatchQuery('comments.message', '[actual query]'));
@@ -98,14 +100,21 @@ And now the query via DSL:
 ```php
 
 $matchQuery = new MatchQuery('cars.manufacturers.country', 'Japan');
+$matchSearch = new Search();
+$matchSearch->addQuery($matchQuery);
+
 $nestedQuery = new NestedQuery('cars.manufacturers', $matchQuery);
-$innerHitNested = new NestedInnerHit('manufacturers', 'cars.manufacturers', $matchQuery);
-$innerHit = new NestedInnerHit('cars', 'cars', $nestedQuery);
-$innerHit->addInnerHit($innerHitNested);
+$nestedSearch = new Search();
+$nestedSearch->addQuery($nestedQuery);
+
+$innerHitNested = new NestedInnerHit('manufacturers', 'cars.manufacturers', $matchSearch);
+
+$innerHit = new NestedInnerHit('cars', 'cars', $nestedSearch);
+$nestedSearch->addInnerHit($innerHitNested);
 
 $search = new Search();
 $search->addInnerHit($innerHit);
 $search->toArray();
 
 ```
-[1]: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html
\ No newline at end of file
+[1]: https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-inner-hits.html
diff --git a/src/InnerHit/NestedInnerHit.php b/src/InnerHit/NestedInnerHit.php
index 1fdeb0a6305d7b3a92f13c933e7e5274e47cff64..e04707adb4e04cfadeb3214291264fb5602417f5 100644
--- a/src/InnerHit/NestedInnerHit.php
+++ b/src/InnerHit/NestedInnerHit.php
@@ -11,10 +11,10 @@
 
 namespace ONGR\ElasticsearchDSL\InnerHit;
 
-use ONGR\ElasticsearchDSL\BuilderBag;
 use ONGR\ElasticsearchDSL\BuilderInterface;
 use ONGR\ElasticsearchDSL\NameAwareTrait;
 use ONGR\ElasticsearchDSL\ParametersTrait;
+use ONGR\ElasticsearchDSL\Search;
 
 /**
  * Represents Elasticsearch top level nested inner hits.
@@ -32,27 +32,24 @@ class NestedInnerHit implements BuilderInterface
     private $path;
 
     /**
-     * @var BuilderInterface
+     * @var Search
      */
-    private $query;
-
-    /**
-     * @var BuilderBag
-     */
-    private $innerHits;
+    private $search;
 
     /**
      * Inner hits container init.
      *
-     * @param string           $name
-     * @param string           $path
-     * @param BuilderInterface $query
+     * @param string $name
+     * @param string $path
+     * @param Search $search
      */
-    public function __construct($name, $path, BuilderInterface $query = null)
+    public function __construct($name, $path, Search $search = null)
     {
         $this->setName($name);
         $this->setPath($path);
-        $this->setQuery($query);
+        if ($search) {
+            $this->setSearch($search);
+        }
     }
 
     /**
@@ -76,21 +73,21 @@ class NestedInnerHit implements BuilderInterface
     }
 
     /**
-     * @return BuilderInterface
+     * @return Search
      */
-    public function getQuery()
+    public function getSearch()
     {
-        return $this->query;
+        return $this->search;
     }
 
     /**
-     * @param BuilderInterface $query
+     * @param Search $search
      *
      * @return $this
      */
-    public function setQuery(BuilderInterface $query)
+    public function setSearch(Search $search)
     {
-        $this->query = $query;
+        $this->search = $search;
 
         return $this;
     }
@@ -103,70 +100,16 @@ class NestedInnerHit implements BuilderInterface
         return 'nested';
     }
 
-    /**
-     * Adds a sub-innerHit.
-     *
-     * @param NestedInnerHit $innerHit
-     *
-     * @return $this
-     */
-    public function addInnerHit(NestedInnerHit $innerHit)
-    {
-        if (!$this->innerHits) {
-            $this->innerHits = new BuilderBag();
-        }
-
-        $this->innerHits->add($innerHit);
-
-        return $this;
-    }
-
-    /**
-     * Returns all sub inner hits.
-     *
-     * @return BuilderInterface[]
-     */
-    public function getInnerHits()
-    {
-        if ($this->innerHits) {
-            return $this->innerHits->all();
-        } else {
-            return [];
-        }
-    }
-
-    /**
-     * Returns sub inner hit.
-     * @param string $name inner hit name to return.
-     *
-     * @return NestedInnerHit|null
-     */
-    public function getInnerHit($name)
-    {
-        if ($this->innerHits && $this->innerHits->has($name)) {
-            return $this->innerHits->get($name);
-        } else {
-            return null;
-        }
-    }
-
     /**
      * {@inheritdoc}
      */
     public function toArray()
     {
-        $out = array_filter(
-            [
-                'query' => $this->getQuery() ? $this->getQuery()->toArray() : null,
-                'inner_hits' => $this->collectNestedInnerHits(),
-            ]
-        );
-
-        $out = $this->processArray($out);
+        $out = $this->getSearch() ? $this->getSearch()->toArray() : new \stdClass();
 
         $out = [
             $this->getPathType() => [
-                $this->getPath() => $out ? $out : new \stdClass(),
+                $this->getPath() => $out ,
             ],
         ];
 
@@ -174,7 +117,7 @@ class NestedInnerHit implements BuilderInterface
     }
 
     /**
-     * Returns 'path' for neted and 'type' for parent inner hits
+     * Returns 'path' for nested and 'type' for parent inner hits
      *
      * @return null|string
      */
@@ -192,20 +135,4 @@ class NestedInnerHit implements BuilderInterface
         }
         return $type;
     }
-
-    /**
-     * Process all nested inner hits.
-     *
-     * @return array
-     */
-    private function collectNestedInnerHits()
-    {
-        $result = [];
-        /** @var NestedInnerHit $innerHit */
-        foreach ($this->getInnerHits() as $innerHit) {
-            $result[$innerHit->getName()] = $innerHit->toArray();
-        }
-
-        return $result;
-    }
 }
diff --git a/tests/InnerHit/NestedInnerHitTest.php b/tests/InnerHit/NestedInnerHitTest.php
index 9cb88fcddee54176118acec853512654d92b51b8..c9bfe8a389f6845a6a70aaf8bc2a4fe32186be11 100644
--- a/tests/InnerHit/NestedInnerHitTest.php
+++ b/tests/InnerHit/NestedInnerHitTest.php
@@ -5,7 +5,7 @@ namespace ONGR\ElasticsearchDSL\Tests\InnerHit;
 use ONGR\ElasticsearchDSL\InnerHit\NestedInnerHit;
 use ONGR\ElasticsearchDSL\Query\MatchQuery;
 use ONGR\ElasticsearchDSL\Query\NestedQuery;
-use ONGR\ElasticsearchDSL\Query\TermQuery;
+use ONGR\ElasticsearchDSL\Search;
 
 class NestedInnerHitTest extends \PHPUnit_Framework_TestCase
 {
@@ -20,11 +20,28 @@ class NestedInnerHitTest extends \PHPUnit_Framework_TestCase
 
         $matchQuery = new MatchQuery('foo.bar.aux', 'foo');
         $nestedQuery = new NestedQuery('foo.bar', $matchQuery);
-        $innerHit = new NestedInnerHit('acme', 'foo', $nestedQuery);
-        $nestedInnerHit1 = new NestedInnerHit('aux', 'foo.bar.aux', $matchQuery);
-        $nestedInnerHit2 = new NestedInnerHit('lux', 'foo.bar.aux', $matchQuery);
-        $innerHit->addInnerHit($nestedInnerHit1);
-        $innerHit->addInnerHit($nestedInnerHit2);
+        $searchQuery = new Search();
+        $searchQuery->addQuery($nestedQuery);
+
+        $matchSearch = new Search();
+        $matchSearch->addQuery($matchQuery);
+
+        $innerHit = new NestedInnerHit('acme', 'foo', $searchQuery);
+        $emptyInnerHit = new NestedInnerHit('acme', 'foo');
+
+        $nestedInnerHit1 = new NestedInnerHit('aux', 'foo.bar.aux', $matchSearch);
+        $nestedInnerHit2 = new NestedInnerHit('lux', 'foo.bar.aux', $matchSearch);
+        $searchQuery->addInnerHit($nestedInnerHit1);
+        $searchQuery->addInnerHit($nestedInnerHit2);
+
+        $out[] = [
+            $emptyInnerHit,
+            [
+                'path' => [
+                    'foo' => new \stdClass(),
+                ],
+            ],
+        ];
 
         $out[] = [
             $nestedInnerHit1,
@@ -88,30 +105,16 @@ class NestedInnerHitTest extends \PHPUnit_Framework_TestCase
     public function testGettersAndSetters()
     {
         $query = new MatchQuery('acme', 'test');
-        $hit = new NestedInnerHit('test', 'acme', new TermQuery('foo', 'bar'));
+        $search = new Search();
+        $search->addQuery($query);
+
+        $hit = new NestedInnerHit('test', 'acme', new Search());
         $hit->setName('foo');
         $hit->setPath('bar');
-        $hit->setQuery($query);
+        $hit->setSearch($search);
 
         $this->assertEquals('foo', $hit->getName());
         $this->assertEquals('bar', $hit->getPath());
-        $this->assertEquals($query, $hit->getQuery());
-    }
-
-    /**
-     * Tests getInnerHit() method
-     */
-    public function testGetInnerHit()
-    {
-        $query = new MatchQuery('acme', 'test');
-        $hit = new NestedInnerHit('test', 'acme', $query);
-        $nestedInnerHit1 = new NestedInnerHit('foo', 'acme.foo', $query);
-        $nestedInnerHit2 = new NestedInnerHit('bar', 'acme.bar', $query);
-        $hit->addInnerHit($nestedInnerHit1);
-        $hit->addInnerHit($nestedInnerHit2);
-
-        $this->assertEquals($nestedInnerHit1, $hit->getInnerHit('foo'));
-        $this->assertEquals($nestedInnerHit2, $hit->getInnerHit('bar'));
-        $this->assertNull($hit->getInnerHit('non_existing_hit'));
+        $this->assertEquals($search, $hit->getSearch());
     }
 }
diff --git a/tests/InnerHit/ParentInnerHitTest.php b/tests/InnerHit/ParentInnerHitTest.php
index 0a80b63a8e788cbf43c95418a80fd9b6ae57090c..9444ec67a32d7d0875d6a28dad0616c0c787b27d 100644
--- a/tests/InnerHit/ParentInnerHitTest.php
+++ b/tests/InnerHit/ParentInnerHitTest.php
@@ -4,13 +4,18 @@ namespace ONGR\ElasticsearchDSL\Tests\InnerHit;
 
 use ONGR\ElasticsearchDSL\InnerHit\ParentInnerHit;
 use ONGR\ElasticsearchDSL\Query\TermQuery;
+use ONGR\ElasticsearchDSL\Search;
 
 class ParentInnerHitTest extends \PHPUnit_Framework_TestCase
 {
     public function testToArray()
     {
         $query = new TermQuery('foo', 'bar');
-        $hit = new ParentInnerHit('test', 'acme', $query);
+        $search = new Search();
+        $search->addQuery($query);
+
+
+        $hit = new ParentInnerHit('test', 'acme', $search);
         $expected = [
             'type' => [
                 'acme' => [