diff --git a/tasks/main.yaml b/tasks/main.yaml
index f53b4becbd0275d17af260a803803aeb140bfa93..b775c93f308293e1b15be3dac6d3f7b66c546228 100644
--- a/tasks/main.yaml
+++ b/tasks/main.yaml
@@ -2,7 +2,7 @@
 
 # We need to make sure dtoverlay is set to any non-empty value
 - name: Check if 'dtoverlay' is already set
-  shell: grep "^dtoverlay=." /boot/config.txt
+  shell: grep -E "^dtoverlay *=.+" /boot/config.txt
   register: check_dtoverlay
   failed_when: check_dtoverlay.rc == 2
   changed_when: false
@@ -12,21 +12,28 @@
   lineinfile:
     dest: /boot/config.txt
     line: dtoverlay=i2c-rtc,ds3231
-  when: check_dtoverlay.rc == 1
+  when: (check_dtoverlay.rc is defined) and (check_dtoverlay.rc == 1)
 
-# If dtoverlay is set, but doesn't contain i2c-rtc, prepend it to the beginning
-- name: "Configure the 'dtoverlay' for i2c-rtc"
-  replace:
-    dest: /boot/config.txt
-    regexp: '^dtoverlay=((?!.*i2c-rtc).+)'
-    replace: 'dtoverlay=i2c-rtc,\1'
+# Get the existing dtoverlay value if it is set
+- name: Get current 'dtoverlay' value
+  shell: tac /boot/config.txt \
+    | grep -E -m 1 '^dtoverlay *=.+' \
+    | tr -d '[:space:]' \
+    | cut -d = -f 2 \
+    | sed -r "s/i2c-rtc//g; s/ds3231//g; s/^,+//g; s/,+$//g" \
+    | tr -s ,
+  register: dtoverlay
+  when: check_dtoverlay|success
+  changed_when: false
 
-# If dtoverlay is set, but doesn't contain ds3231, append it to the end
-- name: "Configure the 'dtoverlay' for ds3231"
-  replace:
+# Set a new dtoverlay with i2c-rtc and ds3231 prepended
+- name: Update 'dtoverlay' to include 'i2c-rtc' and 'ds3231'
+  lineinfile:
     dest: /boot/config.txt
-    regexp: '^dtoverlay=((?!.*ds3231).*i2c-rtc.*)'
-    replace: 'dtoverlay=\1,ds3231'
+    line: dtoverlay=i2c-rtc,ds3231,{{ dtoverlay.stdout }}
+  when: (check_dtoverlay|success)
+    and (dtoverlay|success)
+    and (dtoverlay.stdout is defined and dtoverlay.stdout != '')
 
 ...
 # vi: set ts=2 sts=2 sw=2 et ft=yaml: