diff --git a/lib/steem/api.rb b/lib/steem/api.rb
index 513b3901e46fcd5562e3189a0863c935d9cf6e75..2a72a31e9901a386b28ee628f4df91a119edd3b3 100644
--- a/lib/steem/api.rb
+++ b/lib/steem/api.rb
@@ -149,19 +149,6 @@ module Steem
       @@signatures[url][rpc_method_name] ||= Api::jsonrpc(url).get_signature(method: rpc_method_name).result
     end
     
-    # @private
-    def raise_error_response(rpc_method_name, rpc_args, response)
-      raise UnknownError, "#{rpc_method_name}: #{response}" if response.error.nil?
-      
-      error = response.error
-      
-      if error.message == 'Invalid Request'
-        raise Steem::ArgumentError, "Unexpected arguments: #{rpc_args.inspect}.  Expected: #{rpc_method_name} (#{args_keys_to_s(rpc_method_name)})"
-      end
-      
-      BaseError.build_error(error, rpc_method_name)
-    end
-    
     # @private
     def respond_to_missing?(m, include_private = false)
       methods.nil? ? false : methods.include?(m.to_sym)
@@ -203,14 +190,6 @@ module Steem
       
       response = rpc_client.rpc_execute(@api_name, m, rpc_args)
       
-      if defined?(response.error) && !!response.error
-        if !!response.error.message
-          raise_error_response rpc_method_name, rpc_args, response
-        else
-          raise Steem::ArgumentError, response.error.inspect
-        end
-      end
-      
       if !!block
         case response
         when Hashie::Mash then yield response.result, response.error, response.id
diff --git a/lib/steem/rpc/base_client.rb b/lib/steem/rpc/base_client.rb
index 8d7387e7a5dcb9f75d8f8c169046e78550b92b6c..d5ae9fd2afd7932b2e44186a0cd3ed47d740b75d 100644
--- a/lib/steem/rpc/base_client.rb
+++ b/lib/steem/rpc/base_client.rb
@@ -161,6 +161,19 @@ module Steem
         
         sleep @backoff
       end
+      
+      # @private
+      def raise_error_response(rpc_method_name, rpc_args, response)
+        raise UnknownError, "#{rpc_method_name}: #{response}" if response.error.nil?
+        
+        error = response.error
+        
+        if error.message == 'Invalid Request'
+          raise Steem::ArgumentError, "Unexpected arguments: #{rpc_args.inspect}.  Expected: #{rpc_method_name} (#{args_keys_to_s(rpc_method_name)})"
+        end
+        
+        BaseError.build_error(error, rpc_method_name)
+      end
     end
   end
 end
diff --git a/lib/steem/rpc/http_client.rb b/lib/steem/rpc/http_client.rb
index 0517fa0d460a85a538a3fa70474a69ad5c3d867d..1d153b5d41d1de5c40a3271f8ec528ddc7b35d69 100644
--- a/lib/steem/rpc/http_client.rb
+++ b/lib/steem/rpc/http_client.rb
@@ -17,7 +17,7 @@ module Steem
       # 
       # @private
       TIMEOUT_ERRORS = [Net::OpenTimeout, JSON::ParserError, Net::ReadTimeout,
-        Errno::EBADF, IOError, Errno::ENETDOWN]
+        Errno::EBADF, IOError, Errno::ENETDOWN, Steem::RemoteDatabaseLockError]
       
       # @private
       POST_HEADERS = {
@@ -108,6 +108,22 @@ module Steem
             else; response
             end
             
+            [response].flatten.each_with_index do |r, i|
+              if defined?(r.error) && !!r.error
+                if !!r.error.message
+                  begin
+                    rpc_method_name = "#{api_name}.#{api_method}"
+                    rpc_args = [request_object].flatten[i]
+                    raise_error_response rpc_method_name, rpc_args, r
+                  rescue *TIMEOUT_ERRORS => e
+                    throw retry_timeout(:tota_cera_pila, e)
+                  end
+                else
+                  raise Steem::ArgumentError, r.error.inspect
+                end
+              end
+            end
+            
             yield_response response, &block
           when '504' # Gateway Timeout
             throw retry_timeout(:tota_cera_pila, response.body)
diff --git a/lib/steem/stream.rb b/lib/steem/stream.rb
index 859082108cdf58b33521c25ce8b1d0e13d96f3d8..1e9b25cf99d56c71eebe7ced0070404e848a4ad9 100644
--- a/lib/steem/stream.rb
+++ b/lib/steem/stream.rb
@@ -91,6 +91,14 @@ module Steem
     # @option options [Integer] :until_block_num Ends the stream at the given block number.  Default: nil.
     def transactions(options = {}, &block)
       blocks(options) do |block, block_num|
+        if block.nil?
+          warn "Batch missing block_num: #{block_num}, retrying ..."
+          
+          block = block_api.get_block(block_num: block_num) do |result|
+            result.block
+          end
+        end
+        
         block.transactions.each_with_index do |transaction, index|
           trx_id = block.transaction_ids[index]
           
@@ -332,9 +340,8 @@ module Steem
         end
         
         response = account_history_api.get_ops_in_block(*get_ops_in_block_options)
-        result = response.result
         
-        if result.nil?
+        if response.nil? || (result = response.result).nil?
           if retries < MAX_RETRY_COUNT
             warn "Retrying get_ops_in_block on block #{block_num}" unless @no_warn
             retries = retries + 1
@@ -360,7 +367,8 @@ module Steem
             retries = retries + 1
             redo
           else
-            raise TooManyRetriesError, "unable to find virtual operations for block: #{block_num}"
+            warn "unable to find virtual operations for block: #{block_num}"
+            # raise TooManyRetriesError, "unable to find virtual operations for block: #{block_num}"
           end
         end
         
@@ -374,4 +382,4 @@ module Steem
       end
     end
   end
-end
\ No newline at end of file
+end