diff --git a/src/PRadETChannel.cxx b/src/PRadETChannel.cxx
index 3f4d13c78fbed0d94f9b367e87df35a81830e411..da3dc28ee21b8c02700a31f52eab5b3d33f4d957 100644
--- a/src/PRadETChannel.cxx
+++ b/src/PRadETChannel.cxx
@@ -36,8 +36,7 @@ PRadETChannel::~PRadETChannel()
 // Close ET connection
 void PRadETChannel::ForceClose()
 {
-    if(et_id != nullptr && et_alive(et_id))
-    {
+    if((et_id != nullptr) && et_alive(et_id)) {
         et_forcedclose(et_id);
         et_id = nullptr;
     }
diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt
index cc473be08586a99e62b12d1bb473504c386f8dec..74815add0127f8aad04c09b75a6d80c36669208c 100644
--- a/tools/CMakeLists.txt
+++ b/tools/CMakeLists.txt
@@ -20,6 +20,7 @@ foreach(exe_src ${APP_SOURCES})
 
     target_link_libraries(${exe}
     PUBLIC
+        ${PROJECT_NAME}::HallC
         Podd::Podd
         Podd::Decode
         coda_et::coda_et
diff --git a/tools/et_feeder.cpp b/tools/et_feeder.cpp
index 5cfc6db2123482b29a4412f22c939b8ac9648038..ce11688f588254cce9a9e3af51bb0ba9c73b0b61 100644
--- a/tools/et_feeder.cpp
+++ b/tools/et_feeder.cpp
@@ -2,8 +2,21 @@
 #include "PRadETChannel.h"
 #include "et.h"
 #include "evio.h"
+#include <csignal>
+#include <thread>
+#include <chrono>
+#include <iostream>
 
-#define PROGRESS_COUNT 1000
+
+using namespace std::chrono;
+
+
+volatile std::sig_atomic_t gSignalStatus;
+
+
+void signal_handler(int signal) {
+    gSignalStatus = signal;
+}
 
 
 int main(int argc, char* argv[])
@@ -14,15 +27,15 @@ int main(int argc, char* argv[])
     conf_opt.AddOpt(ConfigOption::arg_require, 'h');
     conf_opt.AddOpt(ConfigOption::arg_require, 'p');
     conf_opt.AddOpt(ConfigOption::arg_require, 'f');
-    conf_opt.AddOpt(ConfigOption::arg_require, 'r');
+    conf_opt.AddOpt(ConfigOption::arg_require, 'i');
 
     conf_opt.SetDesc("usage: %0 <data_file>");
     conf_opt.SetDesc('h', "host address of the ET system, default \"localhost\".");
     conf_opt.SetDesc('p', "port to connect, default 11111.");
     conf_opt.SetDesc('f', "memory mapped et file, default \"/tmp/et_feeder\".");
-    conf_opt.SetDesc('r', "rate in mili-seconds to write data, default \"10\"");
+    conf_opt.SetDesc('i', "interval in milliseconds to write data, default \"10\"");
 
-    if (!conf_opt.ParseArgs(argc, argv) || conf_opt.NbofArgs() != 2) {
+    if (!conf_opt.ParseArgs(argc, argv) || conf_opt.NbofArgs() != 1) {
         std::cout << conf_opt.GetInstruction() << std::endl;
         return -1;
     }
@@ -30,7 +43,7 @@ int main(int argc, char* argv[])
     std::string host = "localhost";
     int port = 11111;
     std::string etf = "/tmp/et_feeder";
-    float rate = 10.;
+    int interval = 10;
 
     for (auto &opt : conf_opt.GetOptions()) {
         switch (opt.mark) {
@@ -43,13 +56,39 @@ int main(int argc, char* argv[])
         case 'f':
             etf = opt.var.String();
             break;
-        case 'r':
-            rate = opt.var.Float();
+        case 'i':
+            interval = opt.var.Int();
             break;
         default :
             std::cout << conf_opt.GetInstruction() << std::endl;
             return -1;
         }
     }
+
+    auto ch = new PRadETChannel();
+    try {
+        ch->Open(host.c_str(), port, etf.c_str());
+        ch->NewStation("Data Feeder");
+        ch->AttachStation();
+    } catch (PRadException e) {
+        std::cerr << e.FailureType() << ": " << e.FailureDesc() << std::endl;
+        return -1;
+    }
+
+    // install signal handler
+    std::signal(SIGINT, signal_handler);
+    while (true) {
+        if (gSignalStatus == SIGINT) {
+            std::cout << "Received control-C, exiting..." << std::endl;
+            ch->ForceClose();
+            break;
+        }
+        system_clock::time_point start(system_clock::now());
+        system_clock::time_point next(start + std::chrono::milliseconds(interval));
+
+        std::this_thread::sleep_until(next);
+    }
+
+    return 0;
 }
 
diff --git a/tools/et_producer.cpp b/tools/et_producer.cpp
index 57bbfed82800eb2d3d036435426f355d4f3fda8a..6d095f41d50d4e22ceddcc0d471db1dc98d92a3e 100644
--- a/tools/et_producer.cpp
+++ b/tools/et_producer.cpp
@@ -614,10 +614,10 @@ static void * signal_thread (void *arg) {
 
   sigset_t   signal_set;
   int        sig_number;
- 
+
   sigemptyset(&signal_set);
   sigaddset(&signal_set, SIGINT);
-  
+
   /* Not necessary to clean up as ET system will do it */
   sigwait(&signal_set, &sig_number);
   printf("Got control-C, exiting\n");