Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocument.cs
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocument.cs	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocument.cs	(revision 1112)
@@ -1003,5 +1003,9 @@
             this.m_appointments.AddAppointment(aCopy);
             
-            
+            //TODO: Improve
+            //Yucky hack for now... haven't investigated why we need to create a new CGAppointment beyond
+            //the one that we pass.
+            rApptInfo.AppointmentKey = nApptID;
+
             //Have make appointment from CGView responsible for requesting an update for the avialability.
             //bool bRet = RefreshAvailabilitySchedule();
Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocumentManager.cs
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocumentManager.cs	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGDocumentManager.cs	(revision 1112)
@@ -8,4 +8,5 @@
 using Mono.Options;
 using System.Runtime.InteropServices;
+using System.Globalization;
 
 namespace IndianHealthService.ClinicalScheduling
@@ -33,4 +34,7 @@
         private string                      m_Encoding="";  //Encoding is "" by default;
 
+        //Globalization Object (tied to command line parameter /culture)
+        private string                      m_CultureName = "";
+
         //Data Access Layer
         private DAL                         _dal = null;
@@ -96,5 +100,5 @@
 
         /// <summary>
-        /// More later...
+        /// User Preferences Auto Property
         /// </summary>
         public UserPreferences UserPreferences { get; private set; }
@@ -171,4 +175,5 @@
         /// /v or -v = Verify Code
         /// /e or -e = Encoding (name of encoding as known to windows, such as windows-1256)
+        /// /culture or -culture = Culture Name for UI Culture if you wish to override the Windows Culture
         /// </param>
         /// <remarks>
@@ -200,5 +205,6 @@
                 { "a=", a => _current.m_AccessCode = a },
                 { "v=", v => _current.m_VerifyCode = v },
-                { "e=", e => _current.m_Encoding = e}
+                { "e=", e => _current.m_Encoding = e},
+                { "culture=", culture => _current.m_CultureName = culture }
             };
 
@@ -469,4 +475,8 @@
             _current.UserPreferences = new UserPreferences();
 
+            //User Interface Culture (m_CultureName is set from the command line flag /culture)
+            try { Thread.CurrentThread.CurrentUICulture = new CultureInfo(m_CultureName); } // if "", invariant culture
+            catch (CultureNotFoundException) { Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture; }
+
             //Create global dataset
 			_current.m_dsGlobal = new DataSet("GlobalDataSet");
Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/CGView.cs	(revision 1112)
@@ -9,4 +9,5 @@
 using System.Runtime.InteropServices;
 using System.Drawing.Printing;
+using System.Linq;
 
 namespace IndianHealthService.ClinicalScheduling
@@ -1954,16 +1955,16 @@
 				calendarGrid1.CGToolTip.Active = true;
 
-				if (bAlreadyCheckedIn == true)
-					return;
-
-				DateTime dtCheckIn = dlgCheckin.CheckInTime;
-
-                //Tell appointment that it is checked in, for proper coloring;
-                //When you refresh from the DB, it will have this property.
-                a.CheckInTime = DateTime.Now;
+                if (bAlreadyCheckedIn != true)
+                {
+                    DateTime dtCheckIn = dlgCheckin.CheckInTime;
+
+                    //Tell appointment that it is checked in, for proper coloring;
+                    //When you refresh from the DB, it will have this property.
+                    a.CheckInTime = DateTime.Now;
+
+                    //Save to Database
+                    this.Document.CheckInAppointment(nApptID, dtCheckIn);
+                }
                 
-                //Save to Database
-                this.Document.CheckInAppointment(nApptID, dtCheckIn);
-
                 //Get Provider (XXXXXXXX: NOT SAVED TO THE DATABASE RIGHT NOW)
                 a.Provider = dlgCheckin.Provider;
@@ -2103,6 +2104,4 @@
 			try
 			{
-				
-			
 				//Get Time and Resource from Selected Cell
 				DateTime dStart = DateTime.Today;
@@ -3217,6 +3216,20 @@
         private void PrintRoutingSlip(CGAppointment appt)
         {
+            //get this appointment's order
+            //Today's appointments
+            var todaysAppts = (from lkappts in this.Document.Appointments.AppointmentTable.Values.Cast<CGAppointment>()
+                               where lkappts.StartTime > appt.StartTime.Date && lkappts.StartTime < appt.StartTime.AddDays(1).Date
+                              orderby lkappts.StartTime
+                              select lkappts).ToList();
+            
+            //Find the order of the appointment
+            int apptOrder = todaysAppts.FindIndex(eachappt => eachappt.StartTime == appt.StartTime && eachappt.PatientID == appt.PatientID);
+ 
+            //Index is zero based, so add 1
+            apptOrder++;
+
+            //Send that to the routing slip as a parameter
             PrintDocument pd = new PrintDocument() { DocumentName = "Routing Slip for Appt " + appt.AppointmentKey };
-            pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintRoutingSlip(appt, "Routing Slip", e);
+            pd.PrintPage += (object s, System.Drawing.Printing.PrintPageEventArgs e) => CGDocumentManager.Current.PrintingObject.PrintRoutingSlip(appt, apptOrder, e);
             pd.Print();
         }
Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj	(revision 1112)
@@ -141,4 +141,14 @@
   <ItemGroup>
     <Compile Include="Provider.cs" />
+    <Compile Include="strings.ar.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>strings.ar.resx</DependentUpon>
+    </Compile>
+    <Compile Include="strings.Designer.cs">
+      <AutoGen>True</AutoGen>
+      <DesignTime>True</DesignTime>
+      <DependentUpon>strings.resx</DependentUpon>
+    </Compile>
     <Compile Include="UserPreferences.cs" />
     <None Include="app.config" />
@@ -412,4 +422,12 @@
     <EmbeddedResource Include="LoadingSplash.resx">
       <DependentUpon>LoadingSplash.cs</DependentUpon>
+    </EmbeddedResource>
+    <EmbeddedResource Include="strings.ar.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>strings.ar.Designer.cs</LastGenOutput>
+    </EmbeddedResource>
+    <EmbeddedResource Include="strings.resx">
+      <Generator>ResXFileCodeGenerator</Generator>
+      <LastGenOutput>strings.Designer.cs</LastGenOutput>
     </EmbeddedResource>
     <EmbeddedResource Include="UCPatientAppts.resx">
Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj.user
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj.user	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/ClinicalScheduling.csproj.user	(revision 1112)
@@ -37,5 +37,5 @@
     </RemoteDebugMachine>
     <StartAction>Project</StartAction>
-    <StartArguments>/s=172.16.16.108 /p=9250 /a=BASMA.ALDWAIRI /v=SELEN.123</StartArguments>
+    <StartArguments>/s=172.16.16.108 /p=9250 /a=BASMA.ALDWAIRI /v=SELEN.123 /culture="ar-JO"</StartArguments>
     <StartPage>
     </StartPage>
Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/Patient.cs
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/Patient.cs	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/Patient.cs	(revision 1112)
@@ -54,8 +54,8 @@
             {
                 if (Age.TotalDays / 365.24 > 5)
-                    return Math.Floor((Age.TotalDays / 365.24)).ToString() + " years";
+                    return Math.Floor((Age.TotalDays / 365.24)).ToString() + " " + strings.years;
                 else
-                    return Math.Floor((Age.TotalDays / 365.24)).ToString() + " years & "
-                     + Math.Floor(Age.TotalDays % 365.24 / 30).ToString() + " months";
+                    return Math.Floor((Age.TotalDays / 365.24)).ToString() + " " + strings.years + " " + strings.and + " "
+                     + Math.Floor(Age.TotalDays % 365.24 / 30).ToString() + " " + strings.months;
             }
         }
Index: /Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs
===================================================================
--- /Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs	(revision 1111)
+++ /Scheduling/trunk/cs/bsdx0200GUISourceCode/Printing.cs	(revision 1112)
@@ -9,5 +9,5 @@
 namespace IndianHealthService.ClinicalScheduling
 {
-    public class Printing
+    public partial class Printing
     { 
         /// <summary>
@@ -48,5 +48,26 @@
             //Typical manipulable print area
             Rectangle printArea = e.MarginBounds;
-            
+            Rectangle pageArea = e.PageBounds;
+            Rectangle headerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.PageBounds.Y,
+                Height = e.MarginBounds.Y - e.PageBounds.Y,
+                Width = e.MarginBounds.Width
+            };
+            Rectangle footerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.MarginBounds.Height + headerArea.Height,
+                Width = e.MarginBounds.Width,
+                Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
+            };
+
+            //print footer
+            StringFormat sfFooter = new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center };
+            string s = strings.Printed + ": " + DateTime.Now.ToString();
+            Font fFooter = new Font(FontFamily.GenericSerif, 7);
+            g.DrawString(s, fFooter, Brushes.Black, footerArea, sfFooter);
+
             //resource we want to print
             dsPatientApptDisplay2.BSDXResourceRow r = ds.BSDXResource[resourceToPrint];
@@ -54,5 +75,5 @@
             //header
             string toprint;
-            if (beg == end) toprint = "Appointments for " + r.RESOURCE_NAME + " on " + beg.ToLongDateString();
+            if (beg.Date == end.Date) toprint = "Appointments for " + r.RESOURCE_NAME + " on " + beg.ToLongDateString();
             else toprint = "Appointments for " + r.RESOURCE_NAME + " from " + beg.ToShortDateString() + " to "
                 + end.ToShortDateString();
@@ -60,6 +81,7 @@
             
             //Move print area down
-            printArea.Height -= (int)f14bold.GetHeight();
-            printArea.Y += (int)f14bold.GetHeight();
+            int titleHeight = (int)g.MeasureString(toprint, f14bold, printArea.Size).Height;
+            printArea.Height -= titleHeight;
+            printArea.Y += titleHeight;
 
             //Draw Line
@@ -134,155 +156,4 @@
                 Width = e.MarginBounds.Width
             };
-
-            // A few fonts
-            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
-            Font fBody = new Font(FontFamily.GenericSerif, 12);
-            Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
-
-            StringFormat sf0 = new StringFormat()
-            {
-                 Alignment = StringAlignment.Center,
-                 LineAlignment = StringAlignment.Center
-            };
-            
-            // Draw Header
-            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
-            g.DrawString(division, fBody, Brushes.Black, headerArea, sf0);
-            
-            // Draw Title
-            StringFormat sf = new StringFormat();
-            sf.Alignment = StringAlignment.Center; //for title & header
-
-            string s = "Appointment Reminder Slip";
-            g.DrawString(s, fTitle, Brushes.Black, printArea, sf); //title
-
-            // move down
-            int titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
-            printArea.Y += titleHeight;
-            printArea.Height -= titleHeight;
-
-            // draw underline
-            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
-            printArea.Y += 15;
-            printArea.Height -= 15;
-
-            // draw curved rectangle.
-            Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, 300);
-            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
-            {
-                g.DrawPath(Pens.Black, path);
-            }
-
-            // group header
-            g.DrawString("Patient Information", fGroupTitle, Brushes.Black, new Point(personalInfoRectangle.X, personalInfoRectangle.Y - 20));
-            
-            // inner rectangle for drawing strings:
-            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, 280 - 40, 300 - 40);
-            
-            // Strings to write
-            StringBuilder sb = new StringBuilder(500);
-            sb.AppendLine("Name:" + "\t" + appt.Patient.Name);
-            sb.AppendLine();
-            sb.AppendLine("ID#:" + "\t" + appt.Patient.ID);
-            sb.AppendLine();
-            sb.AppendLine("DOB:" + "\t" + appt.Patient.DOB.ToShortDateString());
-            sb.AppendLine();
-            sb.AppendLine("Age:" + "\t" + appt.Patient.UserFriendlyAge);
-            sb.AppendLine();
-            sb.AppendLine("Sex:" + "\t" + appt.Patient.Sex.ToString());
-            
-            // Draw them
-            g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle);
-
-            // draw curved rectangle
-            Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, 300);
-            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
-            {
-                g.DrawPath(Pens.Black, path);
-            }
-
-            // group header
-            g.DrawString("Appointment Information", fGroupTitle, Brushes.Black, new Point(apptInfoRectangle.X, apptInfoRectangle.Y - 20));
-
-            // Strings to write
-            sb = new StringBuilder();
-            sb.AppendLine("Clinic: " + "\t" + appt.Resource);
-            sb.AppendLine();
-            sb.AppendLine("Date: " + "\t" + appt.StartTime.ToShortDateString());
-            sb.AppendLine();
-            sb.AppendLine("Day: " + "\t" + appt.StartTime.DayOfWeek.ToString());
-            sb.AppendLine();
-            sb.AppendLine("Time: " + "\t" + appt.StartTime.ToShortTimeString());
-
-            // Draw them
-            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, 280 - 40, 300 - 40);
-
-            // Draw them
-            g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle);
-
-            // Move Drawing Rectangle Down
-            printArea.Y += 300 + 30 + 20;
-            printArea.Height -= 300 + 30 + 20;
-
-            // Draw New Line
-            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
-            printArea.Y += 5;
-            printArea.Height -= 5;
-
-            // Draw new Title
-            s = "Clinic Instructions";
-            g.DrawString(s, fTitle, Brushes.Black, printArea, sf); //title
-
-            // move down
-            titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
-            printArea.Y += titleHeight;
-            printArea.Height -= titleHeight;
-
-            // Draw New Line
-            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
-            printArea.Y += 15;
-            printArea.Height -= 15;
-
-            // Get Resource Clinic Appointment Letter Text
-            DataTable resources = CGDocumentManager.Current.GlobalDataSet.Tables["Resources"];
-
-            string ltrTxt = (from resource in resources.AsEnumerable()
-                             where resource.Field<string>("RESOURCE_NAME") == appt.Resource
-                             select resource.Field<string>("LETTER_TEXT")).SingleOrDefault<string>();
-
-            if (String.IsNullOrWhiteSpace(ltrTxt)) ltrTxt = "(no instructions provided)";
-
-            g.DrawString(ltrTxt, fBody, Brushes.Black, printArea);
-
-            int ltrTxtHeight = (int)g.MeasureString(ltrTxt, fBody).Height;
-
-            printArea.Y += ltrTxtHeight + 15;
-            printArea.Height -= ltrTxtHeight + 15;
-
-            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
-            printArea.Y += 5;
-            printArea.Height -= 5;
-
-            s = "Notes";
-            g.DrawString(s, fTitle, Brushes.Black, printArea, sf); // Notes title
-            
-            // move down
-            titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
-            printArea.Y += titleHeight;
-            printArea.Height -= titleHeight;
-
-            // Draw New Line
-            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
-            printArea.Y += 15;
-            printArea.Height -= 15;
-
-            // Draw Notes Area
-            using (GraphicsPath path = GetRoundedRectPath(printArea, 15))
-            {
-                g.DrawPath(Pens.Black, path);
-            }
-
-            // Draw Footer
-            // Get footer rectangle
             Rectangle footerArea = new Rectangle()
             {
@@ -293,6 +164,163 @@
             };
 
+
+            // A few fonts
+            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
+            Font fBody = new Font(FontFamily.GenericSerif, 12);
+            Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
+
+            StringFormat sf0 = new StringFormat()
+            {
+                 Alignment = StringAlignment.Center,
+                 LineAlignment = StringAlignment.Center
+            };
+            
+            // Draw Header
+            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
+            g.DrawString(division, fBody, Brushes.Black, headerArea, sf0);
+            
+            // Draw Title
+            StringFormat sf = new StringFormat();
+            sf.Alignment = StringAlignment.Center; //for title & header
+
+            //string s = "Appointment Reminder Slip";
+            string s = strings.ApptRoutingSlip;
+            g.DrawString(s, fTitle, Brushes.Black, printArea, sf); //title
+
+            // move down
+            int titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
+            printArea.Y += titleHeight;
+            printArea.Height -= titleHeight;
+
+            // draw underline
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 15;
+            printArea.Height -= 15;
+
+            // draw curved rectangle.
+            Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, 300);
+            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            // group header
+            s = strings.PtInfo;
+            StringFormat sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
+            g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(personalInfoRectangle.X, personalInfoRectangle.Y - 20,personalInfoRectangle.Width, 20),sf3);
+            
+            // inner rectangle for drawing strings:
+            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, 280 - 40, 300 - 40);
+            
+            // Strings to write
+            StringBuilder sb = new StringBuilder(500);
+            sb.AppendLine(strings.Name + ":" + "\t" + appt.Patient.Name);
+            sb.AppendLine();
+            sb.AppendLine(strings.ID + ":" + "\t" + appt.Patient.ID);
+            sb.AppendLine();
+            sb.AppendLine(strings.DOB + ":" + "\t" + appt.Patient.DOB.ToShortDateString());
+            sb.AppendLine();
+            sb.AppendLine(strings.Age + ":" + "\t" + appt.Patient.UserFriendlyAge);
+            sb.AppendLine();
+            s = appt.Patient.Sex == Sex.Male ? strings.Male : strings.Female;
+            sb.AppendLine(strings.Sex + ":" + "\t" + s);
+
+            // Draw them
+            sf3 = new StringFormat(System.Threading.Thread.CurrentThread.CurrentUICulture.TextInfo.IsRightToLeft ? StringFormatFlags.DirectionRightToLeft : 0);
+            sf3.SetTabStops(0, new float[] {75} );
+            sf3.SetDigitSubstitution(System.Threading.Thread.CurrentThread.CurrentUICulture.LCID, StringDigitSubstitute.Traditional);
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle, sf3);
+
+            // draw curved rectangle
+            Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, 300);
+            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            s = strings.ApptInfo;
+            // group header
+            g.DrawString(s, fGroupTitle, Brushes.Black, new Rectangle(apptInfoRectangle.X, apptInfoRectangle.Y - 20,apptInfoRectangle.Width, 20), sf3);
+
+            // Strings to write
+            sb = new StringBuilder();
+            sb.AppendLine(strings.Clinic + ":" + "\t" + appt.Resource);
+            sb.AppendLine();
+            sb.AppendLine(strings.Date + ":" + "\t" + appt.StartTime.ToShortDateString());
+            sb.AppendLine();
+            sb.AppendLine(strings.Day + ":" + "\t" + appt.StartTime.ToString("dddd"));
+            sb.AppendLine();
+            sb.AppendLine(strings.Time + ":" + "\t" + appt.StartTime.ToShortTimeString());
+
+            // Draw them
+            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, 280 - 40, 300 - 40);
+
+            // Draw them
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle, sf3);
+
+            // Move Drawing Rectangle Down
+            printArea.Y += 300 + 30 + 20;
+            printArea.Height -= 300 + 30 + 20;
+
+            // Draw New Line
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            // Draw new Title
+            s = strings.ClinicInstructions;
+            g.DrawString(s, fTitle, Brushes.Black, printArea, sf); //title
+
+            // move down
+            titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
+            printArea.Y += titleHeight;
+            printArea.Height -= titleHeight;
+
+            // Draw New Line
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 15;
+            printArea.Height -= 15;
+
+            // Get Resource Clinic Appointment Letter Text
+            DataTable resources = CGDocumentManager.Current.GlobalDataSet.Tables["Resources"];
+
+            string ltrTxt = (from resource in resources.AsEnumerable()
+                             where resource.Field<string>("RESOURCE_NAME") == appt.Resource
+                             select resource.Field<string>("LETTER_TEXT")).SingleOrDefault<string>();
+
+            if (String.IsNullOrWhiteSpace(ltrTxt)) ltrTxt = strings.NoInstructionsProvided;
+
+            g.DrawString(ltrTxt, fBody, Brushes.Black, printArea, sf3);
+
+            int ltrTxtHeight = (int)g.MeasureString(ltrTxt, fBody).Height;
+
+            printArea.Y += ltrTxtHeight + 15;
+            printArea.Height -= ltrTxtHeight + 15;
+
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            s = strings.Notes;
+            g.DrawString(s, fTitle, Brushes.Black, printArea, sf); // Notes title
+            
+            // move down
+            titleHeight = (int)g.MeasureString(s, fTitle, printArea.Width).Height;
+            printArea.Y += titleHeight;
+            printArea.Height -= titleHeight;
+
+            // Draw New Line
+            g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
+            printArea.Y += 15;
+            printArea.Height -= 15;
+
+            // Draw Notes Area
+            using (GraphicsPath path = GetRoundedRectPath(printArea, 15))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
             //use sf0 to print the footer (center all the way)
-            s = "Printed: " + DateTime.Now.ToString();
+            s = strings.Printed + ": " + DateTime.Now.ToString();
             Font fFooter = new Font(FontFamily.GenericSerif, 7);
             g.DrawString(s, fFooter, Brushes.Black, footerArea, sf0);
@@ -510,13 +538,47 @@
         /// <param name="title">String to print for title</param>
         /// <param name="e">etc</param>
-        public virtual void PrintRoutingSlip(CGAppointment a, string title, PrintPageEventArgs e)
+        public virtual void PrintRoutingSlip(CGAppointment appt, int apptOrder, PrintPageEventArgs e)
         {
+            // Prep
+            Graphics g = e.Graphics;
             Rectangle printArea = e.MarginBounds;
-            Graphics g = e.Graphics;
+            Rectangle pageArea = e.PageBounds;
+            Rectangle headerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.PageBounds.Y,
+                Height = e.MarginBounds.Y - e.PageBounds.Y,
+                Width = e.MarginBounds.Width
+            };
+            Rectangle footerArea = new Rectangle()
+            {
+                X = e.MarginBounds.X,
+                Y = e.MarginBounds.Height + headerArea.Height,
+                Width = e.MarginBounds.Width,
+                Height = pageArea.Height - (e.MarginBounds.Height + headerArea.Height)
+            };
+
+            const int part1Height = 400;
+            string s;
+
+            // A few fonts
+            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
+            Font fBody = new Font(FontFamily.GenericSerif, 12);
+            Font fGroupTitle = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Bold);
+
+            StringFormat sf0 = new StringFormat()
+            {
+                Alignment = StringAlignment.Center,
+                LineAlignment = StringAlignment.Center
+            };
+
+            // Draw Header
+            string division = CGDocumentManager.Current.ConnectInfo.DivisionName;
+            g.DrawString(division, fBody, Brushes.Black, headerArea, sf0);
+
+            // Draw Title
             StringFormat sf = new StringFormat();
-            sf.Alignment = StringAlignment.Center; //for title
-            Font fTitle = new Font(FontFamily.GenericSerif, 24, FontStyle.Bold); //for title
-            Font fBody = new Font(FontFamily.GenericSerif, 18);
-            Font fBodyEm = new Font(FontFamily.GenericSerif, 18, FontStyle.Bold);
+            sf.Alignment = StringAlignment.Center; //for title & header
+            string title = "Routing Slip";
             g.DrawString(title, fTitle, Brushes.Black, printArea, sf); //title
 
@@ -528,30 +590,107 @@
             // draw underline
             g.DrawLine(Pens.Black, printArea.Location, new Point(printArea.Right, printArea.Y));
-
-            // move down
             printArea.Y += 15;
             printArea.Height -= 15;
 
-            //construct what to print
-            string toprint = "Patient: " + a.PatientName + "\t" + "ID: " + a.HealthRecordNumber;
-            toprint += "\n\n";
-            toprint += "Clinic: " + a.Resource;
-            toprint += "\n\n";
-            toprint += "Appointment Time: " + a.StartTime;
-            toprint += "\n\n";
-            toprint += "Notes:\n" + a.Note;
-
-            //print
-            g.DrawString(toprint, fBody, Brushes.Black, printArea);
-
-            // Print Date Printed
-            //sf to move to bottom center
-            StringFormat sf2 = new StringFormat();
-            sf2.LineAlignment = StringAlignment.Far;
-            sf2.Alignment = StringAlignment.Center;
-
-            //Print
-            Font fFooter = new Font(FontFamily.GenericSerif, 8);
-            g.DrawString("Printed: " + DateTime.Now, fFooter, Brushes.Black, printArea, sf2);
+            // draw curved rectangle.
+            Rectangle personalInfoRectangle = new Rectangle(e.MarginBounds.X, printArea.Y + 30, 280, part1Height);
+            using (GraphicsPath path = GetRoundedRectPath(personalInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            // group header
+            g.DrawString("Patient Information", fGroupTitle, Brushes.Black, new Point(personalInfoRectangle.X, personalInfoRectangle.Y - 20));
+
+            // inner rectangle for drawing strings:
+            Rectangle personalInfoInnerRectangle = new Rectangle(personalInfoRectangle.X + 20, personalInfoRectangle.Y + 20, personalInfoRectangle.Width - 40, personalInfoRectangle.Height - 40);
+
+            // Strings to write
+            StringBuilder sb = new StringBuilder(500);
+            sb.AppendLine("Name:" + "\t" + appt.Patient.Name);
+            sb.AppendLine();
+            sb.AppendLine("ID#:" + "\t" + appt.Patient.ID);
+            sb.AppendLine();
+            sb.AppendLine("DOB:" + "\t" + appt.Patient.DOB.ToShortDateString());
+            sb.AppendLine();
+            sb.AppendLine("Age:" + "\t" + appt.Patient.UserFriendlyAge);
+            sb.AppendLine();
+            sb.AppendLine("Sex:" + "\t" + appt.Patient.Sex.ToString());
+
+            // Draw them
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, personalInfoInnerRectangle);
+
+            // draw curved rectangle
+            Rectangle apptInfoRectangle = new Rectangle(e.MarginBounds.X + e.MarginBounds.Width - 280, printArea.Y + 30, 280, part1Height);
+            using (GraphicsPath path = GetRoundedRectPath(apptInfoRectangle, 10))
+            {
+                g.DrawPath(Pens.Black, path);
+            }
+
+            // group header
+            g.DrawString("Appointment Information", fGroupTitle, Brushes.Black, new Point(apptInfoRectangle.X, apptInfoRectangle.Y - 20));
+
+            // Strings to write
+            sb = new StringBuilder();
+            sb.AppendLine("Clinic:");
+            sb.AppendLine(appt.Resource);
+            sb.AppendLine();
+            sb.AppendLine("Appointment Provider:"); 
+            sb.AppendLine((appt.Provider == null) ? "(none)" : appt.Provider.ToString());  //Appt Provider or (none) if null
+            sb.AppendLine();
+            sb.AppendLine("Patient Order:" + "\t" + apptOrder);
+            sb.AppendLine("Date: " + "\t" + appt.StartTime.ToShortDateString() + " " + appt.StartTime.ToShortTimeString());
+            sb.AppendLine();
+            sb.AppendLine("Appointment Note: ");
+            sb.AppendLine(String.IsNullOrWhiteSpace(appt.Note)? "(none)" : appt.Note);
+
+            // Draw them
+            Rectangle apptInfoInnerRectangle = new Rectangle(apptInfoRectangle.X + 20, apptInfoRectangle.Y + 20, apptInfoRectangle.Width - 40, apptInfoRectangle.Height - 40);
+
+            // Draw them
+            g.DrawString(sb.ToString(), fBody, Brushes.Black, apptInfoInnerRectangle);
+
+            // Move Drawing Rectangle Down
+            printArea.Y += apptInfoRectangle.Height + 30 + 20;
+            printArea.Height -= apptInfoRectangle.Height + 30 + 20;
+
+            // Draw New Line
+            using (Pen dashpen = new Pen(Color.Black))
+            {
+                dashpen.DashStyle = DashStyle.Dash;
+                g.DrawLine(dashpen, printArea.Location, new Point(printArea.Right, printArea.Y));
+            }
+
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            s = "Scratch Area";
+            g.DrawString(s, fGroupTitle, Brushes.Black, printArea); 
+
+            // move down
+            printArea.Y += 300;
+            printArea.Height -= 300;
+
+            //TODO: Put Next Appointment Area
+            using (Pen dashpen = new Pen(Color.Black))
+            {
+                dashpen.DashStyle = DashStyle.Dot;
+                g.DrawLine(dashpen, printArea.Location, new Point(printArea.Right, printArea.Y));
+            }
+
+            printArea.Y += 5;
+            printArea.Height -= 5;
+
+            s = "Next Appointment Instructions";
+            g.DrawString(s, fGroupTitle, Brushes.Black, printArea);
+
+            // Draw Footer
+            //use sf0 to print the footer (center all the way)
+            s = "Printed: " + DateTime.Now.ToString();
+            Font fFooter = new Font(FontFamily.GenericSerif, 7);
+            g.DrawString(s, fFooter, Brushes.Black, footerArea, sf0);
+
+            g.Dispose();
+
         }
 
