diff --git a/docs/HowTo/CustomParameters.md b/docs/HowTo/CustomParameters.md
new file mode 100644
index 0000000000000000000000000000000000000000..1fed5b303d84e4bb8b6f9ab3da12d15aec94a326
--- /dev/null
+++ b/docs/HowTo/CustomParameters.md
@@ -0,0 +1,73 @@
+# How to set custom parameters to your search
+
+Elasticsearch supports number of custom parameters which can be added to your query. Detailed explanation of each parameter can be found at [official documentation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-body.html#_parameters_5)
+
+## Setting `timeout` parameter
+
+This option allows user to specify timeout for query execution in ["Time units"](https://www.elastic.co/guide/en/elasticsearch/reference/current/common-options.html#time-units).
+
+Following code
+
+```php
+$search = new Search();
+$search->setTimeout('5s');
+```
+
+would generate the query like this:
+```json
+{
+  "timeout": "5s"
+}
+```
+
+## Setting `from` and `size` parameters
+
+These parameters are usually used for pagination.
+
+Following code
+
+```php
+$search = new Search();
+$search->setSize(25);
+$search->setFrom(50);
+```
+
+would generate the query like this:
+```json
+{
+  "size": 25,
+  "from": 50
+}
+```
+
+## Setting `terminate_after` parameter
+
+This parameter can limit how many documents can be fetched from shard before query execution is terminated.
+
+Following code
+
+```php
+$search = new Search();
+$search->setTerminateAfter(1000);
+```
+
+would generate the query like this:
+```json
+{
+  "terminate_after": 1000
+}
+```
+
+## Setting `search_type` and `request_cache` parameters
+
+These parameters are different from previous ones because they have to be passed not in query's body but as query string parameters.
+
+Following code
+
+```php
+$search = new Search();
+$search->setSearchType('dfs_query_then_fetch');
+$search->setRequestCache(true);
+```
+
+would generate query string with `?search_type=dfs_query_then_fetch&request_cache=true`.
\ No newline at end of file
diff --git a/docs/index.md b/docs/index.md
index 3936368102808cd710192a3ace4bc6253633a9ee..937fd46bf7b13860c32f34c4c147a4db4010a032 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -11,6 +11,7 @@ Everything starts from the `Search` object. We recommend first to take a look at
 
 ### How to
 - [How to Search](HowTo/HowToSearch.md)
+- [How to set custom parameters to Search](HowTo/CustomParameters.md)
 - more coming soon..
 
 [1]: https://github.com/elastic/elasticsearch-php
diff --git a/src/Search.php b/src/Search.php
index eab145f6dda92c0fc697756962f4d34ec9572bc8..b8d83d6ff86cbf8e93a03e76a4a9f4eb48e7a0c5 100644
--- a/src/Search.php
+++ b/src/Search.php
@@ -43,6 +43,16 @@ class Search
      */
     private $from;
 
+    /**
+     * @var string
+     */
+    private $timeout;
+
+    /**
+     * @var int
+     */
+    private $terminateAfter;
+
     /**
      * @var string|null
      */
@@ -68,6 +78,11 @@ class Search
      */
     private $searchType;
 
+    /**
+     * @var string
+     */
+    private $requestCache;
+
     /**
      * @var bool
      */
@@ -400,6 +415,34 @@ class Search
         return $this;
     }
 
+    /**
+     * Sets timeout for query execution.
+     *
+     * @param $timeout
+     *
+     * @return $this
+     */
+    public function setTimeout($timeout)
+    {
+        $this->timeout = $timeout;
+
+        return $this;
+    }
+
+    /**
+     * Sets maximum number of documents per shard.
+     *
+     * @param $terminateAfter
+     *
+     * @return $this
+     */
+    public function setTerminateAfter($terminateAfter)
+    {
+        $this->terminateAfter = $terminateAfter;
+
+        return $this;
+    }
+
     /**
      * Returns results offset value.
      *
@@ -602,6 +645,31 @@ class Search
         return $this->searchType;
     }
 
+
+    /**
+     * Set request cache.
+     *
+     * @param string $requestCache
+     *
+     * @return $this
+     */
+    public function setRequestCache($requestCache)
+    {
+        $this->requestCache = $requestCache;
+
+        return $this;
+    }
+
+    /**
+     * Returns request cache.
+     *
+     * @return string
+     */
+    public function getRequestCache()
+    {
+        return $this->requestCache;
+    }
+
     /**
      * Setter for preference.
      *
@@ -653,6 +721,7 @@ class Search
             [
                 'scroll' => $this->getScroll(),
                 'search_type' => $this->getSearchType(),
+                'request_cache' => $this->getRequestCache(),
                 'preference' => $this->getPreference(),
             ]
         );
@@ -674,6 +743,8 @@ class Search
             'stats' => 'stats',
             'minScore' => 'min_score',
             'source' => '_source',
+            'timeout' => 'timeout',
+            'terminateAfter' => 'terminate_after',
         ];
 
         foreach ($params as $field => $param) {
diff --git a/tests/SearchTest.php b/tests/SearchTest.php
index e5a84d2e38d323d24360eb790be89cade8e99ba9..1b72a3964bff4ca4cdddb1493e9b558b7960e6c3 100644
--- a/tests/SearchTest.php
+++ b/tests/SearchTest.php
@@ -25,4 +25,162 @@ class SearchTest extends \PHPUnit_Framework_TestCase
     {
         $this->assertInstanceOf('ONGR\ElasticsearchDSL\Search', new Search());
     }
+
+    /**
+     * Data provider for test testSettingParams()
+     *
+     * @return array
+     */
+    public function getTestSettingParamsData()
+    {
+        $cases = [];
+
+        $search = new Search();
+        $search->setSize(3);
+        $cases['Only size is set'] = [
+            $search,
+            [
+                'size' => 3,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setFrom(4);
+        $cases['Only from is set'] = [
+            $search,
+            [
+                'from' => 4,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setTimeout('2s');
+        $cases['Only timeout is set'] = [
+            $search,
+            [
+                'timeout' => '2s',
+            ],
+        ];
+
+        $search = new Search();
+        $search->setTerminateAfter(100);
+        $cases['Only terminate_after is set'] = [
+            $search,
+            [
+                'terminate_after' => 100,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setSize(3);
+        $search->setFrom(4);
+        $search->setTimeout('2s');
+        $search->setTerminateAfter(100);
+        $cases['Multiple parameters are set'] = [
+            $search,
+            [
+                'size' => 3,
+                'from' => 4,
+                'timeout' => '2s',
+                'terminate_after' => 100,
+            ],
+        ];
+
+        return $cases;
+    }
+
+    /**
+     * This test checks if parameters are correctly set into Search object.
+     *
+     * @dataProvider getTestSettingParamsData()
+     *
+     * @param Search    $search
+     * @param array     $expected
+     */
+    public function testSettingParams($search, $expected)
+    {
+        $this->assertEquals(
+            $expected,
+            $search->toArray()
+        );
+    }
+
+    /**
+     * Data provider for test testSettingQueryParams()
+     *
+     * @return array
+     */
+    public function getTestSettingQueryParamsData()
+    {
+        $cases = [];
+
+        $search = new Search();
+        $search->setSearchType('dfs_query_then_fetch');
+        $cases['Only search_type is set'] = [
+            $search,
+            [
+                'search_type' => 'dfs_query_then_fetch',
+            ],
+        ];
+
+        $search = new Search();
+        $search->setRequestCache(true);
+        $cases['Only request_cache is set'] = [
+            $search,
+            [
+                'request_cache' => true,
+            ],
+        ];
+
+        $search = new Search();
+        $search->setScroll('1m');
+        $cases['Only scroll is set'] = [
+            $search,
+            [
+                'scroll' => '1m',
+            ],
+        ];
+
+        $search = new Search();
+        $search->setPreference('_local');
+        $cases['Only preference is set'] = [
+            $search,
+            [
+                'preference' => '_local',
+            ],
+        ];
+
+        $search = new Search();
+        $search->setSearchType('dfs_query_then_fetch');
+        $search->setRequestCache(true);
+        $search->setScroll('1m');
+        $search->setPreference('_local');
+        $cases['Multiple parameters are set'] = [
+            $search,
+            [
+                'search_type' => 'dfs_query_then_fetch',
+                'request_cache' => true,
+                'scroll' => '1m',
+                'preference' => '_local',
+            ],
+        ];
+
+        return $cases;
+    }
+
+    /**
+     * Test if query params are constructed correctly.
+     *
+     * @dataProvider getTestSettingQueryParamsData()
+     *
+     * @param Search    $search
+     * @param array     $expected
+     */
+    public function testSettingQueryParams($search, $expected)
+    {
+        $this->assertEquals(
+            $expected,
+            $search->getQueryParams()
+        );
+    }
 }