diff --git a/src/Gargantext/Components/DocsTable.purs b/src/Gargantext/Components/DocsTable.purs
index ee1c2c9f2cdbcba68e731375e9ea8eff2c621327..96c4398ad9c9ed91489f9a9e88d85ae004aa40e8 100644
--- a/src/Gargantext/Components/DocsTable.purs
+++ b/src/Gargantext/Components/DocsTable.purs
@@ -10,7 +10,6 @@ import Data.Argonaut (class DecodeJson, class EncodeJson, decodeJson, encodeJson
 import Data.Array (drop, take, (:), filter)
 import Data.Either (Either(..))
 import Data.Generic.Rep (class Generic)
-import Data.Generic.Rep.Eq (genericEq)
 import Data.Generic.Rep.Show (genericShow)
 import Data.HTTP.Method (Method(..))
 import Data.Lens
@@ -41,6 +40,7 @@ import Gargantext.Config (End(..), NodeType(..), OrderBy(..), Path(..), TabType,
 import Gargantext.Config.REST (get, put, post, deleteWithBody, delete)
 import Gargantext.Components.Loader2 (useLoader)
 import Gargantext.Components.Node (NodePoly(..))
+import Gargantext.Components.Search.Types (Category(..), CategoryQuery(..), favCategory, trashCategory, decodeCategory, putCategories)
 import Gargantext.Components.Table as T
 import Gargantext.Utils.DecodeMaybe ((.|))
 import Gargantext.Utils.Reactix as R2
@@ -50,26 +50,6 @@ import Thermite (PerformAction, Render, Spec, defaultPerformAction, modifyState_
 
 type NodeID = Int
 type TotalRecords = Int
-data Category = Trash | Normal | Favorite
-derive instance genericFavorite :: Generic Category _
-instance showCategory :: Show Category where
-  show = genericShow
-instance eqCategory :: Eq Category where
-  eq = genericEq
-instance encodeJsonCategory :: EncodeJson Category where
-  encodeJson Trash = encodeJson 0
-  encodeJson Normal = encodeJson 1
-  encodeJson Favorite = encodeJson 2
-
-favCategory :: Category -> Category
-favCategory Normal = Favorite
-favCategory Trash = Favorite
-favCategory Favorite = Normal
-
-trashCategory :: Category -> Category
-trashCategory Normal = Trash
-trashCategory Trash = Normal
-trashCategory Favorite = Trash
 
 type Props =
   { nodeId       :: Int
@@ -143,12 +123,6 @@ instance decodeHyperdata :: DecodeJson Hyperdata where
     pub_year <- obj .? "publication_year"
     pure $ Hyperdata { title,source, pub_year}
 
-decodeCategory :: Int -> Category
-decodeCategory 0 = Trash
-decodeCategory 1 = Normal
-decodeCategory 2 = Favorite
-decodeCategory _ = Normal
-
 instance decodeResponse :: DecodeJson Response where
   decodeJson json = do
     obj        <- decodeJson json
@@ -397,24 +371,6 @@ searchResults :: SearchQuery -> Aff Int
 searchResults squery = post "http://localhost:8008/count" unit
   -- TODO
 
-
-newtype CategoryQuery = CategoryQuery {
-    nodeIds :: Array Int
-  , category :: Category
-  }
-
-instance encodeJsonCategoryQuery :: EncodeJson CategoryQuery where
-  encodeJson (CategoryQuery post) =
-       "ntc_nodesId" := post.nodeIds
-    ~> "ntc_category" := encodeJson post.category
-    ~> jsonEmptyObject
-
-categoryUrl :: Int -> String
-categoryUrl nodeId = toUrl Back Node (Just nodeId) <> "/category"
-
-putCategories :: Int -> CategoryQuery -> Aff (Array Int)
-putCategories nodeId = put $ categoryUrl nodeId
-
 documentsUrl :: Int -> String
 documentsUrl nodeId = toUrl Back Node (Just nodeId) <> "/documents"
 
diff --git a/src/Gargantext/Components/FacetsTable.purs b/src/Gargantext/Components/FacetsTable.purs
index 8f91e402124a52d04fc9c449ef5339b2fea3557d..78b38fc3249ec960da2a176d1c3652346c5dae5a 100644
--- a/src/Gargantext/Components/FacetsTable.purs
+++ b/src/Gargantext/Components/FacetsTable.purs
@@ -29,6 +29,7 @@ import Gargantext.Prelude
 import Gargantext.Config (End(..), NodeType(..), OrderBy(..), Path(..), TabType, toUrl)
 import Gargantext.Config.REST (put, post, deleteWithBody)
 import Gargantext.Components.Loader as Loader
+import Gargantext.Components.Search.Types (Category(..), CategoryQuery(..), favCategory, trashCategory, decodeCategory, putCategories)
 import Gargantext.Components.Table as T
 import Gargantext.Utils (toggleSet)
 import Gargantext.Utils.DecodeMaybe ((.|))
@@ -83,9 +84,9 @@ initialState =
   }
 
 data Action
-  = MarkFavorites (Array Int)
+  = MarkCategory Category (Array Int)
   | ToggleDocumentToDelete Int
-  | Trash
+  | TrashDocuments
 
 newtype Pair = Pair
   { id    :: Int
@@ -106,9 +107,9 @@ newtype DocumentsView
     , score  :: Int
     , pairs  :: Array Pair
     , delete :: Boolean
+    , category :: Category
     }
 
-
 derive instance genericDocumentsView :: Generic DocumentsView _
 
 instance showDocumentsView :: Show DocumentsView where
@@ -118,7 +119,7 @@ newtype Response = Response
   { id         :: Int
   , created    :: String
   , hyperdata  :: Hyperdata
-  , favorite   :: Boolean
+  , category   :: Category
   , ngramCount :: Int
 -- , date      :: String
 -- , score     :: Int
@@ -174,7 +175,7 @@ instance decodeResponse :: DecodeJson Response where
     hyperdata  <- obj .? "hyperdata"
     favorite   <- obj .? "favorite"
     ngramCount <- obj .? "ngramCount"
-    pure $ Response { id, created, hyperdata, favorite, ngramCount }
+    pure $ Response { id, created, hyperdata, category: decodeCategory favorite, ngramCount }
 
 -- | Filter
 -- TODO: unused
@@ -194,12 +195,12 @@ layoutDocview :: Spec State Props Action
 layoutDocview = simpleSpec performAction render
   where
     performAction :: PerformAction State Props Action
-    performAction (MarkFavorites nids) {nodeId} _ =
-      void $ lift $ putFavorites nodeId (FavoriteQuery {favorites: nids})
+    performAction (MarkCategory category nids) {nodeId} _ =
+      void $ lift $ putCategories nodeId $ CategoryQuery {nodeIds: nids, category: favCategory category}
     --TODO add array of delete rows here
     performAction (ToggleDocumentToDelete nid) _ _ =
       modifyState_ \state -> state {documentIdsToDelete = toggleSet nid state.documentIdsToDelete}
-    performAction Trash {nodeId} {documentIdsToDelete} = do
+    performAction TrashDocuments {nodeId} {documentIdsToDelete} = do
       void $ lift $ deleteDocuments nodeId (DeleteDocumentQuery {documents: Set.toUnfoldable documentIdsToDelete})
       modifyState_ \{documentIdsToDelete, documentIdsDeleted} ->
         { documentIdsToDelete: mempty
@@ -229,7 +230,7 @@ layoutDocview = simpleSpec performAction render
             ]
           , div [className "col-md-12"]
              [ button [ style {backgroundColor: "peru", padding : "9px", color : "white", border : "white", float: "right"}
-                      , onClick $ (\_ -> dispatch Trash)
+                      , onClick $ (\_ -> dispatch TrashDocuments)
                       ]
                [  i [className "glyphitem glyphicon glyphicon-trash", style {marginRight : "9px"}] []
                ,  text "Trash it !"
@@ -245,12 +246,12 @@ layoutDocviewGraph :: Spec State Props Action
 layoutDocviewGraph = simpleSpec performAction render
   where
     performAction :: PerformAction State Props Action
-    performAction (MarkFavorites nids) {nodeId} _ =
-      void $ lift $ putFavorites nodeId (FavoriteQuery {favorites: nids})
+    performAction (MarkCategory category nids) {nodeId} _ =
+      void $ lift $ putCategories nodeId $ CategoryQuery {nodeIds: nids, category: favCategory category}
     --TODO add array of delete rows here
     performAction (ToggleDocumentToDelete nid) _ _ =
       modifyState_ \state -> state {documentIdsToDelete = toggleSet nid state.documentIdsToDelete}
-    performAction Trash {nodeId} {documentIdsToDelete} = do
+    performAction TrashDocuments {nodeId} {documentIdsToDelete} = do
       void $ lift $ deleteDocuments nodeId (DeleteDocumentQuery {documents: Set.toUnfoldable documentIdsToDelete})
       modifyState_ \{documentIdsToDelete, documentIdsDeleted} ->
         { documentIdsToDelete: mempty
@@ -275,7 +276,7 @@ layoutDocviewGraph = simpleSpec performAction render
                 , container
                 }
             , button [ style {backgroundColor: "peru", padding : "9px", color : "white", border : "white", float: "right"}
-                      , onClick $ (\_ -> dispatch Trash)
+                      , onClick $ (\_ -> dispatch TrashDocuments)
                       ]
                [  i [className "glyphitem glyphicon glyphicon-trash", style {marginRight : "9px"}] []
                ,  text "Trash it !"
@@ -303,7 +304,7 @@ loadPage {nodeId, listId, query, params: {limit, offset, orderBy}} = do
     res2corpus :: Response -> DocumentsView
     res2corpus (Response { id, created: date, ngramCount: score
                          , hyperdata: Hyperdata {title, source}
-                      -- favorite TODO
+                         , category
                          }) =
       DocumentsView
         { id
@@ -313,6 +314,7 @@ loadPage {nodeId, listId, query, params: {limit, offset, orderBy}} = do
         , score
         , pairs: []
         , delete: false
+        , category
         }
     convOrderBy (T.ASC  (T.ColumnName "Date")) = DateAsc
     convOrderBy (T.DESC (T.ColumnName "Date")) = DateDesc
@@ -363,7 +365,7 @@ renderPage loaderDispatch { totalRecords, dispatch, container
   ]
   where
     -- TODO: how to interprete other scores?
-    gi 0 = "glyphicon glyphicon-star-empty"
+    gi Favorite = "glyphicon glyphicon-star-empty"
     gi _ = "glyphicon glyphicon-star"
     isChecked id = Set.member id documentIdsToDelete
     isDeleted (DocumentsView {id}) = Set.member id documentIdsDeleted
@@ -371,7 +373,7 @@ renderPage loaderDispatch { totalRecords, dispatch, container
       | id > 1    = [a [href (toUrl Front NodeContact (Just id)), target "blank"] [text label]]
       | otherwise = [text label]
     comma = span [] [text ", "]
-    rows = (\(DocumentsView {id,score,title,source,date,pairs,delete}) ->
+    rows = (\(DocumentsView {id,score,title,source,date,pairs,delete,category}) ->
                 let
                   strikeIfDeleted
                     | delete    = [style {textDecoration : "line-through"}]
@@ -379,8 +381,8 @@ renderPage loaderDispatch { totalRecords, dispatch, container
                 in
                 { row:
                     [ div []
-                      [ a [ className $ gi score
-                          , onClick $ const $ dispatch $ MarkFavorites [id]
+                      [ a [ className $ gi category
+                          , onClick $ const $ dispatch $ MarkCategory category [id]
                           ] []
                       ]
                     -- TODO show date: Year-Month-Day only
@@ -405,15 +407,6 @@ pageLoader props = React.createElement pageLoaderClass props []
 
 ---------------------------------------------------------
 
-newtype FavoriteQuery = FavoriteQuery
-                        { favorites :: Array Int
-                        }
-
-instance encodeJsonFQuery :: EncodeJson FavoriteQuery where
-  encodeJson (FavoriteQuery post)
-     = "favorites" := post.favorites
-       ~> jsonEmptyObject
-
 newtype DeleteDocumentQuery = DeleteDocumentQuery
   {
     documents :: Array Int
@@ -425,11 +418,5 @@ instance encodeJsonDDQuery :: EncodeJson DeleteDocumentQuery where
      = "documents" := post.documents
        ~> jsonEmptyObject
 
-putFavorites :: Int -> FavoriteQuery -> Aff (Array Int)
-putFavorites nodeId = put (toUrl Back Node (Just nodeId) <> "/favorites")
-
-deleteFavorites :: Int -> FavoriteQuery -> Aff (Array Int)
-deleteFavorites nodeId = deleteWithBody (toUrl Back Node (Just nodeId) <> "/favorites")
-
 deleteDocuments :: Int -> DeleteDocumentQuery -> Aff (Array Int)
 deleteDocuments nodeId = deleteWithBody (toUrl Back Node (Just nodeId) <> "/documents")
diff --git a/src/Gargantext/Components/Search/Types.purs b/src/Gargantext/Components/Search/Types.purs
index d34714abe1e3b92b3d24dcbb28783abe959aa390..1d163ddf1f0a285141b2e3b0144e5449f1975394 100644
--- a/src/Gargantext/Components/Search/Types.purs
+++ b/src/Gargantext/Components/Search/Types.purs
@@ -2,8 +2,11 @@ module Gargantext.Components.Search.Types where
 
 import Control.Monad.Cont.Trans (lift)
 import Data.Argonaut (class EncodeJson, jsonEmptyObject, (:=), (~>), encodeJson)
-import Data.Maybe (Maybe(..), fromMaybe, maybe)
 import Data.Array (head)
+import Data.Generic.Rep (class Generic)
+import Data.Generic.Rep.Eq (genericEq)
+import Data.Generic.Rep.Show (genericShow)
+import Data.Maybe (Maybe(..), fromMaybe, maybe)
 import Data.Newtype (class Newtype)
 import Data.Tuple (Tuple)
 import Data.Tuple.Nested ((/\))
@@ -14,7 +17,8 @@ import Thermite (PerformAction, modifyState)
 
 import Gargantext.Prelude
 import Gargantext.Types (class ToQuery)
-import Gargantext.Config.REST (post)
+import Gargantext.Config (End(..), NodeType(..), Path(..), toUrl)
+import Gargantext.Config.REST (post, put)
 import Gargantext.Components.Modals.Modal (modalHide)
 import Gargantext.Pages.Layout.Specs.AddCorpus.States (Response, State)
 import Gargantext.Utils (id)
@@ -96,3 +100,51 @@ instance encodeJsonSearchQuery :: EncodeJson SearchQuery where
     ~>  "corpus_id"  := fromMaybe 0 corpus_id
     ~>  "files_id"   := files_id
     ~> jsonEmptyObject
+
+
+data Category = Trash | Normal | Favorite
+derive instance genericFavorite :: Generic Category _
+instance showCategory :: Show Category where
+  show = genericShow
+instance eqCategory :: Eq Category where
+  eq = genericEq
+instance encodeJsonCategory :: EncodeJson Category where
+  encodeJson Trash = encodeJson 0
+  encodeJson Normal = encodeJson 1
+  encodeJson Favorite = encodeJson 2
+
+favCategory :: Category -> Category
+favCategory Normal = Favorite
+favCategory Trash = Favorite
+favCategory Favorite = Normal
+
+trashCategory :: Category -> Category
+trashCategory Normal = Trash
+trashCategory Trash = Normal
+trashCategory Favorite = Trash
+
+
+decodeCategory :: Int -> Category
+decodeCategory 0 = Trash
+decodeCategory 1 = Normal
+decodeCategory 2 = Favorite
+decodeCategory _ = Normal
+
+
+
+newtype CategoryQuery = CategoryQuery {
+    nodeIds :: Array Int
+  , category :: Category
+  }
+
+instance encodeJsonCategoryQuery :: EncodeJson CategoryQuery where
+  encodeJson (CategoryQuery post) =
+    "ntc_nodesId" := post.nodeIds
+    ~> "ntc_category" := encodeJson post.category
+    ~> jsonEmptyObject
+
+categoryUrl :: Int -> String
+categoryUrl nodeId = toUrl Back Node (Just nodeId) <> "/category"
+
+putCategories :: Int -> CategoryQuery -> Aff (Array Int)
+putCategories nodeId = put $ categoryUrl nodeId
diff --git a/src/Gargantext/Pages/Corpus/Graph/Tabs.purs b/src/Gargantext/Pages/Corpus/Graph/Tabs.purs
index d31ab0c3ab2eb24b33a5f810f0a318b15e76eb55..67eab12ec2c50b7732597a0e11ed70390d594404 100644
--- a/src/Gargantext/Pages/Corpus/Graph/Tabs.purs
+++ b/src/Gargantext/Pages/Corpus/Graph/Tabs.purs
@@ -4,7 +4,6 @@ import Prelude hiding (div)
 import Data.Lens (view)
 import Data.List (fromFoldable)
 import Data.Tuple (Tuple(..))
-import Gargantext.Config (TabType(..), TabSubType(..))
 import Gargantext.Components.GraphExplorer.Types (GraphSideCorpus(..))
 import Gargantext.Components.FacetsTable (TextQuery, docViewSpec)
 import Gargantext.Components.Table as T
diff --git a/src/Gargantext/Pages/Layout.purs b/src/Gargantext/Pages/Layout.purs
index 05a5121c08dab0123b71bf73d7d3e87ea62d7ca9..82c8ad6c6e609ba18d0b24140f12976fb4eb8b7b 100644
--- a/src/Gargantext/Pages/Layout.purs
+++ b/src/Gargantext/Pages/Layout.purs
@@ -10,7 +10,6 @@ import Gargantext.Pages.Corpus.Graph          as GE
 -- import Gargantext.Pages.Corpus.Tabs.Terms.NgramsTable as NG
 
 -- import Gargantext.Pages.Home as L
--- import Gargantext.Pages.Layout.Specs.Search as S
 import Gargantext.Router (Routes(..))
 
 dispatchAction :: forall ignored m.