diff --git a/.gitignore b/.gitignore
index b55ebf96c650534ee72ccec484316c228b49de3d..a9611540538f8861d95dd3f9809b75181f8d948e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,6 +50,7 @@ examples/*.log.*
 # This is auto generated by hodtest.C
 examples/db_cratemap.dat
 examples/report.out
+examples/periodic.out
 examples/HScaler.txt
 
 # Working directory
diff --git a/examples/hodtest.C b/examples/hodtest.C
index 53932fdc7917db94d8e1cb51312b96295b789f12..f37f54b3448a9f4009c0f2610adbbacb0ff303f2 100644
--- a/examples/hodtest.C
+++ b/examples/hodtest.C
@@ -67,7 +67,13 @@
 
   gHaPhysics->Add(new THcHodoEff("hhodeff","HMS Hodoscope Efficiencies","H.hod"));
   gHaPhysics->Add(new THcHodoEff("shodeff","SOS Hodoscope Efficiencies","S.hod"));
-
+  THcPeriodicReport* prep = new THcPeriodicReport("rep","Periodic Report","periodic.template", "periodic.out");
+  // Defaults to every 2 seconds.  To do by event count instead:
+  //  prep->SetEventPeriod(1000);
+  //  prep->SetTimePeriod(0);
+  //gSystem->Exec("rm periodic.out");
+  //gSystem->Exec("./runstats.tcl periodic.out&"); 
+  gHaPhysics->Add(prep);
 
   // Set up the analyzer - we use the standard one,
   // but this could be an experiment-specific one as well.
diff --git a/examples/periodic.template b/examples/periodic.template
new file mode 100644
index 0000000000000000000000000000000000000000..09f437a26db43a6feac6b0e2c66bf36cfbe20af4
--- /dev/null
+++ b/examples/periodic.template
@@ -0,0 +1,6 @@
+Pedestal events:  {Pedestal_event.npassed}
+Total events:   {Pedestal_event.ncalled}
+HMS events:  {HMS_event.npassed}
+Scaler events:  {scalar_event.npassed}
+hfoundtracks:  {hFoundTrack.npassed}  
+Found/events %: {100*hFoundTrack.npassed/HMS_event.npassed:%.5f}
diff --git a/examples/runstats.tcl b/examples/runstats.tcl
new file mode 100755
index 0000000000000000000000000000000000000000..2b989f15e207859f48c909afa6a2bd2c7844995a
--- /dev/null
+++ b/examples/runstats.tcl
@@ -0,0 +1,188 @@
+#!/usr/bin/wish -f
+#This is a Tcl script that reads the contents of a data file.
+#It reads every few seconds (defined by readinterval)
+#The file is assumed to consist of two entries per line 
+#separated by a colon (no blank lines!). 
+#Note also that the wish path is different
+#for different machines;  Usually /usr/local/bin/wish
+#
+#Sep 1995 Derek van Westrum  (vanwestr@colorado.edu)
+#
+
+#First check to see if filename and run# given as arguments...
+
+if {$argc == 1} {
+#    puts stderr "Wrong number of arguments."
+#    puts stderr "Usage:  'runstats filename run#'"
+#    puts stderr "Trying something..."
+    puts stderr "Num of arguments: $argc"
+    puts stderr "Value of argument: $argv"
+    if {$argc == 1} {
+	set file [lindex $argv 0]
+	if ![file exist $file] {
+	    after 2000
+	}
+	if [catch {open $file r} FileId] {
+	    puts stderr "Cannot find file: $file"
+	    puts stderr "Check file name and path."
+	    puts stderr "Trying 'stats.txt'..."
+	    set file "scalers/stats$file.txt"
+	    if [catch {open $file r} FileId] {
+		puts stderr "Nope. 'stats.txt' not there.  Exiting..."
+		puts stderr "What file? $file"
+		exit
+	    } else {
+		set FileId [open $file r]
+		set fileline [split [read $FileId] \n:] 
+		puts stdout "Setting Run Number to 0000..."
+		set runnum "0000"
+	    }
+	} else {
+	    set FileId [open $file r]
+	    set fileline [split [read $FileId] \n:] 
+	    puts stdout "Setting Run Number to 0000..."
+	    set runnum "0000"
+	}
+    } else {
+	set file "stats.txt"
+	if [catch {open $file r} FileId] {
+	    puts stderr "Nope. 'stats.txt' not there.  Exiting..."
+	    exit
+	} else {
+	    set FileId [open $file r]
+	    set fileline [split [read $FileId] \n:] 
+	    puts stdout "Setting Run Number to 0000..."
+	    set runnum "0000"
+	}
+    }
+}
+#Now set the file name as the 1st argument in the command line...
+if {$argc == 2} {
+    set file [lindex $argv 0]
+    set runnum [lindex $argv 1]
+    if [catch {open $file r} FileId] {
+	puts stderr "Cannot find file: $file"
+	puts stderr "Check file name and path."
+	    puts stderr "Trying 'stats.txt'..."
+	    set file "stats.txt"
+	    if [catch {open $file r} FileId] {
+		puts stderr "Nope.  'stats.txt' not there.  Exiting..."
+		exit
+	    } else {
+		set FileId [open $file r]
+		set fileline [split [read $FileId] \n:] 
+		puts stdout "Setting Run Number to 0000..."
+		set runnum "0000"
+	    }
+	} else {
+	set FileId [open $file r]
+	set fileline [split [read $FileId] \n:] 
+    }
+}
+
+#Then set the read interval in ms
+set readinterval 2000
+
+#Now find the number of lines in the file.
+#This is done by counting colons.  Blank lines
+#will screw this up!
+set lines [exec grep -c ":" $file]
+global off
+set off 0 
+#Now setup the main window
+wm title . "Stats:Run#$runnum"
+wm minsize . 50 4
+
+#Setup the button bar
+#The read button will run the process Read.  See below
+frame .buttons -borderwidth 4 -relief ridge 
+pack .buttons -side top -fill x
+button .buttons.quit -text Quit -command exit
+button .buttons.read -text Read -command Read
+button .buttons.faster -text {Analyze Faster} -command Fast
+pack .buttons.read -side left
+pack .buttons.quit -side right
+pack .buttons.faster -side right
+
+#Now setup two fields for each line in the file
+#The variable names will be raised on the left
+#The values will be sunken on the right
+
+frame .field 
+pack .field -side bottom -expand true -fill both -padx 10 -pady 10
+
+frame .field.var
+pack .field.var -side left -fill y -expand true
+
+frame .field.val
+pack .field.val -side right -fill y -expand true
+
+for {set i 1} {$i <= $lines } {incr i 1} {
+    set temp [expr 2*$i -2]
+    set mylabl [lindex $fileline $temp]
+    set mylabl [string trimright $mylabl]
+    if {[string length $mylabl]==0} {
+      label .field.var.var$i -width 13 -anchor e -padx 2
+      label .field.val.val$i -width 8 
+    } else {
+      label .field.var.var$i -width 15 -anchor e -padx 2
+      label .field.val.val$i -relief sunken -width 8 -bg DarkGoldenrod3
+      .field.var.var$i config -text $mylabl: -padx 10 -anchor e
+    }
+    pack .field.var.var$i -side top -expand true
+    pack .field.val.val$i -side top -expand true
+}
+
+#The process Read will go through "fileline" picking out the
+# values which are in the "even" positions.  Read will execute
+#when it's called by the loop below, or when the read button
+#is pressed.
+
+proc Read { } {
+    global lines file fileline off
+    set FileId [open $file r]
+    set fileline [split [read $FileId] \n:] 
+    for {set i 1} {$i <=$lines } {incr i 1} {
+	set temp [expr 2*$i -1]
+	.field.val.val$i config -text [lindex $fileline $temp] \
+		-padx 10 -anchor w
+	if {[expr 2*$i-1] == 7} {
+	    set x [lindex $fileline $temp]
+	    set y [lindex $x 0]
+	    set z [expr $y+$off]
+	    set a [concat $z Hz]
+	    .field.val.val$i config -text $a \
+ 	      -padx 10 -anchor w
+	}
+}
+
+    #Now change the color of he background quickly to 
+    #indicate that the file is being read.
+#    for {set i 1} {$i <=$lines } {incr i 1} {
+#	.field.val.val$i config -bg Grey
+#    }
+#    after 2 {
+#	for {set i 1} {$i <=$lines } {incr i 1} {
+#	    .field.val.val$i config -bg LightGrey
+#	}
+#    }
+    close $FileId
+}
+
+proc Fast { } {
+    global off
+    incr off 100
+    }
+
+#Now define a recursive (general) process that runs
+#a procedure every "interval" ms
+proc loopdeloop { process interval } {
+    $process
+    after $interval [list loopdeloop $process $interval]
+}
+
+#Now keep reading...
+loopdeloop Read $readinterval
+
+
+close $FileId