diff --git a/warden3/contrib/warden_ra/warden_ra.cfg.dist b/warden3/contrib/warden_ra/warden_ra.cfg.dist
index 27308d08d398092281b850d8821de09f89a52ab6..09f0604736a45bc84c0cfc3682ea0df9d865595b 100644
--- a/warden3/contrib/warden_ra/warden_ra.cfg.dist
+++ b/warden3/contrib/warden_ra/warden_ra.cfg.dist
@@ -1,10 +1,16 @@
 {
-    "url": "https://ejbca.example.org/ejbca/ejbcaws/ejbcaws?wsdl",
-    "cert": "warden_ra.cert.pem",
-    "key": "warden_ra.key.pem",
-    "caName": "Example CA",
-    "certificateProfileName": "Example",
-    "endEntityProfileName": "Example EE",
-    "subjectDN_template": "DC=cz,DC=example-ca,DC=warden,CN=%s",
-    "username_suffix": "@warden"
-}
\ No newline at end of file
+    "Log": {
+        "filename": "/var/log/warden_ra.log",
+        "level": "info"
+    },
+    "Registry": {
+        "url": "https://ejbca.example.org/ejbca/ejbcaws/ejbcaws?wsdl",
+        "cert": "warden_ra.cert.pem",
+        "key": "warden_ra.key.pem",
+        "ca_name": "Example CA",
+        "certificate_profile_name": "Example",
+        "end_entity_profile_name": "Example EE",
+        "subject_dn_template": "DC=cz,DC=example-ca,DC=warden,CN=%s",
+        "username_suffix": "@warden"
+    }
+}
diff --git a/warden3/contrib/warden_ra/warden_ra.py b/warden3/contrib/warden_ra/warden_ra.py
index deb183ae359385b4c31113080f15d1e551abccc8..15a674fbf8b9d3deb08bd54c668b5725040055e8 100755
--- a/warden3/contrib/warden_ra/warden_ra.py
+++ b/warden3/contrib/warden_ra/warden_ra.py
@@ -21,7 +21,8 @@ import ejbcaws
 
 # usual path to warden server
 sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..", "warden_server"))
-from warden_server import Request, ObjectBase, StreamLogger, FileLogger, Server, expose
+import warden_server
+from warden_server import Request, ObjectBase, FileLogger, SysLogger, Server, expose, read_cfg
 
 
 class EjbcaClient(object):
@@ -98,14 +99,15 @@ class EjbcaClient(object):
 
 class EjbcaRegistry(object):
 
-    def __init__(self, url, cert=None, key=None,
-                 caName="", certificateProfileName="", endEntityProfileName="",
-                 subjectDN_template="%s", username_suffix=""):
+    def __init__(self, log, url, cert=None, key=None,
+                 ca_name="", certificate_profile_name="", end_entity_profile_name="",
+                 subject_dn_template="%s", username_suffix=""):
+        self.log = log
         self.ejbca = ejbcaws.Ejbca(url, cert, key)
-        self.caName = caName
-        self.certificateProfileName = certificateProfileName
-        self.endEntityProfileName = endEntityProfileName
-        self.subjectDN_template = subjectDN_template
+        self.ca_name = ca_name
+        self.certificate_profile_name = certificate_profile_name
+        self.end_entity_profile_name = end_entity_profile_name
+        self.subject_dn_template = subject_dn_template
         self.username_suffix = username_suffix
 
     def get_clients(self):
@@ -124,9 +126,9 @@ class EjbcaRegistry(object):
         if user:
             raise LookupError("Client %s already exists" % name)
         new_ejbca_data = dict(
-            caName=self.caName,
-            certificateProfileName=self.certificateProfileName,
-            endEntityProfileName=self.endEntityProfileName,
+            ca_name=self.ca_name,
+            certificate_profile_name=self.certificate_profile_name,
+            end_entity_profile_name=self.end_entity_profile_name,
             keyRecoverable=False,
             sendNotification=False,
             status=ejbcaws.STATUS_INITIALIZED,
@@ -205,18 +207,52 @@ class CertHandler(ObjectBase):
         return [("Content-Type", "application/x-x509-user-cert")], newcert.as_pem()
 
 
+# Order in which the base objects must get initialized
+section_order = ("log", "auth", "registry", "handler", "server")
+
+# List of sections and objects, configured by them
+# First object in each object list is the default one, otherwise
+# "type" keyword in section may be used to choose other
+section_def = {
+    "log": [FileLogger, SysLogger],
+    "auth": [NullAuthenticator],
+    "registry": [EjbcaRegistry],
+    "handler": [CertHandler],
+    "server": [Server]
+}
+
+# Object parameter conversions and defaults
+param_def = {
+    FileLogger: warden_server.param_def[FileLogger],
+    SysLogger: warden_server.param_def[SysLogger],
+    Server: warden_server.param_def[Server],
+    NullAuthenticator: {
+        "req": {"type": "obj", "default": "req"},
+        "log": {"type": "obj", "default": "log"}
+    },
+    EjbcaRegistry: {
+        "log":  {"type": "obj", "default": "log"},
+        "url": {"type": "str", "default": "https://ejbca.example.org/ejbca/ejbcaws/ejbcaws?wsdl"},
+        "cert": {"type": "filepath", "default": os.path.join(os.path.dirname(__file__), "warden_ra.cert.pem")},
+        "key": {"type": "filepath", "default": os.path.join(os.path.dirname(__file__), "warden_ra.key.pem")},
+        "ca_name": {"type": "str", "default": "Example CA"},
+        "certificate_profile_name": {"type": "str", "default": "Example"},
+        "end_entity_profile_name": {"type": "str", "default": "Example EE"},
+        "subject_dn_template": {"type": "str", "default": "DC=cz,DC=example-ca,DC=warden,CN=%s"},
+        "username_suffix": {"type": "str", "default": "@warden"}
+    },
+    CertHandler: {
+        "req": {"type": "obj", "default": "req"},
+        "log": {"type": "obj", "default": "log"},
+        "registry": {"type": "obj", "default": "registry"}
+    }
+}
+
+param_def[FileLogger]["filename"] = {"type": "filepath", "default": os.path.join(os.path.dirname(__file__), os.path.splitext(os.path.split(__file__)[1])[0] + ".log")}
+
+
 def build_server(conf):
-    StreamLogger()
-    req = Request()
-    log = FileLogger(
-        req,
-        filename=os.path.join(os.path.dirname(__file__), os.path.splitext(os.path.split(__file__)[1])[0] + ".log"),
-        level=logging.DEBUG)
-    auth = NullAuthenticator(req, log)
-    registry = EjbcaRegistry(**conf)
-    handler = CertHandler(req, log, registry)
-    server = Server(req, log, auth, handler)
-    return server
+    return warden_server.build_server(conf, section_order, section_def, param_def)
 
 
 # Command line
@@ -369,13 +405,6 @@ def get_args():
     return argp.parse_args()
 
 
-def read_cfg(path):
-    with open(path, "r") as f:
-        stripcomments = "\n".join((l for l in f if not l.lstrip().startswith(("#", "//"))))
-        conf = json.loads(stripcomments)
-    return conf
-
-
 if __name__ == "__main__":
     args = get_args()
     config = read_cfg(os.path.join(os.path.dirname(__file__), args.config or "warden_ra.cfg"))