dsCopy = (MyPersonnelDataSet)dsPersonnel.Copy(); // change a row in the Personnel table dsPersonnel.Personnel[0]["userkey"] = 0; // delete a row in the PhoneNumber table dsPersonnel.PhoneNumber[0].Delete(); // add a row to the PhoneNumber table DataRow row; row = dsPersonnel.PhoneNumber.NewRow(); row["phonenumberkey"] = 0; row["phone"] = "666"; dsPersonnel.PhoneNumber.Rows.Add(row); dsChanged = (MyPersonnelDataSet)dsPersonnel.GetChanges(); dsDeleted = (MyPersonnelDataSet)dsPersonnel.GetChanges(DataRowState.Deleted); // Merge the changes to dsPersonnel into dsCopy dsCopy.Merge(dsDeleted); dsCopy.Merge(dsChanged);What happens is that the row that was deleted is not matched to the original row in the dsCopy dataset, so that I end up with two rows for the same data, one is unchanged and one is deleted ... what *should* happen is that there should only be one deleted row.