diff --git a/core/fiber/fixtures/scheduler.rb b/core/fiber/fixtures/scheduler.rb
new file mode 100644
index 0000000000..59d2fefe54
--- /dev/null
+++ b/core/fiber/fixtures/scheduler.rb
@@ -0,0 +1,30 @@
+module FiberSpecs
+
+  class LoggingScheduler
+    attr_reader :events
+    def initialize
+      @events = []
+    end
+
+    def block(*args)
+      @events << { event: :block, fiber: Fiber.current, args: args }
+      Fiber.yield
+    end
+
+    def io_wait(*args)
+      @events << { event: :io_wait, fiber: Fiber.current, args: args }
+      Fiber.yield
+    end
+
+    def kernel_sleep(*args)
+      @events << { event: :kernel_sleep, fiber: Fiber.current, args: args }
+      Fiber.yield
+    end
+
+    def unblock(*args)
+      @events << { event: :unblock, fiber: Fiber.current, args: args }
+      Fiber.yield
+    end
+  end
+
+end
diff --git a/core/kernel/sleep_spec.rb b/core/kernel/sleep_spec.rb
index 0570629723..7addfafc9d 100644
--- a/core/kernel/sleep_spec.rb
+++ b/core/kernel/sleep_spec.rb
@@ -1,4 +1,6 @@
 require_relative '../../spec_helper'
+require_relative '../fiber/fixtures/scheduler'
+require 'fiber'
 
 describe "Kernel#sleep" do
   it "is a private method" do
@@ -73,6 +75,40 @@ def o.divmod(*); [0, 0.001]; end
       t.value.should == 5
     end
   end
+
+  context "Kernel.sleep with Fiber scheduler" do
+    before :each do
+      Fiber.set_scheduler(FiberSpecs::LoggingScheduler.new)
+    end
+
+    after :each do
+      Fiber.set_scheduler(nil)
+    end
+
+    it "calls the scheduler without arguments when no duration is given" do
+      sleeper = Fiber.new(blocking: false) do
+        sleep
+      end
+      sleeper.resume
+      Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [] }]
+    end
+
+    it "calls the scheduler with the given duration" do
+      sleeper = Fiber.new(blocking: false) do
+        sleep(0.01)
+      end
+      sleeper.resume
+      Fiber.scheduler.events.should == [{ event: :kernel_sleep, fiber: sleeper, args: [0.01] }]
+    end
+
+    it "does not call the scheduler if the fiber is blocking" do
+      sleeper = Fiber.new(blocking: true) do
+        sleep(0.01)
+      end
+      sleeper.resume
+      Fiber.scheduler.events.should == []
+    end
+  end
 end
 
 describe "Kernel.sleep" do