diff --git a/setup.py b/setup.py
index db5e773ffd705635160b0549e71fb781f014e990..8b4a3a679f9a4f930a02d198d08468dde76f21d9 100644
--- a/setup.py
+++ b/setup.py
@@ -26,12 +26,11 @@ from Cython.Distutils import build_ext
 
 def setup_package():
 
-    path = 'wetb/fatigue_tools/rainflowcounting/'
-    module = 'wetb.fatigue_tools.rainflowcounting'
-    names = ['pair_range', 'peak_trough', 'rainflowcount_astm']
+    ex_info = [('wetb.fatigue_tools.rainflowcounting', ['pair_range', 'peak_trough', 'rainflowcount_astm']),
+			   ('wetb.signal_tools.filters', ['cy_filters'])]
     extlist = [Extension('%s.%s' % (module, n),
-                         [os.path.join(path, n)+'.pyx'],
-                         include_dirs=[np.get_include()]) for n in names]
+                         [os.path.join(module.replace(".","/"), n)+'.pyx'],
+                         include_dirs=[np.get_include()]) for module, names in ex_info for n in names]
 
     needs_sphinx = {'build_sphinx', 'upload_docs'}.intersection(sys.argv)
     sphinx = ['sphinx'] if needs_sphinx else []
diff --git a/wetb/signal_tools/filters/cy_filters.pyx b/wetb/signal_tools/filters/cy_filters.pyx
new file mode 100644
index 0000000000000000000000000000000000000000..28fe4b32eb3c5cc5c8702dbddbdd60f3945740c8
--- /dev/null
+++ b/wetb/signal_tools/filters/cy_filters.pyx
@@ -0,0 +1,59 @@
+import cython
+import numpy as np
+cimport numpy as np
+'''
+Created on 29/05/2013
+
+@author: Mads M. Pedersen (mmpe@dtu.dk)
+'''
+
+
+import cython
+import numpy as np
+cimport numpy as np
+
+
+@cython.ccall
+@cython.locals(alpha=cython.float, i=cython.int)
+cpdef cy_low_pass_filter(np.ndarray[double,ndim=1] inp, double delta_t, double tau):
+    cdef np.ndarray[double,ndim=1] output
+    output = np.empty_like(inp, dtype=np.float)
+    output[0] = inp[0]
+
+    alpha = delta_t / (tau + delta_t)
+    for i in range(1, inp.shape[0]):
+        output[i] = output[i - 1] + alpha * (inp[i] - output[i - 1])  # Same as output[i] = alpha*inp[i]+(1-alpha)*output[i-1]
+
+    return output
+
+cpdef cy_dynamic_low_pass_filter(np.ndarray[double,ndim=1] inp, double delta_t, np.ndarray[double,ndim=1] tau, int method):
+    cdef np.ndarray[double,ndim=1] output, alpha
+    cdef int i
+
+    output = np.empty_like(inp, dtype=np.float)
+    output[0] = inp[0]
+
+    if method == 1:
+        alpha = delta_t / (tau + delta_t)
+        for i in range(1, inp.shape[0]):
+            output[i] = output[i - 1] + alpha[i] * (inp[i] - output[i - 1])  # Same as output[i] = alpha*inp[i]+(1-alpha)*output[i-1]
+    elif method == 2:
+        for i in range(1, inp.shape[0]):
+            output[i] = (delta_t * (inp[i] + inp[i - 1] - output[i - 1]) + 2 * tau[i] * output[i - 1]) / (delta_t + 2 * tau[i])
+    elif method == 3:
+        for i in range(1, inp.shape[0]):
+            output[i] = output[i - 1] * np.exp(-delta_t / tau[i]) + inp[i] * (1 - np.exp(-delta_t / tau[i]))
+    return output
+
+
+@cython.ccall
+@cython.locals(alpha=cython.float, i=cython.int)
+cpdef cy_high_pass_filter(np.ndarray[double,ndim=1] inp, double delta_t, double tau):
+    cdef np.ndarray[double,ndim=1] output
+    output = np.empty_like(inp, dtype=np.float)
+    output[0] = inp[0]
+    alpha = tau / (tau + delta_t)
+    for i in range(1, inp.shape[0]):
+        output[i] = alpha * (output[i - 1] + inp[i] - inp[i - 1])
+
+    return output
diff --git a/wetb/signal_tools/tests/test_first_order.py b/wetb/signal_tools/tests/test_first_order.py
new file mode 100644
index 0000000000000000000000000000000000000000..c49c464d36732c26bcf47a232ecb72ae75940b5c
--- /dev/null
+++ b/wetb/signal_tools/tests/test_first_order.py
@@ -0,0 +1,34 @@
+'''
+Created on 13. jan. 2017
+
+@author: mmpe
+'''
+import unittest
+from wetb.signal_tools.filters import first_order
+import numpy as np
+
+class Test_first_order_filters(unittest.TestCase):
+
+
+    def test_low_pass(self):
+        a = np.random.randint(0,100,100).astype(np.float)
+        b = first_order.low_pass(a, 1, 1)
+        self.assertLess(b.std(), a.std())
+        if 0:
+            import matplotlib.pyplot as plt
+            plt.plot(a)
+            plt.plot(b)
+            plt.show()
+
+    def test_high_pass(self):
+        a = np.random.randint(0,100,100).astype(np.float)
+        b = first_order.high_pass(a, 1, 1)
+        self.assertLess(b.mean(), a.mean())
+        if 0:
+            import matplotlib.pyplot as plt
+            plt.plot(a)
+            plt.plot(b)
+            plt.show()
+if __name__ == "__main__":
+    #import sys;sys.argv = ['', 'Test.testName']
+    unittest.main()
\ No newline at end of file