diff --git a/lib/gitlab/ci/config/node/stage.rb b/lib/gitlab/ci/config/node/stage.rb
index 53ceafaa3f46aa3a650052ccc24875b78d1d93ad..c7e12f291d7dd44789ac8bc8c8f691602c9a71e7 100644
--- a/lib/gitlab/ci/config/node/stage.rb
+++ b/lib/gitlab/ci/config/node/stage.rb
@@ -10,6 +10,13 @@ module Gitlab
 
           validations do
             validates :config, key: true
+
+            validate do |entry|
+              unless entry.global
+                raise Entry::InvalidError,
+                  'This entry needs reference to global configuration'
+              end
+            end
           end
 
           def self.default
diff --git a/spec/lib/gitlab/ci/config/node/stage_spec.rb b/spec/lib/gitlab/ci/config/node/stage_spec.rb
index 653d613ba6ed8183f988871718b60c628a96c204..92150ea5337ba9305682c92d67951b16907130ec 100644
--- a/spec/lib/gitlab/ci/config/node/stage_spec.rb
+++ b/spec/lib/gitlab/ci/config/node/stage_spec.rb
@@ -1,11 +1,12 @@
 require 'spec_helper'
 
 describe Gitlab::Ci::Config::Node::Stage do
-  let(:entry) { described_class.new(config) }
+  let(:entry) { described_class.new(config, global: global) }
+  let(:global) { spy('Global') }
 
   describe 'validations' do
     context 'when entry config value is correct' do
-      let(:config) { :stage1 }
+      let(:config) { :build }
 
       describe '#value' do
         it 'returns a stage key' do
@@ -18,20 +19,32 @@ describe Gitlab::Ci::Config::Node::Stage do
           expect(entry).to be_valid
         end
       end
+    end
+
+    context 'when entry config is incorrect' do
+      describe '#errors' do
+        context 'when reference to global node is not set' do
+          let(:entry) { described_class.new(config) }
+
+          it 'raises error' do
+            expect { entry }
+              .to raise_error Gitlab::Ci::Config::Node::Entry::InvalidError
+          end
+        end
 
-      context 'when entry config is incorrect' do
-        let(:config) { { test: true } }
+        context 'when value has a wrong type' do
+          let(:config) { { test: true } }
 
-        describe '#errors' do
-          it 'reports errors' do
+          it 'reports errors about wrong type' do
             expect(entry.errors)
               .to include 'stage config should be a string or symbol'
           end
         end
 
-        describe '#valid?' do
-          it 'is not valid' do
-            expect(entry).not_to be_valid
+        context 'when stage is not present in global configuration' do
+          pending 'reports error about missing stage' do
+            expect(entry.errors)
+              .to include 'stage config should be one of test, stage'
           end
         end
       end