diff --git a/scripts/config.py b/scripts/config.py
index ad1f787..120c827 100755
--- a/scripts/config.py
+++ b/scripts/config.py
@@ -389,7 +389,10 @@
     return continuation
 
 class ConfigFile(metaclass=ABCMeta):
+    """Representation of a configuration file."""
+
     def __init__(self, default_path, filename=None, name=''):
+        """Check if the config file exists."""
         if filename is None:
             for candidate in default_path:
                 if os.path.lexists(candidate):
@@ -418,7 +421,9 @@
                                                 _ifndef_line_regexp,
                                                 _section_line_regexp]))
     def _parse_line(self, line):
-        """Parse a line in the config file and return the corresponding template."""
+        """Parse a line in the config file, save the templates representing the lines
+           and return the corresponding setting element.
+        """
         line = line.rstrip('\r\n')
         m = re.match(self._config_line_regexp, line)
         if m is None:
@@ -449,6 +454,7 @@
             return (active, name, value, self.current_section)
 
     def parse_file(self):
+        """Parse the whole file and return the settings."""
         with open(self.filename, 'r', encoding='utf-8') as file:
             for line in file:
                 setting = self._parse_line(line)
@@ -481,6 +487,8 @@
             self.write_to_stream(settings, output)
 
 class MbedtlsConfigFile(ConfigFile):
+    """Representation of an MbedTLS configuration file."""
+
     _path_in_tree = 'include/mbedtls/mbedtls_config.h'
     default_path = [_path_in_tree,
                     os.path.join(os.path.dirname(__file__),
@@ -517,6 +525,8 @@
                         value]).rstrip()
 
 class CryptoConfigFile(ConfigFile):
+    """Representation of an Crypto configuration file."""
+
     _path_in_tree = 'tf-psa-crypto/include/psa/crypto_config.h'
     default_path = [_path_in_tree,
                     os.path.join(os.path.dirname(__file__),
@@ -545,7 +555,7 @@
                         value]).rstrip()
 
 class MbedtlsConfig(Config):
-    """Representation of the Mbed TLS configuration read for a file.
+    """Representation of the Mbed TLS configuration.
 
     See the documentation of the `Config` class for methods to query
     and modify the configuration.
@@ -564,13 +574,17 @@
         super().set(name, value)
 
     def write(self, filename=None):
+        """Write the whole configuration to the file it was read from.
+
+        If filename is specified, write to this file instead.
+        """
         self.mbedtls_config.write(self.settings, filename)
 
     def filename(self, name):
         return self.mbedtls_config.filename
 
 class CryptoConfig(Config):
-    """Representation of the PSA crypto configuration read for a file.
+    """Representation of the PSA crypto configuration.
 
     See the documentation of the `Config` class for methods to query
     and modify the configuration.
@@ -594,12 +608,21 @@
         super().set(name, value)
 
     def write(self, filename=None):
+        """Write the whole configuration to the file it was read from.
+
+        If filename is specified, write to this file instead.
+        """
         self.crypto_config.write(self.settings, filename)
 
     def filename(self, name):
         return self.crypto_config.filename
 
 class MultiConfig(MbedtlsConfig, CryptoConfig):
+    """Representation of MbedTLS and PSA crypto configuration
+
+    See the documentation of the `Config` class for methods to query
+    and modify the configuration.
+    """
 
     def __init__(self, mbedtls_config, crypto_config):
         super().__init__(mbedtls_config=mbedtls_config, crypto_config=crypto_config)
@@ -615,6 +638,11 @@
         super(self._get_related_config(name), self).set(name, value)
 
     def write(self, mbedtls_file=None, crypto_file=None):
+        """Write the whole configuration to the file it was read from.
+
+        If mbedtls_file or crypto_file is specified, write the specific configuration
+        to the corresponding file instead.
+        """
         self.mbedtls_config.write(self.settings, mbedtls_file)
         self.crypto_config.write(self.settings, crypto_file)
 
