diff --git a/change_log.txt b/change_log.txt
index d7855f8faf..98b013aa7c 100644
--- a/change_log.txt
+++ b/change_log.txt
@@ -4,6 +4,16 @@ Started 2007-June-11
 Please add newer entries at the top, list the date and your name with 
 email address.
 
+2007-Jul-31 UPDATE   Geoff Harland <gharlandau@yahoo.com.au>
+================================================================================
++ pcbnew
+	Drill Map and Drill Report files now list the diameters of each drill in
+		the selected drill unit first, and then in the other drill unit.
+	Drill report files also now list the tool assigned to each drill, and
+		the correct hole count and oval count for each drill size; the
+		 file creation date and the selected drill unit are also listed.
+	
+
 2007-Jul-30 UPDATE   Jean-Pierre Charras <jean-pierre.charras@inpg.fr>
 ================================================================================
 + pcbnew
diff --git a/pcbnew/gendrill.cpp b/pcbnew/gendrill.cpp
index 6438d26258..6bdc81e533 100644
--- a/pcbnew/gendrill.cpp
+++ b/pcbnew/gendrill.cpp
@@ -123,7 +123,7 @@ private:
 	void UpdatePrecisionOptions(wxCommandEvent& event);
 	void UpdateConfig(void);
 	int Plot_Drill_PcbMap( FORET * buffer, int format);
-	void GenDrillReport(const wxString & FullFileName);
+	void GenDrillReport(void);
 	int Gen_Liste_Forets( FORET * buffer,bool print_header);
 	int Gen_Drill_File_EXCELLON( FORET * buffer);
 	void Gen_Line_EXCELLON(char *line, float x, float y);
@@ -293,7 +293,7 @@ void WinEDA_DrillFrame::SetParams(void)
 /*****************************************************************/
 void WinEDA_PcbFrame::InstallDrillFrame(wxCommandEvent& event)
 /*****************************************************************/
-/* Thi function display and delete the dialog frame for drill tools
+/* This function displays and deletes the dialog frame for drill tools
 */
 {
 wxConfig * Config = m_Parent->m_EDA_Config;
@@ -348,8 +348,8 @@ void  WinEDA_DrillFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
 void WinEDA_DrillFrame::GenDrillFiles(wxCommandEvent& event)
 /*************************************************************/
 {
+wxString FullFileName, Mask(wxT("*")), Ext(wxT(".drl"));
 int ii;
-wxString FullFileName;
 wxString msg;
 
 	UpdateConfig();	/* set params and Save drill options */
@@ -362,13 +362,14 @@ wxString msg;
 
 	/* Init nom fichier */
 	FullFileName = m_Parent->m_CurrentScreen->m_FileName;
-	ChangeFileNameExt(FullFileName, wxT(".drl") );
+	ChangeFileNameExt(FullFileName, Ext);
+	Mask += Ext;
 
 	FullFileName = EDA_FileSelector(_("Drill file"),
-					wxEmptyString,				/* Chemin par defaut */
-					FullFileName,				/* nom fichier par defaut */
-					wxT(".drl"),				/* extension par defaut */
-					wxT("*.drl"),				/* Masque d'affichage */
+					wxEmptyString,		/* Chemin par defaut */
+					FullFileName,		/* nom fichier par defaut */
+					Ext,				/* extension par defaut */
+					Mask,				/* Masque d'affichage */
 					this,
 					wxFD_SAVE,
 					TRUE
@@ -412,11 +413,8 @@ wxString msg;
 	}
 
 	if ( m_Choice_Drill_Report->GetSelection() > 0 )
-	{
-		FullFileName << wxT(".rpt");
-		GenDrillReport(FullFileName);
-	}
-	
+		GenDrillReport();
+
 	EndModal(0);
 }
 
@@ -869,11 +867,11 @@ wxString msg;
 
 	/* Init file name */
 	FullFileName = m_Parent->m_CurrentScreen->m_FileName;
-	ChangeFileNameExt(FullFileName,Ext) ;
+	ChangeFileNameExt(FullFileName, Ext);
 	Mask += Ext;
 
 	FullFileName = EDA_FileSelector(_("Drill Map file"),
-					wxEmptyString,					/* Chemin par defaut */
+					wxEmptyString,		/* Chemin par defaut */
 					FullFileName,		/* nom fichier par defaut */
 					Ext,				/* extension par defaut */
 					Mask,				/* Masque d'affichage */
@@ -1104,32 +1102,68 @@ wxString msg;
 		switch( format )
 		{
 			case PLOT_FORMAT_HPGL:
-				sprintf(line,"PU %d, %d; LB%2.2fmm / %2.3f\" (%d holes)",
-						x + (int)(intervalle * CharScale * fTextScale),
-						y - (int)(CharSize / 2 * CharScale * fTextScale),
-						float(foret->m_Diameter) * 0.00254,
-						float(foret->m_Diameter) * 0.0001,
-						foret->m_TotalCount );
-				fputs(line,dest);
-				if ( foret->m_OvalCount )
-				{
-					sprintf(line," (with %d oblongs)", foret->m_OvalCount );
-					fputs(line,dest);
-				}					
+				// List the diameter of each drill in the selected Drill Unit,
+				// and then its diameter in the other Drill Unit.
+				if ( Unit_Drill_is_Inch )
+					sprintf( line, "PU %d, %d; LB%2.3f\" / %2.2fmm ",
+							x + (int)(intervalle * CharScale * fTextScale),
+							y - (int)(CharSize / 2 * CharScale * fTextScale),
+							float(foret->m_Diameter) * 0.0001,
+							float(foret->m_Diameter) * 0.00254 );
+				else
+					sprintf( line, "PU %d, %d; LB%2.2fmm / %2.3f\" ",
+							x + (int)(intervalle * CharScale * fTextScale),
+							y - (int)(CharSize / 2 * CharScale * fTextScale),
+							float(foret->m_Diameter) * 0.00254,
+							float(foret->m_Diameter) * 0.0001 );
+				fputs( line, dest );
+				// Now list how many holes and ovals are associated with each drill.
+				if ( ( foret->m_TotalCount == 1 ) && ( foret->m_OvalCount == 0 ) )
+					sprintf( line, "(1 hole)\n" );
+				else if ( foret->m_TotalCount == 1 ) // && ( foret->m_OvalCount == 1 )
+					sprintf( line, "(1 hole) (with 1 oblong)\n" );
+				else if ( foret->m_OvalCount == 0 )
+					sprintf( line, "(%d holes)\n",
+							foret->m_TotalCount );
+				else if ( foret->m_OvalCount == 1 )
+					sprintf( line, "(%d holes) (with 1 oblong)\n",
+							foret->m_TotalCount );
+				else //  if ( foret->m_OvalCount > 1 )
+					sprintf( line, "(%d holes) (with %d oblongs)\n",
+							foret->m_TotalCount,
+							foret->m_OvalCount );
+				fputs( line, dest );
 				fputs("\03;\n",dest);
 				break;
 
 			case PLOT_FORMAT_POST:
-				sprintf(line,"%2.2fmm / %2.3f\" (%d holes)",
-						float(foret->m_Diameter) * 0.00254,
-						float(foret->m_Diameter) * 0.0001,
-						foret->m_TotalCount );
+				// List the diameter of each drill in the selected Drill Unit,
+				// and then its diameter in the other Drill Unit.
+				if ( Unit_Drill_is_Inch )
+					sprintf( line, "%2.3f\" / %2.2fmm ",
+							float(foret->m_Diameter) * 0.0001,
+							float(foret->m_Diameter) * 0.00254 );
+				else
+					sprintf( line, "%2.2fmm / %2.3f\" ",
+							float(foret->m_Diameter) * 0.00254,
+							float(foret->m_Diameter) * 0.0001 );
 				msg = CONV_FROM_UTF8(line);
-				if ( foret->m_OvalCount )
-				{
-					sprintf(line," (with %d oblongs)", foret->m_OvalCount );
-					msg += CONV_FROM_UTF8(line);
-				}					
+				// Now list how many holes and ovals are associated with each drill.
+				if ( ( foret->m_TotalCount == 1 ) && ( foret->m_OvalCount == 0 ) )
+					sprintf( line, "(1 hole)" );
+				else if ( foret->m_TotalCount == 1 ) // && ( foret->m_OvalCount == 1 )
+					sprintf( line, "(1 hole) (with 1 oblong)" );
+				else if ( foret->m_OvalCount == 0 )
+					sprintf( line, "(%d holes)",
+							foret->m_TotalCount );
+				else if ( foret->m_OvalCount == 1 )
+					sprintf( line, "(%d holes) (with 1 oblong)",
+							foret->m_TotalCount );
+				else // if ( foret->m_OvalCount > 1 )
+					sprintf( line, "(%d holes) (with %d oblongs)",
+							foret->m_TotalCount,
+							foret->m_OvalCount );
+				msg += CONV_FROM_UTF8(line);
 				Plot_1_texte(format, msg, 0, TextWidth,
 						x, y,
 						(int) (CharSize * CharScale),
@@ -1382,29 +1416,34 @@ void PlotOvalDrillSymbol(const wxPoint & position,const wxSize & size,int orient
 	{
 		case PLOT_FORMAT_HPGL:
 			trace_1_pastille_OVALE_HPGL(position, size, orient, FILAIRE);
-		break;
+			break;
+
 		case PLOT_FORMAT_POST:
 			trace_1_pastille_OVALE_POST(position, size, orient, FILAIRE);
-		break;
+			break;
 	}
 }
 
-/********************************************************************/
-void WinEDA_DrillFrame::GenDrillReport(const wxString & FullFileName)
-/********************************************************************/
+/*******************************************/
+void WinEDA_DrillFrame::GenDrillReport(void)
+/*******************************************/
 /*
 Create a list of drill values and drill count
 */
 {
-wxString FileName, Mask(wxT("*")), Ext(wxT(".*"));
-int ii;
+wxString FileName, Mask(wxT("*")), Ext(wxT(".rpt"));
+int ii, TotalHoleCount;
 char line[1024];
 FORET * foret;
+wxString msg;
 	
-	FileName = FullFileName;
-	FileName = EDA_FileSelector(_("Drill Map file"),
-					wxEmptyString,					/* Chemin par defaut */
-					FullFileName,		/* nom fichier par defaut */
+	FileName = m_Parent->m_CurrentScreen->m_FileName;
+	ChangeFileNameExt(FileName, wxT("-drl") + Ext);
+	Mask += Ext;
+
+	FileName = EDA_FileSelector(_("Drill Report file"),
+					wxEmptyString,		/* Chemin par defaut */
+					FileName,			/* nom fichier par defaut */
 					Ext,				/* extension par defaut */
 					Mask,				/* Masque d'affichage */
 					this,
@@ -1416,34 +1455,70 @@ FORET * foret;
 	dest = wxFopen(FileName, wxT("w") );
 	if (dest == 0)
 	{
-		wxString msg = _("Unable to create file ") + FileName;
+		msg = _("Unable to create file ") + FileName;
 		DisplayError(this, msg);
 		return ;
 	}
-	
-	sprintf(line,"Drill report\n\n" );
-	fputs(line, dest);
 
-	for(ii = 0, foret = (FORET*)adr_lowmem ; ii < DrillToolsCount; ii++, foret++)
+	m_Parent->MsgPanel->EraseMsgBox();
+	Affiche_1_Parametre( m_Parent, 0, _("File"), FileName, BLUE );
+
+	/* Determine the list of the different drill diameters. */
+	ii = Gen_Liste_Forets( (FORET *) adr_lowmem, FALSE );
+	msg.Printf( wxT("%d"), ii );
+	Affiche_1_Parametre( m_Parent, 30, _("Tools"), msg, BROWN );
+
+	fprintf(dest, "Drill report for %s\n", CONV_TO_UTF8(m_Parent->m_CurrentScreen->m_FileName) );
+
+	fprintf(dest, "Created on %s\n", DateAndTime(line));
+
+	// List which Drill Unit option had been selected for the associated drill file.
+	if ( Unit_Drill_is_Inch )
+		fputs("Selected Drill Unit: Imperial (\")\n\n", dest);
+	else
+		fputs("Selected Drill Unit: Metric (mm)\n\n", dest);
+
+	TotalHoleCount = 0;
+
+	for ( ii = 0, foret = (FORET*)adr_lowmem ; ii < DrillToolsCount; ii++, foret++ )
 	{
-		int ncount;
-		ncount = foret->m_TotalCount - foret->m_OvalCount;
-		if ( ncount )
-			sprintf(line,"%2.2fmm  %2.3f\" (%d holes)\n",
-					float(foret->m_Diameter) * 0.00254,
+		// List the tool number assigned to each drill,
+		// then its diameter in the selected Drill Unit,
+		// and then its diameter in the other Drill Unit.
+		if ( Unit_Drill_is_Inch )
+			sprintf( line, "T%d  %2.3f\"  %2.2fmm  ",
+					ii + 1,
 					float(foret->m_Diameter) * 0.0001,
-					ncount );
-		if ( foret->m_OvalCount )
-		{
-			sprintf(line,"%2.2fmm  %2.3f\" (%d oblongs)\n",
+					float(foret->m_Diameter) * 0.00254 );
+		else
+			sprintf( line, "T%d  %2.2fmm  %2.3f\"  ",
+					ii + 1,
 					float(foret->m_Diameter) * 0.00254,
-					float(foret->m_Diameter) * 0.0001,
+					float(foret->m_Diameter) * 0.0001 );
+		fputs( line, dest );
+
+		// Now list how many holes and ovals are associated with each drill.
+		if ( ( foret->m_TotalCount == 1 ) && ( foret->m_OvalCount == 0 ) )
+			sprintf( line, "(1 hole)\n" );
+		else if ( foret->m_TotalCount == 1 ) // && ( foret->m_OvalCount == 1 )
+			sprintf( line, "(1 hole)  (with 1 oblong)\n" );
+		else if ( foret->m_OvalCount == 0 )
+			sprintf( line, "(%d holes)\n",
+					foret->m_TotalCount );
+		else if ( foret->m_OvalCount == 1 )
+			sprintf( line, "(%d holes)  (with 1 oblong)\n",
+					foret->m_TotalCount );
+		else //  if ( foret->m_OvalCount > 1 )
+			sprintf( line, "(%d holes)  (with %d oblongs)\n",
+					foret->m_TotalCount,
 					foret->m_OvalCount );
-		}
+		fputs( line, dest );
 
-		fputs(line, dest);
+		TotalHoleCount += foret->m_TotalCount;
 	}
-	
-	fclose(dest);
 
+	msg.Printf( wxT("%d"), TotalHoleCount );
+	Affiche_1_Parametre( m_Parent, 45, _("Drill"), msg, GREEN );
+
+	fclose(dest);
 }