diff --git a/composer.json b/composer.json
index 50ebedcaa47fe227c9b8d307d3169e079466dde4..e23719ec03d10734cf9d4c9e0bdd19bf7c01e67a 100644
--- a/composer.json
+++ b/composer.json
@@ -13,7 +13,7 @@
     "require": {
         "php": "^7.0",
         "symfony/serializer": "^3.0|^4.0",
-        "paragonie/random_compat": "^1.0|^2.0"
+        "paragonie/random_compat": "*"
     },
     "require-dev": {
         "elasticsearch/elasticsearch": "^6.0",
diff --git a/src/Aggregation/Bucketing/DateHistogramAggregation.php b/src/Aggregation/Bucketing/DateHistogramAggregation.php
index 58abbc050340ec7c95a8e10a165ce8f6a83efaec..4b1009d3d13c33fdd342f8e840837f0d6560ad9c 100644
--- a/src/Aggregation/Bucketing/DateHistogramAggregation.php
+++ b/src/Aggregation/Bucketing/DateHistogramAggregation.php
@@ -28,6 +28,11 @@ class DateHistogramAggregation extends AbstractAggregation
      */
     protected $interval;
 
+    /**
+     * @var string
+     */
+    protected $format;
+
     /**
      * Inner aggregations container init.
      *
@@ -35,12 +40,13 @@ class DateHistogramAggregation extends AbstractAggregation
      * @param string $field
      * @param string $interval
      */
-    public function __construct($name, $field = null, $interval = null)
+    public function __construct($name, $field = null, $interval = null, $format = null)
     {
         parent::__construct($name);
 
         $this->setField($field);
         $this->setInterval($interval);
+        $this->setFormat($format);
     }
 
     /**
@@ -59,6 +65,14 @@ class DateHistogramAggregation extends AbstractAggregation
         $this->interval = $interval;
     }
 
+    /**
+     * @param string $format
+     */
+    public function setFormat($format)
+    {
+        $this->format = $format;
+    }
+
     /**
      * {@inheritdoc}
      */
@@ -81,6 +95,10 @@ class DateHistogramAggregation extends AbstractAggregation
             'interval' => $this->getInterval(),
         ];
 
+        if (!empty($this->format)) {
+            $out['format'] = $this->format;
+        }
+
         return $out;
     }
 }
diff --git a/src/Aggregation/Bucketing/DateRangeAggregation.php b/src/Aggregation/Bucketing/DateRangeAggregation.php
index d02b3d727084b14abebe2511de0500d5c1e940e8..00184c97ec202bf27ffe8a5b05560ee8c67c4ac9 100644
--- a/src/Aggregation/Bucketing/DateRangeAggregation.php
+++ b/src/Aggregation/Bucketing/DateRangeAggregation.php
@@ -86,7 +86,10 @@ class DateRangeAggregation extends AbstractAggregation
                 'from' => $from,
                 'to' => $to,
                 'key' => $key,
-            ]
+            ],
+            function ($v) {
+                return !is_null($v);
+            }
         );
 
         if (empty($range)) {
diff --git a/src/Aggregation/Bucketing/GeoDistanceAggregation.php b/src/Aggregation/Bucketing/GeoDistanceAggregation.php
index 2d6a09523b2da7bdd2e1bfbb065f6b7289dae6c6..6772ea5e67cf55361aa0fc1219d31125a9de3842 100644
--- a/src/Aggregation/Bucketing/GeoDistanceAggregation.php
+++ b/src/Aggregation/Bucketing/GeoDistanceAggregation.php
@@ -132,7 +132,10 @@ class GeoDistanceAggregation extends AbstractAggregation
             [
                 'from' => $from,
                 'to' => $to,
-            ]
+            ],
+            function ($v) {
+                return !is_null($v);
+            }
         );
 
         if (empty($range)) {
diff --git a/src/Aggregation/Bucketing/Ipv4RangeAggregation.php b/src/Aggregation/Bucketing/Ipv4RangeAggregation.php
index d9bcd0baacce53daea432ae8ae1de33d3b729697..0579aaf88f8f7b0076ef93e9a1d115a2066d6bf2 100644
--- a/src/Aggregation/Bucketing/Ipv4RangeAggregation.php
+++ b/src/Aggregation/Bucketing/Ipv4RangeAggregation.php
@@ -65,7 +65,10 @@ class Ipv4RangeAggregation extends AbstractAggregation
             [
                 'from' => $from,
                 'to' => $to,
-            ]
+            ],
+            function ($v) {
+                return !is_null($v);
+            }
         );
 
         $this->ranges[] = $range;
diff --git a/src/Aggregation/Bucketing/RangeAggregation.php b/src/Aggregation/Bucketing/RangeAggregation.php
index ab87c9955d2a03aab693773357b0b8b3b21df41e..fb7d756bbdb28e28f05e60cff198df2ca301802e 100644
--- a/src/Aggregation/Bucketing/RangeAggregation.php
+++ b/src/Aggregation/Bucketing/RangeAggregation.php
@@ -84,7 +84,10 @@ class RangeAggregation extends AbstractAggregation
             [
                 'from' => $from,
                 'to' => $to,
-            ]
+            ],
+            function ($v) {
+                return !is_null($v);
+            }
         );
 
         if ($this->keyed && !empty($key)) {
diff --git a/src/Query/Compound/BoolQuery.php b/src/Query/Compound/BoolQuery.php
index 4b30287e2d0517572730050ca02606161403d489..7bb6a8594afec39731cfc704198eb3f2f3bbc5b7 100644
--- a/src/Query/Compound/BoolQuery.php
+++ b/src/Query/Compound/BoolQuery.php
@@ -116,6 +116,10 @@ class BoolQuery implements BuilderInterface
 
         $output = $this->processArray($output);
 
+        if (empty($output)) {
+            $output = new \stdClass();
+        }
+
         return [$this->getType() => $output];
     }
 
diff --git a/src/Search.php b/src/Search.php
index 5dedceaf673a441438bee994d9bbc59eb6712718..1a1b51b96472457ce38e7b77f29504dfd875f229 100644
--- a/src/Search.php
+++ b/src/Search.php
@@ -155,7 +155,7 @@ class Search
     /**
      * @var OrderedSerializer
      */
-    private $serializer;
+    private static $serializer;
 
     /**
      * @var SearchEndpointInterface[]
@@ -167,12 +167,14 @@ class Search
      */
     public function __construct()
     {
-        $this->serializer = new OrderedSerializer(
-            [
-                new CustomReferencedNormalizer(),
-                new CustomNormalizer(),
-            ]
-        );
+        if (static::$serializer === null) {
+            static::$serializer = new OrderedSerializer(
+                [
+                    new CustomReferencedNormalizer(),
+                    new CustomNormalizer(),
+                ]
+            );
+        }
     }
 
     /**
@@ -703,7 +705,7 @@ class Search
      */
     public function toArray()
     {
-        $output = array_filter($this->serializer->normalize($this->endpoints));
+        $output = array_filter(static::$serializer->normalize($this->endpoints));
 
         $params = [
             'from' => 'from',
diff --git a/tests/Unit/Query/Compound/BoolQueryTest.php b/tests/Unit/Query/Compound/BoolQueryTest.php
index 4eb0417dbef94c12101951e3b3a169173b4c89c1..cc91a7b66083830a07063390d3c6b82d0471965f 100644
--- a/tests/Unit/Query/Compound/BoolQueryTest.php
+++ b/tests/Unit/Query/Compound/BoolQueryTest.php
@@ -69,6 +69,16 @@ class BoolQueryTest extends \PHPUnit\Framework\TestCase
         $this->assertEquals($expected, $bool->toArray());
     }
 
+    /**
+     * Tests bool query with empty body if it forms \stdObject
+     */
+    public function testEmptyBoolQuery()
+    {
+        $bool = new BoolQuery();
+
+        $this->assertEquals(['bool' => new \stdClass()], $bool->toArray());
+    }
+
     /**
      * Tests bool query in filter context.
      */