diff --git a/src/assets/i18n/de.json b/src/assets/i18n/de.json
index 9e87be9..7724414 100644
--- a/src/assets/i18n/de.json
+++ b/src/assets/i18n/de.json
@@ -106,10 +106,10 @@
     "SHOWGRAPH": "Grafik anzeigen",
     "UPDATESHOWGRAPH": "Grafik aktualisieren und anzeigen",
     "CREATEPACKAGE": "Neues Paket erstellen",
-    "GZFILETYPEERRROR": "Laden Sie nur eine tar.gz-Datei hoch und die Größe sollte 15 MB nicht überschreiten",
-    "YAMLFILETYPEERRROR": "Laden Sie nur YAML-Dateien hoch und die Größe sollte 15 MB nicht überschreiten",
-    "JSONFILETYPEERRROR": "Laden Sie nur JSON-Dateien hoch und die Größe sollte 15 MB nicht überschreiten",
-    "PUBFILETYPEERRROR": "Laden Sie nur PUB-Dateien hoch und die Größe sollte 15 MB nicht überschreiten",
+    "GZFILETYPEERRROR": "Laden Sie nur eine tar.gz-Datei hoch und die Größe sollte 50 MB nicht überschreiten",
+    "YAMLFILETYPEERRROR": "Laden Sie nur YAML-Dateien hoch und die Größe sollte 50 MB nicht überschreiten",
+    "JSONFILETYPEERRROR": "Laden Sie nur JSON-Dateien hoch und die Größe sollte 50 MB nicht überschreiten",
+    "PUBFILETYPEERRROR": "Laden Sie nur PUB-Dateien hoch und die Größe sollte 50 MB nicht überschreiten",
     "PACKAGE": "Paket",
     "URL": "URL",
     "DEPLOYED": "Bereitgestellt",
diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json
index 688bfc8..9e0c5a0 100644
--- a/src/assets/i18n/en.json
+++ b/src/assets/i18n/en.json
@@ -106,10 +106,10 @@
     "SHOWGRAPH": "Show Graph",
     "UPDATESHOWGRAPH": "Update and Show Graph",
     "CREATEPACKAGE": "Create New Package",
-    "GZFILETYPEERRROR": "Upload only tar.gz file and size should not exceed 15 MB",
-    "YAMLFILETYPEERRROR": "Upload only YAML file and size should not exceed 15 MB",
-    "JSONFILETYPEERRROR": "Upload only JSON file and size should not exceed 15 MB",
-    "PUBFILETYPEERRROR": "Upload only PUB file and size should not exceed 15 MB",
+    "GZFILETYPEERRROR": "Upload only tar.gz file and size should not exceed 50 MB",
+    "YAMLFILETYPEERRROR": "Upload only YAML file and size should not exceed 50 MB",
+    "JSONFILETYPEERRROR": "Upload only JSON file and size should not exceed 50 MB",
+    "PUBFILETYPEERRROR": "Upload only PUB file and size should not exceed 50 MB",
     "PACKAGE": "Package",
     "URL": "URL",
     "DEPLOYED": "Deployed",
diff --git a/src/assets/i18n/es.json b/src/assets/i18n/es.json
index cf7c1fa..dd9d08b 100644
--- a/src/assets/i18n/es.json
+++ b/src/assets/i18n/es.json
@@ -106,10 +106,10 @@
     "SHOWGRAPH": "Mostrar gráfico",
     "UPDATESHOWGRAPH": "Actualizar y mostrar gráfico",
     "CREATEPACKAGE": "Crear nuevo paquete",
-    "GZFILETYPEERRROR": "Cargue solo el archivo tar.gz, el tamaño no debe exceder los 15 MB",
-    "YAMLFILETYPEERRROR": "Cargue solo el archivo YAML, el tamaño no debe exceder los 15 MB",
-    "JSONFILETYPEERRROR": "Cargue solo el archivo JSON, el tamaño no debe exceder los 15 MB",
-    "PUBFILETYPEERRROR": "Cargue solo el archivo PUB, el tamaño no debe exceder los 15 MB",
+    "GZFILETYPEERRROR": "Cargue solo el archivo tar.gz, el tamaño no debe exceder los 50 MB",
+    "YAMLFILETYPEERRROR": "Cargue solo el archivo YAML, el tamaño no debe exceder los 50 MB",
+    "JSONFILETYPEERRROR": "Cargue solo el archivo JSON, el tamaño no debe exceder los 50 MB",
+    "PUBFILETYPEERRROR": "Cargue solo el archivo PUB, el tamaño no debe exceder los 50 MB",
     "PACKAGE": "Paquete",
     "URL": "URL",
     "DEPLOYED": "Desplegada",
diff --git a/src/assets/i18n/pt.json b/src/assets/i18n/pt.json
index 16476dc..48a9fbe 100644
--- a/src/assets/i18n/pt.json
+++ b/src/assets/i18n/pt.json
@@ -106,10 +106,10 @@
     "SHOWGRAPH": "Mostrar gráfico",
     "UPDATESHOWGRAPH": "Atualizar e mostrar gráfico",
     "CREATEPACKAGE": "Criar novo pacote",
-    "GZFILETYPEERRROR": "Carregue apenas o arquivo tar.gz e o tamanho não deve exceder 15 MB",
-    "YAMLFILETYPEERRROR": "Carregar apenas arquivo YAML e o tamanho não deve exceder 15 MB",
-    "JSONFILETYPEERRROR": "Carregar apenas arquivo JSON e o tamanho não deve exceder 15 MB",
-    "PUBFILETYPEERRROR": "Carregar apenas arquivo PUB e o tamanho não deve exceder 15 MB",
+    "GZFILETYPEERRROR": "Carregue apenas o arquivo tar.gz e o tamanho não deve exceder 50 MB",
+    "YAMLFILETYPEERRROR": "Carregar apenas arquivo YAML e o tamanho não deve exceder 50 MB",
+    "JSONFILETYPEERRROR": "Carregar apenas arquivo JSON e o tamanho não deve exceder 50 MB",
+    "PUBFILETYPEERRROR": "Carregar apenas arquivo PUB e o tamanho não deve exceder 50 MB",
     "PACKAGE": "Pacote",
     "URL": "URL",
     "DEPLOYED": "Deployed",
diff --git a/src/assets/js/tar.js b/src/assets/js/tar.js
index 058d1ee..64d25c3 100644
--- a/src/assets/js/tar.js
+++ b/src/assets/js/tar.js
@@ -16,7 +16,7 @@
  Author: KUMARAN M (kumaran.m@tataelxsi.co.in), RAJESH S (rajesh.s@tataelxsi.co.in), BARATH KUMAR R (barath.r@tataelxsi.co.in)
  */
 var Tar =
-/******/ (function(modules) { // webpackBootstrap
+/******/ (function (modules) { // webpackBootstrap
 /******/ 	// The module cache
 /******/ 	var installedModules = {};
 /******/
@@ -24,15 +24,17 @@
 /******/ 	function __webpack_require__(moduleId) {
 /******/
 /******/ 		// Check if module is in cache
-/******/ 		if(installedModules[moduleId]) {
+/******/ 		if (installedModules[moduleId]) {
 /******/ 			return installedModules[moduleId].exports;
-/******/ 		}
+				/******/
+}
 /******/ 		// Create a new module (and put it into the cache)
 /******/ 		var module = installedModules[moduleId] = {
 /******/ 			i: moduleId,
 /******/ 			l: false,
 /******/ 			exports: {}
-/******/ 		};
+				/******/
+};
 /******/
 /******/ 		// Execute the module function
 /******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
@@ -42,7 +44,8 @@
 /******/
 /******/ 		// Return the exports of the module
 /******/ 		return module.exports;
-/******/ 	}
+			/******/
+}
 /******/
 /******/
 /******/ 	// expose the modules object (__webpack_modules__)
@@ -52,381 +55,390 @@
 /******/ 	__webpack_require__.c = installedModules;
 /******/
 /******/ 	// identity function for calling harmony imports with the correct context
-/******/ 	__webpack_require__.i = function(value) { return value; };
+/******/ 	__webpack_require__.i = function (value) { return value; };
 /******/
 /******/ 	// define getter function for harmony exports
-/******/ 	__webpack_require__.d = function(exports, name, getter) {
-/******/ 		if(!__webpack_require__.o(exports, name)) {
+/******/ 	__webpack_require__.d = function (exports, name, getter) {
+/******/ 		if (!__webpack_require__.o(exports, name)) {
 /******/ 			Object.defineProperty(exports, name, {
 /******/ 				configurable: false,
 /******/ 				enumerable: true,
 /******/ 				get: getter
-/******/ 			});
-/******/ 		}
-/******/ 	};
+	/******/
+});
+				/******/
+}
+			/******/
+};
 /******/
 /******/ 	// getDefaultExport function for compatibility with non-harmony modules
-/******/ 	__webpack_require__.n = function(module) {
+/******/ 	__webpack_require__.n = function (module) {
 /******/ 		var getter = module && module.__esModule ?
 /******/ 			function getDefault() { return module['default']; } :
 /******/ 			function getModuleExports() { return module; };
 /******/ 		__webpack_require__.d(getter, 'a', getter);
 /******/ 		return getter;
-/******/ 	};
+			/******/
+};
 /******/
 /******/ 	// Object.prototype.hasOwnProperty.call
-/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/ 	__webpack_require__.o = function (object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
 /******/
 /******/ 	// __webpack_public_path__
 /******/ 	__webpack_require__.p = "";
 /******/
 /******/ 	// Load entry module and return exports
 /******/ 	return __webpack_require__(__webpack_require__.s = 2);
-/******/ })
+		/******/
+})
 /************************************************************************/
-/******/ ([
+/******/([
 /* 0 */
-/***/ (function(module, exports) {
+/***/ (function (module, exports) {
 
-/*
- * tar-js
- * MIT (c) 2011 T. Jameson Little
- */
+		/*
+		 * tar-js
+		 * MIT (c) 2011 T. Jameson Little
+		 */
 
-(function () {
-	"use strict";
+		(function () {
+			"use strict";
 
-	var lookup = [
-			'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
-			'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
-			'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
-			'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
-			'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
-			'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
-			'w', 'x', 'y', 'z', '0', '1', '2', '3',
-			'4', '5', '6', '7', '8', '9', '+', '/'
-		];
-	function clean(length) {
-		var i, buffer = new Uint8Array(length);
-		for (i = 0; i < length; i += 1) {
-			buffer[i] = 0;
-		}
-		return buffer;
-	}
+			var lookup = [
+				'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
+				'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
+				'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
+				'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
+				'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
+				'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
+				'w', 'x', 'y', 'z', '0', '1', '2', '3',
+				'4', '5', '6', '7', '8', '9', '+', '/'
+			];
+			function clean(length) {
+				var i, buffer = new Uint8Array(length);
+				for (i = 0; i < length; i += 1) {
+					buffer[i] = 0;
+				}
+				return buffer;
+			}
 
-	function extend(orig, length, addLength, multipleOf) {
-		var newSize = length + addLength,
-			buffer = clean((parseInt(newSize / multipleOf) + 1) * multipleOf);
+			function extend(orig, length, addLength, multipleOf) {
+				var newSize = length + addLength,
+					buffer = clean((parseInt(newSize / multipleOf) + 1) * multipleOf);
 
-		buffer.set(orig);
+				buffer.set(orig);
 
-		return buffer;
-	}
+				return buffer;
+			}
 
-	function pad(num, bytes, base) {
-		num = num.toString(base || 8);
-		return "000000000000".substr(num.length + 12 - bytes) + num;
-	}	
-	
-	function stringToUint8 (input, out, offset) {
-		var i, length;
+			function pad(num, bytes, base) {
+				num = num.toString(base || 8);
+				return "000000000000".substr(num.length + 12 - bytes) + num;
+			}
 
-		out = out || clean(input.length);
+			function stringToUint8(input, out, offset) {
+				var i, length;
 
-		offset = offset || 0;
-		for (i = 0, length = input.length; i < length; i += 1) {
-			out[offset] = input.charCodeAt(i);
-			offset += 1;
-		}
+				out = out || clean(input.length);
 
-		return out;
-	}
+				offset = offset || 0;
+				for (i = 0, length = input.length; i < length; i += 1) {
+					out[offset] = input.charCodeAt(i);
+					offset += 1;
+				}
 
-	function uint8ToBase64(uint8) {
-		var i,
-			extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
-			output = "",
-			temp, length;
+				return out;
+			}
 
-		function tripletToBase64 (num) {
-			return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
-		};
+			function uint8ToBase64(uint8) {
+				var i,
+					extraBytes = uint8.length % 3, // if we have 1 byte left, pad 2 bytes
+					output = "",
+					temp, length;
 
-		// go through the array every three bytes, we'll deal with trailing stuff later
-		for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
-			temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
-			output += tripletToBase64(temp);
-		}
+				function tripletToBase64(num) {
+					return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F];
+				};
 
-		// this prevents an ERR_INVALID_URL in Chrome (Firefox okay)
-		switch (output.length % 4) {
-			case 1:
-				output += '=';
-				break;
-			case 2:
-				output += '==';
-				break;
-			default:
-				break;
-		}
+				// go through the array every three bytes, we'll deal with trailing stuff later
+				for (i = 0, length = uint8.length - extraBytes; i < length; i += 3) {
+					temp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
+					output += tripletToBase64(temp);
+				}
 
-		return output;
-	}
+				// this prevents an ERR_INVALID_URL in Chrome (Firefox okay)
+				switch (output.length % 4) {
+					case 1:
+						output += '=';
+						break;
+					case 2:
+						output += '==';
+						break;
+					default:
+						break;
+				}
 
-	module.exports.clean = clean;
-	module.exports.pad = pad;
-	module.exports.extend = extend;
-	module.exports.stringToUint8 = stringToUint8;
-	module.exports.uint8ToBase64 = uint8ToBase64;
-}());
+				return output;
+			}
+
+			module.exports.clean = clean;
+			module.exports.pad = pad;
+			module.exports.extend = extend;
+			module.exports.stringToUint8 = stringToUint8;
+			module.exports.uint8ToBase64 = uint8ToBase64;
+		}());
 
 
-/***/ }),
+		/***/
+}),
 /* 1 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ (function (module, exports, __webpack_require__) {
 
-/*
- * tar-js
- * MIT (c) 2011 T. Jameson Little
- */
+		/*
+		 * tar-js
+		 * MIT (c) 2011 T. Jameson Little
+		 */
 
-(function () {
-	"use strict";
-	
-/*
-struct posix_header {             // byte offset
-	char name[100];               //   0
-	char mode[8];                 // 100
-	char uid[8];                  // 108
-	char gid[8];                  // 116
-	char size[12];                // 124
-	char mtime[12];               // 136
-	char chksum[8];               // 148
-	char typeflag;                // 156
-	char linkname[100];           // 157
-	char magic[6];                // 257
-	char version[2];              // 263
-	char uname[32];               // 265
-	char gname[32];               // 297
-	char devmajor[8];             // 329
-	char devminor[8];             // 337
-	char prefix[155];             // 345
-                                  // 500
-};
-*/
+		(function () {
+			"use strict";
 
-	var utils = __webpack_require__(0),
-		headerFormat;
-	
-	headerFormat = [
-		{
-			'field': 'fileName',
-			'length': 100
-		},
-		{
-			'field': 'fileMode',
-			'length': 8
-		},
-		{
-			'field': 'uid',
-			'length': 8
-		},
-		{
-			'field': 'gid',
-			'length': 8
-		},
-		{
-			'field': 'fileSize',
-			'length': 12
-		},
-		{
-			'field': 'mtime',
-			'length': 12
-		},
-		{
-			'field': 'checksum',
-			'length': 8
-		},
-		{
-			'field': 'type',
-			'length': 1
-		},
-		{
-			'field': 'linkName',
-			'length': 100
-		},
-		{
-			'field': 'ustar',
-			'length': 8
-		},
-		{
-			'field': 'owner',
-			'length': 32
-		},
-		{
-			'field': 'group',
-			'length': 32
-		},
-		{
-			'field': 'majorNumber',
-			'length': 8
-		},
-		{
-			'field': 'minorNumber',
-			'length': 8
-		},
-		{
-			'field': 'filenamePrefix',
-			'length': 155
-		},
-		{
-			'field': 'padding',
-			'length': 12
-		}
-	];
+			/*
+			struct posix_header {             // byte offset
+				char name[100];               //   0
+				char mode[8];                 // 100
+				char uid[8];                  // 108
+				char gid[8];                  // 116
+				char size[12];                // 124
+				char mtime[12];               // 136
+				char chksum[8];               // 148
+				char typeflag;                // 156
+				char linkname[100];           // 157
+				char magic[6];                // 257
+				char version[2];              // 263
+				char uname[32];               // 265
+				char gname[32];               // 297
+				char devmajor[8];             // 329
+				char devminor[8];             // 337
+				char prefix[155];             // 345
+											  // 500
+			};
+			*/
 
-	function formatHeader(data, cb) {
-		var buffer = utils.clean(512),
-			offset = 0;
+			var utils = __webpack_require__(0),
+				headerFormat;
 
-		headerFormat.forEach(function (value) {
-			var str = data[value.field] || "",
-				i, length;
+			headerFormat = [
+				{
+					'field': 'fileName',
+					'length': 100
+				},
+				{
+					'field': 'fileMode',
+					'length': 8
+				},
+				{
+					'field': 'uid',
+					'length': 8
+				},
+				{
+					'field': 'gid',
+					'length': 8
+				},
+				{
+					'field': 'fileSize',
+					'length': 12
+				},
+				{
+					'field': 'mtime',
+					'length': 12
+				},
+				{
+					'field': 'checksum',
+					'length': 8
+				},
+				{
+					'field': 'type',
+					'length': 1
+				},
+				{
+					'field': 'linkName',
+					'length': 100
+				},
+				{
+					'field': 'ustar',
+					'length': 8
+				},
+				{
+					'field': 'owner',
+					'length': 32
+				},
+				{
+					'field': 'group',
+					'length': 32
+				},
+				{
+					'field': 'majorNumber',
+					'length': 8
+				},
+				{
+					'field': 'minorNumber',
+					'length': 8
+				},
+				{
+					'field': 'filenamePrefix',
+					'length': 155
+				},
+				{
+					'field': 'padding',
+					'length': 12
+				}
+			];
 
-			for (i = 0, length = str.length; i < length; i += 1) {
-				buffer[offset] = str.charCodeAt(i);
-				offset += 1;
+			function formatHeader(data, cb) {
+				var buffer = utils.clean(512),
+					offset = 0;
+
+				headerFormat.forEach(function (value) {
+					var str = data[value.field] || "",
+						i, length;
+
+					for (i = 0, length = str.length; i < length; i += 1) {
+						buffer[offset] = str.charCodeAt(i);
+						offset += 1;
+					}
+
+					offset += value.length - i; // space it out with nulls
+				});
+
+				if (typeof cb === 'function') {
+					return cb(buffer, offset);
+				}
+				return buffer;
 			}
 
-			offset += value.length - i; // space it out with nulls
-		});
-
-		if (typeof cb === 'function') {
-			return cb(buffer, offset);
-		}
-		return buffer;
-	}
-	
-	module.exports.structure = headerFormat;
-	module.exports.format = formatHeader;
-}());
+			module.exports.structure = headerFormat;
+			module.exports.format = formatHeader;
+		}());
 
 
-/***/ }),
+		/***/
+}),
 /* 2 */
-/***/ (function(module, exports, __webpack_require__) {
+/***/ (function (module, exports, __webpack_require__) {
 
-/*
- * tar-js
- * MIT (c) 2011 T. Jameson Little
- */
+		/*
+		 * tar-js
+		 * MIT (c) 2011 T. Jameson Little
+		 */
 
-(function () {
-	"use strict";
+		(function () {
+			"use strict";
 
-	var header = __webpack_require__(1),
-		utils = __webpack_require__(0),
-		recordSize = 512,
-		blockSize;
-	
-	function Tar(recordsPerBlock) {
-		this.written = 0;
-		blockSize = (recordsPerBlock || 20) * recordSize;
-		this.out = utils.clean(blockSize);
-	}
+			var header = __webpack_require__(1),
+				utils = __webpack_require__(0),
+				recordSize = 512,
+				blockSize;
 
-	Tar.prototype.append = function (filepath, input, opts, callback) {
-		var data,
-			checksum,
-			mode,
-			mtime,
-			uid,
-			gid,
-			headerArr;
-
-		if (typeof input === 'string') {
-			input = utils.stringToUint8(input);
-		} else if (input.constructor !== Uint8Array.prototype.constructor) {
-			throw 'Invalid input type. You gave me: ' + input.constructor.toString().match(/function\s*([$A-Za-z_][0-9A-Za-z_]*)\s*\(/)[1];
-		}
-
-		if (typeof opts === 'function') {
-			callback = opts;
-			opts = {};
-		}
-
-		opts = opts || {};
-
-		mode = opts.mode || parseInt('777', 8) & 0xfff;
-		mtime = opts.mtime || Math.floor(+new Date() / 1000);
-		uid = opts.uid || 0;
-		gid = opts.gid || 0;
-
-		data = {
-			fileName: filepath,
-			fileMode: utils.pad(mode, 7),
-			uid: utils.pad(uid, 7),
-			gid: utils.pad(gid, 7),
-			fileSize: utils.pad(input.length, 11),
-			mtime: utils.pad(mtime, 11),
-			checksum: '        ',
-			type: opts.type || '0',
-			ustar: 'ustar  ',
-			owner: opts.owner || '',
-			group: opts.group || ''
-		};
-
-		// calculate the checksum
-		checksum = 0;
-		Object.keys(data).forEach(function (key) {
-			var i, value = data[key], length;
-
-			for (i = 0, length = value.length; i < length; i += 1) {
-				checksum += value.charCodeAt(i);
+			function Tar(recordsPerBlock) {
+				this.written = 0;
+				blockSize = (recordsPerBlock || 20) * recordSize;
+				this.out = utils.clean(blockSize);
 			}
-		});
 
-		data.checksum = utils.pad(checksum, 6) + "\u0000 ";
+			Tar.prototype.append = function (filepath, input, opts, callback) {
+				var data,
+					checksum,
+					mode,
+					mtime,
+					uid,
+					gid,
+					headerArr;
 
-		headerArr = header.format(data);
+				if (typeof input === 'string') {
+					input = utils.stringToUint8(input);
+				} else if (input.constructor !== Uint8Array.prototype.constructor) {
+					throw 'Invalid input type. You gave me: ' + input.constructor.toString().match(/function\s*([$A-Za-z_][0-9A-Za-z_]*)\s*\(/)[1];
+				}
 
-		var i, offset, length;
+				if (typeof opts === 'function') {
+					callback = opts;
+					opts = {};
+				}
 
-		this.out.set(headerArr, this.written);
+				opts = opts || {};
 
-		this.written += headerArr.length;
+				mode = opts.mode || parseInt('777', 8) & 0xfff;
+				mtime = opts.mtime || Math.floor(+new Date() / 1000);
+				uid = opts.uid || 0;
+				gid = opts.gid || 0;
 
-		// If there is not enough space in this.out, we need to expand it to
-		// fit the new input.
-		if (this.written + input.length > this.out.length) {
-			this.out = utils.extend(this.out, this.written, input.length, blockSize);
-		}
+				data = {
+					fileName: filepath,
+					fileMode: utils.pad(mode, 7),
+					uid: utils.pad(uid, 7),
+					gid: utils.pad(gid, 7),
+					fileSize: utils.pad(input.length, 11),
+					mtime: utils.pad(mtime, 11),
+					checksum: '        ',
+					type: opts.type || '0',
+					ustar: 'ustar  ',
+					owner: opts.owner || '',
+					group: opts.group || '',
+					linkName: opts.linkname || ''
+				};
 
-		this.out.set(input, this.written);
+				// calculate the checksum
+				checksum = 0;
+				Object.keys(data).forEach(function (key) {
+					var i, value = data[key], length;
 
-		// to the nearest multiple of recordSize
-		this.written += input.length + (recordSize - (input.length % recordSize || recordSize));
+					for (i = 0, length = value.length; i < length; i += 1) {
+						checksum += value.charCodeAt(i);
+					}
+				});
 
-		// make sure there's at least 2 empty records worth of extra space
-		if (this.out.length - this.written < recordSize * 2) {
-			this.out = utils.extend(this.out, this.written, recordSize * 2, blockSize);
-		}
+				data.checksum = utils.pad(checksum, 6) + "\u0000 ";
 
-		if (typeof callback === 'function') {
-			callback(this.out);
-		}
+				headerArr = header.format(data);
 
-		return this.out;
-	};
+				var i, offset, length;
 
-	Tar.prototype.clear = function () {
-		this.written = 0;
-		this.out = utils.clean(blockSize);
-	};
-	
-	module.exports = Tar;
-}());
+				this.out.set(headerArr, this.written);
+
+				this.written += headerArr.length;
+
+				// If there is not enough space in this.out, we need to expand it to
+				// fit the new input.
+				if (this.written + input.length > this.out.length) {
+					this.out = utils.extend(this.out, this.written, input.length, blockSize);
+				}
+
+				this.out.set(input, this.written);
+
+				// to the nearest multiple of recordSize
+				this.written += input.length + (recordSize - (input.length % recordSize || recordSize));
+
+				// make sure there's at least 2 empty records worth of extra space
+				if (this.out.length - this.written < recordSize * 2) {
+					this.out = utils.extend(this.out, this.written, recordSize * 2, blockSize);
+				}
+
+				if (typeof callback === 'function') {
+					callback(this.out);
+				}
+
+				return this.out;
+			};
+
+			Tar.prototype.clear = function () {
+				this.written = 0;
+				this.out = utils.clean(blockSize);
+			};
+
+			module.exports = Tar;
+		}());
 
 
-/***/ })
-/******/ ]);
\ No newline at end of file
+		/***/
+})
+/******/]);
\ No newline at end of file
diff --git a/src/environments/environment.prod.ts b/src/environments/environment.prod.ts
index a9be3ad..55697ed 100644
--- a/src/environments/environment.prod.ts
+++ b/src/environments/environment.prod.ts
@@ -50,7 +50,7 @@
 // tslint:disable-next-line: typedef
 export const environment = {
     production: true,
-    packageSize: 15,
+    packageSize: 50,
     paginationNumber: 10, //Possible values are 10, 25, 50, 100
     packageVersion: version,
     // tslint:disable-next-line: no-http-string
diff --git a/src/environments/environment.ts b/src/environments/environment.ts
index d2e5575..92b5193 100644
--- a/src/environments/environment.ts
+++ b/src/environments/environment.ts
@@ -50,7 +50,7 @@
 // tslint:disable-next-line: typedef
 export const environment = {
     production: false,
-    packageSize: 15,
+    packageSize: 50,
     paginationNumber: 10, //Possible values are 10, 25, 50, 100
     packageVersion: version,
     // tslint:disable-next-line: no-http-string
diff --git a/src/models/CommonModel.ts b/src/models/CommonModel.ts
index 627074b..fb9707a 100644
--- a/src/models/CommonModel.ts
+++ b/src/models/CommonModel.ts
@@ -152,6 +152,16 @@
     buffer: ArrayBuffer;
     header_offset?: Number;
     size?: number;
+    linkname?: string;
+    uname?: string;
+    gname?: string;
+}
+/** Interface for File Settings */
+export interface FILESETTINGS {
+    'type'?: string;
+    linkname?: string;
+    owner?: string;
+    group?: string;
 }
 /** Interface for Package information */
 export interface PACKAGEINFO {
diff --git a/src/services/SharedService.ts b/src/services/SharedService.ts
index f2f730e..48fbb17 100644
--- a/src/services/SharedService.ts
+++ b/src/services/SharedService.ts
@@ -23,7 +23,7 @@
 import { FormArray, FormGroup } from '@angular/forms';
 import { Router } from '@angular/router';
 import { TranslateService } from '@ngx-translate/core';
-import { CONSTANTNUMBER, ERRORDATA, GETAPIURLHEADER, PACKAGEINFO, PAGERSMARTTABLE, SMARTTABLECLASS, TARSETTINGS } from 'CommonModel';
+import { CONSTANTNUMBER, ERRORDATA, FILESETTINGS, GETAPIURLHEADER, PACKAGEINFO, PAGERSMARTTABLE, SMARTTABLECLASS, TARSETTINGS } from 'CommonModel';
 import { environment } from 'environment';
 import * as HttpStatus from 'http-status-codes';
 import * as untar from 'js-untar';
@@ -194,14 +194,15 @@
                         const getFoldersFiles: {}[] = extractedFiles;
                         const folderNameStr: string = extractedFiles[0].name;
                         getFoldersFiles.forEach((value: TARSETTINGS) => {
+                            const fileValueObj: FILESETTINGS = this.createFileValueObject(value);
                             const getRootFolder: string[] = value.name.split('/');
                             if (value.name.startsWith(folderNameStr) &&
                                 (value.name.endsWith('.yaml') || value.name.endsWith('.yml')) &&
                                 getRootFolder.length === this.directoryCount) {
-                                tar.append(value.name, packageInfo.descriptor, { type: value.type });
+                                tar.append(value.name, packageInfo.descriptor, fileValueObj);
                             } else {
                                 if (value.type !== 'L') {
-                                    tar.append(value.name, new Uint8Array(value.buffer), { type: value.type });
+                                    tar.append(value.name, new Uint8Array(value.buffer), fileValueObj);
                                 }
                             }
                         });
@@ -224,6 +225,15 @@
             });
         });
     }
+    /** Method to return the file information @public */
+    public createFileValueObject(value: TARSETTINGS): FILESETTINGS {
+        return {
+            type: value.type,
+            linkname: value.linkname,
+            owner: value.uname,
+            group: value.gname
+        };
+    }
     /** Method to check given string is JSON or not @public */
     public checkJson(jsonString: string): boolean {
         jsonString = jsonString.replace(/'/g, '"');
