diff --git a/openecomp-ui/src/nfvo-components/tree/Tree.jsx b/openecomp-ui/src/nfvo-components/tree/Tree.jsx
index 39434fc..1a1ebaf 100644
--- a/openecomp-ui/src/nfvo-components/tree/Tree.jsx
+++ b/openecomp-ui/src/nfvo-components/tree/Tree.jsx
@@ -115,7 +115,6 @@
             this.props.nodes.length !== prevProps.nodes.length ||
             this.props.selectedNodeId !== prevProps.selectedNodeId
         ) {
-            console.log('update');
             this.renderTree();
         }
     }
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/Onboard.js b/openecomp-ui/src/sdc-app/onboarding/onboard/Onboard.js
index ea70f9c..34f9b88 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/Onboard.js
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/Onboard.js
@@ -23,6 +23,7 @@
 import sortByStringProperty from 'nfvo-utils/sortByStringProperty.js';
 import { tabsMapping } from './onboardingCatalog/OnboardingCatalogConstants.js';
 import { itemStatus } from 'sdc-app/common/helpers/ItemsHelperConstants.js';
+import { catalogItemStatuses } from './onboardingCatalog/OnboardingCatalogConstants.js';
 
 export const mapStateToProps = ({
     onboard: { onboardingCatalog, activeTab, searchValue, filter },
@@ -95,6 +96,7 @@
     }
 
     return {
+        isArchived: filter.itemStatus === catalogItemStatuses.ARCHIVED,
         finalizedLicenseModelList,
         finalizedSoftwareProductList,
         licenseModelList,
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/OnboardingCatalogView.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/OnboardingCatalogView.jsx
index 86c437d..ec3d455 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/OnboardingCatalogView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/OnboardingCatalogView.jsx
@@ -44,44 +44,22 @@
             selectedVendor,
             searchValue,
             onMigrate,
-            filteredItems
+            filteredItems,
+            isArchived
         } = this.props;
 
         const { vlmList, vspList } = filteredItems;
 
         switch (activeTab) {
             case tabsMapping.ARCHIVE:
-                return (
-                    <DetailsCatalogView
-                        VLMList={vlmList}
-                        VSPList={vspList}
-                        users={users}
-                        onSelectVLM={(item, users) =>
-                            onSelectLicenseModel(
-                                item,
-                                users,
-                                WCTabsMapping.CATALOG
-                            )
-                        }
-                        onSelectVSP={(item, users) =>
-                            onSelectSoftwareProduct(
-                                item,
-                                users,
-                                WCTabsMapping.CATALOG
-                            )
-                        }
-                        filter={searchValue}
-                        onMigrate={onMigrate}
-                    />
-                );
             case tabsMapping.ACTIVE:
                 return (
                     <DetailsCatalogView
                         VLMList={vlmList}
                         VSPList={vspList}
                         users={users}
-                        onAddVLM={onAddLicenseModelClick}
-                        onAddVSP={onAddSoftwareProductClick}
+                        onAddVLM={!isArchived && onAddLicenseModelClick}
+                        onAddVSP={!isArchived && onAddSoftwareProductClick}
                         onSelectVLM={(item, users) =>
                             onSelectLicenseModel(
                                 item,
@@ -100,10 +78,12 @@
                         onMigrate={onMigrate}
                     />
                 );
+
             case tabsMapping.BY_VENDOR:
             default:
                 return (
                     <VendorCatalogView
+                        isArchived={isArchived}
                         licenseModelList={vlmList}
                         users={users}
                         onAddVSP={onAddSoftwareProductClick}
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VSPOverlay.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VSPOverlay.jsx
index c2eb825..fa71f67 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VSPOverlay.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VSPOverlay.jsx
@@ -18,46 +18,63 @@
 import i18n from 'nfvo-utils/i18n/i18n.js';
 import { migrationStatusMapper } from './OnboardingCatalogConstants.js';
 
-const VSPOverlay = ({ VSPList, onSelectVSP, onSeeMore, onMigrate }) => (
-    <div
-        className="vsp-overlay-wrapper"
-        onClick={e => {
-            e.stopPropagation();
-            e.preventDefault();
-        }}>
-        <div className="vsp-overlay-arrow" />
-        <div className="vsp-overlay">
-            <div className="vsp-overlay-title">{i18n('Recently Edited')}</div>
-            <div className="vsp-overlay-list">
-                {VSPList.slice(0, 5).map(vsp => (
-                    <div
-                        key={vsp.id}
-                        className="vsp-overlay-detail"
-                        onClick={() => {
-                            if (
-                                vsp.isOldVersion &&
-                                vsp.isOldVersion ===
-                                    migrationStatusMapper.OLD_VERSION
-                            ) {
-                                onMigrate({
-                                    softwareProduct: vsp
-                                });
-                            } else {
-                                onSelectVSP(vsp);
-                            }
-                        }}>
-                        {i18n(vsp.name)}
-                    </div>
-                ))}
-            </div>
-            {VSPList.length > 5 && (
-                <div className="vsp-overlay-see-more" onClick={onSeeMore}>
-                    {i18n('See More')}
-                </div>
-            )}
+const VspOverlayItem = ({ vsp, onClick }) => {
+    const handleClick = () => onClick(vsp);
+    return (
+        <div key={vsp.id} className="vsp-overlay-detail" onClick={handleClick}>
+            {i18n(vsp.name)}
         </div>
-    </div>
-);
+    );
+};
+
+VspOverlayItem.propTypes = {
+    vsp: PropTypes.object,
+    onClick: PropTypes.func
+};
+
+const VSPOverlay = ({ VSPList, onSelectVSP, onSeeMore, onMigrate }) => {
+    const handleSelect = vsp => {
+        if (
+            vsp.isOldVersion &&
+            vsp.isOldVersion === migrationStatusMapper.OLD_VERSION
+        ) {
+            onMigrate({
+                softwareProduct: vsp
+            });
+        } else {
+            onSelectVSP(vsp);
+        }
+    };
+    return (
+        <div
+            className="vsp-overlay-wrapper"
+            onClick={e => {
+                e.stopPropagation();
+                e.preventDefault();
+            }}>
+            <div className="vsp-overlay-arrow" />
+            <div className="vsp-overlay">
+                <div className="vsp-overlay-title">
+                    {i18n('Recently Edited')}
+                </div>
+                <div className="vsp-overlay-list">
+                    {VSPList.slice(0, 5).map(vsp => (
+                        <VspOverlayItem
+                            key={vsp.id}
+                            onClick={handleSelect}
+                            vsp={vsp}
+                        />
+                    ))}
+                </div>
+                {VSPList.length > 5 && (
+                    <div className="vsp-overlay-see-more" onClick={onSeeMore}>
+                        {i18n('See More')}
+                    </div>
+                )}
+            </div>
+        </div>
+    );
+};
 
 VSPOverlay.PropTypes = {
     VSPList: PropTypes.array,
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorCatalogView.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorCatalogView.jsx
index 02f8d50..ec45258 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorCatalogView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorCatalogView.jsx
@@ -1,17 +1,17 @@
-/*!
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+/*
+ * Copyright © 2016-2018 European Support Limited
  *
  * Licensed 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
- *
+ * 
+ *      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.
+ * 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.
  */
 import React from 'react';
 import VendorItem from './VendorItem.jsx';
@@ -30,24 +30,27 @@
     onVendorSelect,
     filter,
     onMigrate,
-    users
+    users,
+    isArchived
 }) => {
+    const showAddButtons = !isArchived;
+    const handeleSelectVSP = vsp => onSelectVSP(vsp, users);
+    const handleOnVspButtonClick = (hasVSP, vlm) =>
+        onVspOverlayChange(vlm.id === currentOverlay || !hasVSP ? null : vlm);
+
     return (
-        <CatalogList onAddVLM={onAddVLM} onAddVSP={onAddVSP}>
+        <CatalogList
+            onAddVLM={showAddButtons ? onAddVLM : false}
+            onAddVSP={showAddButtons ? onAddVSP : false}>
             {filterCatalogItemsByType({ items: licenseModelList, filter }).map(
                 vlm => (
                     <VendorItem
                         key={vlm.id}
+                        vlm={vlm}
                         onAddVSP={onAddVSP}
-                        onSelectVSP={vsp => onSelectVSP(vsp, users)}
+                        onSelectVSP={handeleSelectVSP}
                         shouldShowOverlay={currentOverlay === vlm.id}
-                        onVSPButtonClick={hasVSP =>
-                            onVspOverlayChange(
-                                vlm.id === currentOverlay || !hasVSP
-                                    ? null
-                                    : vlm
-                            )
-                        }
+                        onVSPButtonClick={handleOnVspButtonClick}
                         onVendorSelect={onVendorSelect}
                         onMigrate={onMigrate}
                         vendor={vlm}
@@ -66,21 +69,24 @@
     onSelectVLM,
     filter,
     onMigrate,
-    users
+    users,
+    isArchived
 }) => {
+    const handleAddVsp = !isArchived
+        ? () => onAddVSP(selectedVendor.id)
+        : false;
+    const handleOnSelect = () => onSelectVLM(selectedVendor, users);
     return (
         <div>
             <CatalogList
-                onAddVSP={() => {
-                    onAddVSP(selectedVendor.id);
-                }}
+                onAddVSP={handleAddVsp}
                 vendorPageOptions={{
                     selectedVendor,
                     onBack: () => onVendorSelect(false)
                 }}>
                 <CatalogItemDetails
                     key={selectedVendor.id}
-                    onSelect={() => onSelectVLM(selectedVendor, users)}
+                    onSelect={handleOnSelect}
                     catalogItemTypeClass={catalogItemTypes.LICENSE_MODEL}
                     onMigrate={onMigrate}
                     catalogItemData={selectedVendor}
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorItem.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorItem.jsx
index fda47ef..d3e0eb4 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorItem.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/onboardingCatalog/VendorItem.jsx
@@ -41,18 +41,15 @@
         onAddVSP: PropTypes.func,
         onVSPButtonClick: PropTypes.func
     };
-
+    handleSeeMore = () => {
+        const { onVendorSelect, vendor } = this.props;
+        onVendorSelect(vendor);
+    };
     render() {
-        let {
-            vendor,
-            onSelectVSP,
-            shouldShowOverlay,
-            onVendorSelect,
-            onMigrate
-        } = this.props;
+        let { vendor, onSelectVSP, shouldShowOverlay, onMigrate } = this.props;
         let { softwareProductList = [], name } = vendor;
         return (
-            <Tile iconName="vendor" onClick={() => onVendorSelect(vendor)}>
+            <Tile iconName="vendor" onClick={this.handleSeeMore}>
                 <TileInfo align="center">
                     <TileInfoLine type="title">
                         <TooltipWrapper
@@ -65,7 +62,7 @@
                         <Button
                             btnType="secondary"
                             className="venodor-tile-btn"
-                            onClick={e => this.handleVspCountClick(e)}
+                            onClick={this.handleVspCountClick}
                             data-test-id="catalog-vsp-count"
                             disabled={!softwareProductList.length}>
                             {`${softwareProductList.length.toString()} ${i18n(
@@ -80,7 +77,7 @@
                                         onMigrate={onMigrate}
                                         VSPList={softwareProductList}
                                         onSelectVSP={onSelectVSP}
-                                        onSeeMore={() => onVendorSelect(vendor)}
+                                        onSeeMore={this.handleSeeMore}
                                     />
                                 </ClickOutsideWrapper>
                             )}
@@ -92,7 +89,7 @@
                             btnType="link"
                             color="primary"
                             iconName="plusThin"
-                            onClick={e => this.onCreateVspClick(e)}>
+                            onClick={this.onCreateVspClick}>
                             {i18n('Create new VSP')}
                         </Button>
                     </TileFooterCell>
@@ -101,26 +98,28 @@
         );
     }
 
-    onCreateVspClick(e) {
+    onCreateVspClick = e => {
         e.stopPropagation();
         e.preventDefault();
         const { onAddVSP, vendor: { id } } = this.props;
         onAddVSP(id);
-    }
+    };
     handleClickOutside = () => {
-        this.props.onVSPButtonClick(false);
+        const { onVSPButtonClick, vlm } = this.props;
+        onVSPButtonClick(false, vlm);
     };
 
-    handleVspCountClick(e) {
+    handleVspCountClick = e => {
         e.stopPropagation();
         e.preventDefault();
         const {
             onVSPButtonClick,
-            vendor: { softwareProductList }
+            vendor: { softwareProductList },
+            vlm
         } = this.props;
         const hasVSP = Boolean(softwareProductList.length);
-        onVSPButtonClick(hasVSP);
-    }
+        onVSPButtonClick(hasVSP, vlm);
+    };
 }
 
 export default VendorItem;
diff --git a/openecomp-ui/src/sdc-app/onboarding/onboard/workspace/WorkspaceView.jsx b/openecomp-ui/src/sdc-app/onboarding/onboard/workspace/WorkspaceView.jsx
index bef88df..8cc396f 100644
--- a/openecomp-ui/src/sdc-app/onboarding/onboard/workspace/WorkspaceView.jsx
+++ b/openecomp-ui/src/sdc-app/onboarding/onboard/workspace/WorkspaceView.jsx
@@ -17,7 +17,6 @@
 import DetailsCatalogView from '../DetailsCatalogView.jsx';
 import i18n from 'nfvo-utils/i18n/i18n.js';
 import { tabsMapping } from 'sdc-app/onboarding/onboard/OnboardConstants.js';
-import { tabsMapping as catalogTabsMappping } from '../onboardingCatalog/OnboardingCatalogConstants.js';
 
 const WorkspaceView = props => {
     let {
@@ -28,10 +27,13 @@
         onSelectSoftwareProduct,
         searchValue,
         onMigrate,
-        catalogActiveTab,
-        filteredItems: { vspList, vlmList }
+        filteredItems: { vspList, vlmList },
+        isArchived
     } = props;
-
+    const handleSelectVSP = (item, users) =>
+        onSelectSoftwareProduct(item, users, tabsMapping.WORKSPACE);
+    const handleSelectVLM = (item, users) =>
+        onSelectLicenseModel(item, users, tabsMapping.WORKSPACE);
     return (
         <div className="catalog-wrapper workspace-view">
             <div className="catalog-header workspace-header">
@@ -41,22 +43,10 @@
                 VLMList={vlmList}
                 VSPList={vspList}
                 users={users}
-                onAddVLM={
-                    catalogActiveTab === catalogTabsMappping.ACTIVE
-                        ? onAddLicenseModelClick
-                        : undefined
-                }
-                onAddVSP={
-                    catalogActiveTab === catalogTabsMappping.ACTIVE
-                        ? onAddSoftwareProductClick
-                        : undefined
-                }
-                onSelectVLM={(item, users) =>
-                    onSelectLicenseModel(item, users, tabsMapping.WORKSPACE)
-                }
-                onSelectVSP={(item, users) =>
-                    onSelectSoftwareProduct(item, users, tabsMapping.WORKSPACE)
-                }
+                onAddVLM={!isArchived ? onAddLicenseModelClick : undefined}
+                onAddVSP={!isArchived ? onAddSoftwareProductClick : undefined}
+                onSelectVLM={handleSelectVLM}
+                onSelectVSP={handleSelectVSP}
                 onMigrate={onMigrate}
                 filter={searchValue}
             />
