diff --git a/activesupport/lib/active_support/core_ext/string/output_safety.rb b/activesupport/lib/active_support/core_ext/string/output_safety.rb
index <HASH>..<HASH> 100644
--- a/activesupport/lib/active_support/core_ext/string/output_safety.rb
+++ b/activesupport/lib/active_support/core_ext/string/output_safety.rb
@@ -149,9 +149,7 @@ module ActiveSupport #:nodoc:
     end
 
     def [](*args)
-      if args.size < 2
-        super
-      elsif html_safe?
+      if html_safe?
         new_safe_buffer = super
 
         if new_safe_buffer
diff --git a/activesupport/test/safe_buffer_test.rb b/activesupport/test/safe_buffer_test.rb
index <HASH>..<HASH> 100644
--- a/activesupport/test/safe_buffer_test.rb
+++ b/activesupport/test/safe_buffer_test.rb
@@ -150,6 +150,18 @@ class SafeBufferTest < ActiveSupport::TestCase
     assert_not y.html_safe?, "should not be safe"
   end
 
+  test "Should continue safe on slice" do
+    x = "<div>foo</div>".html_safe
+
+    assert x.html_safe?, "should be safe"
+
+    # getting a slice of it
+    y = x[0..-1]
+
+    # should still be safe
+    assert y.html_safe?, "should be safe"
+  end
+
   test "Should work with interpolation (array argument)" do
     x = "foo %s bar".html_safe % ["qux"]
     assert_equal "foo qux bar", x
SafeBuffer should maintain safety upon getting a slice via a range if original buffer was safe.