diff --git a/lib/constants.py b/lib/constants.py
index 508d6088e6f214b7471ef58aed65f9f3e525e4bf..b24c055b8bb9dfd224ccfafa1c6ded7b06f5c9ae 100644
--- a/lib/constants.py
+++ b/lib/constants.py
@@ -2280,5 +2280,34 @@ RANDOM_UUID_FILE = "/proc/sys/kernel/random/uuid"
 # Regex string for verifying a UUID
 UUID_REGEX = "^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$"
 
+# Auto-repair tag prefixes
+AUTO_REPAIR_TAG_PREFIX = "ganeti:watcher:autorepair:"
+AUTO_REPAIR_TAG_ENABLED = AUTO_REPAIR_TAG_PREFIX
+AUTO_REPAIR_TAG_SUSPENDED = AUTO_REPAIR_TAG_ENABLED + "suspend:"
+AUTO_REPAIR_TAG_PENDING = AUTO_REPAIR_TAG_PREFIX + "pending:"
+AUTO_REPAIR_TAG_RESULT = AUTO_REPAIR_TAG_PREFIX + "result:"
+
+# Auto-repair levels
+AUTO_REPAIR_FIX_STORAGE = "fix-storage"
+AUTO_REPAIR_MIGRATE = "migrate"
+AUTO_REPAIR_FAILOVER = "failover"
+AUTO_REPAIR_REINSTALL = "reinstall"
+AUTO_REPAIR_ALL_TYPES = [
+  AUTO_REPAIR_FIX_STORAGE,
+  AUTO_REPAIR_MIGRATE,
+  AUTO_REPAIR_FAILOVER,
+  AUTO_REPAIR_REINSTALL,
+]
+
+# Auto-repair results
+AUTO_REPAIR_SUCCESS = "success"
+AUTO_REPAIR_FAILURE = "failure"
+AUTO_REPAIR_ENOPERM = "enoperm"
+AUTO_REPAIR_ALL_RESULTS = frozenset([
+    AUTO_REPAIR_SUCCESS,
+    AUTO_REPAIR_FAILURE,
+    AUTO_REPAIR_ENOPERM,
+])
+
 # Do not re-export imported modules
 del re, _vcsversion, _autoconf, socket, pathutils, compat
diff --git a/src/Ganeti/HTools/Types.hs b/src/Ganeti/HTools/Types.hs
index 160473b139635f04bd9bff46ce49d6b1903a64d7..b006dde79d3b8acb2b0867f822ec45d090714ac4 100644
--- a/src/Ganeti/HTools/Types.hs
+++ b/src/Ganeti/HTools/Types.hs
@@ -72,6 +72,12 @@ module Ganeti.HTools.Types
   , IPolicy(..)
   , defIPolicy
   , rspecFromISpec
+  , AutoRepairType(..)
+  , autoRepairTypeToRaw
+  , autoRepairTypeFromRaw
+  , AutoRepairResult(..)
+  , autoRepairResultToRaw
+  , autoRepairResultFromRaw
   ) where
 
 import qualified Data.Map as M
@@ -347,3 +353,19 @@ $(THH.declareSADT "EvacMode"
        , ("ChangeAll",       'C.iallocatorNevacAll)
        ])
 $(THH.makeJSONInstance ''EvacMode)
+
+-- | The repair modes for the auto-repair tool.
+$(THH.declareSADT "AutoRepairType"
+       -- Order is important here: from least destructive to most.
+       [ ("ArFixStorage", 'C.autoRepairFixStorage)
+       , ("ArMigrate",    'C.autoRepairMigrate)
+       , ("ArFailover",   'C.autoRepairFailover)
+       , ("ArReinstall",  'C.autoRepairReinstall)
+       ])
+
+-- | The possible auto-repair results.
+$(THH.declareSADT "AutoRepairResult"
+       [ ("ArSuccess", 'C.autoRepairSuccess)
+       , ("ArFailure", 'C.autoRepairFailure)
+       , ("ArEnoperm", 'C.autoRepairEnoperm)
+       ])
diff --git a/test/hs/Test/Ganeti/HTools/Types.hs b/test/hs/Test/Ganeti/HTools/Types.hs
index 5dbcbe71587ca9f90c12d256b6492400ced0f051..7c12c4185be0d501c3db486c9c14b4eb18de2556 100644
--- a/test/hs/Test/Ganeti/HTools/Types.hs
+++ b/test/hs/Test/Ganeti/HTools/Types.hs
@@ -38,8 +38,10 @@ module Test.Ganeti.HTools.Types
   ) where
 
 import Test.QuickCheck hiding (Result)
+import Test.HUnit
 
 import Control.Applicative
+import Data.List (sort)
 
 import Test.Ganeti.TestHelper
 import Test.Ganeti.TestCommon
@@ -47,6 +49,7 @@ import Test.Ganeti.TestHTools
 import Test.Ganeti.Types ()
 
 import Ganeti.BasicTypes
+import qualified Ganeti.Constants as C
 import qualified Ganeti.HTools.Types as Types
 
 -- * Helpers
@@ -146,10 +149,33 @@ prop_eitherToResult ei =
                  Ok v' -> v == v'
     where r = eitherToResult ei
 
+-- | Test 'AutoRepairType' ordering is as expected and consistent with Python
+-- codebase.
+case_AutoRepairType_sort :: Assertion
+case_AutoRepairType_sort = do
+  let expected = [ Types.ArFixStorage
+                 , Types.ArMigrate
+                 , Types.ArFailover
+                 , Types.ArReinstall
+                 ]
+      all_hs_raw = map Types.autoRepairTypeToRaw [minBound..maxBound]
+  assertEqual "Haskell order" expected [minBound..maxBound]
+  assertEqual "consistent with Python" C.autoRepairAllTypes all_hs_raw
+
+-- | Test 'AutoRepairResult' type is equivalent with Python codebase.
+case_AutoRepairResult_pyequiv :: Assertion
+case_AutoRepairResult_pyequiv = do
+  let all_py_results = sort C.autoRepairAllResults
+      all_hs_results = sort $
+                       map Types.autoRepairResultToRaw [minBound..maxBound]
+  assertEqual "for AutoRepairResult equivalence" all_py_results all_hs_results
+
 testSuite "HTools/Types"
             [ 'prop_ISpec_serialisation
             , 'prop_IPolicy_serialisation
             , 'prop_EvacMode_serialisation
             , 'prop_opToResult
             , 'prop_eitherToResult
+            , 'case_AutoRepairType_sort
+            , 'case_AutoRepairResult_pyequiv
             ]