diff --git a/processes/align.py b/old_data_analysis/align.py
similarity index 100%
rename from processes/align.py
rename to old_data_analysis/align.py
diff --git a/processes/autoreg.py b/old_data_analysis/autoreg.py
similarity index 100%
rename from processes/autoreg.py
rename to old_data_analysis/autoreg.py
diff --git a/processes/crosscorr.py b/old_data_analysis/crosscorr.py
similarity index 100%
rename from processes/crosscorr.py
rename to old_data_analysis/crosscorr.py
diff --git a/processes/fft.py b/old_data_analysis/fft.py
similarity index 100%
rename from processes/fft.py
rename to old_data_analysis/fft.py
diff --git a/processes/fft_function.py b/old_data_analysis/fft_function.py
similarity index 100%
rename from processes/fft_function.py
rename to old_data_analysis/fft_function.py
diff --git a/processes/findpeaks.py b/old_data_analysis/findpeaks.py
similarity index 100%
rename from processes/findpeaks.py
rename to old_data_analysis/findpeaks.py
diff --git a/processes/standardscaler.py b/old_data_analysis/standardscaler.py
similarity index 100%
rename from processes/standardscaler.py
rename to old_data_analysis/standardscaler.py
diff --git a/routines/__init__.py b/old_plotting/__init__.py
similarity index 100%
rename from routines/__init__.py
rename to old_plotting/__init__.py
diff --git a/routines/boxplot.py b/old_plotting/boxplot.py
similarity index 100%
rename from routines/boxplot.py
rename to old_plotting/boxplot.py
diff --git a/routines/heatmap.py b/old_plotting/heatmap.py
similarity index 100%
rename from routines/heatmap.py
rename to old_plotting/heatmap.py
diff --git a/routines/histogram.py b/old_plotting/histogram.py
similarity index 100%
rename from routines/histogram.py
rename to old_plotting/histogram.py
diff --git a/routines/mean_plot.py b/old_plotting/mean_plot.py
similarity index 100%
rename from routines/mean_plot.py
rename to old_plotting/mean_plot.py
diff --git a/routines/median_plot.py b/old_plotting/median_plot.py
similarity index 100%
rename from routines/median_plot.py
rename to old_plotting/median_plot.py
diff --git a/routines/plot_utils.py b/old_plotting/plot_utils.py
similarity index 100%
rename from routines/plot_utils.py
rename to old_plotting/plot_utils.py
diff --git a/routines/plottingabc.py b/old_plotting/plottingabc.py
similarity index 100%
rename from routines/plottingabc.py
rename to old_plotting/plottingabc.py
diff --git a/routines/single_birth_plot.py b/old_plotting/single_birth_plot.py
similarity index 100%
rename from routines/single_birth_plot.py
rename to old_plotting/single_birth_plot.py
diff --git a/routines/single_plot.py b/old_plotting/single_plot.py
similarity index 100%
rename from routines/single_plot.py
rename to old_plotting/single_plot.py
diff --git a/plotting.py b/plotting.py
index db2a7d7313a54f71893bebcd4ecb3e42ebc88202..a229e308a8e8181c466002974e66e5f6dd35fd55 100644
--- a/plotting.py
+++ b/plotting.py
@@ -4,6 +4,7 @@ import matplotlib.cm
 import matplotlib.pylab as plt
 import numpy as np
 import numpy.matlib
+from butterfilter import butterfilter
 
 
 def kymograph(
@@ -536,6 +537,8 @@ def bud_to_bud_plot(
     nbins=None,
     return_signal=False,
     df=None,
+    title=None,
+    filter=False,
 ):
     """
     Plot the median and percentiles of a signal between consecutive buddings.
@@ -565,6 +568,10 @@ def bud_to_bud_plot(
         bins.
     df: pd.DataFrame, optional
         If passed, use this data rather than dataloader's.
+    title: str, optional
+        Title for plot.
+    filter: boolean
+        If True, apply a butter filter to each time series.
 
     Example
     -------
@@ -577,6 +584,8 @@ def bud_to_bud_plot(
     else:
         t, signal_data = dl.get_time_series(signal, group=group, df=df)
         t, buddings = dl.get_time_series("buddings", group=group, df=df)
+    if filter:
+        signal_data = butterfilter(signal_data)
     if np.max(t) > 48:
         # convert to hours
         t = t / 60
@@ -590,43 +599,47 @@ def bud_to_bud_plot(
             past_buddings = np.nonzero(buddings[i, :][:tpt_i])[0]
             if np.any(past_buddings):
                 start_tpt_i = past_buddings[-1]
-                local_signals.append(
-                    signal_data[i, start_tpt_i : end_tpt_i + 1]
-                )
-                local_times.append(t[start_tpt_i : end_tpt_i + 1])
-    # find bins for normalised time, between 0 and 1
-    nbins = int(np.median([len(local_time) for local_time in local_times]))
-    ntbins = np.linspace(0, 1, nbins)
-    # interpolate each local signal to make a new signal
-    new_signal = np.nan * np.ones((len(local_signals), nbins))
-    for i in range(len(local_signals)):
-        s = local_signals[i]
-        # normalise time between 0 and 1
-        nt = local_times[i] - local_times[i][0]
-        nt /= nt[-1]
-        # interpolate into the bins
-        new_signal[i, :] = np.interp(
-            ntbins,
-            nt[~np.isnan(s)],
-            s[~np.isnan(s)],
-            left=np.nan,
-            right=np.nan,
-        )
-    # plot median and percentiles
-    plt.figure()
-    plt.plot(ntbins, np.nanmedian(new_signal, axis=0), f"{colour}.-")
-    for lower, upper in zip([45, 40, 35], [55, 60, 65]):
-        plt.fill_between(
-            ntbins,
-            np.nanpercentile(new_signal, lower, axis=0),
-            np.nanpercentile(new_signal, upper, axis=0),
-            alpha=0.06,
-            color=colour,
-        )
-    plt.xlabel("position between budding events")
-    plt.ylabel(signal.replace("_", " "))
-    plt.grid()
-    plt.title(f"{dl.dataname}: t={tpt}")
-    plt.show(block=False)
-    if return_signal:
-        return new_signal
+                local_data = signal_data[i, start_tpt_i : end_tpt_i + 1]
+                if ~np.all(np.isnan(local_data)):
+                    local_signals.append(local_data)
+                    local_times.append(t[start_tpt_i : end_tpt_i + 1])
+    if local_times:
+        # find bins for normalised time, between 0 and 1
+        nbins = int(np.median([len(local_time) for local_time in local_times]))
+        ntbins = np.linspace(0, 1, nbins)
+        # interpolate each local signal to make a new signal
+        new_signal = np.nan * np.ones((len(local_signals), nbins))
+        for i in range(len(local_signals)):
+            s = local_signals[i]
+            # normalise time between 0 and 1
+            nt = local_times[i] - local_times[i][0]
+            nt /= nt[-1]
+            # interpolate into the bins
+            new_signal[i, :] = np.interp(
+                ntbins,
+                nt[~np.isnan(s)],
+                s[~np.isnan(s)],
+                left=np.nan,
+                right=np.nan,
+            )
+        # plot median and percentiles
+        plt.figure()
+        plt.plot(ntbins, np.nanmedian(new_signal, axis=0), f"{colour}.-")
+        for lower, upper in zip([45, 40, 35], [55, 60, 65]):
+            plt.fill_between(
+                ntbins,
+                np.nanpercentile(new_signal, lower, axis=0),
+                np.nanpercentile(new_signal, upper, axis=0),
+                alpha=0.06,
+                color=colour,
+            )
+        plt.xlabel("position between budding events")
+        plt.ylabel(signal.replace("_", " "))
+        plt.grid()
+        if title is None:
+            plt.title(f"{dl.dataname}: t={tpt}")
+        else:
+            plt.title(title)
+        plt.show(block=False)
+        if return_signal:
+            return new_signal