diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb
index ea22b2dcc15a5e7aff6c5822141af82e8f1e6d6e..bc66823dfc45684557a91256a6f61d4e698347e5 100644
--- a/app/controllers/projects/environments_controller.rb
+++ b/app/controllers/projects/environments_controller.rb
@@ -47,10 +47,14 @@ class Projects::EnvironmentsController < Projects::ApplicationController
   end
 
   def stop
-    return render_404 unless @environment.stoppable?
+    return render_404 unless @environment.available?
 
-    new_action = @environment.stop!(current_user)
-    redirect_to polymorphic_path([project.namespace.becomes(Namespace), project, new_action])
+    stop_action = @environment.run_stop!(current_user)
+    if stop_action
+      redirect_to polymorphic_path([project.namespace.becomes(Namespace), project, stop_action])
+    else
+      redirect_to namespace_project_environment_path(project.namespace, project, @environment)
+    end
   end
 
   private
diff --git a/app/controllers/projects/merge_requests_controller.rb b/app/controllers/projects/merge_requests_controller.rb
index 9f104d903cc8e6b1972d1d4d92840107ca9e53a1..ccba37c9c5c406caf9f1d05ecf95874957b0d4ae 100644
--- a/app/controllers/projects/merge_requests_controller.rb
+++ b/app/controllers/projects/merge_requests_controller.rb
@@ -436,7 +436,7 @@ class Projects::MergeRequestsController < Projects::ApplicationController
           deployment = environment.first_deployment_for(@merge_request.diff_head_commit)
 
           stop_url =
-            if environment.stoppable? && can?(current_user, :create_deployment, environment)
+            if environment.can_run_stop_action? && can?(current_user, :create_deployment, environment)
               stop_namespace_project_environment_path(project.namespace, project, environment)
             end
 
diff --git a/app/models/environment.rb b/app/models/environment.rb
index 73f415c0ef07953c891cfe05abe303bca0aa7cdf..5c662bbab87e80b04f25382ccf19953549bad140 100644
--- a/app/models/environment.rb
+++ b/app/models/environment.rb
@@ -85,13 +85,18 @@ class Environment < ActiveRecord::Base
     external_url.gsub(/\A.*?:\/\//, '')
   end
 
-  def stoppable?
+  def can_run_stop_action?
     available? && stop_action.present?
   end
 
-  def stop!(current_user)
-    return unless stoppable?
+  def run_stop!(current_user)
+    return unless available?
 
-    stop_action.play(current_user)
+    if stop_action.present?
+      stop_action.play(current_user)
+    else
+      stop
+      nil
+    end
   end
 end
diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb
index ee4392cc46d462de2da0cd8c7d64f553e8b8b4b6..bfccfd8bb7c1616852d10bc772263dbaf7248ff9 100644
--- a/app/serializers/environment_entity.rb
+++ b/app/serializers/environment_entity.rb
@@ -7,7 +7,7 @@ class EnvironmentEntity < Grape::Entity
   expose :external_url
   expose :environment_type
   expose :last_deployment, using: DeploymentEntity
-  expose :stoppable?
+  expose :can_run_stop_action?
 
   expose :environment_url do |environment|
     namespace_project_environment_url(
diff --git a/app/views/projects/environments/_stop.html.haml b/app/views/projects/environments/_stop.html.haml
index 69848123c170e950bdb5bb7e48f45b70df913688..b78ad7ee2c7343c6f236fb0eaec4cea4b1851437 100644
--- a/app/views/projects/environments/_stop.html.haml
+++ b/app/views/projects/environments/_stop.html.haml
@@ -1,4 +1,4 @@
-- if can?(current_user, :create_deployment, environment) && environment.stoppable?
+- if can?(current_user, :create_deployment, environment) && environment.can_run_stop_action?
   .inline
     = link_to stop_namespace_project_environment_path(@project.namespace, @project, environment), method: :post,
       class: 'btn stop-env-link', rel: 'nofollow', data: { confirm: 'Are you sure you want to stop this environment?' } do
diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml
index da8200a553105cd407e239613a6aa09d663477e7..992d98cdd9662a6c7186a17de0532b25740a16e8 100644
--- a/app/views/projects/environments/show.html.haml
+++ b/app/views/projects/environments/show.html.haml
@@ -11,7 +11,7 @@
         = render 'projects/environments/external_url', environment: @environment
         - if can?(current_user, :update_environment, @environment)
           = link_to 'Edit', edit_namespace_project_environment_path(@project.namespace, @project, @environment), class: 'btn'
-        - if can?(current_user, :create_deployment, @environment)
+        - if can?(current_user, :create_deployment, @environment) && @environment.available?
           = link_to 'Stop', stop_namespace_project_environment_path(@project.namespace, @project, @environment), data: { confirm: 'Are you sure you want to stop this environment?' }, class: 'btn btn-danger', method: :post
 
   .deployments-container
diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb
index b565586ee1454c4ea9c1c980f5e1a636ef00850c..7c9584f6bf18a359aefbc7ecb663788c1a8a586a 100644
--- a/spec/features/environments_spec.rb
+++ b/spec/features/environments_spec.rb
@@ -149,6 +149,24 @@ feature 'Environments', feature: true do
       scenario 'does show no deployments' do
         expect(page).to have_content('You don\'t have any deployments right now.')
       end
+
+      context 'for available environment' do
+        given(:environment) { create(:environment, project: project, state: :available) }
+
+        scenario 'does allow to stop environment' do
+          click_link('Stop')
+
+          expect(page).to have_content(environment.name.titleize)
+        end
+      end
+
+      context 'for stopped environment' do
+        given(:environment) { create(:environment, project: project, state: :stopped) }
+
+        scenario 'does not shows stop button' do
+          expect(page).not_to have_link('Stop')
+        end
+      end
     end
 
     context 'with deployments' do
@@ -175,10 +193,6 @@ feature 'Environments', feature: true do
           expect(page).to have_link('Re-deploy')
         end
 
-        scenario 'does not show stop button' do
-          expect(page).not_to have_link('Stop')
-        end
-
         context 'with manual action' do
           given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production') }
 
diff --git a/spec/models/environment_spec.rb b/spec/models/environment_spec.rb
index a94e6d0165fb4557826df0b6423e0240172982c2..b860ba2a26c7e79487aa2d67d204f2ae50055215 100644
--- a/spec/models/environment_spec.rb
+++ b/spec/models/environment_spec.rb
@@ -99,8 +99,8 @@ describe Environment, models: true do
     end
   end
 
-  describe '#stoppable?' do
-    subject { environment.stoppable? }
+  describe '#can_run_stop_action?' do
+    subject { environment.can_run_stop_action? }
 
     context 'when no other actions' do
       it { is_expected.to be_falsey }
@@ -129,17 +129,39 @@ describe Environment, models: true do
     end
   end
 
-  describe '#stop!' do
+  describe '#run_stop!' do
     let(:user) { create(:user) }
 
-    subject { environment.stop!(user) }
+    subject { environment.run_stop!(user) }
 
     before do
-      expect(environment).to receive(:stoppable?).and_call_original
+      expect(environment).to receive(:available?).and_call_original
     end
 
     context 'when no other actions' do
-      it { is_expected.to be_nil }
+      context 'environment is available' do
+        before do
+          environment.update(state: :available)
+        end
+
+        it do
+          subject
+
+          expect(environment).to be_stopped
+        end
+      end
+
+      context 'environment is already stopped' do
+        before do
+          environment.update(state: :stopped)
+        end
+
+        it do
+          subject
+
+          expect(environment).to be_stopped
+        end
+      end
     end
 
     context 'when matching action is defined' do