diff --git a/dashboardv3/public/css/scss/style.scss b/dashboardv3/public/css/scss/style.scss
index 32640ec..37d5458 100644
--- a/dashboardv3/public/css/scss/style.scss
+++ b/dashboardv3/public/css/scss/style.scss
@@ -37,4 +37,4 @@
 @import "business-metadata.scss";
 @import "stats.scss";
 @import "override.scss";
-@import "leftsidebar.scss"
\ No newline at end of file
+@import "leftsidebar.scss";
\ No newline at end of file
diff --git a/dashboardv3/public/js/utils/Globals.js b/dashboardv3/public/js/utils/Globals.js
index 8fe8ebc..df17a68 100644
--- a/dashboardv3/public/js/utils/Globals.js
+++ b/dashboardv3/public/js/utils/Globals.js
@@ -49,6 +49,7 @@
 
     Globals.isDebugMetricsEnabled = false;
     Globals.isTasksEnabled = false;
+    Globals.advanceSearchData = {};
     Globals.idealTimeoutSeconds = 900;
 
     return Globals;
diff --git a/dashboardv3/public/js/views/search/AdvanceSearchLayoutView.js b/dashboardv3/public/js/views/search/AdvanceSearchLayoutView.js
new file mode 100644
index 0000000..1cbbed9
--- /dev/null
+++ b/dashboardv3/public/js/views/search/AdvanceSearchLayoutView.js
@@ -0,0 +1,365 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+define(['require',
+    'backbone',
+    'hbs!tmpl/search/SearchLayoutView_tmpl',
+    'utils/Utils',
+    'utils/UrlLinks',
+    'utils/Globals',
+    'utils/Enums',
+    'collection/VSearchList',
+    'utils/CommonViewFunction',
+    'jstree'
+], function(require, Backbone, SearchLayoutViewTmpl, Utils, UrlLinks, Globals, Enums, VSearchList, CommonViewFunction) {
+    'use strict';
+
+    var AdvanceSearchLayoutView = Backbone.Marionette.LayoutView.extend(
+        /** @lends AdvanceSearchLayoutView */
+        {
+            _viewName: 'AdvanceSearchLayoutView',
+
+            template: SearchLayoutViewTmpl,
+
+            /** Layout sub regions */
+            regions: {},
+
+            /** ui selector cache */
+            ui: {
+                searchInput: '[data-id="searchInput"]',
+                searchBtn: '[data-id="searchBtn"]',
+                clearSearch: '[data-id="clearSearch"]',
+                typeLov: '[data-id="typeLOV"]',
+                refreshBtn: '[data-id="refreshBtn"]',
+                advancedInfoBtn: '[data-id="advancedInfo"]'
+            },
+
+            /** ui events hash */
+            events: function() {
+                var events = {},
+                    that = this;
+                events["keyup " + this.ui.searchInput] = function(e) {
+                    var code = e.which;
+                    this.value.query = e.currentTarget.value;
+                    this.query[this.type].query = this.value.query;
+                    if (code == 13) {
+                        that.findSearchResult();
+                        this.getAdvanceSearchValues();
+                    }
+                    this.checkForButtonVisiblity();
+                };
+                events["click " + this.ui.searchBtn] = 'findSearchResult';
+                events["click " + this.ui.clearSearch] = 'clearSearchData';
+                events["change " + this.ui.typeLov] = 'checkForButtonVisiblity';
+                events["click " + this.ui.refreshBtn] = 'onRefreshButton';
+                events["click " + this.ui.advancedInfoBtn] = 'advancedInfo';
+                $('.global-search-container').find("span[data-id='detailSearch']").on("click", function(e) {
+                    if (that.$el.height() === 0) {
+                        that.renderTypeTagList({ "filterList": Globals.advanceSearchData.filterTypeSelected, isTypeOnly: true });
+                        that.setAdvanceSeachValues();
+                    }
+                });
+                return events;
+            },
+            /**
+             * intialize a new AdvanceSearchLayoutView Layout
+             * @constructs
+             */
+            initialize: function(options) {
+                var that = this;
+                _.extend(this, _.pick(options, 'value', 'typeHeaders', 'searchVent', 'entityDefCollection', 'enumDefCollection', 'classificationDefCollection', 'searchTableColumns', 'searchTableFilters', 'metricCollection', 'onSubmit'));
+                this.type = "dsl";
+                this.entityCountObj = _.first(this.metricCollection.toJSON()) || { entity: { entityActive: {}, entityDeleted: {} }, tag: { tagEntities: {} } };
+                this.filterTypeSelected = [];
+                var param = Utils.getUrlState.getQueryParams();
+                this.query = {
+                    dsl: {
+                        query: null,
+                        type: null,
+                        pageOffset: null,
+                        pageLimit: null
+                    }
+                };
+                if (!this.value) {
+                    this.value = {};
+                }
+                if (param && param.searchType) {
+                    this.type = param.searchType;
+                    this.updateQueryObject(param);
+                }
+                this.bindEvents();
+            },
+            bindEvents: function(param) {
+                this.listenTo(this.typeHeaders, "reset", function(value) {
+                    this.initializeValues();
+                }, this);
+            },
+            onRender: function() {
+                var that = this;
+                // array of tags which is coming from url
+                this.initializeValues();
+                this.dslFulltextToggle();
+                this.getAdvanceSearchValues();
+            },
+            initializeValues: function() {
+                this.renderTypeTagList();
+                this.setValues();
+                this.checkForButtonVisiblity();
+            },
+            getAdvanceSearchValues: function() {
+                var params = Utils.getUrlState.getQueryParams();
+                if (params && params.searchType === "dsl") {
+                    Globals.advanceSearchData.searchByType = params.type;
+                    Globals.advanceSearchData.searchByQuery = params.query;
+                    if (params.filterTypeSelected) {
+                        Globals.advanceSearchData.filterTypeSelected = params.filterTypeSelected.split(',');
+                    }
+                }
+            },
+            setAdvanceSeachValues: function() {
+                this.ui.typeLov.val(Globals.advanceSearchData.searchByType).trigger('change');
+                this.ui.searchInput.val(Globals.advanceSearchData.searchByQuery);
+            },
+            checkForButtonVisiblity: function(e, options) {
+                var that = this;
+                if (e && e.currentTarget) {
+                    var $el = $(e.currentTarget),
+                        isTypeEl = $el.data('id') == "typeLOV",
+                        select2Data = $el.select2('data');
+                    if (e.type == "change" && select2Data) {
+                        var value = (_.isEmpty(select2Data) ? select2Data : _.first(select2Data).id),
+                            key = "type";
+                        value = value && value.length ? value : null;
+                        if (this.value) {
+                            //On Change handle
+                            if (this.value[key] !== value || (!value && !this.value[key])) {
+                                var temp = {};
+                                temp[key] = value;
+                                _.extend(this.value, temp);
+                                // on change of type/tag change the offset.
+                                if (_.isUndefined(options)) {
+                                    this.value.pageOffset = 0;
+                                }
+                                _.extend(this.query[this.type], temp);
+                            }
+                        }
+                    }
+                }
+                var value = this.ui.searchInput.val() || _.first($(this.ui.typeLov).select2('data')).id;
+                if (value && value.length) {
+                    this.ui.searchBtn.removeAttr("disabled");
+                    setTimeout(function() {
+                        !that.isDestroyed && that.ui.searchInput.focus();
+                    }, 0);
+                } else {
+                    this.ui.searchBtn.attr("disabled", "true");
+                }
+            },
+            updateQueryObject: function(param) {
+                if (param && param.searchType) {
+                    this.type = param.searchType;
+                }
+                _.extend(this.query[this.type],
+                    (this.type == "dsl" ? {
+                        query: null,
+                        type: null,
+                        pageOffset: null,
+                        pageLimit: null
+                    } : {
+                        query: null,
+                        type: null,
+                        tag: null,
+                        term: null,
+                        attributes: null,
+                        tagFilters: null,
+                        pageOffset: null,
+                        pageLimit: null,
+                        entityFilters: null,
+                        includeDE: null
+                    }), param);
+            },
+            fetchCollection: function(value) {
+                this.typeHeaders.fetch({ reset: true });
+            },
+            onRefreshButton: function() {
+                this.fetchCollection();
+                //to check url query param contain type or not
+                var checkURLValue = Utils.getUrlState.getQueryParams(this.url);
+                if (this.searchVent && (_.has(checkURLValue, "type") || _.has(checkURLValue, "query"))) {
+                    this.searchVent.trigger('search:refresh');
+                }
+            },
+            advancedInfo: function(e) {
+                require([
+                    'views/search/AdvancedSearchInfoView',
+                    'modules/Modal'
+                ], function(AdvancedSearchInfoView, Modal) {
+                    var view = new AdvancedSearchInfoView();
+                    var modal = new Modal({
+                        title: 'Advanced Search Queries',
+                        content: view,
+                        okCloses: true,
+                        showFooter: true,
+                        allowCancel: false
+                    }).open();
+                    view.on('closeModal', function() {
+                        modal.trigger('cancel');
+                    });
+                });
+            },
+            manualRender: function(paramObj) {
+                this.updateQueryObject(paramObj);
+                this.setValues(paramObj);
+            },
+            getFilterBox: function() {
+                var serviceStr = '',
+                    serviceArr = [],
+                    that = this;
+                this.typeHeaders.fullCollection.each(function(model) {
+                    var serviceType = model.toJSON().serviceType;
+                    if (serviceType) {
+                        serviceArr.push(serviceType);
+                    }
+                });
+                this.filterTypeSelected = Globals.advanceSearchData.filterTypeSelected;
+                _.each(_.uniq(serviceArr), function(service) {
+                    serviceStr += '<li><div class="pretty p-switch p-fill"><input type="checkbox" class="pull-left" data-value="' + (service) + '" value="" ' + (_.contains(that.filterTypeSelected, service) ? "checked" : "") + '/><div class="state p-primary"><label>' + (service.toUpperCase()) + '</label></div></div></li>';
+                });
+                var templt = serviceStr + '<hr class="hr-filter"/><div class="text-right"><div class="divider"></div><button class="btn btn-action btn-sm filterDone">Done</button></div>';
+                return templt;
+            },
+            setValues: function(paramObj) {
+                var arr = [],
+                    that = this;
+                if (paramObj) {
+                    this.value = paramObj;
+                }
+                if (this.value) {
+                    this.ui.searchInput.val(this.value.query ? this.value.query : Globals.advanceSearchData.searchByQuery || "");
+                    this.ui.typeLov.val(this.value.type);
+                    if (this.ui.typeLov.data('select2')) {
+                        if (this.ui.typeLov.val() !== this.value.type) {
+                            this.value.type = null;
+                            this.ui.typeLov.val("").trigger("change", { 'manual': true });
+                        } else {
+                            this.ui.typeLov.trigger("change", { 'manual': true });
+                        }
+                    }
+                    setTimeout(function() {
+                        !that.isDestroyed && that.ui.searchInput.focus();
+                    }, 0);
+                }
+            },
+            renderTypeTagList: function(options) {
+                var that = this;
+                var serviceTypeToBefiltered = (options && options.filterList);
+                var isTypeOnly = options && options.isTypeOnly;
+                this.ui.typeLov.empty();
+                var typeStr = '<option></option>';
+                this.typeHeaders.fullCollection.each(function(model) {
+                    var name = Utils.getName(model.toJSON(), 'name');
+                    if (model.get('category') == 'ENTITY' && (serviceTypeToBefiltered && serviceTypeToBefiltered.length ? _.contains(serviceTypeToBefiltered, model.get('serviceType')) : true)) {
+                        var entityCount = (that.entityCountObj.entity.entityActive[name] + (that.entityCountObj.entity.entityDeleted[name] ? that.entityCountObj.entity.entityDeleted[name] : 0));
+                        typeStr += '<option value="' + (name) + '" data-name="' + (name) + '">' + (name) + ' ' + (entityCount ? "(" + _.numberFormatWithComma(entityCount) + ")" : '') + '</option>';
+                    }
+                });
+                that.ui.typeLov.html(typeStr);
+                var typeLovSelect2 = this.ui.typeLov.select2({
+                    placeholder: "Select Type",
+                    dropdownAdapter: $.fn.select2.amd.require("ServiceTypeFilterDropdownAdapter"),
+                    allowClear: true,
+                    dropdownCssClass: "searchLayoutView",
+                    getFilterBox: this.getFilterBox.bind(this),
+                    onFilterSubmit: function(options) {
+                        that.filterTypeSelected = options.filterVal;
+                        Globals.advanceSearchData.filterTypeSelected = that.filterTypeSelected;
+                        that.renderTypeTagList({ "filterList": options.filterVal, isTypeOnly: true });
+                        that.checkForButtonVisiblity();
+                    }
+                });
+                if (Globals.advanceSearchData.filterTypeSelected === "undefined") {
+                    typeLovSelect2.on("select2:close", function() {
+                        typeLovSelect2.trigger("hideFilter");
+                    });
+                    if (typeLovSelect2 && serviceTypeToBefiltered) {
+                        typeLovSelect2.select2('open').trigger("change", { 'manual': true });
+                    }
+                }
+            },
+            findSearchResult: function() {
+                this.triggerSearch(this.ui.searchInput.val());
+                this.getAdvanceSearchValues();
+            },
+            triggerSearch: function(value) {
+                var params = {
+                        searchType: this.type,
+                        filterTypeSelected: this.filterTypeSelected
+                    },
+                    typeLovValue = this.ui.typeLov.find(':selected').data('name');
+                params['type'] = typeLovValue || null;
+
+                //Saving the advance search query in Global variable to sync both the advance search.
+                Globals.advanceSearchData.searchByType = typeLovValue;
+                Globals.advanceSearchData.searchByQuery = value;
+
+                if (!_.isUndefinedNull(this.value.pageLimit)) {
+                    params['pageLimit'] = this.value.pageLimit;
+                }
+                if (!_.isUndefinedNull(this.value.pageOffset)) {
+                    if (!_.isUndefinedNull(this.query[this.type]) && this.query[this.type].query != value) {
+                        params['pageOffset'] = 0;
+                    } else {
+                        params['pageOffset'] = this.value.pageOffset;
+                    }
+                }
+                params['query'] = value || null;
+                _.extend(this.query[this.type], params);
+                if (this.onSubmit) {
+                    this.onSubmit(this.query[this.type]);
+                }
+                Utils.setUrl({
+                    url: '#!/search/searchResult',
+                    urlParams: _.extend({}, this.query[this.type]),
+                    mergeBrowserUrl: false,
+                    trigger: true,
+                    updateTabState: true
+                });
+            },
+            dslFulltextToggle: function() {
+                var paramObj = Utils.getUrlState.getQueryParams();
+                if (paramObj && this.type == paramObj.searchType) {
+                    this.updateQueryObject(paramObj);
+                }
+                this.type = "dsl";
+                this.dsl = true;
+                this.$('.typeFilterBtn,.tagBox,.termBox,.basicSaveSearch').hide();
+                this.$('.advanceSaveSearch,.searchByText').show();
+                this.$('.searchText').text('Search By Query');
+                this.ui.searchInput.attr("placeholder", 'Search By Query eg. where name="sales_fact"');
+            },
+            clearSearchData: function() {
+                this.filterTypeSelected = [];
+                Globals.advanceSearchData = {};
+                this.renderTypeTagList();
+                this.updateQueryObject();
+                this.ui.typeLov.val("").trigger("change");
+                this.ui.searchInput.val("");
+                this.checkForButtonVisiblity();
+            }
+        });
+    return AdvanceSearchLayoutView;
+});
\ No newline at end of file
diff --git a/dashboardv3/public/js/views/search/GlobalSearchLayoutView.js b/dashboardv3/public/js/views/search/GlobalSearchLayoutView.js
index 6922181..da3ae3e 100644
--- a/dashboardv3/public/js/views/search/GlobalSearchLayoutView.js
+++ b/dashboardv3/public/js/views/search/GlobalSearchLayoutView.js
@@ -164,9 +164,9 @@
             },
             renderSearchLayoutView: function() {
                 var that = this;
-                require(["views/search/SearchLayoutView"], function(SearchLayoutView) {
+                require(["views/search/AdvanceSearchLayoutView"], function(AdvanceSearchLayoutView) {
                     that.RSearchLayoutView.show(
-                        new SearchLayoutView(
+                        new AdvanceSearchLayoutView(
                             _.extend({
                                     isHeaderSearch: true,
                                     onSubmit: function() {
@@ -261,6 +261,7 @@
                                 if ($(this).data("valSelected") !== true) {
                                     that.closeSearch();
                                     that.triggerBasicSearch($(this).val());
+
                                 } else {
                                     $(this).data("valSelected", false);
                                 }
