diff --git a/modules/aeolus/aeolus_amv.py b/modules/aeolus/aeolus_amv.py
index 91987c10517be8dc80bcc8c3317a9d102db9b14e..a4b4d06a15883e9e5538cb86db9866c707e1ef45 100644
--- a/modules/aeolus/aeolus_amv.py
+++ b/modules/aeolus/aeolus_amv.py
@@ -246,12 +246,14 @@ def create_file2(filename, raob_to_amv_dct, raob_dct, amv_files):
     rootgrp.close()
 
 
-def run_best_fit_all(amv_dir, source, product_dir, product, raob_path, gfs_path, full_domain=False):
+def run_best_fit_driver(amv_dir, source, raob_path, gfs_path, product_dir, product):
     amv_files = get_datasource(amv_dir, source)
-    prd_files = get_datasource(product_dir, product)
     gfs_files = get_datasource(gfs_path, 'GFS')
     raob_ds = get_datasource(raob_path, 'RAOB')
     raob_files = raob_ds.flist
+    prd_files = None
+    if product_dir is None:
+        prd_files = get_datasource(product_dir, product)
 
     out_list = []
     amvs_list = []
@@ -259,141 +261,102 @@ def run_best_fit_all(amv_dir, source, product_dir, product, raob_path, gfs_path,
     rb_list = []
     bfs_gfs_list = []
     prd_list = []
-    if not full_domain:
-        for k, file in enumerate(raob_files):
-            raob_dct = get_raob_dict_cdf(file)
-            ts = raob_ds.ftimes[k,0]
-            m_d = match_amvs_to_raobs(raob_dct, ts, amv_files)
-            if m_d is None:
-                continue
-            gfs_file = gfs_files.get_file(ts)[0]
-            if gfs_file is None:
-                continue
-            bf_dct = run_best_fit(m_d, raob_dct, gfs_file)
-            prd_dct = get_product_at_locs(m_d, ts, prd_files)
-            out_list.append((bf_dct, prd_dct))
-
-        for tup in out_list:
-            ab_dct = tup[0]
-            pr_dct = tup[1]
 
-            keys = list(ab_dct.keys())
-            for key in keys:
-                tup = ab_dct.get(key)
-                amvs_list.append(tup[0])
-                bfs_list.append(tup[1])
-                rb_list.append(tup[2])
-                bfs_gfs_list.append(tup[3])
+    for k, file in enumerate(raob_files):
+        raob_dct = get_raob_dict_cdf(file)
+        ts = raob_ds.ftimes[k,0]
+        m_d = match_amvs_to_raobs(raob_dct, ts, amv_files)
+        if m_d is None:
+            continue
 
-            keys = list(pr_dct.keys())
-            for key in keys:
-                prd_list.append(pr_dct.get(key))
+        gfs_file = gfs_files.get_file(ts)[0]
+        if gfs_file is None:
+            continue
 
-        amvs = np.concatenate(amvs_list)
-        bfs = np.concatenate(bfs_list)
-        rbm = np.concatenate(rb_list)
-        bfs_gfs = np.concatenate(bfs_gfs_list)
-        prd = np.concatenate(prd_list)
+        bf_dct = run_best_fit(m_d, raob_dct, gfs_file)
 
-        tup = (amvs, bfs, prd, bfs_gfs, rbm)
-        return tup
-    else:
-        for k, file in enumerate(raob_files):
-            raob_dct = get_raob_dict_cdf(file)
-            ts = raob_ds.ftimes[k,0]
-            amvs = get_amvs(amv_files, ts)
-            if amvs is None:
-                continue
-            gfs_file = gfs_files.get_file(ts)[0]
-            if gfs_file is None:
+        prd_dct = None
+        if prd_files is not None:
+            prd_dct = get_product_at_locs(m_d, ts, prd_files)
+            if prd_dct is None:
                 continue
-            bfs = run_best_fit_gfs(amvs, gfs_file, amv_lat_idx=0, amv_lon_idx=1, amv_prs_idx=4, amv_spd_idx=5, amv_dir_idx=6)
-            alons = amvs[:, 0]
-            alats = amvs[:, 1]
-            prds = get_product_at_lat_lons(prd_files, ts, alons, alats, filepath=None)
 
-            out_list.append((amvs, np.array(bfs), prds))
+        out_list.append((bf_dct, prd_dct))
+
+    for tup in out_list:
+        ab_dct = tup[0]
+        pr_dct = tup[1]
 
-        for tup in out_list:
+        keys = list(ab_dct.keys())
+        for key in keys:
+            tup = ab_dct.get(key)
             amvs_list.append(tup[0])
             bfs_list.append(tup[1])
-            prd_list.append(tup[2])
+            rb_list.append(tup[2])
+            bfs_gfs_list.append(tup[3])
+
+        if pr_dct is not None:
+            keys = list(pr_dct.keys())
+            for key in keys:
+                prd_list.append(pr_dct.get(key))
 
-        amvs = np.concatenate(amvs_list)
-        bfs = np.concatenate(bfs_list)
+    amvs = np.concatenate(amvs_list)
+    bfs = np.concatenate(bfs_list)
+    rbm = np.concatenate(rb_list)
+    bfs_gfs = np.concatenate(bfs_gfs_list)
+    if len(prd_list) == 0:
+        tup = (amvs, bfs, None, bfs_gfs, rbm)
+    else:
         prd = np.concatenate(prd_list)
+        tup = (amvs, bfs, prd, bfs_gfs, rbm)
 
-        tup = (amvs, bfs, prd)
-        return tup
+    return tup
 
-def run_best_fit_all_no_product(amv_dir, source, raob_path, gfs_path, full_domain=False):
-    amv_files = get_datasource(amv_dir, source)
+
+def run_best_fit_gfs_driver(time_s, amv_dir, amv_source, gfs_dir, product_dir, product_type):
+    amv_files = get_datasource(amv_dir, amv_source)
     gfs_files = get_datasource(gfs_path, 'GFS')
-    raob_ds = get_datasource(raob_path, 'RAOB')
-    raob_files = raob_ds.flist
+    prd_files = get_datasource(product_dir, product_type)
 
-    out_list = []
+    out_time_s = []
     amvs_list = []
     bfs_list = []
-    rb_list = []
-    bfs_gfs_list = []
-    if not full_domain:
-        for k, file in enumerate(raob_files):
-            raob_dct = get_raob_dict_cdf(file)
-            ts = raob_ds.ftimes[k,0]
-            m_d = match_amvs_to_raobs(raob_dct, ts, amv_files)
-            if m_d is None:
-                continue
-            gfs_file = gfs_files.get_file(ts)[0]
-            if gfs_file is None:
-                continue
-            bf_dct = run_best_fit(m_d, raob_dct, gfs_file)
-            out_list.append(bf_dct)
-
-        for tup in out_list:
-            ab_dct = tup
-
-            keys = list(ab_dct.keys())
-            for key in keys:
-                tup = ab_dct.get(key)
-                amvs_list.append(tup[0])
-                bfs_list.append(tup[1])
-                rb_list.append(tup[2])
-                bfs_gfs_list.append(tup[3])
-
+    prd_list = []
 
-        amvs = np.concatenate(amvs_list)
-        bfs = np.concatenate(bfs_list)
-        rbm = np.concatenate(rb_list)
-        bfs_gfs = np.concatenate(bfs_gfs_list)
+    for ts in time_s:
+        amvs = get_amvs(amv_files, ts)
+        if amvs is None:
+            continue
+        gfs_file = gfs_files.get_file(ts)[0]
+        if gfs_file is None:
+            continue
+        bfs = run_best_fit_gfs(amvs, gfs_file, amv_lat_idx=0, amv_lon_idx=1, amv_prs_idx=4, amv_spd_idx=5,
+                               amv_dir_idx=6)
 
-        tup = (amvs, bfs, bfs_gfs, rbm)
-        return tup
-    else:
-        for k, file in enumerate(raob_files):
-            raob_dct = get_raob_dict_cdf(file)
-            ts = raob_ds.ftimes[k,0]
-            amvs = get_amvs(amv_files, ts)
-            if amvs is None:
-                continue
-            gfs_file = gfs_files.get_file(ts)[0]
-            if gfs_file is None:
-                continue
-            bfs = run_best_fit_gfs(amvs, gfs_file, amv_lat_idx=0, amv_lon_idx=1, amv_prs_idx=4, amv_spd_idx=5, amv_dir_idx=6)
+        if product_dir is not None:
             alons = amvs[:, 0]
             alats = amvs[:, 1]
+            prds = get_product_at_lat_lons(prd_files, ts, alons, alats, filepath=None)
+            if prds is None:
+                continue
+            prd_list.append(prds)
 
-            out_list.append((amvs, np.array(bfs)))
+        out_times_s.append(ts)
+        amvs_list.append(amvs)
+        bfs_list.append(np.array(bfs))
 
-        for tup in out_list:
-            amvs_list.append(tup[0])
-            bfs_list.append(tup[1])
+    if len(out_time_s) == 0:
+        return (None, None, None)
+
+    out_time_s = np.array(out_time_s)
+    amvs = np.concatenate(amvs_list)
+    bfs = np.concatenate(bfs_list)
+    if len(prd_list) == 0:
+        return (amvs, bfs, None, out_time_s)
 
-        amvs = np.concatenate(amvs_list)
-        bfs = np.concatenate(bfs_list)
+    prd = np.concatenate(prd_list)
+    return (amvs, bfs, prd, out_time_s)
 
-        tup = (amvs, bfs)
-        return tup
 
 def get_product_at_locs(raob_to_amv_dct, ts, files, filepath=None):
     keys = list(raob_to_amv_dct.keys())
@@ -405,6 +368,8 @@ def get_product_at_locs(raob_to_amv_dct, ts, files, filepath=None):
 
     if filepath is None:
         filepath, ftime, f_idx = files.get_file(ts)
+        if filepath is None:
+            return None
     ds = Dataset(filepath)
 
     param_s = []
@@ -477,6 +442,8 @@ def get_product_at_lat_lons(files, ts, lons, lats, filepath=None):
 
     if filepath is None:
         filepath, ftime, f_idx = files.get_file(ts)
+        if filepath is None:
+            return None
     ds = Dataset(filepath)
 
     var_s = []