diff --git a/dashboardv2/public/js/modules/Modal.js b/dashboardv2/public/js/modules/Modal.js
index 8b27788..48f385e 100644
--- a/dashboardv2/public/js/modules/Modal.js
+++ b/dashboardv2/public/js/modules/Modal.js
@@ -29,7 +29,7 @@
                 this.trigger('closeModal');
 
                 if (this.options.content && this.options.content.trigger) {
-                    this.options.content.trigger('closeModal', this);
+                    this.options.content.trigger('closeModal', this, event);
                 }
             },
             'click .cancel': function(event) {
@@ -38,7 +38,7 @@
                 this.trigger('closeModal');
 
                 if (this.options.content && this.options.content.trigger) {
-                    this.options.content.trigger('closeModal', this);
+                    this.options.content.trigger('closeModal', this, event);
                 }
             },
             'click .ok': function(event) {
@@ -47,7 +47,7 @@
                 this.trigger('ok');
 
                 if (this.options.content && this.options.content.trigger) {
-                    this.options.content.trigger('ok', this);
+                    this.options.content.trigger('ok', this, event);
                 }
 
                 if (this.options.okCloses) {
@@ -85,7 +85,8 @@
                 animate: true,
                 contentWithFooter: false,
                 template: template,
-                width: null
+                width: null,
+                buttons: null
             }, options);
         },
 
@@ -250,4 +251,4 @@
     });
 
     return Modal;
-});
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/router/Router.js b/dashboardv2/public/js/router/Router.js
index f705843..f858ee2 100644
--- a/dashboardv2/public/js/router/Router.js
+++ b/dashboardv2/public/js/router/Router.js
@@ -53,10 +53,6 @@
                 'enumDefCollection': this.enumDefCollection,
                 'classificationDefCollection': this.classificationDefCollection
             }
-            this.filterObj = {
-                'tagFilters': JSON.parse(Utils.localStorage.getValue('tagFilters')),
-                'entityFilters': JSON.parse(Utils.localStorage.getValue('entityFilters'))
-            }
         },
         bindCommonEvents: function() {
             var that = this;
@@ -128,8 +124,7 @@
                     if (!App.rSideNav.currentView) {
                         App.rSideNav.show(new SideNavLayoutView(
                             _.extend({
-                                'url': url,
-                                'filterObj': that.filterObj
+                                'url': url
                             }, that.preFetchedCollectionLists)
                         ));
                     } else {
@@ -161,7 +156,7 @@
                     App.rNHeader.show(new Header());
                     if (!App.rSideNav.currentView) {
                         App.rSideNav.show(new SideNavLayoutView(
-                            _.extend({ 'filterObj': that.filterObj }, that.preFetchedCollectionLists)
+                            _.extend({}, that.preFetchedCollectionLists)
                         ));
                     } else {
                         App.rSideNav.currentView.selectTab();
@@ -198,8 +193,7 @@
                     }
                     App.rSideNav.show(new SideNavLayoutView(
                         _.extend({
-                            'tag': tagName,
-                            'filterObj': that.filterObj
+                            'tag': tagName
                         }, that.preFetchedCollectionLists)
                     ));
                 } else {
@@ -242,8 +236,7 @@
                 if (!App.rSideNav.currentView) {
                     App.rSideNav.show(new SideNavLayoutView(
                         _.extend({
-                            'searchVent': that.searchVent,
-                            'filterObj': that.filterObj
+                            'searchVent': that.searchVent
                         }, that.preFetchedCollectionLists)
                     ));
                 } else {
@@ -259,7 +252,6 @@
                         _.extend({
                             'value': paramObj,
                             'initialView': true,
-                            'filterObj': that.filterObj,
                             'searchVent': that.searchVent
                         }, that.preFetchedCollectionLists)
                     ));
@@ -277,39 +269,13 @@
                 'views/business_catalog/SideNavLayoutView',
                 'views/search/SearchDetailLayoutView'
             ], function(Header, BusinessCatalogLayoutView, SideNavLayoutView, SearchDetailLayoutView) {
-                var paramObj = Utils.getUrlState.getQueryParams(),
-                    filterObj = that.filterObj
-                if (paramObj && paramObj.searchType === "basic") {
-                    if (paramObj.type) {
-                        if (_.has(filterObj.entityFilters, paramObj.type)) {
-                            _.extend(paramObj, {
-                                'entityFilters': +new Date()
-                            })
-                        }
-                    }
-                    if (paramObj.tag) {
-                        if (_.has(filterObj.entityFilters, paramObj.type)) {
-                            _.extend(paramObj, {
-                                'tagFilters': +new Date()
-                            })
-                        }
-                    }
-                    Utils.setUrl({
-                        url: '#!/search/searchResult',
-                        trigger: false,
-                        urlParams: paramObj,
-                        updateTabState: function() {
-                            return { searchUrl: this.url, stateChanged: true };
-                        },
-                    });
-                }
+                var paramObj = Utils.getUrlState.getQueryParams();
                 App.rNHeader.show(new Header());
                 if (!App.rSideNav.currentView) {
                     App.rSideNav.show(new SideNavLayoutView(
                         _.extend({
                             'value': paramObj,
-                            'searchVent': that.searchVent,
-                            'filterObj': that.filterObj
+                            'searchVent': that.searchVent
                         }, that.preFetchedCollectionLists)
                     ));
                 } else {
@@ -320,7 +286,6 @@
                     _.extend({
                         'value': paramObj,
                         'searchVent': that.searchVent,
-                        'filterObj': that.filterObj,
                         'initialView': (paramObj.type || (paramObj.dslChecked == "true" ? "" : paramObj.tag) || (paramObj.query ? paramObj.query.trim() : "")).length === 0
                     }, that.preFetchedCollectionLists)
                 ));
diff --git a/dashboardv2/public/js/templates/common/modal.html b/dashboardv2/public/js/templates/common/modal.html
index 6f28d0a..ef59290 100644
--- a/dashboardv2/public/js/templates/common/modal.html
+++ b/dashboardv2/public/js/templates/common/modal.html
@@ -31,11 +31,14 @@
         <div class="modal-body">{{content}}</div>
         {{#if showFooter}}
         <div class="modal-footer">
-            {{#if allowCancel}} {{#if cancelText}}
+            {{#if buttons}} {{#each buttons}}
+             <button type="button" class="btn btn-atlas {{this.btnClass}}">{{this.text}}</button>
+            {{/each}} {{else}} {{#if allowCancel}} {{#if cancelText}}
             <button type="button" class="btn btn-atlas cancel">{{tt cancelText}}</button>
             {{/if}} {{/if}}
             <button type="button" class="btn btn-atlas ok">{{tt okText}}</button>
+            {{/if}}
         </div>
         {{/if}} {{/if}}
     </div>
-</div>
+</div>
\ No newline at end of file
diff --git a/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html b/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html
index a23057f..911522e 100644
--- a/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/search/SearchLayoutView_tmpl.html
@@ -40,7 +40,7 @@
                         <select data-id="typeLOV"></select>
                     </div>
                     <div class="col-sm-2 no-padding temFilterBtn">
-                        <button type="button" class="btn btn-atlasAction btn-atlas pull-right typeLOV" title="Entity Attribute Filter" data-id="typeAttrFilter"><i class="fa fa-filter"></i></button>
+                        <button type="button" class="btn btn-atlasAction btn-atlas pull-right typeLOV active" title="Entity Attribute Filter" data-id="typeAttrFilter"><i class="fa fa-filter"></i></button>
                     </div>
                 </div>
             </div>
@@ -51,7 +51,7 @@
                         <select data-id="tagLOV"></select>
                     </div>
                     <div class="col-sm-2 no-padding">
-                        <button type="button" class="btn btn-atlasAction btn-atlas pull-right" title="Tag Attribute Filter" data-id="tagAttrFilter"><i class="fa fa-filter"></i></button>
+                        <button type="button" class="btn btn-atlasAction btn-atlas pull-right active" title="Tag Attribute Filter" data-id="tagAttrFilter"><i class="fa fa-filter"></i></button>
                     </div>
                 </div>
             </div>
diff --git a/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html b/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
index fc2fe8c..91f1a67 100644
--- a/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
+++ b/dashboardv2/public/js/templates/search/SearchResultLayoutView_tmpl.html
@@ -20,21 +20,6 @@
     <div class="fontLoader">
         <i class="fa fa-refresh fa-spin-custom"></i>
     </div>
-    <div>
-        <div id="r_searchQuery">
-            <div class="panel panel-default" id="filterPanel">
-                <div class="panel-heading clearfix">
-                    <h4 class="panel-title pull-left">Type,Tag filter/s</h4>
-                    <div class="btn-group pull-right">
-                        <button type="button" id="expand_collapse_panel" class="expand_collapse_panel" title="Collapse"><i class="fa fa-chevron-up" aria-hidden="true"></i></button>
-                    </div>
-                </div>
-                <div id="panel_body" class="panel-body collapse in" align="center">
-                    <p class="filterQuery" id="filterQuery"></p>
-                </div>
-            </div>
-        </div>
-    </div>
     <div class="ellipsis" style="display: none;"><span class="searchResult" style=" font-size: 16px;"></span>
         <a href="javascript:void(0)" class="inputAssignTag multiSelectTerm btnAssign" style="display:none" data-id="addTerm"><i class="fa fa-folder-o"></i> Assign Term</a>
         <a href="javascript:void(0)" class="inputAssignTag multiSelectTag assignTag btnAssign" style="display:none" data-id="addAssignTag"><i class="fa fa-plus"></i> Assign Tag</a>
diff --git a/dashboardv2/public/js/utils/CommonViewFunction.js b/dashboardv2/public/js/utils/CommonViewFunction.js
index 6b8f50d..4abec08 100644
--- a/dashboardv2/public/js/utils/CommonViewFunction.js
+++ b/dashboardv2/public/js/utils/CommonViewFunction.js
@@ -398,6 +398,64 @@
             });
         })
     }
+    CommonViewFunction.attributeFilter = {
+        generateUrl: function(attrObj) {
+            var attrQuery = [];
+            if (attrObj) {
+                _.each(attrObj, function(obj) {
+                    attrQuery.push(obj.id + "::" + obj.operator + "::" + obj.value + "::" + obj.type);
+                });
+                return attrQuery.join();
+            } else {
+                return null;
+            }
+        },
+        extractUrl: function(urlObj) {
+            var attrObj = [];
+            if (urlObj && urlObj.length) {
+                _.each(urlObj.split(","), function(obj) {
+                    var temp = obj.split("::");
+                    attrObj.push({ id: temp[0], operator: temp[1], value: temp[2], type: temp[3] });
+                });
+                return attrObj;
+            } else {
+                return null;
+            }
+        },
+        generateAPIObj: function(url) {
+            if (url && url.length) {
+                var parsObj = {
+                    "condition": 'AND',
+                    "criterion": convertKeyAndExtractObj(this.extractUrl(url))
+                }
+                return parsObj;
+            } else {
+                return null;
+            }
+
+            function convertKeyAndExtractObj(rules) {
+                var convertObj = [];
+                _.each(rules, function(rulObj) {
+                    var tempObj = {};
+                    // For nested 
+                    // if (rulObj.rules) {
+                    //     tempObj = {
+                    //         "condition": "AND",
+                    //         "criterion": convertKeyAndExtractObj(rulObj.rules)
+                    //     }
+                    // } else {
+                    // }
+                    tempObj = {
+                        "attributeName": rulObj.id,
+                        "operator": rulObj.operator,
+                        "attributeValue": (rulObj.type === "date" ? Date.parse(rulObj.value) : rulObj.value)
+                    }
+                    convertObj.push(tempObj);
+                });
+                return convertObj;
+            }
+        }
+    }
     CommonViewFunction.addRestCsrfCustomHeader = function(xhr, settings) {
         //    if (settings.url == null || !settings.url.startsWith('/webhdfs/')) {
         if (settings.url == null) {
diff --git a/dashboardv2/public/js/utils/TableLayout.js b/dashboardv2/public/js/utils/TableLayout.js
index db0a9da..3c9ff3b 100644
--- a/dashboardv2/public/js/utils/TableLayout.js
+++ b/dashboardv2/public/js/utils/TableLayout.js
@@ -238,7 +238,9 @@
              */
             renderTable: function() {
                 var that = this;
-                this.rTableList.show(new Backgrid.Grid(this.gridOpts));
+                this.rTableList.show(new Backgrid.Grid(this.gridOpts).on('backgrid:rendered', function() {
+                    that.trigger('backgrid:rendered', this)
+                }));
             },
 
             /**
@@ -392,4 +394,4 @@
         });
 
     return FSTableLayout;
-});
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/views/business_catalog/SideNavLayoutView.js b/dashboardv2/public/js/views/business_catalog/SideNavLayoutView.js
index 8f41399..da42554 100644
--- a/dashboardv2/public/js/views/business_catalog/SideNavLayoutView.js
+++ b/dashboardv2/public/js/views/business_catalog/SideNavLayoutView.js
@@ -66,7 +66,7 @@
             return events;
         },
         initialize: function(options) {
-            _.extend(this, _.pick(options, 'url', 'value', 'tag', 'selectFirst', 'classificationDefCollection', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'filterObj'));
+            _.extend(this, _.pick(options, 'url', 'value', 'tag', 'selectFirst', 'classificationDefCollection', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection'));
             if (Globals.taxonomy) {
                 this.tabClass = "tab col-sm-4";
             } else {
@@ -97,7 +97,6 @@
                     collection: that.classificationDefCollection,
                     tag: that.tag,
                     value: that.value,
-                    filterObj: that.filterObj,
                     typeHeaders: that.typeHeaders
                 }));
             });
@@ -107,7 +106,6 @@
             require(['views/search/SearchLayoutView'], function(SearchLayoutView) {
                 that.RSearchLayoutView.show(new SearchLayoutView({
                     value: that.value,
-                    filterObj: that.filterObj,
                     searchVent: that.searchVent,
                     typeHeaders: that.typeHeaders,
                     entityDefCollection: that.entityDefCollection,
diff --git a/dashboardv2/public/js/views/search/QueryBuilderView.js b/dashboardv2/public/js/views/search/QueryBuilderView.js
index ec20734..e8acf18 100644
--- a/dashboardv2/public/js/views/search/QueryBuilderView.js
+++ b/dashboardv2/public/js/views/search/QueryBuilderView.js
@@ -20,9 +20,10 @@
     'backbone',
     'hbs!tmpl/search/QueryBuilder_tmpl',
     'utils/Utils',
+    'utils/CommonViewFunction',
     'query-builder',
     'daterangepicker'
-], function(require, Backbone, QueryBuilder_Tmpl, Utils) {
+], function(require, Backbone, QueryBuilder_Tmpl, Utils, CommonViewFunction) {
 
     var QueryBuilderView = Backbone.Marionette.LayoutView.extend(
         /** @lends QueryBuilderView */
@@ -51,8 +52,9 @@
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'filterObj', 'entityDefCollection', 'enumDefCollection', 'tag'));
+                _.extend(this, _.pick(options, 'attrObj', 'value', 'typeHeaders', 'entityDefCollection', 'enumDefCollection', 'tag'));
                 this.attrObj = _.sortBy(this.attrObj, 'name');
+                this.filterType = this.tag ? 'tagFilters' : 'entityFilters';
             },
             bindEvents: function() {},
             getOperator: function(type) {
@@ -89,8 +91,8 @@
                             format: 'MM/DD/YYYY h:mm A'
                         }
                     };
-                    if (rules && rules.rules) {
-                        var valueObj = _.find(rules.rules, { id: obj.id });
+                    if (rules) {
+                        var valueObj = _.find(rules, { id: obj.id });
                         if (valueObj) {
                             obj.plugin_config["startDate"] = valueObj.value;
                         }
@@ -128,15 +130,8 @@
             onRender: function() {
                 var that = this,
                     filters = [];
-                if (this.filterObj) {
-                    var filter = this.filterObj[(this.tag ? 'tagFilters' : 'entityFilters')],
-                        tagTermName = this.tag ? this.value.tag : this.value.type;
-                    if (filter) {
-                        ruleObj = filter[tagTermName];
-                        if (ruleObj) {
-                            var rules_widgets = ruleObj.rule;
-                        }
-                    }
+                if (this.value) {
+                    var rules_widgets = CommonViewFunction.attributeFilter.extractUrl(this.value[this.filterType]);
                 }
                 _.each(this.attrObj, function(obj) {
                     var returnObj = that.getObjDef(obj, rules_widgets);
@@ -145,20 +140,6 @@
                     }
                 });
                 filters = _.uniq(filters, 'id');
-                if (rules_widgets) {
-                    for (var i = 0; i < rules_widgets.rules.length; i++) {
-                        if (!_.find(filters, { id: rules_widgets.rules[i].id })) {
-                            var type = (this.tag ? 'tagFilters' : 'entityFilters');
-                            var list = JSON.parse(Utils.localStorage.getValue(type));
-                            delete list[this.value.tag];
-                            list = _.isEmpty(list) ? null : list;
-                            Utils.localStorage.setValue(type, JSON.stringify(list));
-                            this.filterObj[type] = list;
-                            rules_widgets = null;
-                            break;
-                        }
-                    }
-                }
                 if (filters && !_.isEmpty(filters)) {
                     this.ui.builder.queryBuilder({
                         plugins: ['bt-tooltip-errors'],
diff --git a/dashboardv2/public/js/views/search/SearchDetailLayoutView.js b/dashboardv2/public/js/views/search/SearchDetailLayoutView.js
index 32ad542..b22fae8 100644
--- a/dashboardv2/public/js/views/search/SearchDetailLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchDetailLayoutView.js
@@ -43,7 +43,7 @@
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'value', 'initialView', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'filterObj'));
+                _.extend(this, _.pick(options, 'value', 'initialView', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection'));
             },
             bindEvents: function() {},
             onRender: function() {
@@ -62,7 +62,6 @@
                             entityDefCollection: that.entityDefCollection,
                             typeHeaders: that.typeHeaders,
                             searchVent: that.searchVent,
-                            filterObj: that.filterObj,
                             enumDefCollection: that.enumDefCollection
                         }));
                     }
diff --git a/dashboardv2/public/js/views/search/SearchLayoutView.js b/dashboardv2/public/js/views/search/SearchLayoutView.js
index 76d6f77..0c39b02 100644
--- a/dashboardv2/public/js/views/search/SearchLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchLayoutView.js
@@ -22,7 +22,8 @@
     'utils/Utils',
     'utils/UrlLinks',
     'utils/Globals',
-], function(require, Backbone, SearchLayoutViewTmpl, Utils, UrlLinks, Globals) {
+    'utils/CommonViewFunction'
+], function(require, Backbone, SearchLayoutViewTmpl, Utils, UrlLinks, Globals, CommonViewFunction) {
     'use strict';
 
     var SearchLayoutView = Backbone.Marionette.LayoutView.extend(
@@ -80,7 +81,7 @@
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'filterObj'));
+                _.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection'));
                 this.type = "basic";
                 var param = Utils.getUrlState.getQueryParams();
                 this.query = {
@@ -121,52 +122,88 @@
                     this.checkForButtonVisiblity();
                 }, this);
             },
-            bindSelect2Events: function(argument) {
-                var that = this;
-                this.ui.typeLov.on('select2:select', function(argument) {
-                    // this function calles after checkForButtonVisiblity that is why disabled flter here
-                    that.ui.typeAttrFilter.prop('disabled', false);
-                    _.extend(that.value, { 'type': this.value });
-                    that.makeFilterButtonActive('type');
-                });
-                this.ui.tagLov.on('select2:select', function(argument) {
-                    // this function calles after checkForButtonVisiblity that is why disabled flter here
-                    that.ui.tagAttrFilter.prop('disabled', false);
-                    _.extend(that.value, { 'tag': this.value });
-                    that.makeFilterButtonActive('tag');
-                });
-                this.ui.typeLov.on('select2:unselect', function(argument) {
-                    _.extend(that.value, { 'type': null });
-                });
-                this.ui.tagLov.on('select2:unselect', function(argument) {
-                    _.extend(that.value, { 'tag': null });
+            makeFilterButtonActive: function(filtertypeParam) {
+                var filtertype = ['entityFilters', 'tagFilters'],
+                    that = this;
+                if (filtertypeParam) {
+                    if (_.isArray(filtertypeParam)) {
+                        filtertype = filtertypeParam;
+                    } else if (_.isString(filtertypeParam)) {
+                        filtertype = [filtertypeParam];
+                    }
+                }
+                var typeCheck = function(filterQueryObj, type) {
+                    var filterObj = filterQueryObj[type];
+                    if (that.value.type) {
+                        if (filterObj && filterObj.length) {
+                            that.ui.typeAttrFilter.addClass('active');
+                        } else {
+                            filterQueryObj[type] = null;
+                            that.value[type] = null;
+                            that.ui.typeAttrFilter.removeClass('active');
+                        }
+                        that.ui.typeAttrFilter.prop('disabled', false);
+                    } else {
+                        filterQueryObj[type] = null;
+                        that.value[type] = null;
+                        that.ui.typeAttrFilter.removeClass('active');
+                        that.ui.typeAttrFilter.prop('disabled', true);
+                    }
+
+                }
+                var tagCheck = function(filterQueryObj, type) {
+                    var filterObj = filterQueryObj[type];
+                    if (that.value.tag) {
+                        that.ui.tagAttrFilter.prop('disabled', false);
+                        if (filterObj && filterObj.length) {
+                            that.ui.tagAttrFilter.addClass('active');
+                        } else {
+                            filterQueryObj[type] = null;
+                            that.value[type] = null;
+                            that.ui.tagAttrFilter.removeClass('active');
+                        }
+                    } else {
+                        filterQueryObj[type] = null;
+                        that.value[type] = null;
+                        that.ui.tagAttrFilter.removeClass('active');
+                        that.ui.tagAttrFilter.prop('disabled', true);
+                    }
+                }
+                _.each(filtertype, function(type) {
+                    var filterObj = that.query[that.type][type],
+                        filterQueryObj = that.query[that.type];
+                    if (type == "entityFilters") {
+                        typeCheck(filterQueryObj, type)
+                    }
+                    if (type == "tagFilters") {
+                        tagCheck(filterQueryObj, type)
+                    }
                 });
             },
-            makeFilterButtonActive: function(type) {
-                if (this.filterObj) {
-                    var tagFilters = this.filterObj.tagFilters,
-                        entityFilters = this.filterObj.entityFilters;
-                    if (type == "type") {
-                        if (_.has(entityFilters, this.value[type])) {
-                            this.query[this.type]['entityFilters'] = +new Date();
-                            this.ui.typeAttrFilter.addClass('active');
+            checkForButtonVisiblity: function(e) {
+                if (this.type == "basic" && e && e.currentTarget) {
+                    var $el = $(e.currentTarget),
+                        isTagEl = $el.data('id') == "tagLOV" ? true : false;
+                    if (e.type == "change" && $el.select2('data')) {
+                        var value = $el.val(),
+                            key = (isTagEl ? 'tag' : 'type'),
+                            filterType = (isTagEl ? 'tagFilters' : 'entityFilters'),
+                            value = value.length ? value : null;
+                        if (this.value) {
+                            if (this.value[key] !== value || (!value && !this.value[key]) || (!this.value[filterType])) {
+                                var temp = {};
+                                temp[key] = value;
+                                _.extend(this.value, temp);
+                                this.query[this.type][filterType] = null;
+                                this.value[filterType] = null;
+                                this.makeFilterButtonActive(filterType);
+                            }
                         } else {
-                            this.query[this.type]['entityFilters'] = null;
-                            this.ui.typeAttrFilter.removeClass('active');
-                        }
-                    }
-                    if (type == "tag") {
-                        if (_.has(tagFilters, this.value[type])) {
-                            this.query[this.type]['tagFilters'] = +new Date();
-                            this.ui.tagAttrFilter.addClass('active');
-                        } else {
-                            this.query[this.type]['tagFilters'] = null;
-                            this.ui.tagAttrFilter.removeClass('active');
+                            this.ui.tagAttrFilter.prop('disabled', true);
+                            this.ui.typeAttrFilter.prop('disabled', true);
                         }
                     }
                 }
-            },
-            checkForButtonVisiblity: function() {
                 var that = this,
                     value = this.ui.searchInput.val() || this.ui.typeLov.val();
                 if (!this.dsl && !value) {
@@ -180,24 +217,6 @@
                 } else {
                     this.ui.searchBtn.attr("disabled", "true");
                 }
-                if (this.value) {
-                    if (this.value.tag) {
-                        this.ui.tagAttrFilter.prop('disabled', false);
-                    } else {
-                        this.ui.tagAttrFilter.prop('disabled', true);
-                    }
-                    if (this.value.type) {
-                        this.ui.typeAttrFilter.prop('disabled', false);
-                    } else {
-                        this.ui.typeAttrFilter.prop('disabled', true);
-                    }
-                    this.makeFilterButtonActive('type');
-                    this.makeFilterButtonActive('tag');
-                } else {
-                    this.ui.tagAttrFilter.prop('disabled', true);
-                    this.ui.typeAttrFilter.prop('disabled', true);
-                }
-
             },
             onRender: function() {
                 // array of tags which is coming from url
@@ -211,8 +230,6 @@
                     placeholder: "Select",
                     allowClear: true
                 });
-                this.bindSelect2Events();
-                this.checkForButtonVisiblity();
             },
             updateQueryObject: function(param) {
                 if (param && param.searchType) {
@@ -270,78 +287,24 @@
                         typeHeaders: that.typeHeaders,
                         entityDefCollection: that.entityDefCollection,
                         enumDefCollection: that.enumDefCollection,
-                        filterObj: that.filterObj,
                         classificationDefCollection: that.classificationDefCollection
                     });
-                    that.attrModal.on('ok', function(e) {
-                        that.okAttrFilterButton();
+                    that.attrModal.on('ok', function(scope, e) {
+                        that.okAttrFilterButton(e);
                     });
                 });
             },
-            okAttrFilterButton: function() {
+            okAttrFilterButton: function(e) {
                 var filtertype = this.attrModal.tag ? 'tagFilters' : 'entityFilters',
-                    rule = this.attrModal.RQueryBuilder.currentView.ui.builder.queryBuilder('getRules'),
-                    result = this.getQueryBuilderParsData(rule);
-
-                if (result) {
-                    if (!_.isEmpty(result.criterion)) {
-                        this.query[this.type][filtertype] = +new Date();
-                        if (result) {
-                            var filterObj = this.filterObj ? this.filterObj[filtertype] : null;
-                            if (!filterObj) {
-                                filterObj = {};
-                            }
-                            var temp = {}; // IE fix
-                            temp[(this.attrModal.tag ? this.value.tag : this.value.type)] = { 'result': result, 'rule': rule };
-                            _.extend(filterObj, temp);
-                            this.filterObj[filtertype] = filterObj;
-                            this.makeFilterButtonActive(this.attrModal.tag ? 'tag' : 'type');
-                            Utils.localStorage.setValue((filtertype), JSON.stringify(filterObj));
-                        } else {
-                            this.filterObj[filtertype] = null;
-                            this.query[this.type][filtertype] = null;
-                            this.makeFilterButtonActive(this.attrModal.tag ? 'tag' : 'type');
-                            Utils.localStorage.removeValue(filtertype);
-                        }
-
-                    }
+                    rule = this.attrModal.RQueryBuilder.currentView.ui.builder.queryBuilder('getRules');
+                if (rule) {
+                    this.query[this.type][filtertype] = CommonViewFunction.attributeFilter.generateUrl(rule.rules);
+                    this.makeFilterButtonActive(filtertype);
                     this.attrModal.modal.close();
-                } else {
-                    this.filterObj[filtertype] = null;
-                    this.query[this.type][filtertype] = null;
-                    this.makeFilterButtonActive(this.attrModal.tag ? 'tag' : 'type');
-                    Utils.localStorage.removeValue(filtertype);
-                }
-            },
-            getQueryBuilderParsData: function(obj) {
-                if (obj) {
-                    var parsObj = {
-                        "condition": obj.condition,
-                        "criterion": convertKeyAndExtractObj(obj.rules)
+                    if ($(e.currentTarget).hasClass('search')) {
+                        this.findSearchResult();
                     }
                 }
-
-                function convertKeyAndExtractObj(rules) {
-                    var convertObj = [];
-                    _.each(rules, function(rulObj) {
-                        var tempObj = {}
-                        if (rulObj.rules) {
-                            tempObj = {
-                                "condition": rulObj.condition,
-                                "criterion": convertKeyAndExtractObj(rulObj.rules)
-                            }
-                        } else {
-                            tempObj = {
-                                "attributeName": rulObj.id,
-                                "operator": rulObj.operator,
-                                "attributeValue": (rulObj.type === "date" ? Date.parse(rulObj.value) : rulObj.value)
-                            }
-                        }
-                        convertObj.push(tempObj);
-                    });
-                    return convertObj;
-                }
-                return parsObj;
             },
             manualRender: function(paramObj) {
                 this.updateQueryObject(paramObj);
@@ -408,7 +371,6 @@
                     setTimeout(function() {
                         that.ui.searchInput.focus();
                     }, 0);
-                    //this.searchVent.trigger('searchAttribute', this.value);
                 }
             },
             findSearchResult: function() {
@@ -482,10 +444,6 @@
                 this.ui.tagLov.val("").trigger("change");
                 this.ui.searchInput.val("");
                 this.checkForButtonVisiblity();
-                Utils.localStorage.removeValue('tagFilters');
-                Utils.localStorage.removeValue('entityFilters');
-                this.filterObj.tagFilters = null;
-                this.filterObj.entityFilters = null;
                 Utils.setUrl({
                     url: '#!/search/searchResult',
                     urlParams: {
diff --git a/dashboardv2/public/js/views/search/SearchQueryView.js b/dashboardv2/public/js/views/search/SearchQueryView.js
index 37ccf90..281e37e 100644
--- a/dashboardv2/public/js/views/search/SearchQueryView.js
+++ b/dashboardv2/public/js/views/search/SearchQueryView.js
@@ -50,17 +50,27 @@
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'value', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'classificationDefCollection', 'tag', 'filterObj'));
+                _.extend(this, _.pick(options, 'value', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'classificationDefCollection', 'tag'));
                 this.bindEvents();
                 var that = this;
                 this.modal = new Modal({
                     title: 'Attribute Filter',
                     content: this,
-                    okText: 'Apply',
-                    cancelText: "Cancel",
                     allowCancel: true,
                     okCloses: false,
-                    width: '50%'
+                    width: '50%',
+                    buttons: [{
+                            text: 'Apply',
+                            btnClass: "ok"
+                        },
+                        {
+                            text: 'Apply & Search',
+                            btnClass: "ok search"
+                        }, {
+                            text: 'Cancel',
+                            btnClass: "cancel"
+                        }
+                    ]
                 }).open();
                 this.modal.on('closeModal', function() {
                     that.modal.trigger('cancel');
@@ -73,7 +83,6 @@
                     searchVent: this.searchVent,
                     entityDefCollection: this.entityDefCollection,
                     enumDefCollection: this.enumDefCollection,
-                    filterObj: this.filterObj,
                     classificationDefCollection: this.classificationDefCollection
                 }
 
@@ -110,4 +119,4 @@
             }
         });
     return SearchQueryView;
-});
+});
\ No newline at end of file
diff --git a/dashboardv2/public/js/views/search/SearchResultLayoutView.js b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
index 319beab..d1b1a02 100644
--- a/dashboardv2/public/js/views/search/SearchResultLayoutView.js
+++ b/dashboardv2/public/js/views/search/SearchResultLayoutView.js
@@ -62,9 +62,7 @@
                 editEntityButton: "[data-id='editEntityButton']",
                 createEntity: "[data-id='createEntity']",
                 checkDeletedEntity: "[data-id='checkDeletedEntity']",
-                containerCheckBox: "[data-id='containerCheckBox']",
-                filterPanel: "#filterPanel",
-                filterQuery: "#filterQuery"
+                containerCheckBox: "[data-id='containerCheckBox']"
             },
             templateHelpers: function() {
                 return {
@@ -129,8 +127,7 @@
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'value', 'initialView', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'tagCollection', 'filterObj'));
-                var pagination = "";
+                _.extend(this, _.pick(options, 'value', 'initialView', 'entityDefCollection', 'typeHeaders', 'searchVent', 'enumDefCollection', 'tagCollection'));
                 this.entityModel = new VEntity();
                 this.searchCollection = new VSearchList();
                 this.limit = 25;
@@ -142,7 +139,8 @@
                     includePagination: false,
                     includeFooterRecords: false,
                     includeColumnManager: (this.value && this.value.searchType === "basic" ? true : false),
-                    includeOrderAbleColumns: false,
+                    includeOrderAbleColumns: true,
+                    includeSizeAbleColumns: true,
                     columnOpts: {
                         opts: {
                             initialColumnsVisible: null,
@@ -237,9 +235,6 @@
                 this.listenTo(this.searchVent, "search:refresh", function(model, response) {
                     this.fetchCollection();
                 }, this);
-                this.listenTo(this.searchVent, "searchAttribute", function(obj) {
-                    this.showHideFilter(obj);
-                }, this);
             },
             onRender: function() {
                 if (!this.initialView) {
@@ -269,76 +264,66 @@
                         this.$(".entityLink").show();
                     }
                 }
-                this.showHideFilter();
             },
             updateColumnList: function(updatedList) {
                 if (updatedList) {
                     var listOfColumns = []
                     _.map(updatedList, function(obj) {
                         var key = obj.name;
-                        if (key == "selected" || key == "displayText" || key == "description" || key == "typeName" || key == "owner" || key == "tag" || key == "terms") {
-                            return;
-                        }
                         if (obj.renderable) {
                             listOfColumns.push(obj.name);
                         }
                     });
+                    listOfColumns = _.sortBy(listOfColumns);
                     this.value.attributes = listOfColumns.length ? listOfColumns.join(",") : null;
                 }
                 this.columnToShow = this.value && this.value.attributes ? this.value.attributes.split(',') : [];
             },
             generateQueryOfFilter: function() {
                 var value = this.value,
-                    entityFilters = this.filterObj && this.filterObj.entityFilters ? this.filterObj.entityFilters[value.type] : null,
-                    tagFilters = this.filterObj && this.filterObj.tagFilters ? this.filterObj.tagFilters[value.tag] : null,
+                    entityFilters = CommonViewFunction.attributeFilter.extractUrl(value.entityFilters),
+                    tagFilters = CommonViewFunction.attributeFilter.extractUrl(value.tagFilters),
                     queryArray = [],
                     objToString = function(filterObj) {
                         var tempObj = [];
-                        _.each(filterObj.rules, function(obj) {
-                            tempObj.push('<span class="key">' + obj.field + '</span>&nbsp<span class="operator">' + obj.operator + '</span>&nbsp<span class="value">' + obj.value + "</span>")
+                        _.each(filterObj, function(obj) {
+                            tempObj.push('<span class="key">' + obj.id + '</span>&nbsp<span class="operator">' + obj.operator + '</span>&nbsp<span class="value">' + obj.value + "</span>")
                         });
                         return tempObj.join('&nbsp<span class="operator">AND</span>&nbsp');
                     }
-                if (entityFilters) {
-                    var typeKeyValue = '<span class="key">Type:</span>&nbsp<span class="value">' + value.type + '</span>&nbsp<span class="operator">AND</span>&nbsp';
-                    queryArray = queryArray.concat(typeKeyValue + objToString(entityFilters.rule));
-                }
-                if (tagFilters) {
-                    var tagKeyValue = '<span class="key">Tag:</span>&nbsp<span class="value">' + value.tag + '</span>&nbsp<span class="operator">AND</span>&nbsp';
-                    queryArray = queryArray.concat(tagKeyValue + objToString(tagFilters.rule));
-
-                }
-                if (queryArray.length == 2) {
-                    return "<span>(</span>&nbsp" + queryArray.join('<span>&nbsp)</span>&nbsp<span>AND</span>&nbsp<span>(</span>&nbsp') + "&nbsp<span>)</span>";
-                } else {
-                    return queryArray.join();
-                }
-            },
-            showHideFilter: function() {
-                if (this.value) {
-                    if (Utils.getUrlState.isSearchTab() && this.value.searchType == "basic") {
-                        var query = this.generateQueryOfFilter();
-                        if (query) {
-                            this.ui.filterQuery.html(query);
-                            this.ui.filterPanel.show();
-                        } else
-                            this.ui.filterPanel.hide();
-                    } else {
-                        this.ui.filterPanel.hide();
+                if (value.type) {
+                    var typeKeyValue = '<span class="key">Type:</span>&nbsp<span class="value">' + value.type + '</span>';
+                    if (entityFilters) {
+                        typeKeyValue += '&nbsp<span class="operator">AND</span>&nbsp' + objToString(entityFilters);
                     }
+                    queryArray.push(typeKeyValue)
+                }
+                if (value.tag) {
+                    var tagKeyValue = '<span class="key">Tag:</span>&nbsp<span class="value">' + value.tag + '</span>';
+                    if (tagFilters) {
+                        tagKeyValue += '&nbsp<span class="operator">AND</span>&nbsp' + objToString(tagFilters);
+                    }
+                    queryArray.push(tagKeyValue);
+                }
+                if (value.query) {
+                    queryArray.push('<span class="key">Query:</span>&nbsp<span class="value">' + value.query + '</span>&nbsp');
+                }
+                if (queryArray.length == 1) {
+                    return queryArray.join();
                 } else {
-                    this.ui.filterPanel.hide();
+                    return "<span>(</span>&nbsp" + queryArray.join('<span>&nbsp)</span>&nbsp<span>AND</span>&nbsp<span>(</span>&nbsp') + "&nbsp<span>)</span>";
+
                 }
             },
             fetchCollection: function(value, clickObj) {
                 var that = this,
                     isPostMethod = this.value.searchType === "basic" && Utils.getUrlState.isSearchTab(),
-                    tagFilters = this.filterObj && this.filterObj.tagFilters ? this.filterObj.tagFilters[this.value.tag] : null,
-                    entityFilters = this.filterObj && this.filterObj.entityFilters ? this.filterObj.entityFilters[this.value.type] : null,
+                    tagFilters = CommonViewFunction.attributeFilter.generateAPIObj(this.value.tagFilters),
+                    entityFilters = CommonViewFunction.attributeFilter.generateAPIObj(this.value.entityFilters),
                     filterObj = {
-                        'entityFilters': entityFilters ? entityFilters.result : null,
-                        'tagFilters': tagFilters ? tagFilters.result : null,
-                        'attributes': this.columnToShow.length ? this.columnToShow : null
+                        'entityFilters': entityFilters,
+                        'tagFilters': tagFilters,
+                        'attributes': this.columnToShow.length ? _.without(this.columnToShow, "selected", "name", "description", "typeName", "owner", "tag", "terms") : null
                     }
                 this.showLoader();
                 if (Globals.searchApiCallRef && Globals.searchApiCallRef.readyState === 1) {
@@ -393,7 +378,7 @@
                         if (that.searchCollection.queryParams.query) {
                             resultArr.push(that.searchCollection.queryParams.query)
                         }
-                        var searchString = 'Results for <b>' + _.escape(resultArr.join(that.searchType == 'Advanced Search' ? " " : " & ")) + '</b>';
+                        var searchString = 'Results for: <span class="filterQuery">' + that.generateQueryOfFilter() + "</span>";
                         if (Globals.entityCreate && Globals.entityTypeConfList && Utils.getUrlState.isSearchTab()) {
                             searchString += "<p>If you do not find the entity in search result below then you can" + '<a href="javascript:void(0)" data-id="createEntity"> create new entity</a></p>';
                         }
@@ -412,7 +397,6 @@
                     if (isPostMethod) {
                         apiObj['data'] = _.extend({}, filterObj, _.pick(this.searchCollection.queryParams, 'query', 'excludeDeletedEntities', 'limit', 'offset', 'typeName', 'classification'))
                         Globals.searchApiCallRef = this.searchCollection.getBasicRearchResult(apiObj);
-                        this.showHideFilter();
                     } else {
                         apiObj.data = null;
                         Globals.searchApiCallRef = this.searchCollection.fetch(apiObj);
@@ -441,13 +425,13 @@
                     count = 5;
                 require(['utils/TableLayout'], function(TableLayout) {
                     var columnCollection = Backgrid.Columns.extend({
-                        sortKey: "position",
+                        sortKey: "displayOrder",
                         comparator: function(item) {
                             return item.get(this.sortKey) || 999;
                         },
                         setPositions: function() {
                             _.each(this.models, function(model, index) {
-                                model.set("position", index + 1, { silent: true });
+                                model.set("displayOrder", index + 1, { silent: true });
                             });
                             return this;
                         }
@@ -491,10 +475,13 @@
                     name: "selected",
                     label: "Select",
                     cell: "select-row",
+                    resizeable: false,
+                    orderable: false,
+                    renderable: (that.columnToShow && that.columnToShow.length ? _.contains(that.columnToShow, 'selected') : true),
                     headerCell: "select-all"
                 };
 
-                col['displayText'] = {
+                col['name'] = {
                     label: "Name",
                     cell: "html",
                     editable: false,
@@ -556,7 +543,7 @@
                     sortable: false,
                     resizeable: true,
                     orderable: true,
-                    renderable: true,
+                    renderable: (that.columnToShow && that.columnToShow.length ? _.contains(that.columnToShow, 'typeName') : true),
                     formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                         fromRaw: function(rawValue, model) {
                             var obj = model.toJSON();
@@ -590,7 +577,7 @@
                     sortable: false,
                     resizeable: true,
                     orderable: true,
-                    renderable: true,
+                    renderable: (that.columnToShow && that.columnToShow.length ? _.contains(that.columnToShow, 'tag') : true),
                     className: 'searchTag',
                     formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                         fromRaw: function(rawValue, model) {
@@ -612,7 +599,7 @@
                         sortable: false,
                         resizeable: true,
                         orderable: true,
-                        renderable: true,
+                        renderable: (that.columnToShow && that.columnToShow.length ? _.contains(that.columnToShow, 'terms') : true),
                         className: 'searchTerm',
                         formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                             fromRaw: function(rawValue, model) {
@@ -636,8 +623,11 @@
                         var attrObj = Utils.getNestedSuperTypeObj({ data: def.toJSON(), collection: this.entityDefCollection, attrMerge: true });
                         _.each(attrObj, function(obj, key) {
                             var key = obj.name,
-                                isEenderable = that.columnToShow.length ? _.contains(that.columnToShow, key) : false;
+                                isRenderable = _.contains(that.columnToShow, key)
                             if (key == "name" || key == "description" || key == "owner") {
+                                if (that.columnToShow && that.columnToShow.length) {
+                                    col[key].renderable = isRenderable;
+                                }
                                 return;
                             }
                             col[obj.name] = {
@@ -647,7 +637,7 @@
                                 sortable: false,
                                 resizeable: true,
                                 orderable: true,
-                                renderable: isEenderable,
+                                renderable: isRenderable,
                                 formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                                     fromRaw: function(rawValue, model) {
                                         var modelObj = model.toJSON();
diff --git a/dashboardv2/public/js/views/tag/TagLayoutView.js b/dashboardv2/public/js/views/tag/TagLayoutView.js
index 2714770..5f58ad7 100644
--- a/dashboardv2/public/js/views/tag/TagLayoutView.js
+++ b/dashboardv2/public/js/views/tag/TagLayoutView.js
@@ -59,7 +59,7 @@
              * @constructs
              */
             initialize: function(options) {
-                _.extend(this, _.pick(options, 'tag', 'collection', 'typeHeaders', 'filterObj', 'value'));
+                _.extend(this, _.pick(options, 'tag', 'collection', 'typeHeaders', 'value'));
             },
             bindEvents: function() {
                 var that = this;
@@ -417,15 +417,6 @@
                         }
                         that.collection.remove(deleteTagData);
                         // to update tag list of search tab fetch typeHeaders.
-                        var tagList = JSON.parse(Utils.localStorage.getValue('tagFilters'));
-                        if (tagList) {
-                            delete tagList[that.tagName];
-                        }
-                        tagList = _.isEmpty(tagList) ? null : tagList;
-                        if (that.filterObj['tagFilters'] && that.filterObj['tagFilters'][that.tagName]) {
-                            delete that.filterObj['tagFilters'][that.tagName];
-                        }
-                        Utils.localStorage.setValue('tagFilters', JSON.stringify(tagList));
                         that.typeHeaders.fetch({ reset: true });
                     }
                 });
