diff --git a/CHANGELOG b/CHANGELOG
index ea390eef2007421ada776f8c9958bd98682da919..9fafbbba673c97f83ae996fea2d9ad67fe92f2b8 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -19,7 +19,7 @@ v 7.7.0
   -
   - Add alert message in case of outdated browser (IE < 10)
   -
-  -
+  - Added API support for sorting projects
 
 v 7.6.0
   - Fork repository to groups
diff --git a/doc/api/projects.md b/doc/api/projects.md
index 0055e2e476f9334713bb12ede2662ceeab782232..22d3c828a4bce821fae2818a3f3892933df610ce 100644
--- a/doc/api/projects.md
+++ b/doc/api/projects.md
@@ -11,6 +11,8 @@ GET /projects
 Parameters:
 
 - `archived` (optional) - if passed, limit by archived status
+- `order_by` (optional) - Return requests ordered by `id`, `name`, `created_at` or `last_activity_at` fields
+- `sort` (optional) - Return requests sorted in `asc` or `desc` order
 
 ```json
 [
@@ -628,6 +630,8 @@ GET /projects/search/:query
 
 Parameters:
 
--   query (required) - A string contained in the project name
--   per_page (optional) - number of projects to return per page
--   page (optional) - the page to retrieve
+- `query` (required) - A string contained in the project name
+- `per_page` (optional) - number of projects to return per page
+- `page` (optional) - the page to retrieve
+- `order_by` (optional) - Return requests ordered by `id`, `name`, `created_at` or `last_activity_at` fields
+- `sort` (optional) - Return requests sorted in `asc` or `desc` order
diff --git a/lib/api/projects.rb b/lib/api/projects.rb
index 7fcf97d1ad6531c9465bcb18670a64c403151046..d6dd03656a67958c2c43326f88836076898034a6 100644
--- a/lib/api/projects.rb
+++ b/lib/api/projects.rb
@@ -22,6 +22,15 @@ module API
       #   GET /projects
       get do
         @projects = current_user.authorized_projects
+        sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+
+        @projects = case params["order_by"]
+                    when 'id' then @projects.reorder("id #{sort}")
+                    when 'name' then @projects.reorder("name #{sort}")
+                    when 'created_at' then @projects.reorder("created_at #{sort}")
+                    when 'last_activity_at' then @projects.reorder("last_activity_at #{sort}")
+                    else @projects
+                    end
 
         # If the archived parameter is passed, limit results accordingly
         if params[:archived].present?
@@ -37,7 +46,17 @@ module API
       # Example Request:
       #   GET /projects/owned
       get '/owned' do
-        @projects = paginate current_user.owned_projects
+        sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+        @projects = current_user.owned_projects
+        @projects = case params["order_by"]
+                    when 'id' then @projects.reorder("id #{sort}")
+                    when 'name' then @projects.reorder("name #{sort}")
+                    when 'created_at' then @projects.reorder("created_at #{sort}")
+                    when 'last_activity_at' then @projects.reorder("last_activity_at #{sort}")
+                    else @projects
+                    end
+
+        @projects = paginate @projects
         present @projects, with: Entities::Project
       end
 
@@ -47,7 +66,17 @@ module API
       #   GET /projects/all
       get '/all' do
         authenticated_as_admin!
-        @projects = paginate Project
+        sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+
+        @projects = case params["order_by"]
+                    when 'id' then Project.order("id #{sort}")
+                    when 'name' then Project.order("name #{sort}")
+                    when 'created_at' then Project.order("created_at #{sort}")
+                    when 'last_activity_at' then Project.order("last_activity_at #{sort}")
+                    else Project
+                    end
+
+        @projects = paginate @projects
         present @projects, with: Entities::Project
       end
 
@@ -227,6 +256,16 @@ module API
         ids = current_user.authorized_projects.map(&:id)
         visibility_levels = [ Gitlab::VisibilityLevel::INTERNAL, Gitlab::VisibilityLevel::PUBLIC ]
         projects = Project.where("(id in (?) OR visibility_level in (?)) AND (name LIKE (?))", ids, visibility_levels, "%#{params[:query]}%")
+        sort = params[:sort] == 'desc' ? 'desc' : 'asc'
+
+        projects = case params["order_by"]
+                   when 'id' then projects.order("id #{sort}")
+                   when 'name' then projects.order("name #{sort}")
+                   when 'created_at' then projects.order("created_at #{sort}")
+                   when 'last_activity_at' then projects.order("last_activity_at #{sort}")
+                   else projects
+                   end
+
         present paginate(projects), with: Entities::Project
       end