diff --git a/model_server/base/roiset.py b/model_server/base/roiset.py
index 9b270de5be9c2b99a4e4d4388d4c5f81b5573617..3e99eaef84db78932bbda2e3dc4cf9d98388515a 100644
--- a/model_server/base/roiset.py
+++ b/model_server/base/roiset.py
@@ -331,7 +331,6 @@ def safe_add(a, g, b):
     ).astype(a.dtype)
 
 def make_object_ids_from_df(df: pd.DataFrame, sd: dict) -> InMemoryDataAccessor:
-    # TODO: generate rectangular masks if running without segmentation
     id_mask = np.zeros((sd['Y'], sd['X'], 1, sd['Z']), dtype='uint16')
     if 'binary_mask' not in df.columns:
         raise MissingSegmentationError('RoiSet dataframe does not contain segmentation')
@@ -665,14 +664,6 @@ class RoiSet(object):
 
         return InMemoryDataAccessor(om)
 
-    def export_dataframe(self, csv_path: Path) -> str:
-        # TODO: move this inside of .serialize()
-        csv_path.parent.mkdir(parents=True, exist_ok=True)
-
-        # TODO: suppress errors or check if binary_mask doesn't exist
-        self._df.drop(['expanded_slice', 'slice', 'relative_slice', 'binary_mask'], axis=1).to_csv(csv_path, index=False)
-        return csv_path.name
-
 
     def export_patch_masks(self, where: Path, pad_to: int = None, prefix='mask', expanded=False) -> pd.DataFrame:
         patches_df = self.get_patch_masks(pad_to=pad_to, expanded=expanded).copy()
@@ -947,12 +938,20 @@ class RoiSet(object):
             pad_to=None,
             expanded=False
         )
+        # record patch masks paths to dataframe, then save static columns to CSV
         se_pa = df_exp.patch_mask_path.apply(
             lambda x: str(Path('tight_patch_masks') / x)
         ).rename('tight_patch_masks_path')
+
         self._df = self._df.join(se_pa)
-        df_fn = self.export_dataframe(where / 'dataframe' / (prefix + '.csv'))
-        record['dataframe'] = str(Path('dataframe') / df_fn)
+        csv_path = where / 'dataframe' / (prefix + '.csv')
+        csv_path.parent.mkdir(parents=True, exist_ok=True)
+        self._df.drop(
+            ['expanded_slice', 'slice', 'relative_slice', 'binary_mask'],
+            axis=1
+        ).to_csv(csv_path, index=False)
+
+        record['dataframe'] = str(Path('dataframe') / csv_path.name)
         record['tight_patch_masks'] = list(se_pa)
         return record