diff --git a/Makefile.am b/Makefile.am
index eb6de4f21623140352cdb700ea37c86d6b9486e6..cb750fae530f10d6bbbbf6fc51098d80ccfd2a73 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1046,6 +1046,10 @@ hs-apidoc: $(HS_BUILT_SRCS)
 	ln -s ../hscolour.css $(APIDOC_HS_DIR)/Ganeti/HTools/hscolour.css
 	set -e ; \
 	cd htools; \
+	if [ "$(HTOOLS_NOCURL)" ]; \
+	then OPTGHC="--optghc=$(HTOOLS_NOCURL)"; \
+	else OPTGHC=""; \
+	fi; \
 	RELSRCS="$(HS_LIB_SRCS:htools/%=%)"; \
 	for file in $$RELSRCS; do \
 		hfile=`echo $$file|sed 's/\\.hs$$//'`.html; \
@@ -1055,6 +1059,7 @@ hs-apidoc: $(HS_BUILT_SRCS)
 		-t ganeti-htools -p haddock-prologue \
 		--source-module="%{MODULE/.//}.html" \
 		--source-entity="%{MODULE/.//}.html#%{NAME}" \
+		$$OPTGHC \
 		$(filter-out Ganeti/HTools/ExtLoader.hs,$(HS_LIB_SRCS:htools/%=%))
 
 .PHONY: TAGS
diff --git a/htools/Ganeti/HTools/ExtLoader.hs b/htools/Ganeti/HTools/ExtLoader.hs
index 0412c1bb3731755ed612ce81d64e480321459749..9be8dc7ce8256f3c394d88e9e0c8e88aa3b07504 100644
--- a/htools/Ganeti/HTools/ExtLoader.hs
+++ b/htools/Ganeti/HTools/ExtLoader.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE CPP #-}
-
 {-| External data loader
 
 This module holds the external data loading, and thus is the only one
@@ -10,7 +8,7 @@ libraries implementing the low-level protocols.
 
 {-
 
-Copyright (C) 2009, 2010 Google Inc.
+Copyright (C) 2009, 2010, 2011 Google Inc.
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -43,9 +41,7 @@ import System
 import Text.Printf (printf, hPrintf)
 
 import qualified Ganeti.HTools.Luxi as Luxi
-#ifndef NO_CURL
 import qualified Ganeti.HTools.Rapi as Rapi
-#endif
 import qualified Ganeti.HTools.Simu as Simu
 import qualified Ganeti.HTools.Text as Text
 import Ganeti.HTools.Loader (mergeData, checkData, ClusterData(..)
@@ -109,12 +105,7 @@ loadExternalData opts = do
                      exitWith $ ExitFailure 1)
   input_data <-
       case () of
-        _ | setRapi ->
-#ifdef NO_CURL
-              return $ Bad "RAPI/curl backend disabled at compile time"
-#else
-              wrapIO $ Rapi.loadData mhost
-#endif
+        _ | setRapi -> wrapIO $ Rapi.loadData mhost
           | setLuxi -> wrapIO $ Luxi.loadData $ fromJust lsock
           | setSim -> Simu.loadData simdata
           | setFile -> wrapIO $ Text.loadData $ fromJust tfile
diff --git a/htools/Ganeti/HTools/QC.hs b/htools/Ganeti/HTools/QC.hs
index 62b00c16daea4c01d6dcbe58d79aa0855cb2c459..534a7b1dcf0082b0e6f71551634a88e7fcc0a58f 100644
--- a/htools/Ganeti/HTools/QC.hs
+++ b/htools/Ganeti/HTools/QC.hs
@@ -58,6 +58,7 @@ import qualified Ganeti.HTools.Luxi
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Group as Group
 import qualified Ganeti.HTools.PeerMap as PeerMap
+import qualified Ganeti.HTools.Rapi
 import qualified Ganeti.HTools.Simu
 import qualified Ganeti.HTools.Text as Text
 import qualified Ganeti.HTools.Types as Types
diff --git a/htools/Ganeti/HTools/Rapi.hs b/htools/Ganeti/HTools/Rapi.hs
index 19aa817fb813ebbc559508dde0963cd3a1c1c6f0..1b0b9d219f2e0b64c202d283264126a750d5d53c 100644
--- a/htools/Ganeti/HTools/Rapi.hs
+++ b/htools/Ganeti/HTools/Rapi.hs
@@ -23,7 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 
 -}
 
-{-# LANGUAGE BangPatterns #-}
+{-# LANGUAGE BangPatterns, CPP #-}
 
 module Ganeti.HTools.Rapi
     (
@@ -32,8 +32,10 @@ module Ganeti.HTools.Rapi
     ) where
 
 import Data.Maybe (fromMaybe)
+#ifndef NO_CURL
 import Network.Curl
 import Network.Curl.Types ()
+#endif
 import Control.Monad
 import Text.JSON (JSObject, JSValue, fromJSObject, decodeStrict)
 import Text.JSON.Types (JSValue(..))
@@ -46,6 +48,14 @@ import qualified Ganeti.HTools.Group as Group
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
 
+-- | Read an URL via curl and return the body if successful.
+getUrl :: (Monad m) => String -> IO (m String)
+
+#ifdef NO_CURL
+getUrl _ = return $ fail "RAPI/curl backend disabled at compile time"
+
+#else
+
 -- | The curl options we use
 curlOpts :: [CurlOption]
 curlOpts = [ CurlSSLVerifyPeer False
@@ -54,14 +64,13 @@ curlOpts = [ CurlSSLVerifyPeer False
            , CurlConnectTimeout (fromIntegral connTimeout)
            ]
 
--- | Read an URL via curl and return the body if successful.
-getUrl :: (Monad m) => String -> IO (m String)
 getUrl url = do
   (code, !body) <- curlGetString url curlOpts
   return (case code of
             CurlOK -> return body
             _ -> fail $ printf "Curl error for '%s', error %s"
                  url (show code))
+#endif
 
 -- | Append the default port if not passed in.
 formatHost :: String -> String
diff --git a/htools/hscan.hs b/htools/hscan.hs
index 69601338ccb5ec7ed6275949ac7b87dbe7495d42..07ab65757e2f3c0c488e15954841911b2f3288ce 100644
--- a/htools/hscan.hs
+++ b/htools/hscan.hs
@@ -1,5 +1,3 @@
-{-# LANGUAGE CPP #-}
-
 {-| Scan clusters via RAPI or LUXI and write state data files.
 
 -}
@@ -40,9 +38,7 @@ import qualified Ganeti.HTools.Container as Container
 import qualified Ganeti.HTools.Cluster as Cluster
 import qualified Ganeti.HTools.Node as Node
 import qualified Ganeti.HTools.Instance as Instance
-#ifndef NO_CURL
 import qualified Ganeti.HTools.Rapi as Rapi
-#endif
 import qualified Ganeti.HTools.Luxi as Luxi
 import Ganeti.HTools.Loader (checkData, mergeData, ClusterData(..))
 import Ganeti.HTools.Text (serializeCluster)
@@ -155,12 +151,6 @@ main = do
          result <- writeData nlen name opts input_data
          unless result $ exitWith $ ExitFailure 2
 
-#ifndef NO_CURL
   results <- mapM (\name -> Rapi.loadData name >>= writeData nlen name opts)
              clusters
   unless (all id results) $ exitWith (ExitFailure 2)
-#else
-  when (not $ null clusters) $ do
-    putStrLn "RAPI/curl backend disabled at compile time, cannot scan clusters"
-    exitWith $ ExitFailure 1
-#endif