diff --git a/app/models/connection.rb b/app/models/connection.rb
index 018337ab9..067f33a92 100644
--- a/app/models/connection.rb
+++ b/app/models/connection.rb
@@ -3,4 +3,26 @@
 class Connection < ApplicationRecord
   belongs_to :to, class_name: 'MyModule', foreign_key: 'input_id', inverse_of: :inputs
   belongs_to :from, class_name: 'MyModule', foreign_key: 'output_id', inverse_of: :outputs
+
+  validate :ensure_non_cyclical
+
+  private
+
+  def ensure_non_cyclical
+    connections = Connection.where(
+      input_id: to.experiment.my_modules.select(:id)
+    ).pluck(:input_id, :output_id).to_h
+
+    visited_nodes = [output_id]
+
+    current_input_id = output_id
+
+    while (current_input_id = connections[current_input_id])
+      if current_input_id == input_id || visited_nodes.include?(current_input_id)
+        errors.add(:output_id, :creates_cycle) and return
+      end
+
+      visited_nodes.push(current_input_id)
+    end
+  end
 end
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 3dc6ef7e7..31657becc 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -163,6 +163,10 @@ en:
               disabled: 'Webhooks are disabled'
             url:
               not_valid: 'Not valid URL'
+        connection:
+          attributes:
+            output_id:
+              creates_cycle: "mustn't create cycle"
 
   helpers:
     label: