diff --git a/extensions/debug/panels/DbPanel.php b/extensions/debug/panels/DbPanel.php
index 271373b..9e6002c 100644
--- a/extensions/debug/panels/DbPanel.php
+++ b/extensions/debug/panels/DbPanel.php
@@ -53,7 +53,7 @@ class DbPanel extends Panel
 	public function getDetail()
 	{
 		$searchModel = new Db();
-		$dataProvider = $searchModel->search(Yii::$app->request->get(), $this->getModels());
+		$dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels());
 
 		return Yii::$app->view->render('panels/db/detail', [
 			'panel' => $this,
diff --git a/extensions/debug/panels/LogPanel.php b/extensions/debug/panels/LogPanel.php
index d96704e..4f583c0 100644
--- a/extensions/debug/panels/LogPanel.php
+++ b/extensions/debug/panels/LogPanel.php
@@ -39,7 +39,7 @@ class LogPanel extends Panel
 	public function getDetail()
 	{
 		$searchModel = new Log();
-		$dataProvider = $searchModel->search(Yii::$app->request->get(), $this->getModels());
+		$dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels());
 
 		return Yii::$app->view->render('panels/log/detail', [
 			'dataProvider' => $dataProvider, 
diff --git a/extensions/debug/panels/ProfilingPanel.php b/extensions/debug/panels/ProfilingPanel.php
index 9316552..b4dc57b 100644
--- a/extensions/debug/panels/ProfilingPanel.php
+++ b/extensions/debug/panels/ProfilingPanel.php
@@ -42,7 +42,7 @@ class ProfilingPanel extends Panel
 	public function getDetail()
 	{
 		$searchModel = new Profile();
-		$dataProvider = $searchModel->search(Yii::$app->request->get(), $this->getModels());
+		$dataProvider = $searchModel->search(Yii::$app->request->getQueryParams(), $this->getModels());
 
 		return Yii::$app->view->render('panels/profile/detail', [
 			'panel' => $this,
diff --git a/framework/CHANGELOG.md b/framework/CHANGELOG.md
index 154c064..5ee87d0 100644
--- a/framework/CHANGELOG.md
+++ b/framework/CHANGELOG.md
@@ -96,6 +96,9 @@ Yii Framework 2 Change Log
 - Chg #1821: Changed default values for yii\db\Connection username and password to null (cebe)
 - Chg #1844: `Response::sendFile()` and other file sending methods will not send the response (qiangxue)
 - Chg #1852: DbConnection::tablePrefix default value now 'tbl_' (creocoder)
+- Chg #2043: Renamed `yii\web\Request::acceptedLanguages` to `acceptableLanguages` (qiangxue)
+- Chg #2043: Removed `yii\web\Request::getPut()`, `getDelete()`, `getPatch()` in favor of `getBodyParam()` (cebe)
+- Chg #2043: Renamed `yii\web\Request::get()` to `getQueryParams()` and `getRestParams()` to `getBodyParams()` (cebe)
 - Chg #2057: AutoTimestamp attributes defaults changed from `create_time` and `update_time` to `created_at` and `updated_at` (creocoder)
 - Chg #2063: Removed `yii\web\Request::acceptTypes` and renamed `yii\web\Request::acceptedContentTypes` to `acceptableContentTypes` (qiangxue)
 - Chg: Renamed `yii\jui\Widget::clientEventsMap` to `clientEventMap` (qiangxue)
@@ -108,7 +111,6 @@ Yii Framework 2 Change Log
 - Chg: Changed the directory structure according to PSR-4. You have to update your application `index.php`,
        `index-test.php` and `yii` files to point to the new location of `Yii.php` (qiangxue, cebe)
 - Chg: Advanced app template: moved database connection DSN, login and password to `-local` config not to expose it to VCS (samdark)
-- Chg: Renamed `yii\web\Request::acceptedLanguages` to `acceptableLanguages` (qiangxue)
 - New #66: [Auth client library](https://github.com/yiisoft/yii2-authclient) OpenId, OAuth1, OAuth2 clients (klimov-paul)
 - New #1393: [Codeception testing framework integration](https://github.com/yiisoft/yii2-codeception) (Ragazzo)
 - New #1438: [MongoDB integration](https://github.com/yiisoft/yii2-mongodb) ActiveRecord and Query (klimov-paul)
diff --git a/framework/data/Pagination.php b/framework/data/Pagination.php
index 1c2b534..8e77c6b 100644
--- a/framework/data/Pagination.php
+++ b/framework/data/Pagination.php
@@ -141,7 +141,7 @@ class Pagination extends Object
 		if ($this->_page === null || $recalculate) {
 			if (($params = $this->params) === null) {
 				$request = Yii::$app->getRequest();
-				$params = $request instanceof Request ? $request->get() : [];
+				$params = $request instanceof Request ? $request->getQueryParams() : [];
 			}
 			if (isset($params[$this->pageVar]) && is_scalar($params[$this->pageVar])) {
 				$this->_page = (int)$params[$this->pageVar] - 1;
@@ -183,7 +183,7 @@ class Pagination extends Object
 	{
 		if (($params = $this->params) === null) {
 			$request = Yii::$app->getRequest();
-			$params = $request instanceof Request ? $request->get() : [];
+			$params = $request instanceof Request ? $request->getQueryParams() : [];
 		}
 		if ($page > 0 || $page >= 0 && $this->forcePageVar) {
 			$params[$this->pageVar] = $page + 1;
diff --git a/framework/data/Sort.php b/framework/data/Sort.php
index ab49f49..efac90e 100644
--- a/framework/data/Sort.php
+++ b/framework/data/Sort.php
@@ -245,7 +245,7 @@ class Sort extends Object
 			$this->_attributeOrders = [];
 			if (($params = $this->params) === null) {
 				$request = Yii::$app->getRequest();
-				$params = $request instanceof Request ? $request->get() : [];
+				$params = $request instanceof Request ? $request->getQueryParams() : [];
 			}
 			if (isset($params[$this->sortVar]) && is_scalar($params[$this->sortVar])) {
 				$attributes = explode($this->separators[0], $params[$this->sortVar]);
@@ -341,7 +341,7 @@ class Sort extends Object
 	{
 		if (($params = $this->params) === null) {
 			$request = Yii::$app->getRequest();
-			$params = $request instanceof Request ? $request->get() : [];
+			$params = $request instanceof Request ? $request->getQueryParams() : [];
 		}
 		$params[$this->sortVar] = $this->createSortVar($attribute);
 		$route = $this->route === null ? Yii::$app->controller->getRoute() : $this->route;
diff --git a/framework/helpers/BaseHtml.php b/framework/helpers/BaseHtml.php
index 0fe86af..4d28404 100644
--- a/framework/helpers/BaseHtml.php
+++ b/framework/helpers/BaseHtml.php
@@ -237,7 +237,7 @@ class BaseHtml
 		if ($request instanceof Request) {
 			if (strcasecmp($method, 'get') && strcasecmp($method, 'post')) {
 				// simulate PUT, DELETE, etc. via POST
-				$hiddenInputs[] = static::hiddenInput($request->restVar, $method);
+				$hiddenInputs[] = static::hiddenInput($request->methodVar, $method);
 				$method = 'post';
 			}
 			if ($request->enableCsrfValidation && !strcasecmp($method, 'post')) {
diff --git a/framework/web/Request.php b/framework/web/Request.php
index f9563da..611e601 100644
--- a/framework/web/Request.php
+++ b/framework/web/Request.php
@@ -9,8 +9,6 @@ namespace yii\web;
 
 use Yii;
 use yii\base\InvalidConfigException;
-use yii\base\InvalidParamException;
-use yii\helpers\Json;
 use yii\helpers\Security;
 use yii\helpers\StringHelper;
 
@@ -125,11 +123,11 @@ class Request extends \yii\base\Request
 	 * @var string|boolean the name of the POST parameter that is used to indicate if a request is a PUT, PATCH or DELETE
 	 * request tunneled through POST. Default to '_method'.
 	 * @see getMethod()
-	 * @see getRestParams()
+	 * @see getBodyParams()
 	 */
-	public $restVar = '_method';
+	public $methodVar = '_method';
 	/**
-	 * @var array the parsers for converting the raw HTTP request body into [[restParams]].
+	 * @var array the parsers for converting the raw HTTP request body into [[bodyParams]].
 	 * The array keys are the request `Content-Types`, and the array values are the
 	 * corresponding configurations for [[Yii::createObject|creating the parser objects]].
 	 * A parser must implement the [[RequestParserInterface]].
@@ -145,7 +143,7 @@ class Request extends \yii\base\Request
 	 * To register a parser for parsing all request types you can use `'*'` as the array key.
 	 * This one will be used as a fallback in case no other types match.
 	 *
-	 * @see getRestParams()
+	 * @see getBodyParams()
 	 */
 	public $parsers = [];
 
@@ -176,8 +174,8 @@ class Request extends \yii\base\Request
 	 */
 	public function getMethod()
 	{
-		if (isset($_POST[$this->restVar])) {
-			return strtoupper($_POST[$this->restVar]);
+		if (isset($_POST[$this->methodVar])) {
+			return strtoupper($_POST[$this->methodVar]);
 		} else {
 			return isset($_SERVER['REQUEST_METHOD']) ? strtoupper($_SERVER['REQUEST_METHOD']) : 'GET';
 		}
@@ -265,78 +263,112 @@ class Request extends \yii\base\Request
 			(stripos($_SERVER['HTTP_USER_AGENT'], 'Shockwave') !== false || stripos($_SERVER['HTTP_USER_AGENT'], 'Flash') !== false);
 	}
 
-	private $_restParams;
+	private $_rawBody;
+
+	/**
+	 * Returns the raw HTTP request body.
+	 * @return string the request body
+	 */
+	public function getRawBody()
+	{
+		if ($this->_rawBody === null) {
+			$this->_rawBody = file_get_contents('php://input');
+		}
+		return $this->_rawBody;
+	}
+
+	private $_bodyParams;
 
 	/**
-	 * Returns the request parameters for the RESTful request.
+	 * Returns the request parameters given in the request body.
 	 *
 	 * Request parameters are determined using the parsers configured in [[parsers]] property.
 	 * If no parsers are configured for the current [[contentType]] it uses the PHP function [[mb_parse_str()]]
 	 * to parse the [[rawBody|request body]].
-	 * @return array the RESTful request parameters
+	 * @return array the request parameters given in the request body.
 	 * @throws \yii\base\InvalidConfigException if a registered parser does not implement the [[RequestParserInterface]].
 	 * @see getMethod()
+	 * @see getBodyParam()
+	 * @see setBodyParams()
 	 */
-	public function getRestParams()
+	public function getBodyParams()
 	{
-		if ($this->_restParams === null) {
+		if ($this->_bodyParams === null) {
 			$contentType = $this->getContentType();
-			if (isset($_POST[$this->restVar])) {
-				$this->_restParams = $_POST;
-				unset($this->_restParams[$this->restVar]);
+			if (isset($_POST[$this->methodVar])) {
+				$this->_bodyParams = $_POST;
+				unset($this->_bodyParams[$this->methodVar]);
 			} elseif (isset($this->parsers[$contentType])) {
 				$parser = Yii::createObject($this->parsers[$contentType]);
 				if (!($parser instanceof RequestParserInterface)) {
 					throw new InvalidConfigException("The '$contentType' request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
 				}
-				$this->_restParams = $parser->parse($this->getRawBody(), $contentType);
+				$this->_bodyParams = $parser->parse($this->getRawBody(), $contentType);
 			} elseif (isset($this->parsers['*'])) {
 				$parser = Yii::createObject($this->parsers['*']);
 				if (!($parser instanceof RequestParserInterface)) {
 					throw new InvalidConfigException("The fallback request parser is invalid. It must implement the yii\\web\\RequestParserInterface.");
 				}
-				$this->_restParams = $parser->parse($this->getRawBody(), $contentType);
+				$this->_bodyParams = $parser->parse($this->getRawBody(), $contentType);
 			} else {
-				$this->_restParams = [];
-				mb_parse_str($this->getRawBody(), $this->_restParams);
+				$this->_bodyParams = [];
+				mb_parse_str($this->getRawBody(), $this->_bodyParams);
 			}
 		}
-		return $this->_restParams;
+		return $this->_bodyParams;
 	}
 
-	private $_rawBody;
+	/**
+	 * Sets the request body parameters.
+	 * @param array $values the request body parameters (name-value pairs)
+	 * @see getBodyParam()
+	 * @see getBodyParams()
+	 */
+	public function setBodyParams($values)
+	{
+		$this->_bodyParams = $values;
+	}
 
 	/**
-	 * Returns the raw HTTP request body.
-	 * @return string the request body
+	 * Returns the named request body parameter value.
+	 * @param string $name the parameter name
+	 * @param mixed $defaultValue the default parameter value if the parameter does not exist.
+	 * @return mixed the parameter value
+	 * @see getBodyParams()
+	 * @see setBodyParams()
 	 */
-	public function getRawBody()
+	public function getBodyParam($name, $defaultValue = null)
 	{
-		if ($this->_rawBody === null) {
-			$this->_rawBody = file_get_contents('php://input');
-		}
-		return $this->_rawBody;
+		$params = $this->getBodyParams();
+		return isset($params[$name]) ? $params[$name] : $defaultValue;
 	}
 
+	private $_queryParams;
+
 	/**
-	 * Sets the RESTful parameters.
-	 * @param array $values the RESTful parameters (name-value pairs)
+	 * Returns the request parameters given in the [[queryString]].
+	 *
+	 * This method will return the contents of `$_GET` if params where not explicitly set.
+	 * @return array the request GET parameter values.
+	 * @see setQueryParams()
 	 */
-	public function setRestParams($values)
+	public function getQueryParams()
 	{
-		$this->_restParams = $values;
+		if ($this->_queryParams === null) {
+			return $_GET;
+		}
+		return $this->_queryParams;
 	}
 
 	/**
-	 * Returns the named RESTful parameter value.
-	 * @param string $name the parameter name
-	 * @param mixed $defaultValue the default parameter value if the parameter does not exist.
-	 * @return mixed the parameter value
+	 * Sets the request [[queryString]] parameters.
+	 * @param array $values the request query parameters (name-value pairs)
+	 * @see getQueryParam()
+	 * @see getQueryParams()
 	 */
-	public function getRestParam($name, $defaultValue = null)
+	public function setQueryParams($values)
 	{
-		$params = $this->getRestParams();
-		return isset($params[$name]) ? $params[$name] : $defaultValue;
+		$this->_queryParams = $values;
 	}
 
 	/**
@@ -347,12 +379,10 @@ class Request extends \yii\base\Request
 	 * @return mixed the GET parameter value
 	 * @see getPost()
 	 */
-	public function get($name = null, $defaultValue = null)
+	public function getQueryParam($name, $defaultValue = null)
 	{
-		if ($name === null) {
-			return $_GET;
-		}
-		return isset($_GET[$name]) ? $_GET[$name] : $defaultValue;
+		$params = $this->getQueryParams();
+		return isset($params[$name]) ? $params[$name] : $defaultValue;
 	}
 
 	/**
@@ -364,7 +394,7 @@ class Request extends \yii\base\Request
 	 * @return mixed the POST parameter value
 	 * @see get()
 	 */
-	public function getPost($name = null, $defaultValue = null)
+	public function getPostParam($name = null, $defaultValue = null)
 	{
 		if ($name === null) {
 			return $_POST;
@@ -372,51 +402,6 @@ class Request extends \yii\base\Request
 		return isset($_POST[$name]) ? $_POST[$name] : $defaultValue;
 	}
 
-	/**
-	 * Returns the named DELETE parameter value.
-	 * @param string $name the DELETE parameter name. If not specified, an array of DELETE parameters is returned.
-	 * @param mixed $defaultValue the default parameter value if the DELETE parameter does not exist.
-	 * @property array the DELETE request parameter values
-	 * @return mixed the DELETE parameter value
-	 */
-	public function getDelete($name = null, $defaultValue = null)
-	{
-		if ($name === null) {
-			return $this->getRestParams();
-		}
-		return $this->getIsDelete() ? $this->getRestParam($name, $defaultValue) : null;
-	}
-
-	/**
-	 * Returns the named PUT parameter value.
-	 * @param string $name the PUT parameter name. If not specified, an array of PUT parameters is returned.
-	 * @param mixed $defaultValue the default parameter value if the PUT parameter does not exist.
-	 * @property array the PUT request parameter values
-	 * @return mixed the PUT parameter value
-	 */
-	public function getPut($name = null, $defaultValue = null)
-	{
-		if ($name === null) {
-			return $this->getRestParams();
-		}
-		return $this->getIsPut() ? $this->getRestParam($name, $defaultValue) : null;
-	}
-
-	/**
-	 * Returns the named PATCH parameter value.
-	 * @param string $name the PATCH parameter name. If not specified, an array of PATCH parameters is returned.
-	 * @param mixed $defaultValue the default parameter value if the PATCH parameter does not exist.
-	 * @property array the PATCH request parameter values
-	 * @return mixed the PATCH parameter value
-	 */
-	public function getPatch($name = null, $defaultValue = null)
-	{
-		if ($name === null) {
-			return $this->getRestParams();
-		}
-		return $this->getIsPatch() ? $this->getRestParam($name, $defaultValue) : null;
-	}
-
 	private $_hostInfo;
 
 	/**
@@ -1151,24 +1136,12 @@ class Request extends \yii\base\Request
 	public function validateCsrfToken()
 	{
 		$method = $this->getMethod();
-		if (!$this->enableCsrfValidation || !in_array($method, ['POST', 'PUT', 'PATCH', 'DELETE'], true)) {
+		// only validate CSRF token on "safe" methods http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1
+		if (!$this->enableCsrfValidation || in_array($method, ['GET', 'HEAD', 'OPTIONS'], true)) {
 			return true;
 		}
 		$trueToken = $this->getCookies()->getValue($this->csrfVar);
-		switch ($method) {
-			case 'PUT':
-				$token = $this->getPut($this->csrfVar);
-				break;
-			case 'PATCH':
-				$token = $this->getPatch($this->csrfVar);
-				break;
-			case 'DELETE':
-				$token = $this->getDelete($this->csrfVar);
-				break;
-			default:
-				$token = $this->getPost($this->csrfVar);
-				break;
-		}
+		$token = $this->getBodyParam($this->csrfVar);
 		return $this->validateCsrfTokenInternal($token, $trueToken)
 			|| $this->validateCsrfTokenInternal($this->getCsrfTokenFromHeader(), $trueToken);
 	}
diff --git a/framework/web/UrlManager.php b/framework/web/UrlManager.php
index a2044cb..b87c20d 100644
--- a/framework/web/UrlManager.php
+++ b/framework/web/UrlManager.php
@@ -217,7 +217,7 @@ class UrlManager extends Component
 			return [$pathInfo, []];
 		} else {
 			Yii::trace('Pretty URL not enabled. Using default URL parsing logic.', __METHOD__);
-			$route = $request->get($this->routeVar);
+			$route = $request->getQueryParam($this->routeVar, '');
 			if (is_array($route)) {
 				$route = '';
 			}