diff --git a/hive/db/schema.py b/hive/db/schema.py
index c1388fdead1f655dcd59baab755f6fee2a4b8402..08718053185e5aa3c4db9912fca57d0a518fed8e 100644
--- a/hive/db/schema.py
+++ b/hive/db/schema.py
@@ -588,14 +588,10 @@ def setup(db):
       "condenser_api_post_ex_type.sql",
       "condenser_get_blog.sql",
       "condenser_get_content.sql",
-      "condenser_get_discussions_by_created.sql",
       "condenser_get_discussions_by_blog.sql",
+      "condenser_tags.sql",
+      "condenser_follows.sql",
       "hot_and_trends.sql",
-      "condenser_get_discussions_by_trending.sql",
-      "condenser_get_discussions_by_hot.sql",
-      "condenser_get_discussions_by_promoted.sql",
-      "condenser_get_post_discussions_by_payout.sql",
-      "condenser_get_comment_discussions_by_payout.sql",
       "update_hive_posts_children_count.sql",
       "update_hive_posts_api_helper.sql",
       "database_api_list_comments.sql",
@@ -608,9 +604,6 @@ def setup(db):
       "condenser_get_by_feed_with_reblog.sql",
       "condenser_get_by_blog.sql",
       "bridge_get_account_posts_by_blog.sql",
-      "condenser_get_follow_counts.sql",
-      "condenser_get_names_by_followers.sql",
-      "condenser_get_names_by_following.sql",
       "condenser_get_names_by_reblogged.sql",
       "condenser_get_discussions_by_comments.sql",
       "condenser_get_account_reputations.sql"
diff --git a/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql b/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql
index 556749d787afac9ff0467144e644a1aae32b5e2d..39585907eb734b6d9ef9b39e1544d7048b57ce4e 100644
--- a/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql
+++ b/hive/db/sql_scripts/bridge_get_ranked_post_for_all.sql
@@ -270,7 +270,7 @@ $function$
 language plpgsql STABLE;
 
 DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout;
-CREATE FUNCTION bridge_get_ranked_post_by_payout( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+CREATE FUNCTION bridge_get_ranked_post_by_payout( in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN )
 RETURNS SETOF bridge_api_post
 AS
 $function$
@@ -328,7 +328,8 @@ BEGIN
         , ( hp1.payout + hp1.pending_payout ) as all_payout
       FROM
           hive_posts hp1
-      WHERE hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours'
+      WHERE hp1.counter_deleted = 0 AND NOT hp1.is_paidout
+          AND ( ( NOT _bridge_api AND hp1.depth = 0 ) OR ( _bridge_api AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours' ) )
           AND ( __post_id = 0 OR ( hp1.payout + hp1.pending_payout ) < __payout_limit OR ( ( hp1.payout + hp1.pending_payout ) = __payout_limit AND hp1.id < __post_id ) )
       ORDER BY ( hp1.payout + hp1.pending_payout ) DESC, hp1.id DESC
       LIMIT _limit
diff --git a/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql b/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql
index 58a167d8cfb6a44f6d5eee79f43aa966a52db4b3..147377f89dba7dbae03f9361ede4c8f9796fa430 100644
--- a/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql
+++ b/hive/db/sql_scripts/bridge_get_ranked_post_for_communities.sql
@@ -50,7 +50,7 @@ $function$
 language sql STABLE;
 
 DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_trends_for_community;
-CREATE FUNCTION bridge_get_ranked_post_by_trends_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+CREATE FUNCTION bridge_get_ranked_post_by_trends_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN )
 RETURNS SETOF bridge_api_post
 AS
 $function$
@@ -107,7 +107,8 @@ BEGIN
       FROM
          hive_posts hp1
          JOIN hive_communities hc ON hp1.community_id = hc.id
-      WHERE hc.name = _community AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.depth = 0 AND NOT hp1.is_pinned -- concatenated with bridge_get_ranked_post_pinned_for_community
+      WHERE hc.name = _community AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.depth = 0
+         AND ( NOT _bridge_api OR NOT hp1.is_pinned ) -- concatenated with bridge_get_ranked_post_pinned_for_community when called for bridge_api
          AND ( __post_id = 0 OR hp1.sc_trend < __trending_limit OR ( hp1.sc_trend = __trending_limit AND hp1.id < __post_id ) )
       ORDER BY hp1.sc_trend DESC, hp1.id DESC
       LIMIT _limit
@@ -473,7 +474,7 @@ $function$
 language plpgsql STABLE;
 
 DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_created_for_community;
-CREATE FUNCTION bridge_get_ranked_post_by_created_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+CREATE FUNCTION bridge_get_ranked_post_by_created_for_community( in _community VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN )
 RETURNS SETOF bridge_api_post
 AS
 $function$
@@ -526,7 +527,8 @@ BEGIN
           hive_posts hp1
           JOIN hive_communities hc ON hp1.community_id = hc.id
           JOIN hive_accounts_view ha ON hp1.author_id = ha.id
-      WHERE hc.name = _community AND hp1.counter_deleted = 0 AND hp1.depth = 0 AND NOT hp1.is_pinned -- concatenated with bridge_get_ranked_post_pinned_for_community
+      WHERE hc.name = _community AND hp1.counter_deleted = 0 AND hp1.depth = 0
+          AND ( NOT _bridge_api OR NOT hp1.is_pinned ) -- concatenated with bridge_get_ranked_post_pinned_for_community when called for bridge_api
           AND NOT ha.is_grayed AND ( __post_id = 0 OR hp1.id < __post_id )
       ORDER BY hp1.id DESC
       LIMIT _limit
diff --git a/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql b/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql
index 820f36aeae22f8020241218e96059a10a92359bc..bb8b49d344fe469d530e9078c34eae3080568a5b 100644
--- a/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql
+++ b/hive/db/sql_scripts/bridge_get_ranked_post_for_tag.sql
@@ -283,7 +283,7 @@ $function$
 language plpgsql STABLE;
 
 DROP FUNCTION IF EXISTS bridge_get_ranked_post_by_payout_for_category;
-CREATE FUNCTION bridge_get_ranked_post_by_payout_for_category( in _category VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
+CREATE FUNCTION bridge_get_ranked_post_by_payout_for_category( in _category VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT, in _bridge_api BOOLEAN )
 RETURNS SETOF bridge_api_post
 AS
 $function$
@@ -343,7 +343,8 @@ BEGIN
         , ( hp1.payout + hp1.pending_payout ) as all_payout
       FROM
           hive_posts hp1
-      WHERE hp1.category_id = __hive_category AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours'
+      WHERE hp1.category_id = __hive_category AND hp1.counter_deleted = 0 AND NOT hp1.is_paidout
+          AND ( ( NOT _bridge_api AND hp1.depth = 0 ) OR ( _bridge_api AND hp1.payout_at BETWEEN __head_block_time + interval '12 hours' AND __head_block_time + interval '36 hours' ) )
           AND ( __post_id = 0 OR ( hp1.payout + hp1.pending_payout ) < __payout_limit OR ( ( hp1.payout + hp1.pending_payout ) = __payout_limit AND hp1.id < __post_id ) )
       ORDER BY ( hp1.payout + hp1.pending_payout ) DESC, hp1.id DESC
       LIMIT _limit
diff --git a/hive/db/sql_scripts/condenser_follows.sql b/hive/db/sql_scripts/condenser_follows.sql
new file mode 100644
index 0000000000000000000000000000000000000000..fbfa033f28006311dca9c04c508d6e21a2d61994
--- /dev/null
+++ b/hive/db/sql_scripts/condenser_follows.sql
@@ -0,0 +1,71 @@
+DROP FUNCTION IF EXISTS condenser_get_follow_count;
+CREATE FUNCTION condenser_get_follow_count( in _account VARCHAR,
+  out following hive_accounts.following%TYPE, out followers hive_accounts.followers%TYPE )
+AS
+$function$
+DECLARE
+  __account_id INT;
+BEGIN
+  __account_id = find_account_id( _account, True );
+  SELECT ha.following, ha.followers INTO following, followers FROM hive_accounts ha WHERE ha.id = __account_id;
+  -- following equals (SELECT COUNT(*) FROM hive_follows WHERE state = 1 AND following = __account_id)
+  -- followers equals (SELECT COUNT(*) FROM hive_follows WHERE state = 1 AND follower  = __account_id)
+END
+$function$
+language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_followers;
+-- list of account names that follow/ignore given account
+CREATE FUNCTION condenser_get_followers( in _account VARCHAR, in _start VARCHAR, in _type INT, in _limit INT )
+RETURNS SETOF hive_accounts.name%TYPE
+AS
+$function$
+DECLARE
+  __account_id INT;
+  __start_id INT;
+BEGIN
+  __account_id = find_account_id( _account, True );
+  __start_id = find_account_id( _start, _start <> '' );
+  IF __start_id <> 0 THEN
+      SELECT INTO __start_id COALESCE( ( SELECT id FROM hive_follows WHERE following = __account_id AND follower = __start_id ), 0 );
+  END IF;
+  RETURN QUERY SELECT
+     ha.name
+  FROM
+     hive_follows hf
+     JOIN hive_accounts ha ON hf.follower = ha.id
+  WHERE
+     hf.following = __account_id AND hf.state = _type AND ( __start_id = 0 OR hf.id < __start_id )
+  ORDER BY hf.id DESC
+  LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_following;
+-- list of account names followed/ignored by given account
+CREATE FUNCTION condenser_get_following( in _account VARCHAR, in _start VARCHAR, in _type INT, in _limit INT )
+RETURNS SETOF hive_accounts.name%TYPE
+AS
+$function$
+DECLARE
+  __account_id INT;
+  __start_id INT;
+BEGIN
+  __account_id = find_account_id( _account, True );
+  __start_id = find_account_id( _start, _start <> '' );
+  IF __start_id <> 0 THEN
+      SELECT INTO __start_id COALESCE( ( SELECT id FROM hive_follows WHERE follower = __account_id AND following = __start_id ), 0 );
+  END IF;
+  RETURN QUERY SELECT
+     ha.name
+  FROM
+     hive_follows hf
+     JOIN hive_accounts ha ON hf.following = ha.id
+  WHERE
+     hf.follower = __account_id AND hf.state = _type AND ( __start_id = 0 OR hf.id < __start_id )
+  ORDER BY hf.id DESC
+  LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_comment_discussions_by_payout.sql b/hive/db/sql_scripts/condenser_get_comment_discussions_by_payout.sql
deleted file mode 100644
index 4052a096594f89fd37a5ad3d7d013da13dba8ac2..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_comment_discussions_by_payout.sql
+++ /dev/null
@@ -1,55 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_comment_discussions_by_payout;
-
-CREATE FUNCTION condenser_get_comment_discussions_by_payout( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __category_id INT;
-BEGIN
-  __post_id = find_comment_id( _author, _permlink, True );
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    WHERE hp.is_paidout = '0' AND hp.depth > 0 AND ( __category_id = 0 OR hp.category_id = __category_id )
-    ORDER BY (hp.payout+hp.pending_payout) DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_created.sql b/hive/db/sql_scripts/condenser_get_discussions_by_created.sql
deleted file mode 100644
index c3a1d6c543e6549962f24b39d8485c73fce83f86..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_discussions_by_created.sql
+++ /dev/null
@@ -1,126 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_created;
-
-CREATE FUNCTION condenser_get_discussions_by_created( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __tag_id INT;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __tag_id      = ( SELECT id FROM hive_tag_data WHERE tag = _tag );
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    INNER JOIN hive_post_tags hpt ON hpt.post_id = hp.id
-    WHERE ( __tag_id = 0 OR hpt.tag_id = __tag_id ) AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( __category_id = 0 OR hp.category_id = __category_id ) ) )
-    ORDER BY hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
-
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_created_with_empty_tag;
-
-CREATE FUNCTION condenser_get_discussions_by_created_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    WHERE ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( __category_id = 0 OR hp.category_id = __category_id ) ) )
-    ORDER BY hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql b/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql
deleted file mode 100644
index 981ff24fdb70f8bed492f210231f2340ccfc90dd..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_discussions_by_hot.sql
+++ /dev/null
@@ -1,126 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_hot;
-
-CREATE FUNCTION condenser_get_discussions_by_hot( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __tag_id INT;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __tag_id      = ( SELECT id FROM hive_tag_data WHERE tag = _tag );
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    INNER JOIN hive_post_tags hpt ON hpt.post_id = hp.id
-    WHERE hp.is_paidout = '0' AND ( __tag_id = 0 OR hpt.tag_id = __tag_id ) AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( ( __category_id = 0 OR hp.category_id = __category_id ) AND hp.depth = 0 ) ) )
-    ORDER BY hp.sc_hot DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
-
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_hot_with_empty_tag;
-
-CREATE FUNCTION condenser_get_discussions_by_hot_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    WHERE hp.is_paidout = '0' AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( ( __category_id = 0 OR hp.category_id = __category_id ) AND hp.depth = 0 ) ) )
-    ORDER BY hp.sc_hot DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql b/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql
deleted file mode 100644
index d9afedb60212cfeab6ee78d59427bc2a2ae9db22..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_discussions_by_promoted.sql
+++ /dev/null
@@ -1,127 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_promoted;
-
-CREATE FUNCTION condenser_get_discussions_by_promoted( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __tag_id INT;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __tag_id      = ( SELECT id FROM hive_tag_data WHERE tag = _tag );
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    INNER JOIN hive_post_tags hpt ON hpt.post_id = hp.id
-    WHERE hp.promoted > 0 AND ( __tag_id = 0 OR hpt.tag_id = __tag_id ) AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( __category_id = 0 OR hp.category_id = __category_id ) ) )
-    ORDER BY hp.promoted DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
-
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_promoted_with_empty_tag;
-
-CREATE FUNCTION condenser_get_discussions_by_promoted_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    INNER JOIN hive_post_tags hpt ON hpt.post_id = hp.id
-    WHERE hp.promoted > 0 AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( __category_id = 0 OR hp.category_id = __category_id ) ) )
-    ORDER BY hp.promoted DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql b/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql
deleted file mode 100644
index 277e845083349a2c11365d2937fba8880e10aa33..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_discussions_by_trending.sql
+++ /dev/null
@@ -1,126 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_trending;
-
-CREATE FUNCTION condenser_get_discussions_by_trending( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __tag_id INT;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __tag_id      = ( SELECT id FROM hive_tag_data WHERE tag = _tag );
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    INNER JOIN hive_post_tags hpt ON hpt.post_id = hp.id
-    WHERE hp.is_paidout = '0' AND ( __tag_id = 0 OR hpt.tag_id = __tag_id ) AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( ( __category_id = 0 OR hp.category_id = __category_id ) AND hp.depth = 0 ) ) )
-    ORDER BY hp.sc_trend DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
-
-DROP FUNCTION IF EXISTS condenser_get_discussions_by_trending_with_empty_tag;
-
-CREATE FUNCTION condenser_get_discussions_by_trending_with_empty_tag( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __community VARCHAR;
-  __category_id INT;
-BEGIN
-
-  __post_id     = find_comment_id( _author, _permlink, True );
-  __community   = ( SELECT substring(_tag from '^hive-') );
-
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    WHERE hp.is_paidout = '0' AND ( __post_id = 0 OR hp.id < __post_id )
-          AND ( ( __community IS NULL ) OR ( ( __community IS NOT NULL ) AND ( ( __category_id = 0 OR hp.category_id = __category_id ) AND hp.depth = 0 ) ) )
-    ORDER BY hp.sc_trend DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_follow_counts.sql b/hive/db/sql_scripts/condenser_get_follow_counts.sql
deleted file mode 100644
index b6db581b5842c595ff8b04cc5070e12c838b4b63..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_follow_counts.sql
+++ /dev/null
@@ -1,20 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_follow_counts;
-
-CREATE FUNCTION condenser_get_follow_counts( in _account VARCHAR )
-RETURNS TABLE(
-    following hive_accounts.following%TYPE,
-    followers hive_accounts.followers%TYPE
-)
-AS
-$function$
-DECLARE
-BEGIN
-
-  RETURN QUERY SELECT
-    ha.following, ha.followers
-    FROM hive_accounts ha
-    WHERE ha.name = _account;
-
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_names_by_followers.sql b/hive/db/sql_scripts/condenser_get_names_by_followers.sql
deleted file mode 100644
index 530a06c5c6550ceb22d43cca608a969c8587002c..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_names_by_followers.sql
+++ /dev/null
@@ -1,38 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_names_by_followers;
-
-CREATE FUNCTION condenser_get_names_by_followers( in _account VARCHAR, in _start_account VARCHAR, in _state SMALLINT, _limit SMALLINT )
-RETURNS TABLE(
-    names hive_accounts.name%TYPE
-)
-AS
-$function$
-DECLARE
-  __account_id INT := find_account_id( _account, True );
-  __start_account_id INT := 0;
-  __created_at TIMESTAMP;
-BEGIN
-
-  IF _start_account <> '' THEN
-    __start_account_id = find_account_id( _start_account, True );
-  END IF;
-
-  IF __start_account_id <> 0 THEN
-    SELECT hf.created_at
-    INTO __created_at
-    FROM hive_follows hf
-    WHERE hf.following = __account_id AND hf.follower = __start_account_id;
-  END IF;
-
-  RETURN QUERY SELECT
-    name
-  FROM hive_follows hf
-  LEFT JOIN hive_accounts ha ON hf.follower = ha.id
-  WHERE hf.following = __account_id
-  AND state = _state
-  AND ( __start_account_id = 0 OR hf.created_at <= __created_at )
-  ORDER BY hf.created_at DESC
-  LIMIT _limit;
-
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_names_by_following.sql b/hive/db/sql_scripts/condenser_get_names_by_following.sql
deleted file mode 100644
index 1b7f48a00e6f6532ce016185899622938060162c..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_names_by_following.sql
+++ /dev/null
@@ -1,38 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_names_by_following;
-
-CREATE FUNCTION condenser_get_names_by_following( in _account VARCHAR, in _start_account VARCHAR, in _state SMALLINT, _limit SMALLINT )
-RETURNS TABLE(
-    names hive_accounts.name%TYPE
-)
-AS
-$function$
-DECLARE
-  __account_id INT := find_account_id( _account, True );
-  __start_account_id INT := 0;
-  __created_at TIMESTAMP;
-BEGIN
-
-  IF _start_account <> '' THEN
-    __start_account_id = find_account_id( _start_account, True );
-  END IF;
-
-  IF __start_account_id <> 0 THEN
-    SELECT hf.created_at
-    INTO __created_at
-    FROM hive_follows hf
-    WHERE hf.follower = __account_id AND hf.following = __start_account_id;
-  END IF;
-
-  RETURN QUERY SELECT
-    name
-  FROM hive_follows hf
-  LEFT JOIN hive_accounts ha ON hf.following = ha.id
-  WHERE hf.follower = __account_id
-  AND state = _state
-  AND ( __start_account_id = 0 OR hf.created_at <= __created_at )
-  ORDER BY hf.created_at DESC
-  LIMIT _limit;
-
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_get_post_discussions_by_payout.sql b/hive/db/sql_scripts/condenser_get_post_discussions_by_payout.sql
deleted file mode 100644
index 4996aaa81a78874cede434a1db0a0f0e2d80af62..0000000000000000000000000000000000000000
--- a/hive/db/sql_scripts/condenser_get_post_discussions_by_payout.sql
+++ /dev/null
@@ -1,55 +0,0 @@
-DROP FUNCTION IF EXISTS condenser_get_post_discussions_by_payout;
-
-CREATE FUNCTION condenser_get_post_discussions_by_payout( in _tag VARCHAR, in _author VARCHAR, in _permlink VARCHAR, in _limit SMALLINT )
-RETURNS SETOF bridge_api_post
-AS
-$function$
-DECLARE
-  __post_id INT;
-  __category_id INT;
-BEGIN
-  __post_id = find_comment_id( _author, _permlink, True );
-  __category_id = ( SELECT id FROM hive_category_data WHERE category = _tag );
-  RETURN QUERY SELECT
-      hp.id,
-      hp.author,
-      hp.parent_author,
-      hp.author_rep,
-      hp.root_title,
-      hp.beneficiaries,
-      hp.max_accepted_payout,
-      hp.percent_hbd,
-      hp.url,
-      hp.permlink,
-      hp.parent_permlink_or_category,
-      hp.title,
-      hp.body,
-      hp.category,
-      hp.depth,
-      hp.promoted,
-      hp.payout,
-      hp.pending_payout,
-      hp.payout_at,
-      hp.is_paidout,
-      hp.children,
-      hp.votes,
-      hp.created_at,
-      hp.updated_at,
-      hp.rshares,
-      hp.abs_rshares,
-      hp.json,
-      hp.is_hidden,
-      hp.is_grayed,
-      hp.total_votes,
-      hp.sc_trend,
-      hp.role_title,
-      hp.community_title,
-      hp.role_id,
-      hp.is_pinned,
-      hp.curator_payout_value
-    FROM hive_posts_view hp
-    WHERE hp.is_paidout = '0' AND hp.depth = 0 AND ( __category_id = 0 OR hp.category_id = __category_id )
-    ORDER BY (hp.payout+hp.pending_payout) DESC, hp.id DESC LIMIT _limit;
-END
-$function$
-language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/condenser_tags.sql b/hive/db/sql_scripts/condenser_tags.sql
new file mode 100644
index 0000000000000000000000000000000000000000..0812832b4b04ef8eccef4f6aed217d057a893915
--- /dev/null
+++ b/hive/db/sql_scripts/condenser_tags.sql
@@ -0,0 +1,50 @@
+DROP FUNCTION IF EXISTS condenser_get_top_trending_tags_summary;
+CREATE FUNCTION condenser_get_top_trending_tags_summary( in _limit INT )
+RETURNS SETOF VARCHAR
+AS
+$function$
+BEGIN
+  RETURN QUERY SELECT
+      hcd.category
+  FROM
+      hive_category_data hcd
+      JOIN hive_posts hp ON hp.category_id = hcd.id
+  WHERE hp.counter_deleted = 0 AND NOT hp.is_paidout
+  GROUP BY hcd.category
+  ORDER BY SUM(hp.payout + hp.pending_payout) DESC
+  LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
+
+DROP FUNCTION IF EXISTS condenser_get_trending_tags;
+CREATE FUNCTION condenser_get_trending_tags( in _category VARCHAR, in _limit INT )
+RETURNS TABLE( category VARCHAR, total_posts BIGINT, top_posts BIGINT, total_payouts hive_posts.payout%TYPE )
+AS
+$function$
+DECLARE
+  __category_id INT;
+  __payout_limit hive_posts.payout%TYPE;
+BEGIN
+  __category_id = find_category_id( _category, _category <> '' );
+  IF __category_id <> 0 THEN
+      SELECT SUM(hp.payout + hp.pending_payout) INTO __payout_limit
+      FROM hive_posts hp
+      WHERE hp.category_id = __category_id AND hp.counter_deleted = 0 AND NOT hp.is_paidout;
+  END IF;
+  RETURN QUERY SELECT
+      hcd.category,
+      COUNT(*) AS total_posts,
+      SUM(CASE WHEN hp.depth = 0 THEN 1 ELSE 0 END) AS top_posts,
+      SUM(hp.payout + hp.pending_payout) AS total_payouts
+  FROM
+      hive_posts hp
+      JOIN hive_category_data hcd ON hcd.id = hp.category_id
+  WHERE NOT hp.is_paidout AND counter_deleted = 0
+  GROUP BY hcd.category
+  HAVING __category_id = 0 OR SUM(hp.payout + hp.pending_payout) < __payout_limit OR ( SUM(hp.payout + hp.pending_payout) = __payout_limit AND hcd.category > _category )
+  ORDER BY SUM(hp.payout + hp.pending_payout) DESC, hcd.category ASC
+  LIMIT _limit;
+END
+$function$
+language plpgsql STABLE;
diff --git a/hive/db/sql_scripts/db_upgrade.sh b/hive/db/sql_scripts/db_upgrade.sh
index 0bb9b175945e852fda8d4bfa5c59d717bd113689..f88a769c622f83d501424d99230b333955cb194a 100755
--- a/hive/db/sql_scripts/db_upgrade.sh
+++ b/hive/db/sql_scripts/db_upgrade.sh
@@ -41,14 +41,10 @@ for sql in postgres_handle_view_changes.sql \
           condenser_api_post_ex_type.sql \
           condenser_get_blog.sql \
           condenser_get_content.sql \
-          condenser_get_discussions_by_created.sql \
           condenser_get_discussions_by_blog.sql \
+          condenser_tags.sql \
+          condenser_follows.sql \
           hot_and_trends.sql \
-          condenser_get_discussions_by_trending.sql \
-          condenser_get_discussions_by_hot.sql \
-          condenser_get_discussions_by_promoted.sql \
-          condenser_get_post_discussions_by_payout.sql \
-          condenser_get_comment_discussions_by_payout.sql \
           update_hive_posts_children_count.sql \
           update_hive_posts_api_helper.sql \
           database_api_list_comments.sql \
@@ -61,14 +57,13 @@ for sql in postgres_handle_view_changes.sql \
           condenser_get_by_feed_with_reblog.sql \
           condenser_get_by_blog.sql \
           bridge_get_account_posts_by_blog.sql \
-          condenser_get_follow_counts.sql \
-          condenser_get_names_by_followers.sql \
-          condenser_get_names_by_following.sql \
-          condenser_get_names_by_reblogged.sql
+          condenser_get_names_by_reblogged.sql \
+          condenser_get_discussions_by_comments.sql \
+          condenser_get_account_reputations.sql
 
 do
-	echo Executing psql -U $1 -d $2 -f $sql
-	time psql -1 -v "ON_ERROR_STOP=1" -U $1 -d $2  -c '\timing' -f $sql 2>&1 | tee -a -i upgrade.log
+    echo Executing psql -U $1 -d $2 -f $sql
+    time psql -1 -v "ON_ERROR_STOP=1" -U $1 -d $2  -c '\timing' -f $sql 2>&1 | tee -a -i upgrade.log
   echo $?
 done
 
diff --git a/hive/server/bridge_api/methods.py b/hive/server/bridge_api/methods.py
index 839720f3c5ea33b3f1f3e0f001555a3c7bb8380c..ea8bd756708d6b6d6a48abfe0715b5cd078a170b 100644
--- a/hive/server/bridge_api/methods.py
+++ b/hive/server/bridge_api/methods.py
@@ -117,7 +117,7 @@ async def _get_ranked_posts_for_communities( db, sort:str, community, start_auth
 
     if sort == 'trending':
         result_with_pinned_posts = []
-        sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )"
         result_with_pinned_posts = await execute_community_query(db, pinned_sql, limit)
         limit -= len(result_with_pinned_posts)
         if limit > 0:
@@ -129,7 +129,7 @@ async def _get_ranked_posts_for_communities( db, sort:str, community, start_auth
         return await execute_community_query(db, sql, limit)
 
     if sort == 'created':
-        sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_community( (:community)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )"
         result_with_pinned_posts = await execute_community_query(db, pinned_sql, limit)
         limit -= len(result_with_pinned_posts)
         if limit > 0:
@@ -165,7 +165,7 @@ async def _get_ranked_posts_for_tag( db, sort:str, tag, start_author:str, start_
         return await execute_tags_query(db, sql, limit)
 
     if sort == 'payout':
-        sql = "SELECT * FROM bridge_get_ranked_post_by_payout_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_payout_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )"
         return await execute_tags_query(db, sql, limit)
 
     if sort == 'payout_comments':
@@ -208,7 +208,7 @@ async def _get_ranked_posts_for_all( db, sort:str, start_author:str, start_perml
         return await execute_query(db, sql, limit)
 
     if sort == 'payout':
-        sql = "SELECT * FROM bridge_get_ranked_post_by_payout( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_payout( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, True )"
         return await execute_query(db, sql, limit)
 
     if sort == 'payout_comments':
diff --git a/hive/server/common/helpers.py b/hive/server/common/helpers.py
index 14feebb189fd21c95e7a4fd0ef654265862cf3dc..973246279726048958c56ef038243dd994bc685b 100644
--- a/hive/server/common/helpers.py
+++ b/hive/server/common/helpers.py
@@ -155,8 +155,10 @@ def valid_offset(offset, ubound=None):
 
 def valid_follow_type(follow_type: str):
     """Ensure follow type is valid steemd type."""
-    assert follow_type in ['blog', 'ignore'], 'invalid follow_type `%s`' % follow_type
-    return follow_type
+    # ABW: should be extended with blacklists etc. (and those should be implemented as next 'state' values)
+    supported_follow_types = dict(blog=1, ignore=2)
+    assert follow_type in supported_follow_types, "Unsupported follow type, valid types: {}".format(", ".join(supported_follow_types.keys()))
+    return supported_follow_types[follow_type]
 
 def valid_date(date, allow_empty=False):
     """ Ensure that date is in correct format """
diff --git a/hive/server/condenser_api/cursor.py b/hive/server/condenser_api/cursor.py
index 585c74bc268522d5023c22209d7b5d2da279a39d..f93c46d9401f83bd3bbab324651efd37a508de53 100644
--- a/hive/server/condenser_api/cursor.py
+++ b/hive/server/condenser_api/cursor.py
@@ -7,24 +7,16 @@ from hive.server.database_api.methods import find_votes_impl, VotesPresentation
 
 # pylint: disable=too-many-lines
 
-async def get_followers(db, account: str, start: str, follow_type: str, limit: int):
-    """Get a list of accounts following by a given account."""
-    state = 2 if follow_type == 'ignore' else 1
-    sql = " SELECT * FROM condenser_get_names_by_followers( '{}', '{}', {}::SMALLINT, {}::SMALLINT ) ".format( account, start, state, limit )
+async def get_followers(db, account: str, start: str, state: int, limit: int):
+    """Get a list of accounts following given account."""
+    sql = "SELECT * FROM condenser_get_followers( (:account)::VARCHAR, (:start)::VARCHAR, :type, :limit )"
+    return await db.query_col(sql, account=account, start=start, type=state, limit=limit)
 
-    return await db.query_col(sql)
-
-async def get_following(db, account: str, start: str, follow_type: str, limit: int):
+async def get_following(db, account: str, start: str, state: int, limit: int):
     """Get a list of accounts followed by a given account."""
-    state = 2 if follow_type == 'ignore' else 1
-    sql = " SELECT * FROM condenser_get_names_by_following( '{}', '{}', {}::SMALLINT, {}::SMALLINT ) ".format( account, start, state, limit )
-
-    return await db.query_col(sql)
+    sql = "SELECT * FROM condenser_get_following( (:account)::VARCHAR, (:start)::VARCHAR, :type, :limit )"
+    return await db.query_col(sql, account=account, start=start, type=state, limit=limit)
 
-async def get_follow_counts(db, account: str):
-    """Return following/followers count for `account`."""
-    sql = "SELECT * FROM condenser_get_follow_counts( '{}' )".format( account )
-    return dict (await db.query_row(sql) )
 
 async def get_reblogged_by(db, author: str, permlink: str):
     """Return all rebloggers of a post."""
diff --git a/hive/server/condenser_api/methods.py b/hive/server/condenser_api/methods.py
index ebde88edb669fa6f155962e0dd77d3bea13d39af..b79a8206603151bb017cdf6806ba4c120d9c8eb4 100644
--- a/hive/server/condenser_api/methods.py
+++ b/hive/server/condenser_api/methods.py
@@ -33,8 +33,8 @@ def _legacy_follower(follower, following, follow_type):
     return dict(follower=follower, following=following, what=[follow_type])
 
 @return_error_info
-async def get_followers(context, account: str, start: str, follow_type: str = None,
-                        limit: int = None, **kwargs):
+async def get_followers(context, account: str, start: str = '', follow_type: str = None,
+                        limit: int = 1000, **kwargs):
     """Get all accounts following `account`. (EOL)"""
     # `type` reserved word workaround
     if not follow_type and 'type' in kwargs:
@@ -46,12 +46,12 @@ async def get_followers(context, account: str, start: str, follow_type: str = No
         valid_account(account),
         valid_account(start, allow_empty=True),
         valid_follow_type(follow_type),
-        valid_limit(limit, 1000, None))
+        valid_limit(limit, 1000, 1000))
     return [_legacy_follower(name, account, follow_type) for name in followers]
 
 @return_error_info
-async def get_following(context, account: str, start: str, follow_type: str = None,
-                        limit: int = None, **kwargs):
+async def get_following(context, account: str, start: str = '', follow_type: str = None,
+                        limit: int = 1000, **kwargs):
     """Get all accounts `account` follows. (EOL)"""
     # `type` reserved word workaround
     if not follow_type and 'type' in kwargs:
@@ -63,18 +63,19 @@ async def get_following(context, account: str, start: str, follow_type: str = No
         valid_account(account),
         valid_account(start, allow_empty=True),
         valid_follow_type(follow_type),
-        valid_limit(limit, 1000, None))
+        valid_limit(limit, 1000, 1000))
     return [_legacy_follower(account, name, follow_type) for name in following]
 
 @return_error_info
 async def get_follow_count(context, account: str):
     """Get follow count stats. (EOL)"""
-    count = await cursor.get_follow_counts(
-        context['db'],
-        valid_account(account))
+    db = context['db']
+    account = valid_account(account)
+    sql = "SELECT * FROM condenser_get_follow_count( (:account)::VARCHAR )"
+    counters = await db.query_row(sql, account=account)
     return dict(account=account,
-                following_count=count['following'],
-                follower_count=count['followers'])
+                following_count=counters[0],
+                follower_count=counters[1])
 
 @return_error_info
 async def get_reblogged_by(context, author: str, permlink: str):
@@ -91,7 +92,8 @@ async def get_account_reputations(context, account_lower_bound: str = None, limi
 
 async def _get_account_reputations_impl(db, fat_node_style, account_lower_bound, limit):
     """Enumerate account reputations."""
-    limit = valid_limit(limit, 1000, None)
+    assert isinstance(account_lower_bound, str), "invalid account_lower_bound type"
+    limit = valid_limit(limit, 1000, 1000)
 
     sql = "SELECT * FROM condenser_get_account_reputations( '{}', {}, {} )".format( account_lower_bound, account_lower_bound is None, limit )
     rows = await db.query_all(sql, start=account_lower_bound, limit=limit)
@@ -193,39 +195,56 @@ async def get_posts_by_given_sort(context, sort: str, start_author: str = '', st
     tag             = valid_tag(tag, allow_empty=True)
 
     posts = []
+    is_community = tag[:5] == 'hive-'
    
     if sort == 'created':
-      if tag == '':
-        sql = "SELECT * FROM condenser_get_discussions_by_created_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if is_community:
+        sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )"
+      elif tag == '':
+        sql = "SELECT * FROM bridge_get_ranked_post_by_created( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
       else:
-        sql = "SELECT * FROM condenser_get_discussions_by_created( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_created_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'trending':
-      if tag == '':
-        sql = "SELECT * FROM condenser_get_discussions_by_trending_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if is_community:
+        sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )"
+      elif tag == '':
+        sql = "SELECT * FROM bridge_get_ranked_post_by_trends( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
       else:
-        sql = "SELECT * FROM condenser_get_discussions_by_trending( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_trends_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'hot':
-      if tag == '':
-        sql = "SELECT * FROM condenser_get_discussions_by_hot_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if is_community:
+        sql = "SELECT * FROM bridge_get_ranked_post_by_hot_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      elif tag == '':
+        sql = "SELECT * FROM bridge_get_ranked_post_by_hot( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
       else:
-        sql = "SELECT * FROM condenser_get_discussions_by_hot( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_hot_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'promoted':
-      if tag == '':
-        sql = "SELECT * FROM condenser_get_discussions_by_promoted_with_empty_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if is_community:
+        sql = "SELECT * FROM bridge_get_ranked_post_by_promoted_for_community( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      elif tag == '':
+        sql = "SELECT * FROM bridge_get_ranked_post_by_promoted( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
       else:
-        sql = "SELECT * FROM condenser_get_discussions_by_promoted( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+        sql = "SELECT * FROM bridge_get_ranked_post_by_promoted_for_tag( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     elif sort == 'post_by_payout':
-      sql = "SELECT * FROM condenser_get_post_discussions_by_payout( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if tag == '':
+        sql = "SELECT * FROM bridge_get_ranked_post_by_payout( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )"
+      else:
+        sql = "SELECT * FROM bridge_get_ranked_post_by_payout_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT, False )"
     elif sort == 'comment_by_payout':
-      sql = "SELECT * FROM condenser_get_comment_discussions_by_payout( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      if tag == '':
+        sql = "SELECT * FROM bridge_get_ranked_post_by_payout_comments( (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
+      else:
+        sql = "SELECT * FROM bridge_get_ranked_post_by_payout_comments_for_category( (:tag)::VARCHAR, (:author)::VARCHAR, (:permlink)::VARCHAR, (:limit)::SMALLINT )"
     else:
       return posts
 
     sql_result = await db.query_all(sql, tag=tag, author=start_author, permlink=start_permlink, limit=limit )
 
+    muted_accounts = Mutes.all()
     for row in sql_result:
         post = _condenser_post_object(row, truncate_body)
         post['active_votes'] = await find_votes_impl(db, row['author'], row['permlink'], VotesPresentation.CondenserApi)
+        post['active_votes'] = _mute_votes(post['active_votes'], muted_accounts)
         posts.append(post)
     return posts
 
diff --git a/hive/server/condenser_api/tags.py b/hive/server/condenser_api/tags.py
index 0e6535888dfb9bc37d41dbb1117aa61c34e96e99..d6f05ca2b8d58a55ebf3a0367f6226deb016a039 100644
--- a/hive/server/condenser_api/tags.py
+++ b/hive/server/condenser_api/tags.py
@@ -7,16 +7,7 @@ from hive.server.common.helpers import (return_error_info, valid_tag, valid_limi
 @cached(ttl=7200, timeout=1200)
 async def get_top_trending_tags_summary(context):
     """Get top 50 trending tags among pending posts."""
-    # Same results, more overhead:
-    #return [tag['name'] for tag in await get_trending_tags('', 50)]
-    sql = """
-        SELECT (SELECT category FROM hive_category_data WHERE id = category_id) as category
-          FROM hive_posts
-         WHERE counter_deleted = 0 AND NOT is_paidout
-      GROUP BY category
-      ORDER BY SUM(payout + pending_payout) DESC
-         LIMIT 50
-    """
+    sql = "SELECT condenser_get_top_trending_tags_summary(50)"
     return await context['db'].query_col(sql)
 
 @return_error_info
@@ -27,32 +18,10 @@ async def get_trending_tags(context, start_tag: str = '', limit: int = 250):
     limit = valid_limit(limit, 250, 250)
     start_tag = valid_tag(start_tag or '', allow_empty=True)
 
-    if start_tag:
-        seek = """
-          HAVING SUM(payout + pending_payout) <= (
-            SELECT SUM(payout + pending_payout)
-              FROM hive_posts hp
-              JOIN hive_category_data hcd ON hcd.id = hp.category_id
-             WHERE NOT is_paidout AND counter_deleted = 0 AND hcd.category = :start_tag)
-        """
-    else:
-        seek = ''
-
-    sql = """
-      SELECT hcd.category,
-             COUNT(*) AS total_posts,
-             SUM(CASE WHEN hp.depth = 0 THEN 1 ELSE 0 END) AS top_posts,
-             SUM(hp.payout + hp.pending_payout) AS total_payouts
-        FROM hive_posts hp
-        JOIN hive_category_data hcd ON hcd.id = hp.category_id
-       WHERE NOT hp.is_paidout AND counter_deleted = 0
-    GROUP BY hcd.category %s
-    ORDER BY SUM(hp.payout + hp.pending_payout) DESC, hcd.category ASC
-       LIMIT :limit
-    """ % seek
+    sql = "SELECT * FROM condenser_get_trending_tags( (:tag)::VARCHAR, :limit )"
 
     out = []
-    for row in await context['db'].query_all(sql, limit=limit, start_tag=start_tag):
+    for row in await context['db'].query_all(sql, limit=limit, tag=start_tag):
         out.append({
             'name': row['category'],
             'comments': row['total_posts'] - row['top_posts'],
diff --git a/hive/server/hive_api/public.py b/hive/server/hive_api/public.py
index f6415604c1f6b8ee3cc63565d9852b203ecf9bd5..8119a99c963ae61e60a08759aba28b635955b424 100644
--- a/hive/server/hive_api/public.py
+++ b/hive/server/hive_api/public.py
@@ -44,7 +44,8 @@ async def list_followers(context, account:str, start:str='', limit:int=50, obser
         context['db'],
         valid_account(account),
         valid_account(start, allow_empty=True),
-        'blog', valid_limit(limit, 100, 50))
+        1, # blog
+        valid_limit(limit, 100, 50))
     return await accounts_by_name(context['db'], followers, observer, lite=True)
 
 async def list_following(context, account:str, start:str='', limit:int=50, observer:str=None):
@@ -53,7 +54,8 @@ async def list_following(context, account:str, start:str='', limit:int=50, obser
         context['db'],
         valid_account(account),
         valid_account(start, allow_empty=True),
-        'blog', valid_limit(limit, 100, 50))
+        1, # blog
+        valid_limit(limit, 100, 50))
     return await accounts_by_name(context['db'], following, observer, lite=True)
 
 async def list_all_muted(context, account):
diff --git a/tests/tests_api b/tests/tests_api
index 1ae2a4b1367139e7954b31596eaa4bf65e6aa68e..1cb3c40848344e3f143528c0d4127cd68c2029dd 160000
--- a/tests/tests_api
+++ b/tests/tests_api
@@ -1 +1 @@
-Subproject commit 1ae2a4b1367139e7954b31596eaa4bf65e6aa68e
+Subproject commit 1cb3c40848344e3f143528c0d4127cd68c2029dd