diff --git a/server.R b/server.R
index 1ffc68e129b8b05d080d653930016dcda443034a..dd72eab327fd3d34db6308dc3dea109e01c467fd 100644
--- a/server.R
+++ b/server.R
@@ -17,7 +17,7 @@ shinyServer
       return(x)
     }
   }
-
+  
   beautifulTable <- function(data)  {
     DT::datatable(
       data = data,
@@ -27,7 +27,7 @@ shinyServer
       options = list(
         dom = "lBtip",
         pageLength = 10,
-        lengthMenu = list(c(10, 25, 50, 100, -1), list('10', '25', '50', '100', 'All')),
+        lengthMenu = list(c(10, 25, 50, 100,-1), list('10', '25', '50', '100', 'All')),
         buttons = list(
           'colvis',
           list(
@@ -44,32 +44,31 @@ shinyServer
       height = "auto"
     )
   }
-
+  
   source({
     "https://raw.githubusercontent.com/mahendra-mariadassou/phyloseq-extended/master/R/load-extra-functions.R"
   })
-
+  
   source("internals.R")
-
+  
   data16S <- reactive({
-
     ## BIOM input
     if (input$dataset == "input")
     {
       ## Unhappy path
       if (is.null(input$fileBiom))
         return()
-
+      
       ## Happy path
       ## Import biom
       d <- .import_biom(input)
-
+      
       ## Format tax table
       tax_table(d) <- .format_tax_table(tax_table(d))
-
+      
       ## import metadata and store it in phyloseq object
       sample_data(d) <- .import_sample_data(input, d)
-
+      
       ## Rarefy data
       if (input$rareData) {
         d <- rarefy_even_depth(
@@ -81,29 +80,30 @@ shinyServer
       }
       return(d)
     }
-
+    
     ## Rdata input
     if (input$dataset == "rdata")
     {
       ## .import_from_rdata(input) ## does not work as a function for some reason
-
+      
       ## Happy path
-      ne <- new.env() ## new env to store RData content and avoid border effects
+      ne <-
+        new.env() ## new env to store RData content and avoid border effects
       if (!is.null(input$fileRData))
         load(input$fileRData$datapath, envir = ne)
       if (class(ne$data) == "phyloseq")
         return(ne$data)
-
+      
       ## Unhappy paths: everything else
       return()
     }
-
+    
     ## Default case
     load("demo/demo.RData")
     return(get(input$dataset))
-
+    
   })
-
+  
   data <- reactiveValues()
   {
     observe({
@@ -111,7 +111,7 @@ shinyServer
         isolate(data <<- data16S())
     })
   }
-
+  
   output$downloadData <- {
     downloadHandler(
       filename = function() {
@@ -122,7 +122,7 @@ shinyServer
       }
     )
   }
-
+  
   output$downloadUI <- renderUI({
     validate(need(data16S(), ""))
     tags$div(
@@ -131,15 +131,15 @@ shinyServer
       downloadButton("downloadData", "Download", style = "color: black; background-color: gray90")
     )
   })
-
+  
   output$rarefactionMin <- renderText({
     validate(need(input$fileBiom, ""),
              need(input$dataset == "input", ""))
     paste("(min sample =", format(min(sample_sums(data16S(
-
+      
     ))), big.mark = " "), "reads)")
   })
-
+  
   output$phyloseqPrint <- renderPrint({
     validate(
       need(
@@ -149,7 +149,7 @@ shinyServer
     )
     data16S()
   })
-
+  
   output$summaryTable <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -169,11 +169,38 @@ shinyServer
                  #as.data.frame(sapply(sample_data(data16S()), class)),
                  beautifulTable(
                    data.frame(SAMPLE = sample_names(data16S()), sample_data(data16S()))
-                 ))
+                 )),
+        tabPanel(
+          "agglomerate_taxa",
+          radioButtons(
+            "glomRank",
+            label = "Taxonomic rank : ",
+            choices = rank_names(data16S()),
+            inline = TRUE
+          ),
+          dataTableOutput("tableGlom")
+        )
       )
     )
   })
-
+  
+  output$tableGlom <- renderDataTable({
+    Glom <- tax_glom(data16S(), input$glomRank)
+    taxTableGlom <- Glom %>%
+      tax_table() %>%
+      as.data.frame() %>%
+      dplyr::select(1:input$glomRank) %>%
+      tibble::rownames_to_column()
+    otuTableGlom <- Glom %>%
+      otu_table() %>%
+      as.data.frame() %>%
+      tibble::rownames_to_column()
+    joinGlom <-
+      dplyr::left_join(taxTableGlom, otuTableGlom, by = "rowname") %>%
+      dplyr::select(-rowname)
+    return(joinGlom)
+  })
+  
   output$histUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -202,7 +229,7 @@ shinyServer
       )
     )
   })
-
+  
   output$histo <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -218,7 +245,7 @@ shinyServer
     }
     return(p)
   })
-
+  
   output$histFocusUIfocusRank <- renderUI({
     validate(need(data16S(), ""))
     radioButtons(
@@ -228,19 +255,19 @@ shinyServer
       inline = TRUE
     )
   })
-
+  
   output$histFocusUIfocusTaxa <- renderUI({
     validate(need(data16S(), ""))
     selectInput(
       "focusTaxa",
       label = "Selected taxa : ",
       choices = unique(as.vector(tax_table(data16S(
-
+        
       ))[, input$focusRank])),
       selected = TRUE
     )
   })
-
+  
   output$histFocusUIfocusNbTaxa <- renderUI({
     validate(need(data16S(), ""))
     sliderInput(
@@ -285,7 +312,7 @@ shinyServer
     }
     return(p)
   })
-
+  
   output$clustUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -326,7 +353,7 @@ shinyServer
       )
     )
   })
-
+  
   output$clust <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -337,7 +364,7 @@ shinyServer
       color = checkNull(input$clustCol)
     )
   })
-
+  
   output$richnessAUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -398,7 +425,7 @@ shinyServer
       )
     )
   })
-
+  
   output$richnessA <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -420,7 +447,7 @@ shinyServer
     }
     return(p)
   })
-
+  
   output$richnessATable <- renderUI({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -428,7 +455,7 @@ shinyServer
       SAMPLE = sample_names(data16S()), round(estimate_richness(data16S()), digits = 2)
     )))
   })
-
+  
   output$richnessBUI <- renderUI({
     box(
       title = "Setting : " ,
@@ -444,7 +471,7 @@ shinyServer
                 value = "Beta diversity heatmap")
     )
   })
-
+  
   output$richnessB <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -477,7 +504,7 @@ shinyServer
     )
     return(p + scale_fill_gradient2())
   })
-
+  
   output$networkBUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -518,7 +545,7 @@ shinyServer
       )
     )
   })
-
+  
   output$networkB <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -539,7 +566,7 @@ shinyServer
     )
     return(p)
   })
-
+  
   output$richnessBTable <- renderUI({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -549,7 +576,7 @@ shinyServer
       ), digits = 2)
     )))
   })
-
+  
   output$rarefactionCurve <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -564,16 +591,16 @@ shinyServer
     if (!is.null(checkNull(input$rarefactionGrid))) {
       p <- p + facet_grid(paste(".", "~", input$rarefactionGrid))
     }
-
+    
     if (input$rarefactionMin) {
       p <-
         p + geom_vline(xintercept = min(sample_sums(data16S())),
                        color = "gray60")
     }
     return(p + ggtitle(input$rarefactionTitle))
-
+    
   })
-
+  
   output$rarefactionCurveUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -608,7 +635,7 @@ shinyServer
       )
     )
   })
-
+  
   output$HeatmapUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -667,7 +694,7 @@ shinyServer
       )
     )
   })
-
+  
   output$Heatmap <- renderPlot({
     validate(need(data16S(),
                   "Requires an abundance dataset"))
@@ -689,7 +716,7 @@ shinyServer
     }
     return(p)
   })
-
+  
   output$treeUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -728,7 +755,7 @@ shinyServer
       )
     )
   })
-
+  
   output$tree <- renderPlot({
     validate(
       need(data16S(), "Requires an abundance dataset"),
@@ -757,7 +784,7 @@ shinyServer
       return(p)
     }
   })
-
+  
   output$acpUI <- renderUI({
     validate(need(data16S(), ""))
     box(
@@ -821,7 +848,7 @@ shinyServer
       )
     )
   })
-
+  
   output$acp <- renderPlot({
     validate(
       need(data16S(), "Requires an abundance dataset"),