diff --git a/package/logger_36/catalog/config/console_rich.py b/package/logger_36/catalog/config/console_rich.py
index ac483c746071b46f4af60f3f48795ef52bdbc366..611b2ee0ab6fb96a135ee40ab265c57d47b6077a 100644
--- a/package/logger_36/catalog/config/console_rich.py
+++ b/package/logger_36/catalog/config/console_rich.py
@@ -25,7 +25,6 @@ LEVEL_COLOR: dict[int, str | style_t] = {
 ACTUAL_COLOR = LEVEL_COLOR[lggg.CRITICAL]
 EXPECTED_COLOR = "green3"
 DATE_TIME_COLOR = "sky_blue3"
-ELAPSED_TIME_COLOR = DATE_TIME_COLOR
 
 ALTERNATIVE_BACKGROUND_FOR_LIGHT = style_t(bgcolor=color_t.from_rgb(230, 230, 230))
 ALTERNATIVE_BACKGROUND_FOR_DARK = style_t(bgcolor=color_t.from_rgb(25, 25, 25))
diff --git a/package/logger_36/catalog/handler/README.txt b/package/logger_36/catalog/handler/README.txt
index 8762597949d64be9ddcf18a258ef3c81c38b48f0..40a38b7aa4f95b34e8cb80ef9afa5152e9b323a2 100644
--- a/package/logger_36/catalog/handler/README.txt
+++ b/package/logger_36/catalog/handler/README.txt
@@ -1,3 +1,4 @@
 --- Note concerning: def emit(self, record: lggg.LogRecord, /) -> None:
 The attribute "message" is not yet defined in record. It will be set by format().
 Use "msg" instead.
+Same remark with asctime.
diff --git a/package/logger_36/catalog/handler/console.py b/package/logger_36/catalog/handler/console.py
index 14fd3522d10d5a0fed7c0c5d92bb9b2bc9ff9223..eb6a1e086b977e404fcae55777f1dccce773abdd 100644
--- a/package/logger_36/catalog/handler/console.py
+++ b/package/logger_36/catalog/handler/console.py
@@ -18,12 +18,11 @@ from logger_36.type.handler import handler_extension_t
 @d.dataclass(slots=True, repr=False, eq=False)
 class console_handler_t(lggg.Handler):
     extension: handler_extension_t = d.field(init=False)
-    FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
+    MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
 
     name: d.InitVar[str | None] = None
     level: d.InitVar[int] = lggg.NOTSET
-    show_where: d.InitVar[bool] = True
-    show_memory_usage: d.InitVar[bool] = False
+    should_store_memory_usage: d.InitVar[bool] = False
     message_width: d.InitVar[int] = -1
     formatter: d.InitVar[lggg.Formatter | None] = None
 
@@ -31,8 +30,7 @@ class console_handler_t(lggg.Handler):
         self,
         name: str | None,
         level: int,
-        show_where: bool,
-        show_memory_usage: bool,
+        should_store_memory_usage: bool,
         message_width: int,
         formatter: lggg.Formatter | None,
     ) -> None:
@@ -41,22 +39,21 @@ class console_handler_t(lggg.Handler):
 
         self.extension = handler_extension_t(
             name=name,
-            show_where=show_where,
-            show_memory_usage=show_memory_usage,
+            should_store_memory_usage=should_store_memory_usage,
             handler=self,
             level=level,
             message_width=message_width,
             formatter=formatter,
         )
 
-        self.FormattedLines = self.extension.FormattedLines
+        self.MessageFromRecord = self.extension.MessageFromRecord
 
     def emit(self, record: lggg.LogRecord, /) -> None:
         """"""
         if hasattr(record, SHOW_W_RULE_ATTR):
             message = RuleAsText(record.msg)
         else:
-            message, _ = self.FormattedLines(record, should_join_lines=True)
+            message = self.MessageFromRecord(record)
         print(message)
 
     def ShowMessage(self, message: str, /, *, indented: bool = False) -> None:
diff --git a/package/logger_36/catalog/handler/console_rich.py b/package/logger_36/catalog/handler/console_rich.py
index d92457d2a627df9e90a1f4271024db4368796940..6c3c712d2dddd60ca6216224af9e1c00494418cf 100644
--- a/package/logger_36/catalog/handler/console_rich.py
+++ b/package/logger_36/catalog/handler/console_rich.py
@@ -14,20 +14,13 @@ from logger_36.catalog.config.console_rich import (
     ALTERNATIVE_BACKGROUND_FOR_DARK,
     ALTERNATIVE_BACKGROUND_FOR_LIGHT,
     DATE_TIME_COLOR,
-    ELAPSED_TIME_COLOR,
     EXPECTED_COLOR,
     GRAY_COLOR,
     LEVEL_COLOR,
     WHITE_COLOR,
 )
-from logger_36.config.message import (
-    ACTUAL_PATTERNS,
-    ELAPSED_TIME_SEPARATOR,
-    EXPECTED_PATTERNS,
-    LEVEL_CLOSING,
-    WHERE_SEPARATOR,
-)
-from logger_36.constant.message import LINE_INDENT
+from logger_36.config.message import ACTUAL_PATTERNS, EXPECTED_PATTERNS, WHERE_SEPARATOR
+from logger_36.constant.message import CONTEXT_LENGTH, LINE_INDENT
 from logger_36.constant.record import SHOW_W_RULE_ATTR
 from logger_36.task.format.rule import Rule
 from logger_36.type.handler import handler_extension_t
@@ -64,14 +57,13 @@ class console_rich_handler_t(lggg.Handler):
 
     extension: handler_extension_t = d.field(init=False)
     console: console_t = d.field(init=False)
-    FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
+    MessageFromRecord: h.Callable[..., str] = d.field(init=False)
     alternating_lines: int = 0
     background_is_light: bool = True
 
     name: d.InitVar[str | None] = None
     level: d.InitVar[int] = lggg.NOTSET
-    show_where: d.InitVar[bool] = True
-    show_memory_usage: d.InitVar[bool] = False
+    should_store_memory_usage: d.InitVar[bool] = False
     message_width: d.InitVar[int] = -1
     formatter: d.InitVar[lggg.Formatter | None] = None
     should_install_traceback: d.InitVar[bool] = False
@@ -83,8 +75,7 @@ class console_rich_handler_t(lggg.Handler):
         self,
         name: str | None,
         level: int,
-        show_where: bool,
-        show_memory_usage: bool,
+        should_store_memory_usage: bool,
         message_width: int,
         formatter: lggg.Formatter | None,
         should_install_traceback: bool,
@@ -96,8 +87,7 @@ class console_rich_handler_t(lggg.Handler):
 
         self.extension = handler_extension_t(
             name=name,
-            show_where=show_where,
-            show_memory_usage=show_memory_usage,
+            should_store_memory_usage=should_store_memory_usage,
             handler=self,
             level=level,
             message_width=message_width,
@@ -127,7 +117,7 @@ class console_rich_handler_t(lggg.Handler):
             rich_traceback_kwargs["console"] = self.console
             InstallTracebackHandler(**rich_traceback_kwargs)
 
-        self.FormattedLines = self.extension.FormattedLines
+        self.MessageFromRecord = self.extension.MessageFromRecord
         if self.alternating_lines == 1:
             self.alternating_lines = 0
             self.background_is_light = False
@@ -142,14 +132,13 @@ class console_rich_handler_t(lggg.Handler):
         if hasattr(record, SHOW_W_RULE_ATTR):
             richer = Rule(record.msg, DATE_TIME_COLOR)
         else:
-            first, next_s = self.FormattedLines(record, PreProcessed=EscapedVersion)
+            message = self.MessageFromRecord(record, PreProcessed=EscapedVersion)
             should_highlight_back = self.alternating_lines == 1
             if self.alternating_lines >= 0:
                 self.alternating_lines = (self.alternating_lines + 1) % 2
             richer = HighlightedVersion(
                 self.console,
-                first,
-                next_s,
+                message,
                 record.levelno,
                 should_highlight_back=should_highlight_back,
                 background_is_light=self.background_is_light,
@@ -172,8 +161,7 @@ class console_rich_handler_t(lggg.Handler):
 
 def HighlightedVersion(
     _: console_t,
-    first_line: str,
-    next_lines: str | None,
+    message: str,
     log_level: int,
     /,
     *,
@@ -181,24 +169,13 @@ def HighlightedVersion(
     background_is_light: bool = True,
 ) -> renderable_t:
     """"""
-    output = text_t(first_line, WHITE_COLOR)
-
-    # Used instead of _CONTEXT_LENGTH which might include \t, thus creating a
-    # mismatch between character length and length when displayed in console.
-    context_end = first_line.find(LEVEL_CLOSING)
-    elapsed_time_separator = first_line.rfind(ELAPSED_TIME_SEPARATOR)
-    where_separator = first_line.rfind(
-        WHERE_SEPARATOR, context_end, elapsed_time_separator
-    )
-
-    output.stylize(LEVEL_COLOR[log_level], end=context_end + 1)
-    output.stylize(GRAY_COLOR, start=where_separator, end=elapsed_time_separator)
-    output.stylize(ELAPSED_TIME_COLOR, start=elapsed_time_separator)
-
-    if next_lines is not None:
-        output.append(next_lines)
+    output = text_t(message, WHITE_COLOR)
 
-    _ = output.highlight_regex(ACTUAL_PATTERNS, style=ACTUAL_COLOR)
+    output.stylize(LEVEL_COLOR[log_level], end=CONTEXT_LENGTH)
+    where = message.rfind(WHERE_SEPARATOR)
+    if (where >= 0) and ("\n" not in message[where:]):
+        output.stylize(GRAY_COLOR, start=where)
+    _ = output.highlight_words(ACTUAL_PATTERNS, style=ACTUAL_COLOR)
     _ = output.highlight_regex(EXPECTED_PATTERNS, style=EXPECTED_COLOR)
 
     if should_highlight_back:
diff --git a/package/logger_36/catalog/handler/file.py b/package/logger_36/catalog/handler/file.py
index 2e7409a568f8ce207a9f10f7ccb1400a56723270..4ddc305208efb5ce590bd08597cff07dd40cd9c3 100644
--- a/package/logger_36/catalog/handler/file.py
+++ b/package/logger_36/catalog/handler/file.py
@@ -20,12 +20,11 @@ from logger_36.type.handler import handler_extension_t
 class file_handler_t(lggg.FileHandler):
 
     extension: handler_extension_t = d.field(init=False)
-    FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
+    MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
 
     name: d.InitVar[str | None] = None
     level: d.InitVar[int] = lggg.NOTSET
-    show_where: d.InitVar[bool] = True
-    show_memory_usage: d.InitVar[bool] = False
+    should_store_memory_usage: d.InitVar[bool] = False
     message_width: d.InitVar[int] = -1
     formatter: d.InitVar[lggg.Formatter | None] = None
 
@@ -37,8 +36,7 @@ class file_handler_t(lggg.FileHandler):
         self,
         name: str | None,
         level: int,
-        show_where: bool,
-        show_memory_usage: bool,
+        should_store_memory_usage: bool,
         message_width: int,
         formatter: lggg.Formatter | None,
         path: path_t | None,
@@ -50,22 +48,21 @@ class file_handler_t(lggg.FileHandler):
 
         self.extension = handler_extension_t(
             name=name,
-            show_where=show_where,
-            show_memory_usage=show_memory_usage,
+            should_store_memory_usage=should_store_memory_usage,
             handler=self,
             level=level,
             message_width=message_width,
             formatter=formatter,
         )
 
-        self.FormattedLines = self.extension.FormattedLines
+        self.MessageFromRecord = self.extension.MessageFromRecord
 
     def emit(self, record: lggg.LogRecord, /) -> None:
         """"""
         if hasattr(record, SHOW_W_RULE_ATTR):
             message = RuleAsText(record.msg)
         else:
-            message, _ = self.FormattedLines(record, should_join_lines=True)
+            message = self.MessageFromRecord(record)
         print(message, file=self.stream)
         self.stream.flush()
 
diff --git a/package/logger_36/catalog/handler/generic.py b/package/logger_36/catalog/handler/generic.py
index 6fdd1732238e46a9119f3f8b0f7444f3693e208b..e6a98142f5b5be0723b4d98c1ea20de2782b9043 100644
--- a/package/logger_36/catalog/handler/generic.py
+++ b/package/logger_36/catalog/handler/generic.py
@@ -60,12 +60,11 @@ class generic_handler_t(lggg.Handler):
 
     DisplayRule: display_rule_p = d.field(init=False)
     extension: handler_extension_t = d.field(init=False)
-    FormattedLines: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
+    MessageFromRecord: h.Callable[..., tuple[str, str | None]] = d.field(init=False)
 
     name: d.InitVar[str | None] = None
     level: d.InitVar[int] = lggg.NOTSET
-    show_where: d.InitVar[bool] = True
-    show_memory_usage: d.InitVar[bool] = False
+    should_store_memory_usage: d.InitVar[bool] = False
     message_width: d.InitVar[int] = -1
     formatter: d.InitVar[lggg.Formatter | None] = None
 
@@ -77,8 +76,7 @@ class generic_handler_t(lggg.Handler):
         self,
         name: str | None,
         level: int,
-        show_where: bool,
-        show_memory_usage: bool,
+        should_store_memory_usage: bool,
         message_width: int,
         formatter: lggg.Formatter | None,
         supports_html: bool,
@@ -90,8 +88,7 @@ class generic_handler_t(lggg.Handler):
 
         self.extension = handler_extension_t(
             name=name,
-            show_where=show_where,
-            show_memory_usage=show_memory_usage,
+            should_store_memory_usage=should_store_memory_usage,
             handler=self,
             level=level,
             message_width=message_width,
@@ -114,7 +111,7 @@ class generic_handler_t(lggg.Handler):
         else:
             self.DisplayRule = self._DisplayRuleAsText
 
-        self.FormattedLines = self.extension.FormattedLines
+        self.MessageFromRecord = self.extension.MessageFromRecord
         if self.alternating_lines == 1:
             self.alternating_lines = 0
             self.background_is_light = False
@@ -130,19 +127,18 @@ class generic_handler_t(lggg.Handler):
             if hasattr(record, SHOW_W_RULE_ATTR):
                 message = RuleAsText(record.msg)
             else:
-                message, _ = self.FormattedLines(record, should_join_lines=True)
+                message = self.MessageFromRecord(record)
         else:
             if hasattr(record, SHOW_W_RULE_ATTR):
                 richer = Rule(record.msg, DATE_TIME_COLOR)
             else:
-                first, next_s = self.FormattedLines(record, PreProcessed=EscapedForRich)
+                message = self.MessageFromRecord(record, PreProcessed=EscapedForRich)
                 should_highlight_back = self.alternating_lines == 1
                 if self.alternating_lines >= 0:
                     self.alternating_lines = (self.alternating_lines + 1) % 2
                 richer = HighlightedVersion(
                     self.console,
-                    first,
-                    next_s,
+                    message,
                     record.levelno,
                     should_highlight_back=should_highlight_back,
                     background_is_light=self.background_is_light,
diff --git a/package/logger_36/catalog/logger/chronos.py b/package/logger_36/catalog/logger/chronos.py
index 87f9e72d6bfb5d0e174e778ce7aa29cc6a30f8ba..03a9de1e50934c6de92f208a639b8138144d88c8 100644
--- a/package/logger_36/catalog/logger/chronos.py
+++ b/package/logger_36/catalog/logger/chronos.py
@@ -4,7 +4,6 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
 SEE COPYRIGHT NOTICE BELOW
 """
 
-from logger_36.constant.logger import HIDE_WHERE_KWARG
 from logger_36.instance.logger import LOGGER
 from logger_36.task.measure.chronos import ElapsedTime
 from logger_36.type.logger import logger_t
@@ -12,7 +11,7 @@ from logger_36.type.logger import logger_t
 
 def LogElapsedTime(*, logger: logger_t = LOGGER) -> None:
     """"""
-    logger.info(f"Elapsed Time: {ElapsedTime()}", **HIDE_WHERE_KWARG)
+    logger.info(f"Elapsed Time: {ElapsedTime()}")
 
 
 """
diff --git a/package/logger_36/catalog/logger/gpu.py b/package/logger_36/catalog/logger/gpu.py
index c3dd58f3771751efcb29fc0e64caab9e064303d1..8c22fd2c97d2998795c03a1381baccbe90e3688a 100644
--- a/package/logger_36/catalog/logger/gpu.py
+++ b/package/logger_36/catalog/logger/gpu.py
@@ -7,7 +7,6 @@ SEE COPYRIGHT NOTICE BELOW
 import sys as sstm
 
 from logger_36.constant.error import GPU_LOGGING_ERROR
-from logger_36.constant.logger import HIDE_WHERE_KWARG
 from logger_36.instance.logger import LOGGER
 from logger_36.type.logger import logger_t
 
@@ -41,7 +40,6 @@ def LogGPURelatedDetails(*, logger: logger_t = LOGGER) -> None:
         f"          Tensorflow: {tsfl.version.VERSION}\n"
         f"    Tensorflow Build: {tsfl.sysconfig.get_build_info()}\n"
         f"            TensorRT: {tsrt.__version__}",
-        **HIDE_WHERE_KWARG,
     )
 
 
diff --git a/package/logger_36/catalog/logger/memory.py b/package/logger_36/catalog/logger/memory.py
index e5512a284894dd43b0f5dc912698a6ac6c7bb836..7c31de4e33617f54bb1f878a26f7aeda2acd7d20 100644
--- a/package/logger_36/catalog/logger/memory.py
+++ b/package/logger_36/catalog/logger/memory.py
@@ -5,11 +5,10 @@ SEE COPYRIGHT NOTICE BELOW
 """
 
 from logger_36.config.memory import LENGTH_100, MAX_N_SAMPLES
-from logger_36.constant.logger import HIDE_WHERE_KWARG
 from logger_36.constant.memory import storage_units_h
 from logger_36.instance.logger import LOGGER
 from logger_36.task.format.memory import FormattedUsage, UsageBar
-from logger_36.task.format.message import FormattedMessage
+from logger_36.task.format.message import MessageWithActualExpected
 from logger_36.type.logger import logger_t
 
 
@@ -22,7 +21,7 @@ def LogMemoryUsages(
     logger: logger_t = LOGGER,
 ) -> None:
     """"""
-    if not logger.any_handler_shows_memory:
+    if not logger.any_handler_stores_memory:
         return
 
     where_s, usages = zip(*logger.memory_usages)
@@ -34,7 +33,7 @@ def LogMemoryUsages(
     if isinstance(max_n_samples, int):
         if max_n_samples < 1:
             raise ValueError(
-                FormattedMessage(
+                MessageWithActualExpected(
                     "Invalid maximum number of samples",
                     actual=max_n_samples,
                     expected=1,
@@ -65,7 +64,7 @@ def LogMemoryUsages(
         )
     plot = "\n".join(plot)
 
-    logger.info(title + plot, **HIDE_WHERE_KWARG)
+    logger.info(title + plot)
 
 
 def LogMaximumMemoryUsage(
@@ -77,12 +76,10 @@ def LogMaximumMemoryUsage(
     """
     unit: b or None=bytes, k=kilo, m=mega, g=giga, a=auto
     """
-    if logger.any_handler_shows_memory:
+    if logger.any_handler_stores_memory:
         where, max_usage = logger.max_memory_usage_full
         value, unit = FormattedUsage(max_usage, unit=unit, decimals=decimals)
-        logger.info(
-            f"Max. Memory Usage: {value}{unit} near {where}", **HIDE_WHERE_KWARG
-        )
+        logger.info(f"Max. Memory Usage: {value}{unit} near {where}")
 
 
 """
diff --git a/package/logger_36/catalog/logger/system.py b/package/logger_36/catalog/logger/system.py
index 03349e71d27d6de1b52c592f8e8e180032ff45d6..53c99fb5848d6c080018373e9ac19b7f4c2d0374 100644
--- a/package/logger_36/catalog/logger/system.py
+++ b/package/logger_36/catalog/logger/system.py
@@ -4,7 +4,6 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
 SEE COPYRIGHT NOTICE BELOW
 """
 
-from logger_36.constant.logger import HIDE_WHERE_KWARG
 from logger_36.constant.system import MAX_DETAIL_NAME_LENGTH, SYSTEM_DETAILS_AS_DICT
 from logger_36.instance.logger import LOGGER
 from logger_36.task.inspection import Modules
@@ -35,7 +34,6 @@ def LogSystemDetails(
         f"{details}\n"
         f"    {'Python Modules':>{MAX_DETAIL_NAME_LENGTH}}:\n"
         f"{modules}",
-        **HIDE_WHERE_KWARG,
     )
 
 
diff --git a/package/logger_36/config/logger.py b/package/logger_36/config/logger.py
index e0f75587fe76f69f358c1fc1bed0e48f4b438e71..21b64b17ddd535825ffaf3dae28b48d43653fda8 100644
--- a/package/logger_36/config/logger.py
+++ b/package/logger_36/config/logger.py
@@ -12,7 +12,7 @@ from logger_36.catalog.handler.file import file_handler_t
 from logger_36.catalog.handler.generic import generic_handler_t
 from logger_36.constant.handler import HANDLER_CODES, handler_codes_h
 from logger_36.instance.logger import LOGGER
-from logger_36.task.format.message import FormattedMessage
+from logger_36.task.format.message import MessageWithActualExpected
 
 
 def SetLOGLevel(
@@ -48,7 +48,7 @@ def SetLOGLevel(
 
     if not found:
         raise ValueError(
-            FormattedMessage(
+            MessageWithActualExpected(
                 "Handler not found",
                 actual=which,
                 expected=f"{str(HANDLER_CODES)[1:-1]}, or a handler name",
diff --git a/package/logger_36/config/message.py b/package/logger_36/config/message.py
index d71812c90e91d8c8f419f1036ea8c98222a2afe8..bf00b25a3449b23553aea3b04da76612de018814 100644
--- a/package/logger_36/config/message.py
+++ b/package/logger_36/config/message.py
@@ -4,20 +4,19 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
 SEE COPYRIGHT NOTICE BELOW
 """
 
+from datetime import timedelta as time_delta_t
+
 LEVEL_OPENING = "("
 LEVEL_CLOSING = ")"
-MESSAGE_MARKER = "| "
+MESSAGE_MARKER = "|"
 WHERE_SEPARATOR = "@"
 ELAPSED_TIME_SEPARATOR = "+"
-MEMORY_SEPARATOR = ":"
 
 DATE_FORMAT = "%Y-%m-%d"
 TIME_FORMAT = "%H:%M:%S"
-WHERE_FORMAT = f" {WHERE_SEPARATOR} {{module}}:{{funcName}}:{{lineno}}"
-ELAPSED_TIME_FORMAT = f" {ELAPSED_TIME_SEPARATOR}%(elapsed_time)s"
-MEMORY_FORMAT = f" {MEMORY_SEPARATOR}%(memory_usage)s"
+LONG_ENOUGH = time_delta_t(minutes=5)
 
-ACTUAL_PATTERNS: str = r" Actual="
+ACTUAL_PATTERNS: tuple[str] = (r" Actual=",)
 EXPECTED_PATTERNS: str = r" Expected([!<>]?=|: )"
 
 """
diff --git a/package/logger_36/constant/logger.py b/package/logger_36/constant/logger.py
index eeebb75a7465a6251e1be0fd8e5402377aad4ff4..ed630670c84ea65e09cf16c2c5a83dca4f2d2b12 100644
--- a/package/logger_36/constant/logger.py
+++ b/package/logger_36/constant/logger.py
@@ -8,8 +8,6 @@ import logging as lggg
 import re as regx
 import typing as h
 
-from logger_36.constant.record import HIDE_WHERE_ATTR
-
 LOGGER_NAME = "logger-36"
 
 # https://docs.python.org/3/library/logging.html#logging.captureWarnings
@@ -17,8 +15,6 @@ WARNING_LOGGER_NAME = "py.warnings"
 WARNING_TYPE_PATTERN = r"([^:]+):([0-9]+): ([^:]+): ([^\n]+)\n"
 WARNING_TYPE_COMPILED_PATTERN = regx.compile(WARNING_TYPE_PATTERN)
 
-HIDE_WHERE_KWARG = {"extra": {HIDE_WHERE_ATTR: True}}
-
 # Second version: with self as first parameter.
 logger_handle_h = (
     h.Callable[[lggg.LogRecord], None] | h.Callable[[lggg.Logger, lggg.LogRecord], None]
diff --git a/package/logger_36/constant/message.py b/package/logger_36/constant/message.py
index 7cbab994d83c83d1d8e03b7a8b4a57f2b718430c..76f16110cc22661bc23bfad9c4f728e2df97e4c9 100644
--- a/package/logger_36/constant/message.py
+++ b/package/logger_36/constant/message.py
@@ -8,6 +8,7 @@ import time
 import typing as h
 
 from logger_36.config.message import (
+    ELAPSED_TIME_SEPARATOR,
     LEVEL_CLOSING,
     LEVEL_OPENING,
     MESSAGE_MARKER,
@@ -15,9 +16,10 @@ from logger_36.config.message import (
 )
 
 TIME_LENGTH = time.strftime(TIME_FORMAT, time.gmtime(0)).__len__()
+TIME_LENGTH_m_1 = TIME_LENGTH - ELAPSED_TIME_SEPARATOR.__len__()
 LOG_LEVEL_LENGTH = 1 + LEVEL_OPENING.__len__() + LEVEL_CLOSING.__len__()
 CONTEXT_LENGTH = TIME_LENGTH + LOG_LEVEL_LENGTH
-LINE_INDENT = (CONTEXT_LENGTH + MESSAGE_MARKER.__len__() + 1) * " "
+LINE_INDENT = (CONTEXT_LENGTH + MESSAGE_MARKER.__len__() + 2) * " "
 NEXT_LINE_PROLOGUE = "\n" + LINE_INDENT
 
 expected_op_h = h.Literal[":", ": ", "=", "!=", ">=", "<="]
diff --git a/package/logger_36/constant/record.py b/package/logger_36/constant/record.py
index e6f2e30568690c0c866ae9fd1c0707793a10c6a4..cc580243e36c0bf2a58602ee4f3e4e210e6f5edb 100644
--- a/package/logger_36/constant/record.py
+++ b/package/logger_36/constant/record.py
@@ -4,10 +4,9 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
 SEE COPYRIGHT NOTICE BELOW
 """
 
-SHOW_W_RULE_ATTR = "show_w_rule"
-SHOW_WHERE_ATTR = "where"
-HIDE_WHERE_ATTR = "hide_where"
-SHOW_MEMORY_ATTR = "show_memory_usage"
+SHOW_W_RULE_ATTR = "should_show_w_rule"
+STORE_MEMORY_ATTR = "should_store_memory_usage"
+HIDE_WHERE_ATTR = "should_hide_where"
 
 """
 COPYRIGHT NOTICE
diff --git a/package/logger_36/content.py b/package/logger_36/content.py
index 9342291c473dbd72f7c437d243cc297d4c369462..4e82a1609be5908d5098bc35db0f6285f201e02a 100644
--- a/package/logger_36/content.py
+++ b/package/logger_36/content.py
@@ -5,7 +5,7 @@ SEE COPYRIGHT NOTICE BELOW
 """
 
 from logger_36.constant.message import LINE_INDENT
-from logger_36.task.format.message import FormattedMessage
+from logger_36.task.format.message import MessageWithActualExpected
 from logger_36.task.format.rule import Rule, RuleAsText
 
 """
diff --git a/package/logger_36/handler.py b/package/logger_36/handler.py
index cddf27a99b0217c16b7783e693a7cbaa23594484..b493b57da29e2e709acd34fb59e216bdb2642df2 100644
--- a/package/logger_36/handler.py
+++ b/package/logger_36/handler.py
@@ -33,8 +33,7 @@ def AddGenericHandler(
     logger: lggg.Logger | None = None,
     name: str | None = None,
     level: int = lggg.INFO,
-    show_where: bool = True,
-    show_memory_usage: bool = False,
+    should_store_memory_usage: bool = False,
     message_width: int = -1,
     formatter: lggg.Formatter | None = None,
     supports_html: bool = False,
@@ -50,8 +49,7 @@ def AddGenericHandler(
     handler = generic_handler_t(
         name=name,
         level=level,
-        show_where=show_where,
-        show_memory_usage=show_memory_usage,
+        should_store_memory_usage=should_store_memory_usage,
         message_width=message_width,
         formatter=formatter,
         supports_html=supports_html,
@@ -68,8 +66,7 @@ def AddConsoleHandler(
     logger: lggg.Logger | None = None,
     name: str | None = None,
     level: int = lggg.INFO,
-    show_where: bool = True,
-    show_memory_usage: bool = False,
+    should_store_memory_usage: bool = False,
     message_width: int = -1,
     formatter: lggg.Formatter | None = None,
     should_hold_messages: bool = False,
@@ -81,8 +78,7 @@ def AddConsoleHandler(
     handler = console_handler_t(
         name=name,
         level=level,
-        show_where=show_where,
-        show_memory_usage=show_memory_usage,
+        should_store_memory_usage=should_store_memory_usage,
         message_width=message_width,
         formatter=formatter,
     )
@@ -94,8 +90,7 @@ def AddRichConsoleHandler(
     logger: lggg.Logger | None = None,
     name: str | None = None,
     level: int = lggg.INFO,
-    show_where: bool = True,
-    show_memory_usage: bool = False,
+    should_store_memory_usage: bool = False,
     message_width: int = -1,
     formatter: lggg.Formatter | None = None,
     alternating_lines: int = 2,
@@ -125,8 +120,7 @@ def AddRichConsoleHandler(
     handler = console_rich_handler_t(
         name=name,
         level=level,
-        show_where=show_where,
-        show_memory_usage=show_memory_usage,
+        should_store_memory_usage=should_store_memory_usage,
         message_width=message_width,
         formatter=formatter,
         **additional_s,
@@ -141,8 +135,7 @@ def AddFileHandler(
     logger: lggg.Logger | None = None,
     name: str | None = None,
     level: int = lggg.INFO,
-    show_where: bool = True,
-    show_memory_usage: bool = False,
+    should_store_memory_usage: bool = False,
     message_width: int = -1,
     formatter: lggg.Formatter | None = None,
     should_hold_messages: bool = False,
@@ -159,8 +152,7 @@ def AddFileHandler(
     handler = file_handler_t(
         name=name,
         level=level,
-        show_where=show_where,
-        show_memory_usage=show_memory_usage,
+        should_store_memory_usage=should_store_memory_usage,
         message_width=message_width,
         formatter=formatter,
         path=path,
diff --git a/package/logger_36/task/format/memory.py b/package/logger_36/task/format/memory.py
index 1f6cc5364a01a99d65828c964e613805eb69ee22..5c4a433bab74adcf03d5ff02e74a100c8bf2b1d6 100644
--- a/package/logger_36/task/format/memory.py
+++ b/package/logger_36/task/format/memory.py
@@ -5,7 +5,7 @@ SEE COPYRIGHT NOTICE BELOW
 """
 
 from logger_36.constant.memory import STORAGE_UNITS, storage_units_h
-from logger_36.task.format.message import FormattedMessage
+from logger_36.task.format.message import MessageWithActualExpected
 
 _KILO_UNIT = 1000.0
 _MEGA_UNIT = _KILO_UNIT * 1000.0
@@ -41,7 +41,7 @@ def FormattedUsage(
         value, unit = FormattedUsageWithAutoUnit(usage, decimals)
     else:
         raise ValueError(
-            FormattedMessage(
+            MessageWithActualExpected(
                 "Invalid unit", actual=unit, expected=str(STORAGE_UNITS)[1:-1]
             )
         )
diff --git a/package/logger_36/task/format/message.py b/package/logger_36/task/format/message.py
index cff6f75b949cfd0fb3e2fe0c3efce768575de640..89d51233ce6ce672b3a303e7d5abbd2f977758c8 100644
--- a/package/logger_36/task/format/message.py
+++ b/package/logger_36/task/format/message.py
@@ -7,35 +7,11 @@ SEE COPYRIGHT NOTICE BELOW
 import difflib as diff
 import typing as h
 
-from logger_36.config.message import (
-    ELAPSED_TIME_FORMAT,
-    LEVEL_CLOSING,
-    LEVEL_OPENING,
-    MEMORY_FORMAT,
-    MESSAGE_MARKER,
-)
 from logger_36.constant.generic import NOT_PASSED
 from logger_36.constant.message import expected_op_h
 
 
-def MessageFormat(with_where: bool, with_memory_usage: bool, /) -> str:
-    """"""
-    output = [
-        f"%(asctime)s"
-        f"{LEVEL_OPENING}%(level_first_letter)s{LEVEL_CLOSING}\t"
-        f"{MESSAGE_MARKER}%(message)s"
-    ]
-
-    if with_where:
-        output.append("%(where)s")
-    output.append(ELAPSED_TIME_FORMAT)
-    if with_memory_usage:
-        output.append(MEMORY_FORMAT)
-
-    return "".join(output)
-
-
-def FormattedMessage(
+def MessageWithActualExpected(
     message: str,
     /,
     *,
diff --git a/package/logger_36/task/measure/chronos.py b/package/logger_36/task/measure/chronos.py
index 7b35f324966f83fe18e40f7e28d1fd422dd285d7..8c3117bffcd536c8fbe1fc3baa0d5b4428b22e42 100644
--- a/package/logger_36/task/measure/chronos.py
+++ b/package/logger_36/task/measure/chronos.py
@@ -5,25 +5,35 @@ SEE COPYRIGHT NOTICE BELOW
 """
 
 import time
-from datetime import datetime as dttm
+from datetime import datetime as date_time_t
 
 # This module is imported early. Therefore, the current date and time should be close
 # enough to the real start time of the main script.
-_START_DATE_AND_TIME = dttm.now()
+_START_DATE_AND_TIME = date_time_t.now()
 
 
 def TimeStamp(*, precision: str = "microseconds") -> str:
     """"""
-    return dttm.now().isoformat(timespec=precision).replace(".", "-").replace(":", "-")
+    return (
+        date_time_t.now()
+        .isoformat(timespec=precision)
+        .replace(".", "-")
+        .replace(":", "-")
+    )
 
 
-def ElapsedTime() -> str:
+def ElapsedTime(
+    *, should_return_now: bool = False
+) -> str | tuple[str, date_time_t.date]:
     """"""
-    elapsed_seconds = (dttm.now() - _START_DATE_AND_TIME).total_seconds()
-    output = time.strftime("%Hh %Mm %Ss", time.gmtime(elapsed_seconds))
-    while output.startswith("00") and (" " in output):
-        output = output.split(maxsplit=1)[-1]
-
+    now = date_time_t.now()
+    elapsed_seconds = (now - _START_DATE_AND_TIME).total_seconds()
+    output = time.strftime("%H:%M:%S", time.gmtime(elapsed_seconds))
+    while output.startswith("00:"):
+        output = output.split(sep=":", maxsplit=1)[-1]
+
+    if should_return_now:
+        return output, now
     return output
 
 
diff --git a/package/logger_36/type/handler.py b/package/logger_36/type/handler.py
index f8eda8074b134d4f2e1a5d8de5dffbdf3b292b04..57bc279ba8d5f88416dc22c162927b8ece458752 100644
--- a/package/logger_36/type/handler.py
+++ b/package/logger_36/type/handler.py
@@ -8,15 +8,17 @@ import dataclasses as d
 import logging as lggg
 import sys as sstm
 import typing as h
-from os import sep as FOLDER_SEPARATOR
-from pathlib import Path as path_t
 
-from logger_36.config.message import TIME_FORMAT, WHERE_FORMAT
+from logger_36.config.message import (
+    LEVEL_CLOSING,
+    LEVEL_OPENING,
+    MESSAGE_MARKER,
+    WHERE_SEPARATOR,
+)
 from logger_36.constant.error import MEMORY_MEASURE_ERROR
 from logger_36.constant.handler import HANDLER_CODES
 from logger_36.constant.message import NEXT_LINE_PROLOGUE
-from logger_36.constant.record import HIDE_WHERE_ATTR, SHOW_WHERE_ATTR
-from logger_36.task.format.message import FormattedMessage, MessageFormat
+from logger_36.task.format.message import MessageWithActualExpected
 from logger_36.task.measure.chronos import TimeStamp
 from logger_36.task.measure.memory import CanCheckUsage as CanCheckMemoryUsage
 
@@ -26,10 +28,9 @@ _MEMORY_MEASURE_ERROR = MEMORY_MEASURE_ERROR
 @d.dataclass(slots=True, repr=False, eq=False)
 class handler_extension_t:
     name: str | None = None
-    show_where: bool = True
-    show_memory_usage: bool = False
+    should_store_memory_usage: bool = False
     message_width: int = -1
-    FormattedRecord: h.Callable[[lggg.LogRecord], str] = d.field(init=False)
+    MessageFromRecord: h.Callable[..., str] = d.field(init=False)
 
     handler: d.InitVar[lggg.Handler | None] = None
     level: d.InitVar[int] = lggg.NOTSET
@@ -43,7 +44,7 @@ class handler_extension_t:
 
         if self.name in HANDLER_CODES:
             raise ValueError(
-                FormattedMessage(
+                MessageWithActualExpected(
                     "Invalid handler name",
                     actual=self.name,
                     expected=f"a name not in {str(HANDLER_CODES)[1:-1]}",
@@ -53,8 +54,8 @@ class handler_extension_t:
         if self.name is None:
             self.name = TimeStamp()
 
-        if self.show_memory_usage and not CanCheckMemoryUsage():
-            self.show_memory_usage = False
+        if self.should_store_memory_usage and not CanCheckMemoryUsage():
+            self.should_store_memory_usage = False
             if _MEMORY_MEASURE_ERROR is not None:
                 print(_MEMORY_MEASURE_ERROR, file=sstm.stderr)
                 _MEMORY_MEASURE_ERROR = None
@@ -64,85 +65,45 @@ class handler_extension_t:
         if 0 < self.message_width < 5:
             self.message_width = 5
         if formatter is None:
-            message_format = MessageFormat(self.show_where, self.show_memory_usage)
-            formatter = lggg.Formatter(fmt=message_format, datefmt=TIME_FORMAT)
-        handler.setFormatter(formatter)
-        self.FormattedRecord = handler.formatter.format
+            self.MessageFromRecord = self._MessageFromRecord
+        else:
+            handler.setFormatter(formatter)
+            self.MessageFromRecord = handler.formatter.format
 
-    def FormattedLines(
+    def _MessageFromRecord(
         self,
         record: lggg.LogRecord,
         /,
         *,
         PreProcessed: h.Callable[[str], str] | None = None,
-        should_join_lines: bool = False,
-    ) -> tuple[str, str | None]:
+    ) -> str:
         """
         See logger_36.catalog.handler.README.txt.
         """
-        record.level_first_letter = record.levelname[0]
-
         message = record.msg
-        if not isinstance(message, str):
-            message = str(message)
-        original_message = message
 
         if PreProcessed is not None:
             message = PreProcessed(message)
-        if (has_newlines := ("\n" in message)) or (
-            (self.message_width > 0) and (message.__len__() > self.message_width)
-        ):
-            if has_newlines:
-                lines = message.splitlines()
-                if self.message_width > 0:
-                    lines = _WrappedLines(lines, self.message_width)
-            else:
-                lines = _WrappedLines([message], self.message_width)
-            next_lines = NEXT_LINE_PROLOGUE.join(lines[1:])
-            next_lines = f"{NEXT_LINE_PROLOGUE}{next_lines}"
-            message = lines[0]
+        if (self.message_width <= 0) or (message.__len__() <= self.message_width):
+            if "\n" in message:
+                message = NEXT_LINE_PROLOGUE.join(message.splitlines())
         else:
-            next_lines = None
-        if self.message_width > 0:
-            n_missing_s = self.message_width - message.__len__()
-            if n_missing_s > 3:
-                message += " " + (n_missing_s - 1) * "."
-            elif n_missing_s > 0:
-                message += n_missing_s * " "
-
-        record.msg = message
-        if self.show_where and not hasattr(record, SHOW_WHERE_ATTR):
-            hide_where = getattr(record, HIDE_WHERE_ATTR, False)
-            if hide_where:
-                record.where = ""
+            if "\n" in message:
+                lines = _WrappedLines(message.splitlines(), self.message_width)
             else:
-                module = path_t(record.pathname)
-                path_was_found = False
-                for path in sstm.path:
-                    if module.is_relative_to(path):
-                        module = module.relative_to(path)
-                        path_was_found = True
-                        break
-                if path_was_found:
-                    module = str(module.parent / module.stem)
-                    module = module.replace(FOLDER_SEPARATOR, ".")
-                else:
-                    module = record.module
-                record.where = WHERE_FORMAT.format(
-                    module=module, funcName=record.funcName, lineno=record.lineno
-                )
-        first_line = self.FormattedRecord(record).replace("\t", " ")
-
-        # Revert the record message to its original value for subsequent handlers.
-        record.msg = original_message
+                lines = _WrappedLines([message], self.message_width)
+            message = NEXT_LINE_PROLOGUE.join(lines)
 
-        if should_join_lines:
-            if next_lines is None:
-                return first_line, None
-            else:
-                return f"{first_line}{next_lines}", None
+        if (where := getattr(record, "where", None)) is None:
+            where = ""
         else:
-            return first_line, next_lines
+            where = f"{NEXT_LINE_PROLOGUE}{WHERE_SEPARATOR} {where}"
+
+        return (
+            f"{record.when_or_elapsed}"
+            f"{LEVEL_OPENING}{record.level_first_letter}{LEVEL_CLOSING} "
+            f"{MESSAGE_MARKER} {message}{where}"
+        )
 
 
 def _WrappedLines(lines: list[str], message_width: int, /) -> list[str]:
diff --git a/package/logger_36/type/issue.py b/package/logger_36/type/issue.py
index 3decba6ab9f7084dfc6bc331a9da46aca1317d95..e93328a960fccf66a7cc9ef79459fd1cac8c9ac2 100644
--- a/package/logger_36/type/issue.py
+++ b/package/logger_36/type/issue.py
@@ -11,7 +11,7 @@ from logger_36.config.issue import ISSUE_BASE_CONTEXT
 from logger_36.constant.generic import NOT_PASSED
 from logger_36.constant.issue import ISSUE_LEVEL_SEPARATOR
 from logger_36.constant.message import expected_op_h
-from logger_36.task.format.message import FormattedMessage
+from logger_36.task.format.message import MessageWithActualExpected
 
 issue_t = str
 
@@ -32,7 +32,7 @@ def NewIssue(
     """"""
     if context.__len__() == 0:
         context = ISSUE_BASE_CONTEXT
-    message = FormattedMessage(
+    message = MessageWithActualExpected(
         message,
         actual=actual,
         expected=expected,
diff --git a/package/logger_36/type/logger.py b/package/logger_36/type/logger.py
index f0a9da89d63657d3fcdf11bcc24369f60746f3cb..7d8ae2ec03fafd0d14f25aff237e1dedf3c1ccb1 100644
--- a/package/logger_36/type/logger.py
+++ b/package/logger_36/type/logger.py
@@ -10,35 +10,47 @@ import sys as sstm
 import traceback as tcbk
 import types as t
 import typing as h
-from datetime import datetime as dttm
+from datetime import date as date_t
+from datetime import datetime as date_time_t
+from os import sep as FOLDER_SEPARATOR
 from pathlib import Path as path_t
 from traceback import TracebackException as traceback_t
 
 from logger_36.config.issue import ISSUE_CONTEXT_END, ISSUE_CONTEXT_SEPARATOR
-from logger_36.config.message import DATE_FORMAT
+from logger_36.config.message import (
+    DATE_FORMAT,
+    ELAPSED_TIME_SEPARATOR,
+    LONG_ENOUGH,
+    TIME_FORMAT,
+)
 from logger_36.constant.generic import NOT_PASSED
 from logger_36.constant.issue import ISSUE_LEVEL_SEPARATOR, ORDER, order_h
 from logger_36.constant.logger import (
-    HIDE_WHERE_KWARG,
     LOGGER_NAME,
     WARNING_LOGGER_NAME,
     WARNING_TYPE_COMPILED_PATTERN,
     logger_handle_h,
 )
 from logger_36.constant.memory import UNKNOWN_MEMORY_USAGE
-from logger_36.constant.message import expected_op_h
-from logger_36.constant.record import SHOW_MEMORY_ATTR, SHOW_W_RULE_ATTR
-from logger_36.task.format.memory import (
-    FormattedUsageWithAutoUnit as FormattedMemoryUsage,
+from logger_36.constant.message import TIME_LENGTH_m_1, expected_op_h
+from logger_36.constant.record import (
+    HIDE_WHERE_ATTR,
+    SHOW_W_RULE_ATTR,
+    STORE_MEMORY_ATTR,
 )
-from logger_36.task.format.message import FormattedMessage
+from logger_36.task.format.message import MessageWithActualExpected
 from logger_36.task.measure.chronos import ElapsedTime
 from logger_36.task.measure.memory import CurrentUsage as CurrentMemoryUsage
 from logger_36.type.issue import NewIssue, issue_t
 
+logger_base_t = lggg.Logger
+
+_DATE_TIME_ORIGIN = date_time_t.fromtimestamp(1970, None)
+_DATE_ORIGIN = _DATE_TIME_ORIGIN.date()
+
 
 @d.dataclass(slots=True, repr=False, eq=False)
-class logger_t(lggg.Logger):
+class logger_t(logger_base_t):
     name_: d.InitVar[str] = LOGGER_NAME
     level_: d.InitVar[int] = lggg.NOTSET
     activate_wrn_interceptions: d.InitVar[bool] = True
@@ -50,8 +62,9 @@ class logger_t(lggg.Logger):
 
     on_hold: list[lggg.LogRecord] = d.field(init=False, default_factory=list)
     events: dict[int, int] = d.field(init=False, default_factory=dict)
-    last_message_date: str = d.field(init=False, default="")
-    any_handler_shows_memory: bool = d.field(init=False, default=False)
+    last_message_now: date_time_t = d.field(init=False, default=_DATE_TIME_ORIGIN)
+    last_message_date: date_t = d.field(init=False, default=_DATE_ORIGIN)
+    any_handler_stores_memory: bool = d.field(init=False, default=False)
     memory_usages: list[tuple[str, int]] = d.field(init=False, default_factory=list)
     context_levels: list[str] = d.field(init=False, default_factory=list)
     staged_issues: list[issue_t] = d.field(init=False, default_factory=list)
@@ -64,9 +77,9 @@ class logger_t(lggg.Logger):
         self, name_: str, level_: int, activate_wrn_interceptions: bool
     ) -> None:
         """"""
-        lggg.Logger.__init__(self, name_)
+        logger_base_t.__init__(self, name_)
         self.setLevel(level_)
-        self.propagate = False  # Part of lggg.Logger.
+        self.propagate = False  # Part of logger_base_t.
 
         for level in lggg.getLevelNamesMapping().values():
             self.events[level] = 0
@@ -92,7 +105,7 @@ class logger_t(lggg.Logger):
             logger.handle = t.MethodType(_HandleForWarnings(self), logger)
 
             lggg.captureWarnings(True)
-            self.info("Warning Interception: ON", **HIDE_WHERE_KWARG)
+            self.info("Warning Interception: ON")
 
     def _DeactivateWarningInterceptions(self) -> None:
         """"""
@@ -102,7 +115,7 @@ class logger_t(lggg.Logger):
             self.intercepted_wrn_handle = None
 
             lggg.captureWarnings(False)
-            self.info("Warning Interception: OFF", **HIDE_WHERE_KWARG)
+            self.info("Warning Interception: OFF")
 
     def ToggleWarningInterceptions(self, state: bool, /) -> None:
         """"""
@@ -130,16 +143,13 @@ class logger_t(lggg.Logger):
             intercepted = sorted(self.intercepted_log_handles.keys())
             if intercepted.__len__() > 0:
                 as_str = ", ".join(intercepted)
-                self.info(
-                    f"Now Intercepting LOGs from: {as_str}",
-                    **HIDE_WHERE_KWARG,
-                )
+                self.info(f"Now Intercepting LOGs from: {as_str}")
         elif self.intercepted_log_handles.__len__() > 0:
             for name, handle in self.intercepted_log_handles.items():
                 logger = lggg.getLogger(name)
                 logger.handle = handle
             self.intercepted_log_handles.clear()
-            self.info("Log Interception: OFF", **HIDE_WHERE_KWARG)
+            self.info("Log Interception: OFF")
 
     @property
     def max_memory_usage(self) -> int:
@@ -162,15 +172,15 @@ class logger_t(lggg.Logger):
     def AddHandler(self, handler: lggg.Handler, should_hold_messages: bool, /) -> None:
         """"""
         self.should_hold_messages = should_hold_messages
-        lggg.Logger.addHandler(self, handler)
+        logger_base_t.addHandler(self, handler)
 
         extension = getattr(handler, "extension", None)
         if extension is None:
-            show_memory_usage = False
+            should_store_memory_usage = False
         else:
-            show_memory_usage = getattr(extension, SHOW_MEMORY_ATTR, False)
-        if show_memory_usage:
-            self.any_handler_shows_memory = True
+            should_store_memory_usage = getattr(extension, STORE_MEMORY_ATTR, False)
+        if should_store_memory_usage:
+            self.any_handler_stores_memory = True
 
         extension = getattr(handler, "extension", handler.name)
         if isinstance(extension, str):
@@ -180,51 +190,75 @@ class logger_t(lggg.Logger):
         self.info(
             f'New handler "{name}" with class "{type(handler).__name__}" and '
             f"level {lggg.getLevelName(handler.level)}",
-            **HIDE_WHERE_KWARG,
         )
 
     def handle(self, record: lggg.LogRecord, /) -> None:
         """"""
-        if (not self.should_hold_messages) and (self.on_hold.__len__() > 0):
-            for hold in self.on_hold:
-                lggg.Logger.handle(self, hold)
-            self.on_hold.clear()
-
-        record.elapsed_time = ElapsedTime()
+        elapsed_time, now = ElapsedTime(should_return_now=True)
 
-        if self.any_handler_shows_memory or not self.hasHandlers():
-            # Memory usage is also added if there are no handlers yet, just in case.
-            usage = CurrentMemoryUsage()
-            self.memory_usages.append(
-                (f"{record.module}.{record.funcName}.{record.lineno}", usage)
-            )
-
-            value, unit = FormattedMemoryUsage(usage, 1)
-            record.memory_usage = f"{value}{unit}"
+        if (self.on_hold.__len__() > 0) and not self.should_hold_messages:
+            for held in self.on_hold:
+                logger_base_t.handle(self, held)
+            self.on_hold.clear()
 
-        date = dttm.now().strftime(DATE_FORMAT)
-        if date != self.last_message_date:
+        if (date := now.date()) != self.last_message_date:
             self.last_message_date = date
             # levelno: Added for management by logging.Logger.handle.
             date_record = lggg.makeLogRecord(
                 {
                     "name": self.name,
                     "levelno": lggg.INFO,
-                    "msg": f"DATE: {date}",
+                    "msg": f"DATE: {date.strftime(DATE_FORMAT)}",
                     SHOW_W_RULE_ATTR: True,
                 }
             )
             if self.should_hold_messages:
                 self.on_hold.append(date_record)
             else:
-                lggg.Logger.handle(self, date_record)
+                logger_base_t.handle(self, date_record)
+
+        # When.
+        if now - self.last_message_now > LONG_ENOUGH:
+            record.when_or_elapsed = now.strftime(TIME_FORMAT)
+        else:
+            record.when_or_elapsed = (
+                f"{ELAPSED_TIME_SEPARATOR}{elapsed_time:.<{TIME_LENGTH_m_1}}"
+            )
+        self.last_message_now = now
+
+        # Where.
+        # Memory usage is also stored if there are no handlers yet, just in case.
+        should_store_where = self.any_handler_stores_memory or not self.hasHandlers()
+        should_show_where = (record.levelno != lggg.INFO) and not hasattr(
+            record, HIDE_WHERE_ATTR
+        )
+        if should_store_where or should_show_where:
+            module = path_t(record.pathname)
+            for path in sstm.path:
+                if module.is_relative_to(path):
+                    module = module.relative_to(path).with_suffix("")
+                    module = str(module).replace(FOLDER_SEPARATOR, ".")
+                    break
+            else:
+                module = record.module
+            where = f"{module}:{record.funcName}:{record.lineno}"
+            if should_show_where:
+                record.where = where
+        else:
+            where = None
+
+        # How.
+        record.level_first_letter = record.levelname[0]
+
+        # What.
+        if not isinstance(record.msg, str):
+            record.msg = str(record.msg)
 
         if self.should_hold_messages:
             self.on_hold.append(record)
         else:
-            lggg.Logger.handle(self, record)
+            logger_base_t.handle(self, record)
 
-        self.events[record.levelno] += 1
         if (self.exit_on_critical and (record.levelno is lggg.CRITICAL)) or (
             self.exit_on_error and (record.levelno is lggg.ERROR)
         ):
@@ -232,6 +266,11 @@ class logger_t(lggg.Logger):
             # __post_init__ set self.exit_on_critical if self.exit_on_error.
             sstm.exit(1)
 
+        self.events[record.levelno] += 1
+
+        if should_store_where:
+            self.memory_usages.append((where, CurrentMemoryUsage()))
+
     def Log(
         self,
         message: str,
@@ -247,7 +286,7 @@ class logger_t(lggg.Logger):
         """"""
         if isinstance(level, str):
             level = lggg.getLevelNamesMapping()[level.upper()]
-        message = FormattedMessage(
+        message = MessageWithActualExpected(
             message,
             actual=actual,
             expected=expected,
@@ -357,7 +396,7 @@ class logger_t(lggg.Logger):
 
         if order not in ORDER:
             raise ValueError(
-                FormattedMessage(
+                MessageWithActualExpected(
                     "Invalid commit order",
                     actual=order,
                     expected=f"One of {str(ORDER)[1:-1]}",
@@ -379,17 +418,18 @@ class logger_t(lggg.Logger):
             formatted = "\n".join(lines)
         """
 
+        hide_where = {HIDE_WHERE_ATTR: None}
         if unified:
             level, _ = issues[0].split(ISSUE_LEVEL_SEPARATOR, maxsplit=1)
             wo_level = []
             for issue in issues:
                 _, issue = issue.split(ISSUE_LEVEL_SEPARATOR, maxsplit=1)
                 wo_level.append(issue)
-            self.log(int(level), "\n".join(wo_level), stacklevel=2)
+            self.log(int(level), "\n".join(wo_level), stacklevel=2, extra=hide_where)
         else:
             for issue in issues:
                 level, issue = issue.split(ISSUE_LEVEL_SEPARATOR, maxsplit=1)
-                self.log(int(level), issue, stacklevel=2)
+                self.log(int(level), issue, stacklevel=2, extra=hide_where)
         self.staged_issues.clear()
 
     def __enter__(self) -> None:
@@ -408,10 +448,10 @@ class logger_t(lggg.Logger):
         return False
 
 
-def _HandleForWarnings(interceptor: lggg.Logger, /) -> logger_handle_h:
+def _HandleForWarnings(interceptor: logger_base_t, /) -> logger_handle_h:
     """"""
 
-    def handle_p(_: lggg.Logger, record: lggg.LogRecord, /) -> None:
+    def handle_p(_: logger_base_t, record: lggg.LogRecord, /) -> None:
         pieces = WARNING_TYPE_COMPILED_PATTERN.match(record.msg)
         if pieces is None:
             # The warning message does not follow the default format.
@@ -437,11 +477,11 @@ def _HandleForWarnings(interceptor: lggg.Logger, /) -> logger_handle_h:
 
 
 def _HandleForInterceptions(
-    intercepted: lggg.Logger, interceptor: lggg.Logger, /
+    intercepted: logger_base_t, interceptor: logger_base_t, /
 ) -> logger_handle_h:
     """"""
 
-    def handle_p(_: lggg.Logger, record: lggg.LogRecord, /) -> None:
+    def handle_p(_: logger_base_t, record: lggg.LogRecord, /) -> None:
         duplicate = lggg.makeLogRecord(record.__dict__)
         duplicate.msg = f"{record.msg} :{intercepted.name}:"
         interceptor.handle(duplicate)
diff --git a/package/logger_36/version.py b/package/logger_36/version.py
index caafadc7a17be50ad3997769abf18aec945d6dbe..a5156b48b9109b0599c961e5540c0c46190b3796 100644
--- a/package/logger_36/version.py
+++ b/package/logger_36/version.py
@@ -4,7 +4,7 @@ Contributor(s): Eric Debreuve (eric.debreuve@cnrs.fr) since 2023
 SEE COPYRIGHT NOTICE BELOW
 """
 
-__version__ = "2024.28"
+__version__ = "2024.29"
 
 """
 COPYRIGHT NOTICE
diff --git a/test/main.py b/test/main.py
index bdcfaeeddbf0509e1c7d89ece214bd8572764f7d..9650bf48419ce1c127ccd2bfd68360cf3ee6320d 100644
--- a/test/main.py
+++ b/test/main.py
@@ -52,7 +52,7 @@ with TemporaryDirectory() as tmp_folder:
 
     AddRichConsoleHandler(
         level=lggg.DEBUG,
-        show_memory_usage=True,
+        should_store_memory_usage=True,
         should_hold_messages=True,
         should_record=True,
         alternating_lines=1,
@@ -62,7 +62,7 @@ with TemporaryDirectory() as tmp_folder:
         message_width=80,
         should_hold_messages=True,
     )
-    AddFileHandler(tmp_file, show_memory_usage=True)  # Level=lggg.INFO.
+    AddFileHandler(tmp_file, should_store_memory_usage=True)  # Level=lggg.INFO.
     LOGGER.ToggleLogInterceptions(True)
 
     LogSystemDetails()