diff --git a/src/abg-default-reporter.cc b/src/abg-default-reporter.cc
index 1c39b3b2..2754da4b 100644
--- a/src/abg-default-reporter.cc
+++ b/src/abg-default-reporter.cc
@@ -894,7 +894,6 @@ default_reporter::report(const class_or_union_diff& d,
       if (numdels)
 	report_mem_header(out, numdels, num_filtered, del_kind,
 			  "member function", indent);
-      bool emitted = false;
       for (string_member_function_sptr_map::const_iterator i =
 	     d.get_priv()->deleted_member_functions_.begin();
 	   i != d.get_priv()->deleted_member_functions_.end();
@@ -905,16 +904,10 @@ default_reporter::report(const class_or_union_diff& d,
 	      && !get_member_function_is_virtual(i->second))
 	    continue;
 
-	  if (emitted
-	      && i != d.get_priv()->deleted_member_functions_.begin())
-	    out << "\n";
 	  method_decl_sptr mem_fun = i->second;
 	  out << indent << "  ";
 	  represent(*ctxt, mem_fun, out);
-	  emitted = true;
 	}
-      if (emitted)
-	out << "\n";
 
       // report insertions;
       int numins = d.get_priv()->inserted_member_functions_.size();
@@ -922,7 +915,6 @@ default_reporter::report(const class_or_union_diff& d,
       if (numins)
 	report_mem_header(out, numins, num_filtered, ins_kind,
 			  "member function", indent);
-      emitted = false;
       for (string_member_function_sptr_map::const_iterator i =
 	     d.get_priv()->inserted_member_functions_.begin();
 	   i != d.get_priv()->inserted_member_functions_.end();
@@ -933,16 +925,10 @@ default_reporter::report(const class_or_union_diff& d,
 	      && !get_member_function_is_virtual(i->second))
 	    continue;
 
-	  if (emitted
-	      && i != d.get_priv()->inserted_member_functions_.begin())
-	    out << "\n";
 	  method_decl_sptr mem_fun = i->second;
 	  out << indent << "  ";
 	  represent(*ctxt, mem_fun, out);
-	  emitted = true;
 	}
-      if (emitted)
-	out << "\n";
 
       // report member function with sub-types changes
       int numchanges = d.get_priv()->sorted_changed_member_functions_.size();
@@ -950,7 +936,6 @@ default_reporter::report(const class_or_union_diff& d,
       if (numchanges)
 	report_mem_header(out, numchanges, num_filtered, change_kind,
 			  "member function", indent);
-      emitted = false;
       for (function_decl_diff_sptrs_type::const_iterator i =
 	     d.get_priv()->sorted_changed_member_functions_.begin();
 	   i != d.get_priv()->sorted_changed_member_functions_.end();
@@ -970,15 +955,9 @@ default_reporter::report(const class_or_union_diff& d,
 
 	  string repr =
 	    (*i)->first_function_decl()->get_pretty_representation();
-	  if (emitted
-	      && i != d.get_priv()->sorted_changed_member_functions_.begin())
-	    out << "\n";
 	  out << indent << "  '" << repr << "' has some sub-type changes:\n";
 	  diff->report(out, indent + "    ");
-	  emitted = true;
 	}
-      if (emitted)
-	out << "\n";
     }
 
   // data members
@@ -1090,14 +1069,12 @@ default_reporter::report(const class_or_union_diff& d,
 	       i != d.class_or_union_diff::get_priv()->deleted_member_types_.end();
 	       ++i)
 	    {
-	      if (i != d.class_or_union_diff::get_priv()->deleted_member_types_.begin())
-		out << "\n";
 	      decl_base_sptr mem_type = i->second;
 	      out << indent << "  '"
 		  << mem_type->get_pretty_representation()
-		  << "'";
+		  << "'\n";
 	    }
-	  out << "\n\n";
+	  out << "\n";
 	}
       // report changes
       if (numchanges)
@@ -1135,7 +1112,6 @@ default_reporter::report(const class_or_union_diff& d,
 	  report_mem_header(out, numins, 0, ins_kind,
 			    "member type", indent);
 
-	  bool emitted = false;
 	  for (vector<insertion>::const_iterator i = e.insertions().begin();
 	       i != e.insertions().end();
 	       ++i)
@@ -1146,8 +1122,6 @@ default_reporter::report(const class_or_union_diff& d,
 		   j != i->inserted_indexes().end();
 		   ++j)
 		{
-		  if (emitted)
-		    out << "\n";
 		  mem_type = second->get_member_types()[*j];
 		  if (!d.class_or_union_diff::get_priv()->
 		      member_type_has_changed(get_type_declaration(mem_type)))
@@ -1155,12 +1129,11 @@ default_reporter::report(const class_or_union_diff& d,
 		      out << indent << "  '"
 			  << get_type_declaration(mem_type)->
 			get_pretty_representation()
-			  << "'";
-		      emitted = true;
+			  << "'\n";
 		    }
 		}
 	    }
-	  out << "\n\n";
+	  out << "\n";
 	}
     }
 
@@ -1176,23 +1149,18 @@ default_reporter::report(const class_or_union_diff& d,
 	   i != e.deletions().end();
 	   ++i)
 	{
-	  if (i != e.deletions().begin())
-	    out << "\n";
 	  member_function_template_sptr mem_fn_tmpl =
 	    first->get_member_function_templates()[i->index()];
 	  out << indent << "  '"
 	      << mem_fn_tmpl->as_function_tdecl()->get_pretty_representation()
-	      << "'";
+	      << "'\n";
 	}
-      if (numdels)
-	out << "\n\n";
 
       // report insertions
       int numins = e.num_insertions();
       if (numins)
 	report_mem_header(out, numins, 0, ins_kind,
 			  "member function template", indent);
-      bool emitted = false;
       for (vector<insertion>::const_iterator i = e.insertions().begin();
 	   i != e.insertions().end();
 	   ++i)
@@ -1203,18 +1171,13 @@ default_reporter::report(const class_or_union_diff& d,
 	       j != i->inserted_indexes().end();
 	       ++j)
 	    {
-	      if (emitted)
-		out << "\n";
 	      mem_fn_tmpl = second->get_member_function_templates()[*j];
 	      out << indent << "  '"
 		  << mem_fn_tmpl->as_function_tdecl()->
 		get_pretty_representation()
-		  << "'";
-	      emitted = true;
+		  << "'\n";
 	    }
 	}
-      if (numins)
-	out << "\n\n";
     }
 
   // member class templates.
@@ -1229,23 +1192,18 @@ default_reporter::report(const class_or_union_diff& d,
 	   i != e.deletions().end();
 	   ++i)
 	{
-	  if (i != e.deletions().begin())
-	    out << "\n";
 	  member_class_template_sptr mem_cls_tmpl =
 	    first->get_member_class_templates()[i->index()];
 	  out << indent << "  '"
 	      << mem_cls_tmpl->as_class_tdecl()->get_pretty_representation()
-	      << "'";
+	      << "'\n";
 	}
-      if (numdels)
-	out << "\n\n";
 
       // report insertions
       int numins = e.num_insertions();
       if (numins)
 	report_mem_header(out, numins, 0, ins_kind,
 			  "member class template", indent);
-      bool emitted = false;
       for (vector<insertion>::const_iterator i = e.insertions().begin();
 	   i != e.insertions().end();
 	   ++i)
@@ -1256,18 +1214,13 @@ default_reporter::report(const class_or_union_diff& d,
 	       j != i->inserted_indexes().end();
 	       ++j)
 	    {
-	      if (emitted)
-		out << "\n";
 	      mem_cls_tmpl = second->get_member_class_templates()[*j];
 	      out << indent << "  '"
 		  << mem_cls_tmpl->as_class_tdecl()
 		->get_pretty_representation()
-		  << "'";
-	      emitted = true;
+		  << "'\n";
 	    }
 	}
-      if (numins)
-	out << "\n\n";
     }
 }
 
diff --git a/src/abg-leaf-reporter.cc b/src/abg-leaf-reporter.cc
index 77569d2c..a3c96432 100644
--- a/src/abg-leaf-reporter.cc
+++ b/src/abg-leaf-reporter.cc
@@ -489,7 +489,6 @@ leaf_reporter::report(const class_or_union_diff& d,
       if (numdels)
 	report_mem_header(out, numdels, num_filtered, del_kind,
 			  "member function", indent);
-      bool emitted = false;
       for (string_member_function_sptr_map::const_iterator i =
 	     d.get_priv()->deleted_member_functions_.begin();
 	   i != d.get_priv()->deleted_member_functions_.end();
@@ -500,16 +499,10 @@ leaf_reporter::report(const class_or_union_diff& d,
 	      && !get_member_function_is_virtual(i->second))
 	    continue;
 
-	  if (emitted
-	      && i != d.get_priv()->deleted_member_functions_.begin())
-	    out << "\n";
 	  method_decl_sptr mem_fun = i->second;
 	  out << indent << "  ";
 	  represent(*ctxt, mem_fun, out);
-	  emitted = true;
 	}
-      if (emitted)
-	out << "\n";
 
       // report insertions;
       int numins = d.get_priv()->inserted_member_functions_.size();
@@ -517,7 +510,6 @@ leaf_reporter::report(const class_or_union_diff& d,
       if (numins)
 	report_mem_header(out, numins, num_filtered, ins_kind,
 			  "member function", indent);
-      emitted = false;
       for (string_member_function_sptr_map::const_iterator i =
 	     d.get_priv()->inserted_member_functions_.begin();
 	   i != d.get_priv()->inserted_member_functions_.end();
@@ -528,22 +520,15 @@ leaf_reporter::report(const class_or_union_diff& d,
 	      && !get_member_function_is_virtual(i->second))
 	    continue;
 
-	  if (emitted
-	      && i != d.get_priv()->inserted_member_functions_.begin())
-	    out << "\n";
 	  method_decl_sptr mem_fun = i->second;
 	  out << indent << "  ";
 	  represent(*ctxt, mem_fun, out);
-	  emitted = true;
 	}
-      if (emitted)
-	out << "\n";
 
       // report member function with sub-types changes
       int numchanges = d.get_priv()->sorted_changed_member_functions_.size();
       if (numchanges)
 	report_mem_header(out, change_kind, "member function", indent);
-      emitted = false;
       for (function_decl_diff_sptrs_type::const_iterator i =
 	     d.get_priv()->sorted_changed_member_functions_.begin();
 	   i != d.get_priv()->sorted_changed_member_functions_.end();
@@ -563,15 +548,9 @@ leaf_reporter::report(const class_or_union_diff& d,
 
 	  string repr =
 	    (*i)->first_function_decl()->get_pretty_representation();
-	  if (emitted
-	      && i != d.get_priv()->sorted_changed_member_functions_.begin())
-	    out << "\n";
 	  out << indent << "  '" << repr << "' has some changes:\n";
 	  diff->report(out, indent + "    ");
-	  emitted = true;
 	}
-      if (numchanges)
-	out << "\n";
     }
 
   // data members
diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am
index 6d4e2faa..277f5721 100644
--- a/tests/data/Makefile.am
+++ b/tests/data/Makefile.am
@@ -135,6 +135,11 @@ test-abidiff-exit/test-leaf-peeling-v0.o \
 test-abidiff-exit/test-leaf-peeling-v1.cc \
 test-abidiff-exit/test-leaf-peeling-v1.o \
 test-abidiff-exit/test-leaf-peeling-report.txt \
+test-abidiff-exit/test-leaf-cxx-members-v0.cc \
+test-abidiff-exit/test-leaf-cxx-members-v0.o \
+test-abidiff-exit/test-leaf-cxx-members-v1.cc \
+test-abidiff-exit/test-leaf-cxx-members-v1.o \
+test-abidiff-exit/test-leaf-cxx-members-report.txt \
 \
 test-diff-dwarf/test0-v0.cc		\
 test-diff-dwarf/test0-v0.o			\
diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt b/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
new file mode 100644
index 00000000..082db83e
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-leaf-cxx-members-report.txt
@@ -0,0 +1,42 @@
+Leaf changes summary: 4 artifacts changed
+Changed leaf types summary: 1 leaf type changed
+Removed/Changed/Added functions summary: 1 Removed, 1 Changed, 1 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 Removed function:
+
+  [D] 'method virtual int ops::deleted_fn()'    {_ZN3ops10deleted_fnEv}
+    note that this removes an entry from the vtable of struct ops
+
+1 Added function:
+
+  [A] 'method virtual long int ops::added_fn()'    {_ZN3ops8added_fnEv}
+    note that this adds a new entry to the vtable of struct ops
+
+1 function with some sub-type change:
+
+  [C] 'method virtual int ops::changed_fn()' at test-leaf-cxx-members-v1.cc:6:1 has some sub-type changes:
+    return type changed:
+      type name changed from 'int' to 'long int'
+      type size changed from 32 to 64 (in bits)
+
+'struct ops at test-leaf-cxx-members-v0.cc:1:1' changed:
+  type size changed from 128 to 192 (in bits)
+  1 member function deletion:
+    'method virtual int ops::deleted_fn()' at test-leaf-cxx-members-v0.cc:3:1, virtual at voffset 0/1    {_ZN3ops10deleted_fnEv}
+  1 member function insertion:
+    'method virtual long int ops::added_fn()' at test-leaf-cxx-members-v1.cc:3:1, virtual at voffset 0/1    {_ZN3ops8added_fnEv}
+  there are member function changes:
+    'method virtual int ops::changed_fn()' has some changes:
+      return type changed:
+        type name changed from 'int' to 'long int'
+        type size changed from 32 to 64 (in bits)
+  there are data member changes:
+    type 'int' of 'ops::deleted_var' changed:
+      type name changed from 'int' to 'long int'
+      type size changed from 32 to 64 (in bits)
+    and name of 'ops::deleted_var' changed to 'ops::added_var' at test-leaf-cxx-members-v1.cc:2:1, size changed from 32 to 64 (in bits) (by +32 bits)
+    type 'int' of 'ops::changed_var' changed:
+      type name changed from 'int' to 'long int'
+      type size changed from 32 to 64 (in bits)
+    and offset changed from 96 to 128 (in bits) (by +32 bits), size changed from 32 to 64 (in bits) (by +32 bits)
diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-v0.cc b/tests/data/test-abidiff-exit/test-leaf-cxx-members-v0.cc
new file mode 100644
index 00000000..89612562
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-leaf-cxx-members-v0.cc
@@ -0,0 +1,12 @@
+struct ops {
+  int deleted_var;
+  virtual int deleted_fn() { return 0; }
+
+  int changed_var;
+  virtual int changed_fn() { return 0; }
+};
+
+void reg(ops& x) {
+  ops instantiate = x;
+  (void) instantiate;
+}
diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-v0.o b/tests/data/test-abidiff-exit/test-leaf-cxx-members-v0.o
new file mode 100644
index 0000000000000000000000000000000000000000..8202ecb5dd7cb2bbe79a0a2f3ff42a103f56387c
GIT binary patch
diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-v1.cc b/tests/data/test-abidiff-exit/test-leaf-cxx-members-v1.cc
new file mode 100644
index 00000000..0437584e
--- /dev/null
+++ b/tests/data/test-abidiff-exit/test-leaf-cxx-members-v1.cc
@@ -0,0 +1,14 @@
+struct ops {
+  // TODO: type, name and size are differnent from deleted_var, but this is
+  // still reported as a change rather than a deletion and an addition.
+  long added_var;
+  virtual long added_fn() { return 0; }
+
+  long changed_var;
+  virtual long changed_fn() { return 0; }
+};
+
+void reg(ops& x) {
+  ops instantiate = x;
+  (void) instantiate;
+}
diff --git a/tests/data/test-abidiff-exit/test-leaf-cxx-members-v1.o b/tests/data/test-abidiff-exit/test-leaf-cxx-members-v1.o
new file mode 100644
index 0000000000000000000000000000000000000000..617ffd21551b158227af04c6e601ebc5a12e6b9b
GIT binary patch
diff --git a/tests/data/test-abidiff/test-struct1-report.txt b/tests/data/test-abidiff/test-struct1-report.txt
index 1300d96c..fe5064c6 100644
--- a/tests/data/test-abidiff/test-struct1-report.txt
+++ b/tests/data/test-abidiff/test-struct1-report.txt
@@ -3,7 +3,6 @@
     type size changed from 192 to 256 (in bits)
     1 member function insertion:
       'method virtual int s0::foo(int, char) const', virtual at voffset 2/2
-
     1 data member deletion:
       'char s0::m1', at offset 96 (in bits)
     1 data member insertion:
diff --git a/tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt b/tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt
index d88db9c4..78f91a58 100644
--- a/tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt
+++ b/tests/data/test-diff-dwarf/test41-PR20476-hidden-report-0.txt
@@ -9,10 +9,8 @@ Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
         type size hasn't changed
         1 member function insertion:
           'method virtual void Interface::method2()', virtual at voffset 3/4
-
         1 member function change:
           'method virtual void Interface::method3()' has some sub-type changes:
             the vtable offset of method virtual void Interface::method3() changed from 3 to 4
               note that this is an ABI incompatible change to the vtable of class Interface
 
-
diff --git a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
index 451a4981..62785044 100644
--- a/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
+++ b/tests/data/test-diff-pkg/tbb-4.1-9.20130314.fc22.x86_64--tbb-4.3-3.20141204.fc23.x86_64-report-0.txt
@@ -119,10 +119,8 @@
                                 'char tbb::internal::mail_outbox::pad[104]', at offset 136 (in bits) at mailbox.h:114:1
                 1 member function deletion:
                   'method virtual tbb::task* tbb::internal::generic_scheduler::receive_or_steal_task(tbb::internal::reference_count&, bool)' at scheduler.h:391:1, virtual at voffset 7/7
-
                 1 member function insertion:
                   'method virtual tbb::task* tbb::internal::generic_scheduler::receive_or_steal_task(tbb::internal::reference_count&)' at scheduler.h:362:1, virtual at voffset 7/7
-
                 3 data member deletions:
                   'unsigned int tbb::internal::generic_scheduler::hint_for_push', at offset 896 (in bits) at scheduler.h:171:1
                   'volatile intptr_t* tbb::internal::generic_scheduler::my_ref_top_priority', at offset 2560 (in bits) at scheduler.h:433:1
diff --git a/tests/test-abidiff-exit.cc b/tests/test-abidiff-exit.cc
index ebac7a00..17523afa 100644
--- a/tests/test-abidiff-exit.cc
+++ b/tests/test-abidiff-exit.cc
@@ -167,6 +167,16 @@ InOutSpec in_out_specs[] =
     "data/test-abidiff-exit/test-leaf-peeling-report.txt",
     "output/test-abidiff-exit/test-leaf-peeling-report.txt"
   },
+  {
+    "data/test-abidiff-exit/test-leaf-cxx-members-v0.o",
+    "data/test-abidiff-exit/test-leaf-cxx-members-v1.o",
+    "",
+    "--leaf-changes-only",
+    abigail::tools_utils::ABIDIFF_ABI_CHANGE
+    | abigail::tools_utils::ABIDIFF_ABI_INCOMPATIBLE_CHANGE,
+    "data/test-abidiff-exit/test-leaf-cxx-members-report.txt",
+    "output/test-abidiff-exit/test-leaf-cxx-members-report.txt"
+  },
   {0, 0, 0 ,0,  abigail::tools_utils::ABIDIFF_OK, 0, 0}
 };
 
