diff --git a/examples/compute_tests.rb b/examples/compute_tests.rb
index 0333b48f7..85b3d0b92 100755
--- a/examples/compute_tests.rb
+++ b/examples/compute_tests.rb
@@ -39,12 +39,18 @@ Shindo.tests('compute examples', 'compute') do
         @server.ssh('pwd')
       end
 
-      # scp to a server
+      # scp a file to a server
       lorem_path = File.join([File.dirname(__FILE__), '..', 'tests', 'lorem.txt'])
       tests("@server.scp('#{lorem_path}', 'lorem.txt')").succeeds do
         @server.scp(lorem_path, 'lorem.txt')
       end
 
+      # scp a directory to a server
+      lorem_dir = File.join([File.dirname(__FILE__), '..', 'tests'])
+      tests("@server.scp('#{lorem_dir}', '/tmp/lorem', :recursive => true)").succeeds do
+        @server.scp(lorem_dir, '/tmp/lorem', :recursive => true)
+      end
+
       # destroy the server
       tests('@server.destroy').succeeds do
         @server.destroy
diff --git a/lib/fog/compute/models/aws/server.rb b/lib/fog/compute/models/aws/server.rb
index 485ee64ed..0a474fcc7 100644
--- a/lib/fog/compute/models/aws/server.rb
+++ b/lib/fog/compute/models/aws/server.rb
@@ -200,12 +200,12 @@ module Fog
           Fog::SSH.new(public_ip_address, username, options).run(commands)
         end
 
-        def scp(local_path, remote_path)
+        def scp(local_path, remote_path, scp_options = nil)
           requires :public_ip_address, :username
 
           options = {}
           options[:key_data] = [private_key] if private_key
-          Fog::SCP.new(public_ip_address, username, options).upload(local_path, remote_path)
+          Fog::SCP.new(public_ip_address, username, options).upload(local_path, remote_path, scp_options)
         end
 
         def start
diff --git a/lib/fog/compute/models/bluebox/server.rb b/lib/fog/compute/models/bluebox/server.rb
index 24fca51f2..8d9a117ef 100644
--- a/lib/fog/compute/models/bluebox/server.rb
+++ b/lib/fog/compute/models/bluebox/server.rb
@@ -128,12 +128,12 @@ module Fog
           Fog::SSH.new(ips.first['address'], username, options).run(commands)
         end
 
-        def scp(local_path, remote_path)
+        def scp(local_path, remote_path, scp_options = nil)
           requires :ips, :username
 
           options = {}
           options[:key_data] = [private_key] if private_key
-          Fog::SCP.new(ips.first['address'], username, options).upload(local_path, remote_path)
+          Fog::SCP.new(ips.first['address'], username, options).upload(local_path, remote_path, scp_options)
         end
 
         def username
diff --git a/lib/fog/compute/models/go_grid/server.rb b/lib/fog/compute/models/go_grid/server.rb
index 57fb5fef7..8acc693ee 100644
--- a/lib/fog/compute/models/go_grid/server.rb
+++ b/lib/fog/compute/models/go_grid/server.rb
@@ -78,12 +78,12 @@ module Fog
           Fog::SSH.new(ip['ip'], username, options).run(commands)
         end
 
-        def scp(local_path, remote_path)
+        def scp(local_path, remote_path, scp_options = nil)
           requires :ip, :username
 
           options = {}
           options[:key_data] = [private_key] if private_key
-          Fog::SCP.new(ip['ip'], username, options).upload(local_path, remote_path)
+          Fog::SCP.new(ip['ip'], username, options).upload(local_path, remote_path, scp_options)
         end
 
         def setup(credentials = {})
diff --git a/lib/fog/compute/models/rackspace/server.rb b/lib/fog/compute/models/rackspace/server.rb
index 121e4e4b1..29d72b6f5 100644
--- a/lib/fog/compute/models/rackspace/server.rb
+++ b/lib/fog/compute/models/rackspace/server.rb
@@ -120,12 +120,12 @@ module Fog
           Fog::SSH.new(public_ip_address, username, options).run(commands)
         end
 
-        def scp(local_path, remote_path)
+        def scp(local_path, remote_path, scp_options = nil)
           requires :public_ip_address, :username
 
           options = {}
           options[:key_data] = [private_key] if private_key
-          Fog::SCP.new(public_ip_address, username, options).upload(local_path, remote_path)
+          Fog::SCP.new(public_ip_address, username, options).upload(local_path, remote_path, scp_options)
         end
 
         def username
diff --git a/lib/fog/compute/models/slicehost/server.rb b/lib/fog/compute/models/slicehost/server.rb
index 3430bdf29..d9984cd2e 100644
--- a/lib/fog/compute/models/slicehost/server.rb
+++ b/lib/fog/compute/models/slicehost/server.rb
@@ -110,12 +110,12 @@ module Fog
           Fog::SSH.new(addresses.first, username, options).run(commands)
         end
 
-        def scp(local_path, remote_path)
+        def scp(local_path, remote_path, scp_options = nil)
           requires :addresses, :username
 
           options = {}
           options[:key_data] = [private_key] if private_key
-          Fog::SCP.new(addresses.first, username, options).upload(local_path, remote_path)
+          Fog::SCP.new(addresses.first, username, options).upload(local_path, remote_path, scp_options)
         end
 
         def username
diff --git a/lib/fog/compute/models/virtual_box/server.rb b/lib/fog/compute/models/virtual_box/server.rb
index 65ca9d5be..2d0331bae 100644
--- a/lib/fog/compute/models/virtual_box/server.rb
+++ b/lib/fog/compute/models/virtual_box/server.rb
@@ -151,13 +151,13 @@ module Fog
           end
         end
 
-        def scp(local_path, remote_path)
+        def scp(local_path, remote_path, scp_options = nil)
           raise 'Not Implemented'
           # requires :addresses, :username
-          # 
+          #
           # options = {}
           # options[:key_data] = [private_key] if private_key
-          # Fog::SCP.new(addresses['public'].first, username, options).upload(local_path, remote_path)
+          # Fog::SCP.new(addresses['public'].first, username, options).upload(local_path, remote_path, scp_options)
         end
 
         def setup(credentials = {})
@@ -178,7 +178,7 @@ module Fog
         def ssh(commands)
           raise 'Not Implemented'
           # requires :addresses, :identity, :username
-          # 
+          #
           # options = {}
           # options[:key_data] = [private_key] if private_key
           # Fog::SSH.new(addresses['public'].first, username, options).run(commands)
diff --git a/lib/fog/core/scp.rb b/lib/fog/core/scp.rb
index 37ceba5e0..ae96c9e6c 100644
--- a/lib/fog/core/scp.rb
+++ b/lib/fog/core/scp.rb
@@ -23,7 +23,7 @@ module Fog
         @options  = options
       end
 
-      def upload(local_path, remote_path)
+      def upload(local_path, remote_path, scp_options)
         Fog::Mock.not_implemented
       end
 
@@ -45,10 +45,10 @@ module Fog
         @options  = { :paranoid => false }.merge(options)
       end
 
-      def upload(local_path, remote_path)
+      def upload(local_path, remote_path, scp_options = nil)
         begin
           Net::SCP.start(@address, @username, @options) do |scp|
-            scp.upload!(local_path, remote_path) do |ch, name, sent, total|
+            scp.upload!(local_path, remote_path, scp_options) do |ch, name, sent, total|
               # TODO: handle progress display?
             end
           end