diff --git a/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..ef3bd790fde0628b96992c21eb6d28384bd2ce42
--- /dev/null
+++ b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.cpp
@@ -0,0 +1,48 @@
+
+#include <stdlib.h>
+#include "Arduino_Mega_ISR_Registry.h"
+#include "avr/interrupt.h"
+
+proc_ptr Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_NUM_SLOTS];
+
+void Arduino_Mega_ISR_Registry::init()
+{
+    for (int i = 0; i < ISR_REGISTRY_NUM_SLOTS; i++)
+        _registry[i] = NULL;
+}
+
+int Arduino_Mega_ISR_Registry::register_signal(int signal, proc_ptr proc)
+{
+    if (signal >= 0 && signal < ISR_REGISTRY_NUM_SLOTS) {
+        _registry[signal] = proc;
+        return 0;
+    }
+    return -1;
+}
+
+int Arduino_Mega_ISR_Registry::unregister_signal(int signal)
+{
+    if (signal >= 0 && signal < ISR_REGISTRY_NUM_SLOTS) {
+        _registry[signal] = NULL;
+        return 0;
+    }
+    return -1;
+}
+
+/* ========== ISR IMPLEMENTATIONS ========== */
+
+extern "C" ISR(TIMER2_OVF_vect) {
+    if (Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER2_OVF] != NULL)
+        Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER2_OVF]();
+}
+
+
+extern "C" ISR(TIMER4_CAPT_vect) {
+    if (Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER4_CAPT] != NULL)
+        Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER4_CAPT]();
+}
+
+extern "C" ISR(TIMER5_CAPT_vect) {
+    if (Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER5_CAPT] != NULL)
+        Arduino_Mega_ISR_Registry::_registry[ISR_REGISTRY_TIMER5_CAPT]();
+}
diff --git a/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h
new file mode 100644
index 0000000000000000000000000000000000000000..0bd51539f70fde46b7d7dd5a2809457dde3c5878
--- /dev/null
+++ b/libraries/Arduino_Mega_ISR_Registry/Arduino_Mega_ISR_Registry.h
@@ -0,0 +1,22 @@
+
+#ifndef __ARDUINO_MEGA_ISR_REGISTRY_H__
+#define __ARDUINO_MEGA_ISR_REGISTRY_H__
+
+#define ISR_REGISTRY_TIMER2_OVF    0
+#define ISR_REGISTRY_TIMER4_CAPT   1
+#define ISR_REGISTRY_TIMER5_CAPT   2
+#define ISR_REGISTRY_NUM_SLOTS     3
+
+typedef void (*proc_ptr)(void);
+
+class Arduino_Mega_ISR_Registry
+{
+    public:
+    void init();
+    int register_signal(int isr_number, proc_ptr proc);
+    int unregister_signal(int isr_number);
+
+    static proc_ptr _registry[ISR_REGISTRY_NUM_SLOTS];
+};
+
+#endif // __ARDUINO_MEGA_ISR_REGISTRY_H__