diff --git a/app/services/ci/stop_environment_service.rb b/app/services/ci/stop_environment_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..5c208b738f7f0063c579a9e3fcf8accdc0768902
--- /dev/null
+++ b/app/services/ci/stop_environment_service.rb
@@ -0,0 +1,31 @@
+module Ci
+  class StopEnvironmentService < BaseService
+    def execute(ref)
+      @ref = ref
+      @commit = project.commit(ref)
+
+      return unless has_ref_sha_pair?
+      return unless has_environments?
+
+      environments.each do |environment|
+        next unless environment.stoppable?
+
+        environment.stop!(current_user)
+      end
+    end
+
+    private
+
+    def has_ref_sha_pair?
+      @ref && @commit
+    end
+
+    def has_environments?
+      environments.any?
+    end
+
+    def environments
+      @environments ||= project.environments_for(@ref, @commit)
+    end
+  end
+end
diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb
index 3e5dd4ebb86b90da2322d91b1c27d38095a1a6d2..ec8ee7452d651b34e0929d4a28274f3b4d496e50 100644
--- a/app/services/delete_branch_service.rb
+++ b/app/services/delete_branch_service.rb
@@ -21,6 +21,8 @@ class DeleteBranchService < BaseService
       return error('You dont have push access to repo', 405)
     end
 
+    # StopEnvironmentService
+
     if repository.rm_branch(current_user, branch_name)
       success('Branch was removed')
     else
diff --git a/spec/services/ci/stop_environment_service_spec.rb b/spec/services/ci/stop_environment_service_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..40b2a028f67af282dee1fc24fa58b3ab6a68a061
--- /dev/null
+++ b/spec/services/ci/stop_environment_service_spec.rb
@@ -0,0 +1,35 @@
+require 'spec_helper'
+
+describe Ci::StopEnvironmentService, services: true do
+  let(:project) { create(:project) }
+  let(:user) { create(:user) }
+
+  let(:service) { described_class.new(project, user) }
+
+  describe '#execute' do
+    context 'when environment exists' do
+      let(:environment) { create(:environment, project: project) }
+      let(:deployable) { create(:ci_build) }
+
+      let(:stop_build) do
+        create(:ci_build, :manual, name: 'environment/teardown',
+                                   pipeline: deployable.pipeline)
+      end
+
+      before do
+        create(:deployment, environment: environment,
+                            deployable: deployable,
+                            on_stop: stop_build.name,
+                            user: user,
+                            project: project,
+                            sha: project.commit.id)
+      end
+
+      it 'stops environment' do
+        expect_any_instance_of(Environment).to receive(:stop!)
+
+        service.execute('master')
+      end
+    end
+  end
+end