diff --git a/htools/Ganeti/HTools/CLI.hs b/htools/Ganeti/HTools/CLI.hs
index 3c882638b2a957bee82f1fe9bbe285ccbb3c6ba2..4558cc8cbfd2337ac1e0bab384e4bcfd99213fb6 100644
--- a/htools/Ganeti/HTools/CLI.hs
+++ b/htools/Ganeti/HTools/CLI.hs
@@ -200,7 +200,7 @@ oDiskMoves = Option "" ["no-disk-moves"]
 oDiskTemplate :: OptType
 oDiskTemplate = Option "" ["disk-template"]
                 (ReqArg (\ t opts -> do
-                           dt <- diskTemplateFromString t
+                           dt <- diskTemplateFromRaw t
                            return $ opts { optDiskTemplate = dt }) "TEMPLATE")
                 "select the desired disk template"
 
diff --git a/htools/Ganeti/HTools/Cluster.hs b/htools/Ganeti/HTools/Cluster.hs
index 7984172f6ec4568ef9acb0b9617cf4d01ecac917..aa5b4a6798a5fffc89ef1c292241f446f4bfcfe1 100644
--- a/htools/Ganeti/HTools/Cluster.hs
+++ b/htools/Ganeti/HTools/Cluster.hs
@@ -736,7 +736,7 @@ solutionDescription gl (groupId, result) =
     Bad message -> [printf "Group %s: error %s" gname message]
   where grp = Container.find groupId gl
         gname = Group.name grp
-        pol = allocPolicyToString (Group.allocPolicy grp)
+        pol = allocPolicyToRaw (Group.allocPolicy grp)
 
 -- | From a list of possibly bad and possibly empty solutions, filter
 -- only the groups with a valid result. Note that the result will be
@@ -842,7 +842,7 @@ tryReloc _ _ _ reqn _  = fail $ "Unsupported number of relocation \
 -- this function, whatever mode we have is just a primary change.
 failOnSecondaryChange :: (Monad m) => EvacMode -> DiskTemplate -> m ()
 failOnSecondaryChange ChangeSecondary dt =
-    fail $ "Instances with disk template '" ++ diskTemplateToString dt ++
+    fail $ "Instances with disk template '" ++ diskTemplateToRaw dt ++
          "' can't execute change secondary"
 failOnSecondaryChange _ _ = return ()
 
diff --git a/htools/Ganeti/HTools/Program/Hspace.hs b/htools/Ganeti/HTools/Program/Hspace.hs
index 23c7aaf88ede7346365ccdb18b5322f762ef4d28..206224122e31764210f9f9f8a756af8a914cbf10 100644
--- a/htools/Ganeti/HTools/Program/Hspace.hs
+++ b/htools/Ganeti/HTools/Program/Hspace.hs
@@ -295,7 +295,7 @@ printISpec True ispec spec disk_template = do
   printKeys $ map (\(a, fn) -> (prefix ++ "_" ++ a, fn ispec)) specData
   printKeys [ (prefix ++ "_RQN", printf "%d" req_nodes) ]
   printKeys [ (prefix ++ "_DISK_TEMPLATE",
-               diskTemplateToString disk_template) ]
+               diskTemplateToRaw disk_template) ]
       where req_nodes = Instance.requiredNodes disk_template
             prefix = specPrefix spec
 
@@ -303,7 +303,7 @@ printISpec False ispec spec disk_template =
   printf "%s instance spec is:\n  %s, using disk\
          \ template '%s'.\n"
          (specDescription spec)
-         (formatResources ispec specData) (diskTemplateToString disk_template)
+         (formatResources ispec specData) (diskTemplateToRaw disk_template)
 
 -- | Prints the tiered results.
 printTiered :: Bool -> [(RSpec, Int)] -> Double
diff --git a/htools/Ganeti/HTools/QC.hs b/htools/Ganeti/HTools/QC.hs
index 53fd48b47abdff049b5af9aaf1a278704088df6b..e7f6bc5cf0f765b9589ed32c93fac79f81dadb5f 100644
--- a/htools/Ganeti/HTools/QC.hs
+++ b/htools/Ganeti/HTools/QC.hs
@@ -597,7 +597,7 @@ prop_Text_Load_Instance name mem dsk vcpus status
         nl = Data.Map.fromList ndx
         tags = ""
         sbal = if autobal then "Y" else "N"
-        sdt = Types.diskTemplateToString dt
+        sdt = Types.diskTemplateToRaw dt
         inst = Text.loadInst nl
                [name, mem_s, dsk_s, vcpus_s, status,
                 sbal, pnode, snode, sdt, tags]
diff --git a/htools/Ganeti/HTools/Simu.hs b/htools/Ganeti/HTools/Simu.hs
index 22386ff6ea9958c952e2b49595a79987888c38ce..01a56249a7830fe4549789161d59ed6bf169e2e2 100644
--- a/htools/Ganeti/HTools/Simu.hs
+++ b/htools/Ganeti/HTools/Simu.hs
@@ -54,7 +54,7 @@ parseDesc :: String -> Result (AllocPolicy, Int, Int, Int, Int)
 parseDesc desc =
     case sepSplit ',' desc of
       [a, n, d, m, c] -> do
-        apol <- allocPolicyFromString a `mplus` apolAbbrev a
+        apol <- allocPolicyFromRaw a `mplus` apolAbbrev a
         ncount <- tryRead "node count" n
         disk <- annotateResult "disk size" (parseUnit d)
         mem <- annotateResult "memory size" (parseUnit m)
diff --git a/htools/Ganeti/HTools/Text.hs b/htools/Ganeti/HTools/Text.hs
index 1f20f550c948bd89a592bd95f9683e4dadc51648..7ac1d5c0840ec8c62e7bac1a585ff8f8576a2147 100644
--- a/htools/Ganeti/HTools/Text.hs
+++ b/htools/Ganeti/HTools/Text.hs
@@ -57,7 +57,7 @@ import qualified Ganeti.HTools.Instance as Instance
 serializeGroup :: Group.Group -> String
 serializeGroup grp =
     printf "%s|%s|%s" (Group.name grp) (Group.uuid grp)
-               (allocPolicyToString (Group.allocPolicy grp))
+               (allocPolicyToRaw (Group.allocPolicy grp))
 
 -- | Generate group file data from a group list.
 serializeGroups :: Group.List -> String
@@ -97,7 +97,7 @@ serializeInstance nl inst =
              iname (Instance.mem inst) (Instance.dsk inst)
              (Instance.vcpus inst) (Instance.runSt inst)
              (if Instance.autoBalance inst then "Y" else "N")
-             pnode snode (diskTemplateToString (Instance.diskTemplate inst))
+             pnode snode (diskTemplateToRaw (Instance.diskTemplate inst))
              (intercalate "," (Instance.tags inst))
 
 -- | Generate instance file data from instance objects.
@@ -121,7 +121,7 @@ loadGroup :: (Monad m) => [String]
           -> m (String, Group.Group) -- ^ The result, a tuple of group
                                      -- UUID and group object
 loadGroup [name, gid, apol] = do
-  xapol <- allocPolicyFromString apol
+  xapol <- allocPolicyFromRaw apol
   return (gid, Group.create name gid xapol)
 
 loadGroup s = fail $ "Invalid/incomplete group data: '" ++ show s ++ "'"
@@ -168,7 +168,7 @@ loadInst ktn [ name, mem, dsk, vcpus, status, auto_bal, pnode, snode
                     _ -> fail $ "Invalid auto_balance value '" ++ auto_bal ++
                          "' for instance " ++ name
   disk_template <- annotateResult ("Instance " ++ name)
-                   (diskTemplateFromString dt)
+                   (diskTemplateFromRaw dt)
   when (sidx == pidx) $ fail $ "Instance " ++ name ++
            " has same primary and secondary node - " ++ pnode
   let vtags = sepSplit ',' tags
diff --git a/htools/Ganeti/HTools/Types.hs b/htools/Ganeti/HTools/Types.hs
index 8e6b6a4dcb44a14a664ba4d88f0c246d7ef11ac3..a7d7130e6f73651870d0868becb079c14016678a 100644
--- a/htools/Ganeti/HTools/Types.hs
+++ b/htools/Ganeti/HTools/Types.hs
@@ -34,8 +34,8 @@ module Ganeti.HTools.Types
     , Weight
     , GroupID
     , AllocPolicy(..)
-    , allocPolicyFromString
-    , allocPolicyToString
+    , allocPolicyFromRaw
+    , allocPolicyToRaw
     , RSpec(..)
     , DynUtil(..)
     , zeroUtil
@@ -51,8 +51,8 @@ module Ganeti.HTools.Types
     , Placement
     , IMove(..)
     , DiskTemplate(..)
-    , diskTemplateToString
-    , diskTemplateFromString
+    , diskTemplateToRaw
+    , diskTemplateFromRaw
     , MoveJob
     , JobSet
     , Result(..)
diff --git a/htools/Ganeti/Luxi.hs b/htools/Ganeti/Luxi.hs
index ade6c229b08828b111b2fcee6e607f91a2d246a1..70b2b20627ddb34c765b0a22b538a2628ee783e9 100644
--- a/htools/Ganeti/Luxi.hs
+++ b/htools/Ganeti/Luxi.hs
@@ -154,7 +154,8 @@ $(declareIADT "ResultStatus"
      , ("RSUnavailable", 'rsUnavail)
      , ("RSOffline", 'rsOffline)
      ])
-$(makeJSONInstanceInt ''ResultStatus)
+
+$(makeJSONInstance ''ResultStatus)
 
 -- | Check that ResultStatus is success or fail with descriptive message.
 checkRS :: (Monad m) => ResultStatus -> a -> m a
diff --git a/htools/Ganeti/THH.hs b/htools/Ganeti/THH.hs
index e3c1110a864a671ebc934ac0a4859a4690ae98b5..44e410a1d8ba27cac5b91fab9cd4828d69f2ae27 100644
--- a/htools/Ganeti/THH.hs
+++ b/htools/Ganeti/THH.hs
@@ -32,7 +32,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 module Ganeti.THH ( declareSADT
                   , declareIADT
                   , makeJSONInstance
-                  , makeJSONInstanceInt
                   , genOpID
                   , genOpCode
                   , noDefault
@@ -53,7 +52,7 @@ import qualified Text.JSON as JSON
 -- | Ensure first letter is lowercase.
 --
 -- Used to convert type name to function prefix, e.g. in @data Aa ->
--- aaToString@.
+-- aaToRaw@.
 ensureLower :: String -> String
 ensureLower [] = []
 ensureLower (x:xs) = toLower x:xs
@@ -66,21 +65,13 @@ varNameE = varE . mkName
 showJSONE :: Q Exp
 showJSONE = varNameE "showJSON"
 
--- | ToString function name.
-toStrName :: String -> Name
-toStrName = mkName . (++ "ToString") . ensureLower
+-- | ToRaw function name.
+toRawName :: String -> Name
+toRawName = mkName . (++ "ToRaw") . ensureLower
 
--- | ToInt function name.
-toIntName :: String -> Name
-toIntName= mkName . (++ "ToInt") . ensureLower
-
--- | FromString function name.
-fromStrName :: String -> Name
-fromStrName = mkName . (++ "FromString") . ensureLower
-
--- | FromInt function name.
-fromIntName:: String -> Name
-fromIntName = mkName . (++ "FromInt") . ensureLower
+-- | FromRaw function name.
+fromRawName :: String -> Name
+fromRawName = mkName . (++ "FromRaw") . ensureLower
 
 -- | Converts a name to it's varE/litE representations.
 --
@@ -95,78 +86,7 @@ appFn :: Exp -> Exp -> Exp
 appFn f x | f == VarE 'id = x
           | otherwise = AppE f x
 
--- * Template code for simple integer-equivalent ADTs
-
--- | Generates a data type declaration.
---
--- The type will have a fixed list of instances.
-intADTDecl :: Name -> [String] -> Dec
-intADTDecl name constructors =
-    DataD [] name []
-              (map (flip NormalC [] . mkName) constructors)
-              [''Show]
-
--- | Generates a toInt function.
-genToInt :: Name -> Name -> [(String, Name)] -> Q [Dec]
-genToInt fname tname constructors = do
-  sigt <- [t| $(conT tname) -> Int |]
-  clauses <- mapM  (\(c, v) -> clause [recP (mkName c) []]
-                             (normalB (varE v)) []) constructors
-  return [SigD fname sigt, FunD fname clauses]
-
--- | Generates a fromInt function.
-genFromInt :: Name -> Name -> [(String, Name)] -> Q [Dec]
-genFromInt fname tname constructors = do
-  sigt <- [t| (Monad m) => Int-> m $(conT tname) |]
-  let varp = mkName "s"
-      varpe = varE varp
-  clauses <- mapM (\(c, v) -> do
-                     g <- normalG [| $varpe == $(varE v) |]
-                     r <- [| return $(conE (mkName c)) |]
-                     return (g, r)) constructors
-  oth_clause <- do
-    g <- normalG [| otherwise |]
-    r <- [|fail ("Invalid int value for type " ++
-                 $(litE (stringL (nameBase tname))) ++ ": " ++ show $varpe) |]
-    return (g, r)
-  let fun = FunD fname [Clause [VarP varp]
-                        (GuardedB (clauses++[oth_clause])) []]
-  return [SigD fname sigt, fun]
-
--- | Generates a data type from a given string format.
-declareIADT:: String -> [(String, Name)] -> Q [Dec]
-declareIADT sname cons = do
-  let name = mkName sname
-      ddecl = intADTDecl name (map fst cons)
-  tostr <- genToInt (toIntName sname) name cons
-  fromstr <- genFromInt (fromIntName sname) name cons
-  return $ ddecl:tostr ++ fromstr
-
--- | Creates the showJSON member of a JSON instance declaration.
-genShowJSONInt :: String -> Q [Dec]
-genShowJSONInt name = [d| showJSON = JSON.showJSON . $(varE (toIntName name)) |]
-
--- | Creates the readJSON member of a JSON instance declaration.
-genReadJSONInt :: String -> Q Dec
-genReadJSONInt name = do
-  let s = mkName "s"
-  body <- [| case JSON.readJSON $(varE s) of
-               JSON.Ok s' -> $(varE (fromIntName name)) s'
-               JSON.Error e ->
-                   JSON.Error $ "Can't parse int value for type " ++
-                           $(stringE name) ++ ": " ++ e
-           |]
-  return $ FunD (mkName "readJSON") [Clause [VarP s] (NormalB body) []]
-
--- | Generates a JSON instance for a given type.
-makeJSONInstanceInt :: Name -> Q [Dec]
-makeJSONInstanceInt name = do
-  let base = nameBase name
-  showJ <- genShowJSONInt base
-  readJ <- genReadJSONInt base
-  return [InstanceD [] (AppT (ConT ''JSON.JSON) (ConT name)) (readJ:showJ)]
-
--- * Template code for simple string-equivalent ADTs
+-- * Template code for simple raw type-equivalent ADTs
 
 -- | Generates a data type declaration.
 --
@@ -177,39 +97,39 @@ strADTDecl name constructors =
               (map (flip NormalC [] . mkName) constructors)
               [''Show, ''Read, ''Eq, ''Enum, ''Bounded, ''Ord]
 
--- | Generates a toString function.
+-- | Generates a toRaw function.
 --
 -- This generates a simple function of the form:
 --
 -- @
--- nameToString :: Name -> String
--- nameToString Cons1 = var1
--- nameToString Cons2 = \"value2\"
+-- nameToRaw :: Name -> /traw/
+-- nameToRaw Cons1 = var1
+-- nameToRaw Cons2 = \"value2\"
 -- @
-genToString :: Name -> Name -> [(String, Either String Name)] -> Q [Dec]
-genToString fname tname constructors = do
-  sigt <- [t| $(conT tname) -> String |]
+genToRaw :: Name -> Name -> Name -> [(String, Either String Name)] -> Q [Dec]
+genToRaw traw fname tname constructors = do
+  sigt <- [t| $(conT tname) -> $(conT traw) |]
   -- the body clauses, matching on the constructor and returning the
-  -- string value
+  -- raw value
   clauses <- mapM  (\(c, v) -> clause [recP (mkName c) []]
                              (normalB (reprE v)) []) constructors
   return [SigD fname sigt, FunD fname clauses]
 
--- | Generates a fromString function.
+-- | Generates a fromRaw function.
 --
 -- The function generated is monadic and can fail parsing the
--- string. It is of the form:
+-- raw value. It is of the form:
 --
 -- @
--- nameFromString :: (Monad m) => String -> m Name
--- nameFromString s | s == var1       = Cons1
---                  | s == \"value2\" = Cons2
---                  | otherwise = fail /.../
+-- nameFromRaw :: (Monad m) => /traw/ -> m Name
+-- nameFromRaw s | s == var1       = Cons1
+--               | s == \"value2\" = Cons2
+--               | otherwise = fail /.../
 -- @
-genFromString :: Name -> Name -> [(String, Name)] -> Q [Dec]
-genFromString fname tname constructors = do
+genFromRaw :: Name -> Name -> Name -> [(String, Name)] -> Q [Dec]
+genFromRaw traw fname tname constructors = do
   -- signature of form (Monad m) => String -> m $name
-  sigt <- [t| (Monad m) => String -> m $(conT tname) |]
+  sigt <- [t| (Monad m) => $(conT traw) -> m $(conT tname) |]
   -- clauses for a guarded pattern
   let varp = mkName "s"
       varpe = varE varp
@@ -223,13 +143,13 @@ genFromString fname tname constructors = do
   oth_clause <- do
     g <- normalG [| otherwise |]
     r <- [|fail ("Invalid string value for type " ++
-                 $(litE (stringL (nameBase tname))) ++ ": " ++ $varpe) |]
+                 $(litE (stringL (nameBase tname))) ++ ": " ++ show $varpe) |]
     return (g, r)
   let fun = FunD fname [Clause [VarP varp]
                         (GuardedB (clauses++[oth_clause])) []]
   return [SigD fname sigt, fun]
 
--- | Generates a data type from a given string format.
+-- | Generates a data type from a given raw format.
 --
 -- The format is expected to multiline. The first line contains the
 -- type name, and the rest of the lines must contain two words: the
@@ -239,34 +159,39 @@ genFromString fname tname constructors = do
 -- The function will generate the data type declaration, and then two
 -- functions:
 --
--- * /name/ToString, which converts the type to a string
+-- * /name/ToRaw, which converts the type to a raw type
 --
--- * /name/FromString, which (monadically) converts from a string to the type
+-- * /name/FromRaw, which (monadically) converts from a raw type to the type
 --
 -- Note that this is basically just a custom show/read instance,
 -- nothing else.
-declareSADT :: String -> [(String, Name)] -> Q [Dec]
-declareSADT sname cons = do
+declareADT :: Name -> String -> [(String, Name)] -> Q [Dec]
+declareADT traw sname cons = do
   let name = mkName sname
       ddecl = strADTDecl name (map fst cons)
-      -- process cons in the format expected by genToString
+      -- process cons in the format expected by genToRaw
       cons' = map (\(a, b) -> (a, Right b)) cons
-  tostr <- genToString (toStrName sname) name cons'
-  fromstr <- genFromString (fromStrName sname) name cons
-  return $ ddecl:tostr ++ fromstr
+  toraw <- genToRaw traw (toRawName sname) name cons'
+  fromraw <- genFromRaw traw (fromRawName sname) name cons
+  return $ ddecl:toraw ++ fromraw
 
+declareIADT :: String -> [(String, Name)] -> Q [Dec]
+declareIADT = declareADT ''Int
+
+declareSADT :: String -> [(String, Name)] -> Q [Dec]
+declareSADT = declareADT ''String
 
 -- | Creates the showJSON member of a JSON instance declaration.
 --
 -- This will create what is the equivalent of:
 --
 -- @
--- showJSON = showJSON . /name/ToString
+-- showJSON = showJSON . /name/ToRaw
 -- @
 --
 -- in an instance JSON /name/ declaration
 genShowJSON :: String -> Q [Dec]
-genShowJSON name = [d| showJSON = JSON.showJSON . $(varE (toStrName name)) |]
+genShowJSON name = [d| showJSON = JSON.showJSON . $(varE (toRawName name)) |]
 
 -- | Creates the readJSON member of a JSON instance declaration.
 --
@@ -274,7 +199,7 @@ genShowJSON name = [d| showJSON = JSON.showJSON . $(varE (toStrName name)) |]
 --
 -- @
 -- readJSON s = case readJSON s of
---                Ok s' -> /name/FromString s'
+--                Ok s' -> /name/FromRaw s'
 --                Error e -> Error /description/
 -- @
 --
@@ -283,16 +208,16 @@ genReadJSON :: String -> Q Dec
 genReadJSON name = do
   let s = mkName "s"
   body <- [| case JSON.readJSON $(varE s) of
-               JSON.Ok s' -> $(varE (fromStrName name)) s'
+               JSON.Ok s' -> $(varE (fromRawName name)) s'
                JSON.Error e ->
-                   JSON.Error $ "Can't parse string value for type " ++
+                   JSON.Error $ "Can't parse raw value for type " ++
                            $(stringE name) ++ ": " ++ e
            |]
   return $ FunD (mkName "readJSON") [Clause [VarP s] (NormalB body) []]
 
 -- | Generates a JSON instance for a given type.
 --
--- This assumes that the /name/ToString and /name/FromString functions
+-- This assumes that the /name/ToRaw and /name/FromRaw functions
 -- have been defined as by the 'declareSADT' function.
 makeJSONInstance :: Name -> Q [Dec]
 makeJSONInstance name = do
@@ -324,13 +249,13 @@ constructorName x                = fail $ "Unhandled constructor " ++ show x
 -- @
 --
 -- This builds a custom list of name/string pairs and then uses
--- 'genToString' to actually generate the function
+-- 'genToRaw' to actually generate the function
 genConstrToStr :: (String -> String) -> Name -> String -> Q [Dec]
 genConstrToStr trans_fun name fname = do
   TyConI (DataD _ _ _ cons _) <- reify name
   cnames <- mapM (liftM nameBase . constructorName) cons
   let svalues = map (Left . trans_fun) cnames
-  genToString (mkName fname) name $ zip cnames svalues
+  genToRaw ''String (mkName fname) name $ zip cnames svalues
 
 -- | Constructor-to-string for OpCode.
 genOpID :: Name -> String -> Q [Dec]