diff --git a/lib/sshkit/backends/abstract.rb b/lib/sshkit/backends/abstract.rb
index <HASH>..<HASH> 100644
--- a/lib/sshkit/backends/abstract.rb
+++ b/lib/sshkit/backends/abstract.rb
@@ -127,6 +127,12 @@ module SSHKit
         end
       end
 
+      # Backends which extend the Abstract backend should implement the following methods:
+      def upload!(local, remote, options = {}) raise MethodUnavailableError end
+      def download!(remote, local=nil, options = {}) raise MethodUnavailableError end
+      def execute_command(cmd) raise MethodUnavailableError end
+      private :execute_command # Can inline after Ruby 2.1
+
       private
 
       def output
diff --git a/test/unit/backends/test_abstract.rb b/test/unit/backends/test_abstract.rb
index <HASH>..<HASH> 100644
--- a/test/unit/backends/test_abstract.rb
+++ b/test/unit/backends/test_abstract.rb
@@ -64,6 +64,16 @@ module SSHKit
         assert_equal 'Some stdout', output
       end
 
+      def test_calling_abstract_with_undefined_execute_command_raises_exception
+        abstract =  Abstract.new(ExampleBackend.example_host) do
+          execute(:some_command)
+        end
+
+        assert_raises(SSHKit::Backend::MethodUnavailableError) do
+          abstract.run
+        end
+      end
+
       def test_abstract_backend_can_be_configured
         Abstract.configure do |config|
           config.some_option = 100
Added stub implementations for abstract methods on Abstract backend

Stub methods throw MethodUnavailableError to be consistent with previous behaviour