diff --git a/include/abg-comparison.h b/include/abg-comparison.h
index 78e4102e..f5169aeb 100644
--- a/include/abg-comparison.h
+++ b/include/abg-comparison.h
@@ -1716,6 +1716,9 @@ public:
   const base_diff_sptrs_type&
   changed_bases();
 
+  const vector<class_decl::base_spec_sptr>&
+  moved_bases() const;
+
   virtual bool
   has_changes() const;
 
diff --git a/src/abg-comparison-priv.h b/src/abg-comparison-priv.h
index ef271d8b..0953d567 100644
--- a/src/abg-comparison-priv.h
+++ b/src/abg-comparison-priv.h
@@ -613,6 +613,7 @@ struct class_diff::priv
   class_decl::base_specs sorted_inserted_bases_;
   string_base_diff_sptr_map changed_bases_;
   base_diff_sptrs_type sorted_changed_bases_;
+  vector<class_decl::base_spec_sptr> moved_bases_;
 
   class_decl::base_spec_sptr
   base_has_changed(class_decl::base_spec_sptr) const;
diff --git a/src/abg-comparison.cc b/src/abg-comparison.cc
index 2ce3f5d4..1313e8fd 100644
--- a/src/abg-comparison.cc
+++ b/src/abg-comparison.cc
@@ -5217,6 +5217,11 @@ class_diff::ensure_lookup_tables_populated(void) const
 		if (j->second != b)
 		  get_priv()->changed_bases_[name] =
 		    compute_diff(j->second, b, context());
+		else
+		  // The base class changed place.  IOW, the base
+		  // classes got re-arranged.  Let's keep track of the
+		  // base classes that moved.
+		  get_priv()->moved_bases_.push_back(b);
 		get_priv()->deleted_bases_.erase(j);
 	      }
 	    else
@@ -5547,6 +5552,16 @@ const base_diff_sptrs_type&
 class_diff::changed_bases()
 {return get_priv()->sorted_changed_bases_;}
 
+/// Getter for the vector of bases that "moved".
+/// That is, the vector of base types which position changed.  If this
+/// vector is not empty, it means the bases of the underlying class
+/// type got re-ordered.
+///
+/// @return the vector of bases that moved.
+const vector<class_decl::base_spec_sptr>&
+class_diff::moved_bases() const
+{return get_priv()->moved_bases_;}
+
 /// @return the edit script of the bases of the two classes.
 edit_script&
 class_diff::base_changes()
diff --git a/src/abg-default-reporter.cc b/src/abg-default-reporter.cc
index a5cebef4..909d1de4 100644
--- a/src/abg-default-reporter.cc
+++ b/src/abg-default-reporter.cc
@@ -1348,6 +1348,9 @@ default_reporter::report(const class_diff& d, ostream& out,
 	      out << "\n";
 	    }
 	}
+
+      // Report base classes re-organisation
+      maybe_report_base_class_reordering(d, out, indent);
     }
 
   d.class_or_union_diff::report(out, indent);
diff --git a/src/abg-leaf-reporter.cc b/src/abg-leaf-reporter.cc
index 07391720..79b0286b 100644
--- a/src/abg-leaf-reporter.cc
+++ b/src/abg-leaf-reporter.cc
@@ -691,6 +691,8 @@ leaf_reporter::report(const class_diff& d,
 
   d.class_or_union_diff::report(out, indent);
 
+  maybe_report_base_class_reordering(d, out, indent);
+
   maybe_report_interfaces_impacted_by_diff(&d, out, indent);
 
   d.reported_once(true);
diff --git a/src/abg-reporter-priv.cc b/src/abg-reporter-priv.cc
index 7012f5dc..06145a1b 100644
--- a/src/abg-reporter-priv.cc
+++ b/src/abg-reporter-priv.cc
@@ -1451,5 +1451,53 @@ maybe_report_data_members_replaced_by_anon_dm(const class_or_union_diff &d,
     }
 }
 
+/// Report about the base classes of a class having been re-ordered.
+///
+/// @param d the class diff to consider.
+///
+/// @param out the output stream to report the change to.
+///
+/// @param indent the indentation string to use.
+void
+maybe_report_base_class_reordering(const class_diff	&d,
+				   ostream		&out,
+				   const string	&indent)
+{
+  if (d.moved_bases().empty())
+    return;
+
+  class_decl_sptr first = d.first_class_decl(),
+    second = d.second_class_decl();
+
+  ABG_ASSERT(!first->get_base_specifiers().empty());
+  ABG_ASSERT(!second->get_base_specifiers().empty());
+
+  out << indent << "base classes of '"
+      << first->get_pretty_representation()
+      << "' are re-ordered from: ";
+
+  vector<class_decl_sptr> classes = {first, second};
+  unsigned nb_classes_seen = 0;
+  for (auto &klass : classes)
+    {
+      if (nb_classes_seen >= 1)
+	out << " to: ";
+      out << "'";
+      bool needs_comma = false;
+      for (auto &b : klass->get_base_specifiers())
+	{
+	  if (needs_comma)
+	    out << ", ";
+	  if (b->get_is_virtual())
+	    out << "virtual ";
+	  out << b->get_base_class()->get_qualified_name();
+	  needs_comma = true;
+	}
+      out << "'";
+      nb_classes_seen++;
+    }
+  if (nb_classes_seen)
+    out << "\n";
+}
 } // Namespace comparison
 } // end namespace abigail
diff --git a/src/abg-reporter-priv.h b/src/abg-reporter-priv.h
index a7c4878c..42425ef2 100644
--- a/src/abg-reporter-priv.h
+++ b/src/abg-reporter-priv.h
@@ -241,6 +241,10 @@ maybe_report_data_members_replaced_by_anon_dm(const class_or_union_diff &d,
 					      const string		indent);
 
 
+void
+maybe_report_base_class_reordering(const class_diff	&d,
+				   ostream		&out,
+				   const string	&indent);
 } // end namespace comparison
 } // end namespace abigail
 
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index ee23aff6..a0c086d9 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -98,12 +98,16 @@ test-abidiff/test-PR27985-v0.o.abi	 \
 test-abidiff/test-PR27985-v1.c		 \
 test-abidiff/test-PR27985-v1.o		 \
 test-abidiff/test-PR27985-v1.o.abi	 \
+test-abidiff/test-PR27616-squished-v0.abi \
+test-abidiff/test-PR27616-squished-v1.abi \
+test-abidiff/test-PR27616-v0.xml \
+test-abidiff/test-PR27616-v1.xml \
+\
 test-abidiff-exit/test-PR28316-v0.cc     \
 test-abidiff-exit/test-PR28316-v1.cc     \
 test-abidiff-exit/test-PR28316-v0.o      \
 test-abidiff-exit/test-PR28316-v1.o      \
 test-abidiff-exit/test-PR28316-report.txt \
-\
 test-abidiff-exit/test1-voffset-change-report0.txt \
 test-abidiff-exit/test1-voffset-change-report1.txt \
 test-abidiff-exit/test1-voffset-change.abignore \
@@ -218,10 +222,12 @@ test-abidiff-exit/test-crc-v1.abi \
 test-abidiff-exit/test-missing-alias-report.txt \
 test-abidiff-exit/test-missing-alias.abi \
 test-abidiff-exit/test-missing-alias.suppr \
-test-abidiff/test-PR27616-squished-v0.abi \
-test-abidiff/test-PR27616-squished-v1.abi \
-test-abidiff/test-PR27616-v0.xml \
-test-abidiff/test-PR27616-v1.xml \
+test-abidiff-exit/test-PR29144-report-2.txt \
+test-abidiff-exit/test-PR29144-report.txt \
+test-abidiff-exit/test-PR29144-v0.cc \
+test-abidiff-exit/test-PR29144-v0.o \
+test-abidiff-exit/test-PR29144-v1.cc \
+test-abidiff-exit/test-PR29144-v1.o \
 \
 test-diff-dwarf/test0-v0.cc		\
 test-diff-dwarf/test0-v0.o			\
diff --git a/tests/data/test-abidiff-exit/test-PR29144-report-2.txt b/tests/data/test-abidiff-exit/test-PR29144-report-2.txt
new file mode 100644
index 00000000..3aff12d4
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-PR29144-report-2.txt
@@ -0,0 +1,8 @@
+Leaf changes summary: 1 artifact changed
+Changed leaf types summary: 1 leaf type changed
+Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+'struct D at 1.cc:13:1' changed:
+  type size hasn't changed
+  base classes of 'struct D' are re-ordered from: 'A, B, C' to: 'B, A, C'
diff --git a/tests/data/test-abidiff-exit/test-PR29144-report.txt b/tests/data/test-abidiff-exit/test-PR29144-report.txt
new file mode 100644
index 00000000..88c78fdf
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-PR29144-report.txt
@@ -0,0 +1,10 @@
+Functions changes summary: 0 Removed, 0 Changed, 0 Added function
+Variables changes summary: 0 Removed, 1 Changed, 0 Added variable
+
+1 Changed variable:
+
+  [C] 'D order' was changed at 2.cc:17:1:
+    type of variable changed:
+      type size hasn't changed
+      base classes of 'struct D' are re-ordered from: 'A, B, C' to: 'B, A, C'
+
diff --git a/tests/data/test-abidiff-exit/test-PR29144-v0.cc b/tests/data/test-abidiff-exit/test-PR29144-v0.cc
new file mode 100644
index 00000000..8805cfd9
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-PR29144-v0.cc
@@ -0,0 +1,17 @@
+struct A {
+  int x;
+};
+
+struct B {
+  int y;
+};
+
+struct C {
+  int z;
+};
+
+struct D: A, B, C {
+  int d;
+};
+
+D order;
diff --git a/tests/data/test-abidiff-exit/test-PR29144-v0.o b/tests/data/test-abidiff-exit/test-PR29144-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..2964a6802a82dbcbcaad22cb5a6be6de85804576
GIT binary patch
diff --git a/tests/data/test-abidiff-exit/test-PR29144-v1.cc b/tests/data/test-abidiff-exit/test-PR29144-v1.cc
new file mode 100644
index 00000000..eb476828
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-PR29144-v1.cc
@@ -0,0 +1,18 @@
+struct A {
+  int x;
+};
+
+struct B {
+  int y;
+};
+
+struct C {
+  int z;
+};
+
+struct D: B, A, C {
+  int d;
+};
+
+D order;
+
diff --git a/tests/data/test-abidiff-exit/test-PR29144-v1.o b/tests/data/test-abidiff-exit/test-PR29144-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..03eb7a91c2c5768af8fab0e3eca907ddd481d8f2
GIT binary patch
diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
index 15acfed9..4932d949 100644
--- a/tests/test-abidiff-exit.cc
+++ b/tests/test-abidiff-exit.cc
@@ -427,6 +427,28 @@ InOutSpec in_out_specs[] =
     "data/test-abidiff-exit/test-PR28316-report.txt",
     "output/test-abidiff-exit/test-PR28316-report.txt"
   },
+  {
+    "data/test-abidiff-exit/test-PR29144-v0.o",
+    "data/test-abidiff-exit/test-PR29144-v1.o",
+    "",
+    "",
+    "",
+    "--no-default-suppression --harmless",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/test-PR29144-report.txt",
+    "output/test-abidiff-exit/test-PR29144-report.txt"
+  },
+  {
+    "data/test-abidiff-exit/test-PR29144-v0.o",
+    "data/test-abidiff-exit/test-PR29144-v1.o",
+    "",
+    "",
+    "",
+    "--leaf-changes-only --no-default-suppression --harmless",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE,
+    "data/test-abidiff-exit/test-PR29144-report-2.txt",
+    "output/test-abidiff-exit/test-PR29144-report-2.txt"
+  },
   {0, 0, 0 ,0, 0, 0, abigail::tools_utils::ABIDIFF_OK, 0, 0}
 };
 
