diff --git a/aartfaacreader/RCUMode.h b/aartfaacreader/RCUMode.h
new file mode 100644
index 0000000000000000000000000000000000000000..04c2355a9b03747ccf600653f708076ef208317d
--- /dev/null
+++ b/aartfaacreader/RCUMode.h
@@ -0,0 +1,134 @@
+// Copyright (C) 2023 ASTRON (Netherlands Institute for Radio Astronomy)
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+/// This code was taken from https://git.astron.nl/RD/aartfaac-tools.git
+/// and adapted to fit into DP3 codebase.
+
+#ifndef AARTFAAC_MODE_H
+#define AARTFAAC_MODE_H
+
+#include <string>
+#include <stdexcept>
+
+class RCUMode {
+ public:
+  enum Mode {
+    Unused = 0,         // 0 = Unused
+    LBAOuter10_90 = 1,  // 1 = LBA_OUTER, 10-90 MHz Analog filter
+    LBAOuter30_90 = 2,  // Mode 2 = LBA_OUTER, 30-90 MHz Analog filter
+    LBAInner10_90 = 3,  // Mode 3 = LBA_INNER, 10-90 MHz Analog filter
+    LBAInner30_90 = 4,  // Mode 4 = LBA_INNER, 30-90 MHz Analog filter
+    HBA110_190 = 5,     // Mode 5 = HBA, 110-190MHz Analog filter
+    HBA170_230 = 6,     // Mode 6 = HBA, 170-230MHz Analog filter
+    HBA210_270 = 7      // Mode 7 = HBA, 210-270MHz Analog filter
+  } mode;
+
+  RCUMode(Mode m) : mode(m){};
+  RCUMode(){};
+
+  std::string ToString() const {
+    switch (mode) {
+      default:
+      case Unused:
+        return "unused";
+      case LBAOuter10_90:
+        return "LBA_OUTER 10-90 MHz";
+      case LBAOuter30_90:
+        return "LBA_OUTER 30-90 MHz";
+      case LBAInner10_90:
+        return "LBA_INNER 10-90 MHz";
+      case LBAInner30_90:
+        return "LBA_INNER 30-90 MHz";
+      case HBA110_190:
+        return "HBA 110-190 MHz";
+      case HBA170_230:
+        return "HBA 170-230 MHz";
+      case HBA210_270:
+        return "HBA 210-270 MHz";
+    }
+  }
+
+  std::string AntennaType() {
+    std::string antenna_type;
+    switch (mode) {
+      case RCUMode::LBAInner10_90:
+      case RCUMode::LBAInner30_90:
+      case RCUMode::LBAOuter10_90:
+      case RCUMode::LBAOuter30_90:
+        antenna_type = "LBA";
+        break;
+      case RCUMode::HBA110_190:
+      case RCUMode::HBA170_230:
+      case RCUMode::HBA210_270:
+        antenna_type = "HBA";
+        break;
+      default:
+        antenna_type = "?";
+        break;
+    }
+    return antenna_type;
+  }
+  bool operator==(Mode _mode) const { return _mode == mode; }
+
+  static RCUMode FromNumber(int modeNumber) {
+    return {static_cast<Mode>(modeNumber)};
+  }
+
+  double Bandwidth() const {
+    switch (mode) {
+      case RCUMode::LBAInner10_90:  // 200 MHz clock, Nyquist zone 1
+      case RCUMode::LBAInner30_90:
+      case RCUMode::LBAOuter10_90:
+      case RCUMode::LBAOuter30_90:
+      case RCUMode::HBA110_190:  // 200 MHz clock, Nyquist zone 2
+      case RCUMode::HBA210_270:  // 200 MHz clock, Nyquist zone 3
+        return 195312.5;         // 1/1024 x nu_{clock}
+      case RCUMode::HBA170_230:  // 160 MHz clock, Nyquist zone 3
+        return 156250.0;
+      default:
+        throw std::runtime_error(
+            "Don't know how to handle this mode: not implemented yet");
+    }
+  }
+
+  double CentralFrequency() const {
+    switch (mode) {
+      case RCUMode::LBAOuter30_90:
+      case RCUMode::LBAInner30_90:
+        return 60.;
+      case RCUMode::LBAOuter10_90:
+      case RCUMode::LBAInner10_90:
+        return 50.;
+      case RCUMode::HBA110_190:
+        return 150.;
+      case RCUMode::HBA210_270:
+        return 240.;
+      case RCUMode::HBA170_230:
+        return 200.;
+      default:
+        throw std::runtime_error(
+            "Don't know how to handle this mode: not implemented yet");
+    }
+  }
+
+  double FrequencyOffset() const {
+    switch (mode) {
+      case RCUMode::LBAInner10_90:  // 200 MHz clock, Nyquist zone 1
+      case RCUMode::LBAInner30_90:
+      case RCUMode::LBAOuter10_90:
+      case RCUMode::LBAOuter30_90:
+        return 0.0;
+      case RCUMode::HBA110_190:  // 200 MHz clock, Nyquist zone 2
+        return 100e6;
+      case RCUMode::HBA170_230:  // 160 MHz clock, Nyquist zone 3
+        return 160e6;
+      case RCUMode::HBA210_270:  // 200 MHz clock, Nyquist zone 3
+        return 200e6;
+      default:
+        throw std::runtime_error(
+            "Don't know how to handle this mode: not implemented yet");
+    }
+  }
+};
+
+#endif