diff --git a/workspace/R/2_prep.R b/workspace/R/2_prep.R
index b43ada7a15c6555e0e6bb09e354e10c79de77f50..06c409110882f30259e353e1be71365c12da1ad8 100644
--- a/workspace/R/2_prep.R
+++ b/workspace/R/2_prep.R
@@ -482,9 +482,76 @@ prepare_vpu_base_layers <- function(ref_gpkg, nav_gpkg, vpu, full_cat_table, rpu
     
     write_sf(catchments, out_refac_gpkg, nhd_catchment)
     
-    rpu_list[[rpu_code]] <- list(flowline = nhd, catchment = catchments)
+    rpu_list[[rpu_code]] <- list(flowline = nhd_sub, catchment = catchments)
     
   }
   
   return(list(vpu = vpu, flowline = nhd, catchment = cats, catchment_network = cat_network, waterbodies = waterbodies, rpus = rpu_list))
 }
+
+#' prepare rpu vpu output list
+#' @param vpu_base list of data as output from prepare_vpu_base_layers
+#' @param rpu_vpu data.frame ontaining all rpu-vpu pairs
+#' @returns list of outputs from a vpu and rpus that make it up
+prep_rpu_vpu_out_list <- function(vpu_base, rpu_vpu) {
+
+  nhd <- vpu_base$flowline
+  vpu <- vpu_base$vpu
+  
+  out_vpu <- nhd %>%
+    st_drop_geometry() %>%
+    select(COMID, toCOMID) %>%
+    filter(!toCOMID %in% COMID & !toCOMID == 0)
+  
+  rpus <- rpu_vpu[rpu_vpu$vpuid == vpu,]$rpuid
+  
+  rpu_list <- setNames(rep(list(list()), length(rpus)), rpus)
+  
+  for(rpu_code in rpus) {
+    
+    nhd_sub <- vpu_base$rpus[[rpu_code]]$flowline
+    
+    rpu_list[[rpu_code]] <- nhd_sub %>%
+      st_drop_geometry() %>%
+      select(COMID, toCOMID) %>%
+      filter(!toCOMID %in% COMID & !toCOMID == 0)
+  }
+  return(list(vpu = vpu, vpu_out = out_vpu, rpu_out = rpu_list))
+}
+
+#' prepare rpu vpu out
+#' @param rpu_vpu_out_list list of rpu vpu outlets
+#' @param fline reference flowlines
+#' @returns table of flowlines that are rpu and/or vpu outlets
+prep_rpu_vpu_out <- function(rpu_vpu_out_list, fline) {
+
+  make_df <- function(x, d, n) {
+    y <- d[[x]]
+    nr <- nrow(y)
+    na <- names(d)[x]
+    o <- data.frame(d = rep(na, nr), 
+                    COMID = d[[x]]$COMID, 
+                    toCOMID = d[[x]]$toCOMID)
+    names(o) <- c(n, "COMID", "toCOMID") 
+    o
+  }
+  
+  out_rpu <- unlist(lapply(unname(rpu_vpu_out_list), \(x) x$rpu_out), recursive = FALSE)
+  out_vpu <- lapply(rpu_vpu_out_list, \(x) x$vpu_out)
+  
+  names(out_vpu) <- sapply(rpu_vpu_out_list, \(x) x$vpu)
+  
+  rpu <- do.call(rbind, lapply(1:length(out_rpu), make_df, d = out_rpu, n = "rpu"))
+  
+  vpu <- do.call(rbind, lapply(1:length(out_vpu), make_df, d = out_vpu, n = "vpu"))
+  
+  out_rpu_vpu <- left_join(rpu, vpu, by = "COMID") 
+  
+  out_rpu_vpu <- select(out_rpu_vpu, RPUID = rpu, VPUID = vpu, COMID = COMID, toCOMID = toCOMID.x)
+  
+  out_rpu_vpu <- left_join(out_rpu_vpu, select(sf::st_drop_geometry(fline), COMID, toRPUID = RPUID, toVPUID = VPUID), 
+                           by = c("toCOMID" = "COMID"))
+  
+  out_rpu_vpu
+  
+}
diff --git a/workspace/R/config.R b/workspace/R/config.R
index c2dcfae1d5e40d1018d395899409b07f8e2044e2..1af3f6142047458ef7b63e3caad2b62b15d9e1b2 100644
--- a/workspace/R/config.R
+++ b/workspace/R/config.R
@@ -1,7 +1,7 @@
 
 # rpu_vpu <- readr::read_csv(system.file("extdata/rpu_vpu.csv", package = "hyfabric"), 
 #                            show_col_types = FALSE)
-# rpu_vpu_out <- readr::read_csv("cache/rpu_vpu_out.csv", 
+# rpu_vpu_out <- readr::read_csv("cache/rpu_vpu_out.csv",
 #                                col_types = c("c", "c", "i" , "i"), show_col_types = FALSE)
 
 # # The below deals with various ways to get / set rpu and vpu codes
diff --git a/workspace/_targets.R b/workspace/_targets.R
index cc9d049f9344c5834e9e1078c32b5f3d6aa4b165..1806da164b1d9fe8950f8b82d58faab5bf8966bb 100644
--- a/workspace/_targets.R
+++ b/workspace/_targets.R
@@ -81,5 +81,8 @@ list(
   
   # ~1GB of memory
   tar_target(vpu_base, prepare_vpu_base_layers(ref_gpkg, nav_gpkg, vpu_codes, full_cat_table, rpu_vpu),
-             pattern = map(ref_gpkg, nav_gpkg, vpu_codes), deployment = "worker")
+             pattern = map(ref_gpkg, nav_gpkg, vpu_codes), deployment = "worker"),
+  tar_target(rpu_vpu_out_list, prep_rpu_vpu_out_list(vpu_base, rpu_vpu), pattern = map(vpu_base), 
+             deployment = "worker", iteration = "list"),
+  tar_target(rpu_vpu_out, prep_rpu_vpu_out(rpu_vpu_out_list, reference_flowlines))
 )
\ No newline at end of file
diff --git a/workspace/workflow_runner.R b/workspace/workflow_runner.R
index 40ced23ad7441e1260044f3842deaf5a38f3e007..05e24280e3e3da4864d8d629c2d8432266d7c394 100644
--- a/workspace/workflow_runner.R
+++ b/workspace/workflow_runner.R
@@ -38,7 +38,8 @@ if(FALSE) { # this won't run if you just bang through this file
 
 # run branches for a given target in parallel if you have enough memory
 # note this will only work for targets with 'deployment = "worker"'
-tar_make_future(vpu_base, workers = 8)
+tar_make_future(rpu_vpu_out_list, workers = 8)
+tar_make(rpu_vpu_out)
 
 # to run all, just do:
 tar_make()