diff --git a/src/controller/GymFilterController.php b/src/controller/GymFilterController.php
new file mode 100644
index 0000000000000000000000000000000000000000..2e98cf08fb78d47e4dc0481c97a758797d63a5fd
--- /dev/null
+++ b/src/controller/GymFilterController.php
@@ -0,0 +1,88 @@
+<?php
+
+require __DIR__ . "/../inc/bootstrap.php";
+require_once PROJECT_ROOT_PATH . "/controller/BaseController.php";
+require_once PROJECT_ROOT_PATH . "/services/GymService.php";
+require_once PROJECT_ROOT_PATH . "/services/MultimediaService.php";
+
+
+
+class GymFilterController extends BaseController
+{
+
+    public function respond()
+    {
+
+        $strErrorDesc = '';
+        $requestMethod = strtoupper($_SERVER["REQUEST_METHOD"]);
+        $arrQueryStringParams = $this->getQueryStringParams();
+        $responseData = [];
+
+        try {
+            switch ($requestMethod) {
+                case 'PUT':
+                    $jsonData = file_get_contents("php://input");
+                    $params = json_decode($jsonData, true);
+
+                    $currentPage = $params['page'];
+                    $selectedCity = $params['cityId'];
+                    $selectedSorting = $params['sorting'];
+                    $selectedPriceRange = $params['priceRange'];
+                    $sortingOption = $params['sortingOption'];
+                    $priceRangeOption = $params['priceRangeOption'];
+                    $itemInPage = $params['gymCountInPage'];
+                    $searching = $params['searching'];
+
+                    $gyms = GymService::getInstance()->getFiltered(
+                        [
+                            'page' => $currentPage,
+                            'cityId' => $selectedCity,
+                            'sorting' => $selectedSorting,
+                            'priceRange' => $selectedPriceRange,
+                            'sortingOption' => $sortingOption,
+                            'priceRangeOption' => $priceRangeOption,
+                            'gymCountInPage' => $itemInPage,
+                            'searching' => $searching
+                        ]
+                    );
+                    // make it gyms -> a,b,c
+                    // and itemCount -> 3 in response data
+                    $gyms_response = [];
+                    foreach ($gyms['gyms'] as $gym) {
+                        array_push($gyms_response, $gym->toResponse());
+                    }
+                    $responseData['gyms'] = $gyms_response;
+                    $responseData['itemCount'] = $gyms['itemCount'];
+
+                    break;
+                default:
+                    $strErrorDesc = 'Method not supported';
+                    $strErrorHeader = 'HTTP/1.1 400 Bad Request';
+                    break;
+            }
+
+        } catch (Error $e) {
+            $strErrorDesc = $e->getMessage() . 'Something went wrong!';
+            $strErrorHeader = 'HTTP/1.1 500 Internal Server Error';
+        } catch (ServiceException $e) {
+            $strErrorDesc = (string) "Service Exception Encountered";
+            $strErrorHeader = 'HTTP/1.1 400 Bad Request';
+        } catch (Exception $e) {
+            $strErrorDesc = $e->getMessage();
+            $strErrorHeader = 'HTTP/1.1 400 Bad Request';
+        }
+
+        // send output 
+        if ($strErrorDesc) {
+            $this->sendOutput(
+                json_encode(array('error' => $strErrorDesc)),
+                array('Content-Type: application/json', $strErrorHeader)
+            );
+        }
+
+        $this->sendOutput(
+            json_encode($responseData),
+            array('Content-Type: application/json', 'HTTP/1.1 200 OK')
+        );
+    }
+}
\ No newline at end of file