diff --git a/data/icons/hicolor/16x16/status/package-available-locked.svg b/data/icons/hicolor/16x16/status/package-available-locked.svg
deleted file mode 100644
index 4d4e19197adf0ce12ca35f75c8444e6851c62c8e..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-available-locked.svg
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   version="1.1"
-   viewBox="0 0 16 16"
-   id="svg8"
-   sodipodi:docname="package-available-locked.svg"
-   inkscape:version="0.92.2 2405546, 2018-03-11">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="792"
-     inkscape:window-height="480"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="7.0564046"
-     inkscape:cy="8"
-     inkscape:window-x="403"
-     inkscape:window-y="85"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="g6" />
-  <g
-     transform="translate(0,-1036.3622)"
-     id="g6">
-    <rect
-       style="fill:#e4e4e4;fill-opacity:1"
-       width="16"
-       height="16"
-       x="-1052.36"
-       y="-16"
-       rx=".8"
-       ry=".8"
-       transform="matrix(0,-1,-1,0,0,0)"
-       id="rect2" />
-    <path
-       style="fill:#ffffff"
-       d="m 5,1041.3622 0,1.9998 -0.5000001,0 c -0.277,0 -0.5,0.223 -0.5,0.5 l 0,5 c 0,0.277 0.223,0.5 0.5,0.5 l 7.0000001,0 c 0.277,0 0.5,-0.223 0.5,-0.5 l 0,-5 c 0,-0.277 -0.223,-0.5 -0.5,-0.5 l -0.5,0 0,-1.9998 c 0,-2 -1,-2 -2,-2 l -2,0 c -1,0 -2,0 -2,2 z m 4,0 0,2 -2,0 0,-2 z"
-       id="path4" />
-  </g>
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-available.svg b/data/icons/hicolor/16x16/status/package-available.svg
deleted file mode 100644
index 242dc3e12f5d53d114d68725b0130f69332716f8..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-available.svg
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   version="1.1"
-   viewBox="0 0 16 16"
-   id="svg6"
-   sodipodi:docname="package-available.svg"
-   inkscape:version="0.92.2 2405546, 2018-03-11">
-  <metadata
-     id="metadata12">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs10" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="792"
-     inkscape:window-height="480"
-     id="namedview8"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="svg6" />
-  <rect
-     style="fill:#e4e4e4"
-     width="16"
-     height="16"
-     x="-16"
-     y="-16"
-     rx=".8"
-     ry=".8"
-     transform="matrix(0,-1,-1,0,0,0)"
-     id="rect2" />
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-install.svg b/data/icons/hicolor/16x16/status/package-install.svg
deleted file mode 100644
index 89cbdd74e9b7107c20a3bf2a20c5f20dd8002d0e..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-install.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   version="1.1"
-   viewBox="0 0 16 16"
-   id="svg8"
-   sodipodi:docname="package-install.svg"
-   inkscape:version="0.92.2 2405546, 2018-03-11">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="778"
-     inkscape:window-height="480"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="527"
-     inkscape:window-y="67"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="g6" />
-  <g
-     transform="translate(0,-1036.3622)"
-     id="g6">
-    <rect
-       style="fill:#e4e4e4;fill-opacity:1"
-       width="16"
-       height="16"
-       x="-1052.36"
-       y="-16"
-       rx=".8"
-       ry=".8"
-       transform="matrix(0,-1,-1,0,0,0)"
-       id="rect2" />
-    <path
-       style="fill:#8fb629;fill-opacity:1"
-       d="m 12.900392,1039.8778 -5.6582045,5.6563 -2.828125,-2.8281 L 3,1044.12 l 2.828125,2.8281 1.4140625,1.4141 1.4140625,-1.4141 5.658203,-5.6562 -1.414061,-1.4141 z"
-       id="path4" />
-  </g>
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-installed-locked.svg b/data/icons/hicolor/16x16/status/package-installed-locked.svg
deleted file mode 100644
index 37b47b01721fb7986337e975e507fcd5c23863f2..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-installed-locked.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   version="1.1"
-   viewBox="0 0 16 16"
-   id="svg8"
-   sodipodi:docname="package-installed-locked.svg"
-   inkscape:version="0.92.2 2405546, 2018-03-11">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="792"
-     inkscape:window-height="480"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8.1048439"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="g6" />
-  <g
-     transform="translate(0,-1036.3622)"
-     id="g6">
-    <rect
-       style="fill:#8fb633;fill-opacity:1"
-       width="16"
-       height="16"
-       x="-1052.36"
-       y="-16"
-       rx=".8"
-       ry=".8"
-       transform="matrix(0,-1,-1,0,0,0)"
-       id="rect2" />
-    <path
-       style="fill:#ffffff"
-       d="m 5,1041.3622 0,1.9998 -0.5000001,0 c -0.277,0 -0.5,0.223 -0.5,0.5 l 0,5 c 0,0.277 0.223,0.5 0.5,0.5 l 7.0000001,0 c 0.277,0 0.5,-0.223 0.5,-0.5 l 0,-5 c 0,-0.277 -0.223,-0.5 -0.5,-0.5 l -0.5,0 0,-1.9998 c 0,-2 -1,-2 -2,-2 l -2,0 c -1,0 -2,0 -2,2 z m 4,0 0,2 -2,0 0,-2 z"
-       id="path4" />
-  </g>
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-installed-updated.svg b/data/icons/hicolor/16x16/status/package-installed-updated.svg
deleted file mode 100644
index a7b40412670b77c122e01e28e2189ca63f5eb9ef..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-installed-updated.svg
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   version="1.1"
-   viewBox="0 0 16 16"
-   id="svg8"
-   sodipodi:docname="package-installed-updated.svg"
-   inkscape:version="0.92.2 2405546, 2018-03-11">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-        <dc:title></dc:title>
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="640"
-     inkscape:window-height="480"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="g6" />
-  <g
-     transform="translate(0,-1036.3622)"
-     id="g6">
-    <rect
-       style="fill:#8fb633"
-       width="16"
-       height="16"
-       x="-1052.36"
-       y="-16"
-       rx=".8"
-       ry=".8"
-       transform="matrix(0,-1,-1,0,0,0)"
-       id="rect2" />
-  </g>
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-reinstall.svg b/data/icons/hicolor/16x16/status/package-reinstall.svg
deleted file mode 100644
index d3d7d7aced8186f603a216b7f8324c65fc4cf0e7..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-reinstall.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" version="1.1" viewBox="0 0 16 16">
- <g transform="translate(0,-1036.3622)">
-  <rect style="fill:#8fb633" width="16" height="16" x="-1052.36" y="-16" rx=".8" ry=".8" transform="matrix(0,-1,-1,0,0,0)"/>
-  <path style="fill:#ffffff" d="M 3 3 L 3 11 L 3 13 L 5 13 L 7 13 L 7 11 L 5 11 L 5 10.382812 L 5 5 L 11 5 L 11 9 L 9 9 L 10.5 11 L 12 13 L 13.5 11 L 15 9 L 13 9 L 13 3 L 3 3 z" transform="translate(0,1036.3622)"/>
- </g>
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-remove.svg b/data/icons/hicolor/16x16/status/package-remove.svg
deleted file mode 100644
index 450605153014abb48fa08d59f3db03fc497e45c1..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-remove.svg
+++ /dev/null
@@ -1,6 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" version="1.1" viewBox="0 0 16 16">
- <g transform="translate(0,-1036.3622)">
-  <rect style="fill:#ff6b26" width="16" height="16" x="-1052.36" y="-16" rx=".8" ry=".8" transform="matrix(0,-1,-1,0,0,0)"/>
-  <path style="fill:#ffffff" d="m 3.0502591,1040.8266 3.5355339,3.5356 -3.5355528,3.5356 1.4142136,1.4142 3.5355528,-3.5356 3.5355334,3.5355 1.4142,-1.4141 -3.535533,-3.5356 3.535552,-3.5356 -1.414212,-1.4142 -3.5355536,3.5356 -3.5355339,-3.5355 -1.4142004,1.4141 z"/>
- </g>
-</svg>
diff --git a/data/icons/hicolor/16x16/status/package-upgrade.svg b/data/icons/hicolor/16x16/status/package-upgrade.svg
deleted file mode 100644
index c8297fdc389262e95e2cdbfe7c81ebf12ac9a3de..0000000000000000000000000000000000000000
--- a/data/icons/hicolor/16x16/status/package-upgrade.svg
+++ /dev/null
@@ -1,68 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<svg
-   xmlns:dc="http://purl.org/dc/elements/1.1/"
-   xmlns:cc="http://creativecommons.org/ns#"
-   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-   xmlns:svg="http://www.w3.org/2000/svg"
-   xmlns="http://www.w3.org/2000/svg"
-   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-   width="16"
-   height="16"
-   version="1.1"
-   viewBox="0 0 16 16"
-   id="svg8"
-   sodipodi:docname="package-upgrade.svg"
-   inkscape:version="0.92.2 2405546, 2018-03-11">
-  <metadata
-     id="metadata14">
-    <rdf:RDF>
-      <cc:Work
-         rdf:about="">
-        <dc:format>image/svg+xml</dc:format>
-        <dc:type
-           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
-      </cc:Work>
-    </rdf:RDF>
-  </metadata>
-  <defs
-     id="defs12" />
-  <sodipodi:namedview
-     pagecolor="#ffffff"
-     bordercolor="#666666"
-     borderopacity="1"
-     objecttolerance="10"
-     gridtolerance="10"
-     guidetolerance="10"
-     inkscape:pageopacity="0"
-     inkscape:pageshadow="2"
-     inkscape:window-width="792"
-     inkscape:window-height="480"
-     id="namedview10"
-     showgrid="false"
-     inkscape:zoom="14.75"
-     inkscape:cx="8"
-     inkscape:cy="8"
-     inkscape:window-x="0"
-     inkscape:window-y="0"
-     inkscape:window-maximized="0"
-     inkscape:current-layer="g6" />
-  <g
-     transform="translate(0,-1036.3622)"
-     id="g6">
-    <rect
-       style="fill:#8fb633;fill-opacity:1"
-       width="16"
-       height="16"
-       x="-1052.36"
-       y="-16"
-       rx=".8"
-       ry=".8"
-       transform="matrix(0,-1,-1,0,0,0)"
-       id="rect2" />
-    <path
-       style="fill:#ffffff;fill-rule:evenodd"
-       d="m 7,1049.3622 0,-6 -2,0 3,-4 3,4 -2,0 0,6 z"
-       id="path4" />
-  </g>
-</svg>
diff --git a/src/alpm_utils.vala b/src/alpm_utils.vala
index 55c07df02a20190741936a55a5acebe45863c39e..e7050db2441b23f48d1347cad4243cd8aa5c979f 100644
--- a/src/alpm_utils.vala
+++ b/src/alpm_utils.vala
@@ -358,7 +358,7 @@ namespace Pamac {
 					installed_version = (owned) installed_version,
 					desc = (owned) desc,
 					repo = (owned) repo_name,
-					size = alpm_pkg.isize,
+					installed_size = alpm_pkg.isize,
 					download_size = alpm_pkg.download_size,
 					builddate = alpm_pkg.builddate,
 					installdate = alpm_pkg.installdate,
@@ -621,9 +621,8 @@ namespace Pamac {
 									// opt_pkg is at least optional for pkg
 									if (optionalfor.length == 1) {
 										success = trans_remove_pkg (opt_pkg.name);
-									} else {
-										optionalfor.free_inner (GLib.free);
 									}
+									optionalfor.free_inner (GLib.free);
 								} else {
 									requiredby.free_inner (GLib.free);
 								}
diff --git a/src/cli.vala b/src/cli.vala
index 5cf39abfdebf3370f47e72dc26ada36447b83010..fa73059bfd0af9be25e46432352842184b7dd1e4 100644
--- a/src/cli.vala
+++ b/src/cli.vala
@@ -1344,7 +1344,7 @@ namespace Pamac {
 					print_aligned (properties[5], ": %s".printf (dgettext (null, "AUR")), max_length);
 				}
 				// Size
-				print_aligned (properties[6], ": %s".printf (format_size (details.size)), max_length);
+				print_aligned (properties[6], ": %s".printf (format_size (details.installed_size)), max_length);
 				if (details.repo == dgettext (null, "AUR")) {
 					AURPackageDetails aur_pkg_details = yield database.get_aur_pkg_details (details.name);
 					// Package Base
@@ -1731,7 +1731,7 @@ namespace Pamac {
 				str_builder.append ("%-*s  %-*s  %s\n".printf (
 									version_length, pkg.version,
 									repo_length, pkg.repo,
-									format_size (pkg.size)));
+									format_size (pkg.installed_size)));
 				stdout.printf ("%s", str_builder.str);
 			}
 		}
diff --git a/src/common.vala b/src/common.vala
index c06c5f405118c6616e8f24fe388ce49b1a8a963a..56ac48f23200d33baf490de6754febb9e6f5d34b 100644
--- a/src/common.vala
+++ b/src/common.vala
@@ -25,42 +25,13 @@ namespace Pamac {
 		public string installed_version;
 		public string desc;
 		public string repo;
-		public uint64 size;
+		public uint64 installed_size;
 		public uint64 download_size;
 		public string icon;
 		public uint64 builddate;
 		public uint64 installdate;
 	}
 
-	struct PackageDetailsStruct {
-		public string name;
-		public string app_name;
-		public string version;
-		public string installed_version;
-		public string desc;
-		public string long_desc;
-		public string repo;
-		public uint64 size;
-		public string url;
-		public string icon;
-		public string screenshot;
-		public string packager;
-		public uint64 builddate;
-		public uint64 installdate;
-		public string reason;
-		public string has_signature;
-		public string[] licenses;
-		public string[] depends;
-		public string[] optdepends;
-		public string[] requiredby;
-		public string[] optionalfor;
-		public string[] provides;
-		public string[] replaces;
-		public string[] conflicts;
-		public string[] groups;
-		public string[] backups;
-	}
-
 	struct AURPackageStruct {
 		public string name;
 		public string version;
@@ -72,28 +43,6 @@ namespace Pamac {
 		public uint64 outofdate;
 	}
 
-	struct AURPackageDetailsStruct {
-		public string name;
-		public string version;
-		public string desc;
-		public double popularity;
-		public string packagebase;
-		public string url;
-		public string maintainer;
-		public uint64 firstsubmitted;
-		public uint64 lastmodified;
-		public uint64 outofdate;
-		public uint64 numvotes;
-		public string[] licenses;
-		public string[] depends;
-		public string[] makedepends;
-		public string[] checkdepends;
-		public string[] optdepends;
-		public string[] provides;
-		public string[] replaces;
-		public string[] conflicts;
-	}
-
 	struct TransactionSummaryStruct {
 		public PackageStruct[] to_install;
 		public PackageStruct[] to_upgrade;
diff --git a/src/common_daemon.vala b/src/common_daemon.vala
index c8df54c9af19fbc582274f938155e227644bd84d..4aaeafc7750c58d26c79898191d8c5252b1d3c8a 100644
--- a/src/common_daemon.vala
+++ b/src/common_daemon.vala
@@ -25,42 +25,13 @@ namespace Pamac {
 		public string installed_version;
 		public string desc;
 		public string repo;
-		public uint64 size;
+		public uint64 installed_size;
 		public uint64 download_size;
 		public string icon;
 		public uint64 builddate;
 		public uint64 installdate;
 	}
 
-	public struct PackageDetailsStruct {
-		public string name;
-		public string app_name;
-		public string version;
-		public string installed_version;
-		public string desc;
-		public string long_desc;
-		public string repo;
-		public uint64 size;
-		public string url;
-		public string icon;
-		public string screenshot;
-		public string packager;
-		public string builddate;
-		public string installdate;
-		public string reason;
-		public string has_signature;
-		public string[] licenses;
-		public string[] depends;
-		public string[] optdepends;
-		public string[] requiredby;
-		public string[] optionalfor;
-		public string[] provides;
-		public string[] replaces;
-		public string[] conflicts;
-		public string[] groups;
-		public string[] backups;
-	}
-
 	public struct AURPackageStruct {
 		public string name;
 		public string version;
@@ -72,28 +43,6 @@ namespace Pamac {
 		public uint64 outofdate;
 	}
 
-	public struct AURPackageDetailsStruct {
-		public string name;
-		public string version;
-		public string desc;
-		public double popularity;
-		public string packagebase;
-		public string url;
-		public string maintainer;
-		public uint64 firstsubmitted;
-		public uint64 lastmodified;
-		public string outofdate;
-		public uint64 numvotes;
-		public string[] licenses;
-		public string[] depends;
-		public string[] makedepends;
-		public string[] checkdepends;
-		public string[] optdepends;
-		public string[] provides;
-		public string[] replaces;
-		public string[] conflicts;
-	}
-
 	public struct TransactionSummaryStruct {
 		public PackageStruct[] to_install;
 		public PackageStruct[] to_upgrade;
diff --git a/src/database.vala b/src/database.vala
index 5bc35af6fedcd7eeace40c4f0d60be4f8987f5fc..21ce7f2210e1b68f806a9ad50f6b1642d81f8ea0 100644
--- a/src/database.vala
+++ b/src/database.vala
@@ -277,11 +277,11 @@ namespace Pamac {
 		}
 
 		public Package get_installed_pkg (string pkgname) {
-			return new Package.from_struct (initialise_pkg_struct (alpm_handle.localdb.get_pkg (pkgname)));
+			return initialise_pkg (alpm_handle.localdb.get_pkg (pkgname));
 		}
 
 		public Package find_installed_satisfier (string depstring) {
-			return new Package.from_struct (initialise_pkg_struct (Alpm.find_satisfier (alpm_handle.localdb.pkgcache, depstring)));
+			return initialise_pkg (Alpm.find_satisfier (alpm_handle.localdb.pkgcache, depstring));
 		}
 
 		public bool should_hold (string pkgname) {
@@ -382,24 +382,29 @@ namespace Pamac {
 			return (owned) matching_apps;
 		}
 
-		PackageStruct initialise_pkg_struct (Alpm.Package? alpm_pkg) {
+		Package initialise_pkg (Alpm.Package? alpm_pkg) {
+			var pkg = new Package ();
 			if (alpm_pkg != null) {
-				string installed_version = "";
-				string repo_name = "";
-				string desc = alpm_pkg.desc ?? "";
-				string icon = "";
-				string app_name = "";
+				pkg.name = alpm_pkg.name;
+				pkg.version = alpm_pkg.version;
+				pkg.installed_size = alpm_pkg.isize;
+				pkg.download_size = alpm_pkg.download_size;
+				pkg.builddate = alpm_pkg.builddate;
+				pkg.installdate = alpm_pkg.installdate;
+				if (alpm_pkg.desc != null) {
+					pkg.desc = alpm_pkg.desc;
+				}
 				if (alpm_pkg.origin == Alpm.Package.From.LOCALDB) {
-					installed_version = alpm_pkg.version;
+					pkg.installed_version = alpm_pkg.version;
 					unowned Alpm.Package? sync_pkg = get_syncpkg (alpm_pkg.name);
 					if (sync_pkg != null) {
-						repo_name = sync_pkg.db.name;
+						pkg.repo = sync_pkg.db.name;
 					} else if (config.enable_aur) {
 						var loop = new MainLoop ();
 						get_aur_pkg.begin (alpm_pkg.name, (obj, res) => {
 							var aur_pkg = get_aur_pkg.end (res);
 							if (aur_pkg.name != "") {
-								repo_name = dgettext (null, "AUR");
+								pkg.repo = dgettext (null, "AUR");
 							}
 							loop.quit ();
 						});
@@ -408,44 +413,22 @@ namespace Pamac {
 				} else if (alpm_pkg.origin == Alpm.Package.From.SYNCDB) {
 					unowned Alpm.Package? local_pkg = alpm_handle.localdb.get_pkg (alpm_pkg.name);
 					if (local_pkg != null) {
-						installed_version = local_pkg.version;
+						pkg.installed_version = local_pkg.version;
 					}
-					repo_name = alpm_pkg.db.name;
+					pkg.repo = alpm_pkg.db.name;
 				}
-				if (repo_name != "" && repo_name != dgettext (null, "AUR")) {
+				if (pkg.repo != "" && pkg.repo != dgettext (null, "AUR")) {
 					// find if pkgname provides only one app
 					var matching_apps = get_pkgname_matching_apps (alpm_pkg.name);
 					if (matching_apps.length () == 1) {
 						As.App app = matching_apps.nth_data (0);
-						app_name = get_app_name (app);
-						desc = get_app_summary (app);
-						icon = get_app_icon (app, repo_name);
+						pkg.app_name = get_app_name (app);
+						pkg.desc = get_app_summary (app);
+						pkg.icon = get_app_icon (app, pkg.repo);
 					}
 				}
-				return PackageStruct () {
-					name = alpm_pkg.name,
-					app_name = (owned) app_name,
-					version = alpm_pkg.version,
-					installed_version = (owned) installed_version,
-					desc = (owned) desc,
-					repo = (owned) repo_name,
-					size = alpm_pkg.isize,
-					download_size = alpm_pkg.download_size,
-					builddate = alpm_pkg.builddate,
-					installdate = alpm_pkg.installdate,
-					icon = (owned) icon
-				};
-			} else {
-				return PackageStruct () {
-					name = "",
-					app_name = "",
-					version = "",
-					installed_version = "",
-					desc = "",
-					repo = "",
-					icon = ""
-				};
 			}
+			return pkg;
 		}
 
 		List<Package> initialise_pkgs (Alpm.List<unowned Alpm.Package>? alpm_pkgs) {
@@ -454,86 +437,59 @@ namespace Pamac {
 			string[] foreign_pkgnames = {};
 			while (alpm_pkgs != null) {
 				unowned Alpm.Package alpm_pkg = alpm_pkgs.data;
-				string installed_version = "";
-				string repo_name = "";
+				var pkg = new Package ();
+				pkg.name = alpm_pkg.name;
+				pkg.version = alpm_pkg.version;
+				if (alpm_pkg.desc != null) {
+					pkg.desc = alpm_pkg.desc;
+				}
+				pkg.installed_size = alpm_pkg.isize;
+				pkg.download_size = alpm_pkg.download_size;
+				pkg.builddate = alpm_pkg.builddate;
+				pkg.installdate = alpm_pkg.installdate;
 				if (alpm_pkg.origin == Alpm.Package.From.LOCALDB) {
-					installed_version = alpm_pkg.version;
+					pkg.installed_version = alpm_pkg.version;
 					unowned Alpm.Package? sync_pkg = get_syncpkg (alpm_pkg.name);
 					if (sync_pkg != null) {
-						repo_name = sync_pkg.db.name;
+						pkg.repo = sync_pkg.db.name;
 					} else if (config.enable_aur) {
 						foreign_pkgnames += alpm_pkg.name;
 					}
 				} else if (alpm_pkg.origin == Alpm.Package.From.SYNCDB) {
 					unowned Alpm.Package? local_pkg = alpm_handle.localdb.get_pkg (alpm_pkg.name);
 					if (local_pkg != null) {
-						installed_version = local_pkg.version;
+						pkg.installed_version = local_pkg.version;
 					}
-					repo_name = alpm_pkg.db.name;
+					pkg.repo = alpm_pkg.db.name;
 				}
-				if (repo_name == "" ) {
+				if (pkg.repo == "" ) {
 					if (config.enable_aur) {
-						data.insert (alpm_pkg.name, new Package.from_struct (PackageStruct () {
-							name = alpm_pkg.name,
-							app_name = "",
-							version = alpm_pkg.version,
-							installed_version = (owned) installed_version,
-							desc = alpm_pkg.desc ?? "",
-							repo = (owned) repo_name,
-							size = alpm_pkg.isize,
-							download_size = alpm_pkg.download_size,
-							builddate = alpm_pkg.builddate,
-							installdate = alpm_pkg.installdate,
-							icon = ""
-						}));
+						data.insert (alpm_pkg.name, pkg);
 					} else {
-						pkgs.append (new Package.from_struct (PackageStruct () {
-							name = alpm_pkg.name,
-							app_name = "",
-							version = alpm_pkg.version,
-							installed_version = (owned) installed_version,
-							desc = alpm_pkg.desc ?? "",
-							repo = (owned) repo_name,
-							size = alpm_pkg.isize,
-							download_size = alpm_pkg.download_size,
-							builddate = alpm_pkg.builddate,
-							installdate = alpm_pkg.installdate,
-							icon = ""
-						}));
+						pkgs.append (pkg);
 					}
 				} else {
 					var apps = get_pkgname_matching_apps (alpm_pkg.name);
 					if (apps.length () > 0) {
 						// alpm_pkg provide some apps
-						foreach (unowned As.App app in apps) {
-							pkgs.append (new Package.from_struct (PackageStruct () {
-								name = alpm_pkg.name,
-								app_name = get_app_name (app),
-								version = alpm_pkg.version,
-								installed_version = installed_version,
-								desc = get_app_summary (app),
-								repo = repo_name,
-								size = alpm_pkg.isize,
-								download_size = alpm_pkg.download_size,
-								builddate = alpm_pkg.builddate,
-								installdate = alpm_pkg.installdate,
-								icon = get_app_icon (app, repo_name)
-							}));
+						unowned SList<As.App> apps_list = apps;
+						unowned As.App app = apps_list.data;
+						pkg.app_name = get_app_name (app);
+						pkg.desc = get_app_summary (app);
+						pkg.icon = get_app_icon (app, pkg.repo);
+						pkgs.append (pkg);
+						apps_list = apps_list.next;
+						while (apps_list != null) {
+							app = apps_list.data;
+							var pkg_dup = pkg.dup ();
+							pkg_dup.app_name = get_app_name (app);
+							pkg_dup.desc = get_app_summary (app);
+							pkg_dup.icon = get_app_icon (app, pkg_dup.repo);
+							pkgs.append (pkg_dup);
+							apps_list = apps_list.next;
 						}
 					} else {
-						pkgs.append (new Package.from_struct (PackageStruct () {
-							name = alpm_pkg.name,
-							app_name = "",
-							version = alpm_pkg.version,
-							installed_version = (owned) installed_version,
-							desc = alpm_pkg.desc ?? "",
-							repo = (owned) repo_name,
-							size = alpm_pkg.isize,
-							download_size = alpm_pkg.download_size,
-							builddate = alpm_pkg.builddate,
-							installdate = alpm_pkg.installdate,
-							icon = ""
-						}));
+						pkgs.append (pkg);
 					}
 				}
 				alpm_pkgs.next ();
@@ -581,19 +537,19 @@ namespace Pamac {
 					if (local_pkg != null) {
 						unowned Alpm.Package? sync_pkg = get_syncpkg (pkgname);
 						if (sync_pkg != null) {
-							result.append (new Package.from_struct (PackageStruct () {
-								name = sync_pkg.name,
-								app_name = get_app_name (app),
-								version = sync_pkg.version,
-								installed_version = local_pkg.version,
-								desc = get_app_summary (app),
-								repo = sync_pkg.db.name,
-								size = local_pkg.isize,
-								download_size = sync_pkg.download_size,
-								builddate = local_pkg.builddate,
-								installdate = local_pkg.installdate,
-								icon = get_app_icon (app, sync_pkg.db.name)
-							}));
+							var pkg = new Package ();
+							pkg.name = sync_pkg.name;
+							pkg.app_name = get_app_name (app);
+							pkg.version = sync_pkg.version;
+							pkg.installed_version = local_pkg.version;
+							pkg.desc = get_app_summary (app);
+							pkg.repo = sync_pkg.db.name;
+							pkg.installed_size = local_pkg.isize;
+							pkg.download_size = sync_pkg.download_size;
+							pkg.builddate = local_pkg.builddate;
+							pkg.installdate = local_pkg.installdate;
+							pkg.icon = get_app_icon (app, sync_pkg.db.name);
+							result.append (pkg);
 						}
 					}
 				}
@@ -741,7 +697,7 @@ namespace Pamac {
 		}
 
 		public Package get_sync_pkg (string pkgname) {
-			return new Package.from_struct (initialise_pkg_struct (get_syncpkg (pkgname)));
+			return initialise_pkg (get_syncpkg (pkgname));
 		}
 
 		unowned Alpm.Package? find_dbs_satisfier (string depstring) {
@@ -759,7 +715,7 @@ namespace Pamac {
 		}
 
 		public Package find_sync_satisfier (string depstring) {
-			return new Package.from_struct (initialise_pkg_struct (find_dbs_satisfier (depstring)));
+			return initialise_pkg (find_dbs_satisfier (depstring));
 		}
 
 		Alpm.List<unowned Alpm.Package> search_local_db (string search_string) {
@@ -940,38 +896,28 @@ namespace Pamac {
 			return (owned) pkgs;
 		}
 
-		AURPackageStruct initialise_aur_struct (Json.Object? json_object) {
+		AURPackage initialise_aur_pkg (Json.Object? json_object) {
+			var aur_pkg = new AURPackage ();
 			if (json_object == null) {
-				return AURPackageStruct () {
-					name = "",
-					version = "",
-					installed_version = "",
-					desc = "",
-					packagebase = ""
-				};
-			}
-			string installed_version = "";
+				return aur_pkg;
+			}
+			aur_pkg.name = json_object.get_string_member ("Name");
+			aur_pkg.version = json_object.get_string_member ("Version");
+			// desc can be null
+			aur_pkg.desc = json_object.get_null_member ("Description") ? "" : json_object.get_string_member ("Description");
+			aur_pkg.popularity = json_object.get_double_member ("Popularity");
+			aur_pkg.packagebase = json_object.get_string_member ("PackageBase");
+			aur_pkg.lastmodified = (uint64) json_object.get_int_member ("LastModified");
 			unowned Alpm.Package? pkg = alpm_handle.localdb.get_pkg (json_object.get_string_member ("Name"));
 			if (pkg != null) {
-				installed_version = pkg.version;
+				aur_pkg.installed_version = pkg.version;
 			}
 			// set out of date
-			uint64 outofdate = 0;
 			unowned Json.Node? out_node = json_object.get_member ("OutOfDate");
 			if (!out_node.is_null ()) {
-				outofdate = (uint64) out_node.get_int ();
+				aur_pkg.outofdate = (uint64) out_node.get_int ();
 			}
-			return AURPackageStruct () {
-				name = json_object.get_string_member ("Name"),
-				version = json_object.get_string_member ("Version"),
-				installed_version = (owned) installed_version,
-				// desc can be null
-				desc = json_object.get_null_member ("Description") ? "" : json_object.get_string_member ("Description"),
-				popularity = json_object.get_double_member ("Popularity"),
-				packagebase = json_object.get_string_member ("PackageBase"),
-				lastmodified = (uint64) json_object.get_int_member ("LastModified"),
-				outofdate = outofdate
-			};
+			return aur_pkg;
 		}
 
 		public async List<AURPackage> search_in_aur (string search_string) {
@@ -980,13 +926,13 @@ namespace Pamac {
 				aur_search_results.insert (search_string, pkgs);
 			}
 			var result = new List<AURPackage> ();
-			Json.Array aur_pkgs = aur_search_results.get (search_string);
-			aur_pkgs.foreach_element ((array, index, node) => {
-				Json.Object aur_pkg = node.get_object ();
+			var json_array = aur_search_results.get (search_string);
+			json_array.foreach_element ((array, index, node) => {
+				Json.Object json_object = node.get_object ();
 				// remove results which is installed or exist in repos
-				if (alpm_handle.localdb.get_pkg (aur_pkg.get_string_member ("Name")) == null
-					&& get_syncpkg (aur_pkg.get_string_member ("Name")) == null) {
-					result.append (new AURPackage.from_struct (initialise_aur_struct (aur_pkg)));
+				if (alpm_handle.localdb.get_pkg (json_object.get_string_member ("Name")) == null
+					&& get_syncpkg (json_object.get_string_member ("Name")) == null) {
+					result.append (initialise_aur_pkg (json_object));
 				}
 			});
 			return (owned) result;
@@ -1068,17 +1014,17 @@ namespace Pamac {
 								repo_name = sync_pkg.db.name;
 								installed_version = local_pkg.version;
 							}
-							result.append (new Package.from_struct (PackageStruct () {
-								name = sync_pkg.name,
-								app_name = get_app_name (app),
-								version = sync_pkg.version,
-								installed_version = (owned) installed_version,
-								desc = get_app_summary (app),
-								repo = (owned) repo_name,
-								size = sync_pkg.isize,
-								download_size = sync_pkg.download_size,
-								icon = get_app_icon (app, sync_pkg.db.name)
-							}));
+							var pkg = new Package ();
+							pkg.name = sync_pkg.name;
+							pkg.app_name = get_app_name (app);
+							pkg.version = sync_pkg.version;
+							pkg.installed_version = installed_version;
+							pkg.desc = get_app_summary (app);
+							pkg.repo = repo_name;
+							pkg.installed_size = sync_pkg.isize;
+							pkg.download_size = sync_pkg.download_size;
+							pkg.icon = get_app_icon (app, sync_pkg.db.name);
+							result.append (pkg);
 						}
 					}
 				});
@@ -1238,48 +1184,23 @@ namespace Pamac {
 		}
 
 		public PackageDetails get_pkg_details (string pkgname, string appname, bool use_sync_pkg) {
-			string name = "";
-			string app_name = "";
-			string version = "";
-			string installed_version = "";
-			string desc = "";
-			string long_desc = "";
-			string url = "";
-			string icon = "";
-			string screenshot = "";
-			string repo = "";
-			uint64 size = 0;
-			string has_signature = "";
-			string reason = "";
-			string packager = "";
-			uint64 builddate = 0;
-			uint64 installdate = 0;
-			string[] groups = {};
-			string[] backups = {};
-			string[] licenses = {};
-			string[] depends = {};
-			string[] optdepends = {};
-			string[] requiredby = {};
-			string[] optionalfor = {};
-			string[] provides = {};
-			string[] replaces = {};
-			string[] conflicts = {};
+			var details = new PackageDetails ();
 			unowned Alpm.Package? alpm_pkg = alpm_handle.localdb.get_pkg (pkgname);
 			unowned Alpm.Package? sync_pkg = get_syncpkg (pkgname);
 			if (alpm_pkg != null) {
-				installed_version = alpm_pkg.version;
+				details.installed_version = alpm_pkg.version;
 			}
 			if (alpm_pkg == null || use_sync_pkg) {
 				alpm_pkg = sync_pkg;
 			}
 			if (alpm_pkg != null) {
 				// name
-				name = alpm_pkg.name;
+				details.name = alpm_pkg.name;
 				// version
-				version = alpm_pkg.version;
+				details.version = alpm_pkg.version;
 				// desc can be null
 				if (alpm_pkg.desc != null) {
-					desc = alpm_pkg.desc;
+					details.desc = alpm_pkg.desc;
 				}
 				if (sync_pkg != null) {
 					if (appname != "") {
@@ -1289,15 +1210,15 @@ namespace Pamac {
 								&& get_app_name (app) == appname) {
 								found = true;
 								if (app.get_pkgname_default () == alpm_pkg.name) {
-									app_name = appname;
-									desc = get_app_summary (app);
+									details.app_name = appname;
+									details.desc = get_app_summary (app);
 									try {
-										long_desc = As.markup_convert_simple (get_app_description (app));
+										details.long_desc = As.markup_convert_simple (get_app_description (app));
 									} catch (Error e) {
 										stderr.printf ("Error: %s\n", e.message);
 									}
-									icon = get_app_icon (app, sync_pkg.db.name);
-									screenshot = get_app_screenshot (app);
+									details.icon = get_app_icon (app, sync_pkg.db.name);
+									details.screenshot = get_app_screenshot (app);
 								}
 							}
 						});
@@ -1306,50 +1227,50 @@ namespace Pamac {
 						var matching_apps = get_pkgname_matching_apps (pkgname);
 						if (matching_apps.length () == 1) {
 							As.App app = matching_apps.nth_data (0);
-							app_name = get_app_name (app);
-							desc = get_app_summary (app);
+							details.app_name = get_app_name (app);
+							details.desc = get_app_summary (app);
 							try {
-								long_desc = As.markup_convert_simple (get_app_description (app));
+								details.long_desc = As.markup_convert_simple (get_app_description (app));
 							} catch (Error e) {
 								stderr.printf ("Error: %s\n", e.message);
 							}
-							icon = get_app_icon (app, sync_pkg.db.name);
-							screenshot = get_app_screenshot (app);
+							details.icon = get_app_icon (app, sync_pkg.db.name);
+							details.screenshot = get_app_screenshot (app);
 						}
 					}
 				}
-				size = alpm_pkg.isize;
+				details.installed_size = alpm_pkg.isize;
 				// url can be null
 				if (alpm_pkg.url != null) {
-					url = alpm_pkg.url;
+					details.url = alpm_pkg.url;
 				}
 				// packager can be null
-				packager = alpm_pkg.packager ?? "";
+				details.packager = alpm_pkg.packager ?? "";
 				// groups
-				unowned Alpm.List list = alpm_pkg.groups;
+				unowned Alpm.List<unowned string> list = alpm_pkg.groups;
 				while (list != null) {
-					groups += ((Alpm.List<unowned string>) list).data;
+					details.groups_priv.append (list.data);
 					list.next ();
 				}
 				// licenses
 				list = alpm_pkg.licenses;
 				while (list != null) {
-					licenses += ((Alpm.List<unowned string>) list).data;
+					details.licenses_priv.append (list.data);
 					list.next ();
 				}
 				// build_date
-				builddate = alpm_pkg.builddate;
+				details.builddate = alpm_pkg.builddate;
 				// local pkg
 				if (alpm_pkg.origin == Alpm.Package.From.LOCALDB) {
 					// repo
 					if (sync_pkg != null) {
-						repo = sync_pkg.db.name;
+						details.repo = sync_pkg.db.name;
 					} else if (config.enable_aur) {
 						var loop = new MainLoop ();
 						get_aur_pkg.begin (alpm_pkg.name, (obj, res) => {
 							var aur_pkg = get_aur_pkg.end (res);
 							if (aur_pkg.name != "") {
-								repo = dgettext (null, "AUR");
+								details.repo = dgettext (null, "AUR");
 							}
 							loop.quit ();
 						});
@@ -1357,102 +1278,77 @@ namespace Pamac {
 					}
 					// reason
 					if (alpm_pkg.reason == Alpm.Package.Reason.EXPLICIT) {
-						reason = dgettext (null, "Explicitly installed");
+						details.reason = dgettext (null, "Explicitly installed");
 					} else if (alpm_pkg.reason == Alpm.Package.Reason.DEPEND) {
-						reason = dgettext (null, "Installed as a dependency for another package");
+						details.reason = dgettext (null, "Installed as a dependency for another package");
 					} else {
-						reason = dgettext (null, "Unknown");
+						details.reason = dgettext (null, "Unknown");
 					}
 					// install_date
-					installdate = alpm_pkg.installdate;
+					details.installdate = alpm_pkg.installdate;
 					// backups
-					list = alpm_pkg.backups;
-					while (list != null) {
-						backups += "/" + ((Alpm.List<unowned Alpm.Backup>) list).data.name;
+					unowned Alpm.List<unowned Alpm.Backup> backups_list = alpm_pkg.backups;
+					while (backups_list != null) {
+						details.backups_priv.append ("/" + backups_list.data.name);
 						list.next ();
 					}
 					// requiredby
 					Alpm.List<string> pkg_requiredby = alpm_pkg.compute_requiredby ();
-					list = pkg_requiredby;
-					while (list != null) {
-						requiredby += ((Alpm.List<unowned string>) list).data;
-						list.next ();
+					unowned Alpm.List<string> string_list = pkg_requiredby;
+					while (string_list != null) {
+						details.requiredby_priv.append ((owned) string_list.data);
+						string_list.next ();
 					}
-					pkg_requiredby.free_inner (GLib.free);
 					// optionalfor
 					Alpm.List<string> pkg_optionalfor = alpm_pkg.compute_optionalfor ();
-					list = pkg_optionalfor;
-					while (list != null) {
-						optionalfor += ((Alpm.List<unowned string>) list).data;
-						list.next ();
+					string_list = pkg_optionalfor;
+					while (string_list != null) {
+						details.optionalfor_priv.append ((owned) string_list.data);
+						string_list.next ();
 					}
-					pkg_optionalfor.free_inner (GLib.free);
 				// sync pkg
 				} else if (alpm_pkg.origin == Alpm.Package.From.SYNCDB) {
 					// repos
-					repo = alpm_pkg.db.name;
+					details.repo = alpm_pkg.db.name;
 					// signature
-					has_signature = alpm_pkg.base64_sig != null ? dgettext (null, "Yes") : dgettext (null, "No");
+					if (alpm_pkg.base64_sig != null) {
+						details.has_signature = dgettext (null, "Yes");
+					} else {
+						details.has_signature = dgettext (null, "No");
+					}
 				}
 				// depends
-				list = alpm_pkg.depends;
-				while (list != null) {
-					depends += ((Alpm.List<unowned Alpm.Depend>) list).data.compute_string ();
-					list.next ();
+				unowned Alpm.List<unowned Alpm.Depend> depends_list = alpm_pkg.depends;
+				while (depends_list != null) {
+					details.depends_priv.append (depends_list.data.compute_string ());
+					depends_list.next ();
 				}
 				// optdepends
-				list = alpm_pkg.optdepends;
-				while (list != null) {
-					optdepends += ((Alpm.List<unowned Alpm.Depend>) list).data.compute_string ();
-					list.next ();
+				depends_list = alpm_pkg.optdepends;
+				while (depends_list != null) {
+					details.optdepends_priv.append (depends_list.data.compute_string ());
+					depends_list.next ();
 				}
 				// provides
-				list = alpm_pkg.provides;
-				while (list != null) {
-					provides += ((Alpm.List<unowned Alpm.Depend>) list).data.compute_string ();
-					list.next ();
+				depends_list = alpm_pkg.provides;
+				while (depends_list != null) {
+					details.provides_priv.append (depends_list.data.compute_string ());
+					depends_list.next ();
 				}
 				// replaces
-				list = alpm_pkg.replaces;
-				while (list != null) {
-					replaces += ((Alpm.List<unowned Alpm.Depend>) list).data.compute_string ();
-					list.next ();
+				depends_list = alpm_pkg.replaces;
+				while (depends_list != null) {
+					details.replaces_priv.append (depends_list.data.compute_string ());
+					depends_list.next ();
 				}
 				// conflicts
-				list = alpm_pkg.conflicts;
-				while (list != null) {
-					conflicts += ((Alpm.List<unowned Alpm.Depend>) list).data.compute_string ();
-					list.next ();
+				depends_list = alpm_pkg.conflicts;
+				while (depends_list != null) {
+					details.conflicts_priv.append (depends_list.data.compute_string ());
+					depends_list.next ();
 				}
 			}
-			return new PackageDetails.from_struct (PackageDetailsStruct () {
-				name = (owned) name,
-				app_name = (owned) app_name,
-				version = (owned) version,
-				installed_version = (owned) installed_version,
-				desc = (owned) desc,
-				long_desc = (owned) long_desc,
-				repo = (owned) repo,
-				size = size,
-				url = (owned) url,
-				icon = (owned) icon,
-				screenshot = (owned) screenshot,
-				packager = (owned) packager,
-				builddate = builddate,
-				installdate = installdate,
-				reason = (owned) reason,
-				has_signature = (owned) has_signature,
-				licenses = (owned) licenses,
-				depends = (owned) depends,
-				optdepends = (owned) optdepends,
-				requiredby = (owned) requiredby,
-				optionalfor = (owned) optionalfor,
-				provides = (owned) provides,
-				replaces = (owned) replaces,
-				conflicts = (owned) conflicts,
-				groups = (owned) groups,
-				backups = (owned) backups
-			});
+			return details;
 		}
 
 		public List<string> get_pkg_files (string pkgname) {
@@ -1674,7 +1570,7 @@ namespace Pamac {
 		public async AURPackage get_aur_pkg (string pkgname) {
 			if (config.enable_aur) {
 				yield populate_aur_infos ({pkgname});
-				return new AURPackage.from_struct (initialise_aur_struct (aur_infos.lookup (pkgname)));
+				return initialise_aur_pkg (aur_infos.lookup (pkgname));
 			} else {
 				return new AURPackage ();
 			}
@@ -1685,151 +1581,113 @@ namespace Pamac {
 			if (config.enable_aur) {
 				yield populate_aur_infos (pkgnames);
 				foreach (unowned string pkgname in pkgnames) {
-					data.insert (pkgname, new AURPackage.from_struct (initialise_aur_struct (aur_infos.lookup (pkgname))));
+					data.insert (pkgname, initialise_aur_pkg (aur_infos.lookup (pkgname)));
 				}
 			}
 			return data;
 		}
 
-		AURPackageDetailsStruct initialise_aur_details_struct (Json.Object? json_object) {
-			string name = "";
-			string version = "";
-			string desc = "";
-			double popularity = 0;
-			string packagebase = "";
-			string url = "";
-			string maintainer = "";
-			uint64 firstsubmitted = 0;
-			uint64 lastmodified = 0;
-			uint64 outofdate = 0;
-			uint64 numvotes = 0;
-			string[] licenses = {};
-			string[] depends = {};
-			string[] makedepends = {};
-			string[] checkdepends = {};
-			string[] optdepends = {};
-			string[] provides = {};
-			string[] replaces = {};
-			string[] conflicts = {};
+		AURPackageDetails initialise_aur_details (Json.Object? json_object) {
+			var aur_details = new AURPackageDetails ();
 			if (json_object != null) {
 				// name
-				name = json_object.get_string_member ("Name");
+				aur_details.name = json_object.get_string_member ("Name");
 				// version
-				version = json_object.get_string_member ("Version");
+				aur_details.version = json_object.get_string_member ("Version");
 				// desc can be null
 				if (!json_object.get_null_member ("Description")) {
-					desc = json_object.get_string_member ("Description");
+					aur_details.desc = json_object.get_string_member ("Description");
 				}
-				popularity = json_object.get_double_member ("Popularity");
+				aur_details.popularity = json_object.get_double_member ("Popularity");
 				// packagebase
-				packagebase = json_object.get_string_member ("PackageBase");
+				aur_details.packagebase = json_object.get_string_member ("PackageBase");
 				// url can be null
 				unowned Json.Node? node = json_object.get_member ("URL");
 				if (!node.is_null ()) {
-					url = node.get_string ();
+					aur_details.url = node.get_string ();
 				}
 				// maintainer can be null
 				node = json_object.get_member ("Maintainer");
 				if (!node.is_null ()) {
-					maintainer = node.get_string ();
+					aur_details.maintainer = node.get_string ();
 				}
 				// firstsubmitted
-				firstsubmitted = (uint64) json_object.get_int_member ("FirstSubmitted");
+				aur_details.firstsubmitted = (uint64) json_object.get_int_member ("FirstSubmitted");
 				// lastmodified
-				lastmodified = (uint64) json_object.get_int_member ("LastModified");
+				aur_details.lastmodified = (uint64) json_object.get_int_member ("LastModified");
 				// outofdate can be null
 				node = json_object.get_member ("OutOfDate");
 				if (!node.is_null ()) {
-					outofdate = (uint64) node.get_int ();
+					aur_details.outofdate = (uint64) node.get_int ();
 				}
 				//numvotes
-				numvotes = (uint64) json_object.get_int_member ("NumVotes");
+				aur_details.numvotes = (uint64) json_object.get_int_member ("NumVotes");
 				// licenses
 				node = json_object.get_member ("License");
 				if (!node.is_null ()) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						licenses += _node.get_string ();
+						aur_details.licenses_priv.append (_node.get_string ());
 					});
 				} else {
-					licenses += dgettext (null, "Unknown");
+					aur_details.licenses_priv.append (dgettext (null, "Unknown"));
 				}
 				// depends
 				node = json_object.get_member ("Depends");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						depends += _node.get_string ();
+						aur_details.depends_priv.append (_node.get_string ());
 					});
 				}
 				// optdepends
 				node = json_object.get_member ("OptDepends");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						optdepends += _node.get_string ();
+						aur_details.optdepends_priv.append (_node.get_string ());
 					});
 				}
 				// makedepends
 				node = json_object.get_member ("MakeDepends");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						makedepends += _node.get_string ();
+						aur_details.makedepends_priv.append (_node.get_string ());
 					});
 				}
 				// checkdepends
 				node = json_object.get_member ("CheckDepends");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						checkdepends += _node.get_string ();
+						aur_details.checkdepends_priv.append (_node.get_string ());
 					});
 				}
 				// provides
 				node = json_object.get_member ("Provides");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						provides += _node.get_string ();
+						aur_details.provides_priv.append (_node.get_string ());
 					});
 				}
 				// replaces
 				node = json_object.get_member ("Replaces");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						replaces += _node.get_string ();
+						aur_details.replaces_priv.append (_node.get_string ());
 					});
 				}
 				// conflicts
 				node = json_object.get_member ("Conflicts");
 				if (node != null) {
 					node.get_array ().foreach_element ((array, index, _node) => {
-						conflicts += _node.get_string ();
+						aur_details.conflicts_priv.append (_node.get_string ());
 					});
 				}
 			}
-			var details = AURPackageDetailsStruct ();
-			details.name = (owned) name;
-			details.version = (owned) version ;
-			details.desc = (owned) desc;
-			details.popularity = popularity;
-			details.packagebase = (owned) packagebase;
-			details.url = (owned) url;
-			details.maintainer = (owned) maintainer ;
-			details.firstsubmitted = firstsubmitted;
-			details.lastmodified = lastmodified;
-			details.outofdate = outofdate;
-			details.numvotes = numvotes;
-			details.licenses = (owned) licenses;
-			details.depends = (owned) depends;
-			details.optdepends = (owned) optdepends;
-			details.checkdepends = (owned) checkdepends;
-			details.makedepends = (owned) makedepends;
-			details.provides = (owned) provides;
-			details.replaces = (owned) replaces;
-			details.conflicts = (owned) conflicts;
-			return details;
+			return aur_details;
 		}
 
 		public async AURPackageDetails get_aur_pkg_details (string pkgname) {
 			if (config.enable_aur) {
 				yield populate_aur_infos ({pkgname});
-				return new AURPackageDetails.from_struct (initialise_aur_details_struct (aur_infos.lookup (pkgname)));
+				return initialise_aur_details (aur_infos.lookup (pkgname));
 			} else {
 				return new AURPackageDetails ();
 			}
@@ -1840,7 +1698,7 @@ namespace Pamac {
 			if (config.enable_aur) {
 				yield populate_aur_infos (pkgnames);
 				foreach (unowned string pkgname in pkgnames) {
-					data.insert (pkgname, new AURPackageDetails.from_struct (initialise_aur_details_struct (aur_infos.lookup (pkgname))));
+					data.insert (pkgname, initialise_aur_details (aur_infos.lookup (pkgname)));
 				}
 			}
 			return data;
@@ -1941,7 +1799,7 @@ namespace Pamac {
 					if (tmp_handle.should_ignore (installed_pkg) == 0) {
 						unowned Alpm.Package? candidate = installed_pkg.sync_newversion (tmp_handle.syncdbs);
 						if (candidate != null) {
-							repos_updates.append (new Package.from_struct (initialise_pkg_struct (candidate)));
+							repos_updates.append (initialise_pkg (candidate));
 						} else {
 							if (config.check_aur_updates) {
 								// check if installed_pkg is a local pkg
@@ -2010,16 +1868,16 @@ namespace Pamac {
 								string pkgbase = "";
 								string desc = "";
 								var pkgnames_found = new SList<string> ();
-								var pkgnames_table = new HashTable<string, AURPackageStruct?> (str_hash, str_equal);
+								var pkgnames_table = new HashTable<string, AURPackage> (str_hash, str_equal);
 								while ((line = yield dis.read_line_async ()) != null) {
 									if ("pkgbase = " in line) {
 										pkgbase = line.split (" = ", 2)[1];
 									} else if ("pkgdesc = " in line) {
 										desc = line.split (" = ", 2)[1];
 										if (!current_section_is_pkgbase) {
-											unowned AURPackageStruct? aur_struct = pkgnames_table.get (current_section);
-											if (aur_struct != null) {
-												aur_struct.desc = desc;
+											unowned AURPackage? aur_pkg = pkgnames_table.get (current_section);
+											if (aur_pkg != null) {
+												aur_pkg.desc = desc;
 											}
 										}
 									} else if ("pkgver = " in line) {
@@ -2035,22 +1893,21 @@ namespace Pamac {
 										current_section = pkgname_found;
 										current_section_is_pkgbase = false;
 										if (pkgname_found in vcs_local_pkgs) {
-											var aur_struct = AURPackageStruct () {
-												name = pkgname_found,
-												version = version.str,
-												installed_version = alpm_handle.localdb.get_pkg (pkgname_found).version,
-												desc = desc,
-												packagebase = pkgbase
-											};
-											pkgnames_table.insert (pkgname_found, (owned) aur_struct);
+											var aur_pkg = new AURPackage ();
+											aur_pkg.name = pkgname_found;
+											aur_pkg.version = version.str;
+											aur_pkg.installed_version = alpm_handle.localdb.get_pkg (pkgname_found).version;
+											aur_pkg.desc = desc;
+											aur_pkg.packagebase = pkgbase;
+											pkgnames_table.insert (pkgname_found, aur_pkg);
 											pkgnames_found.append (pkgname_found);
 											already_checked.add ((owned) pkgname_found);
 										}
 									}
 								}
 								foreach (unowned string pkgname_found in pkgnames_found) {
-									AURPackageStruct? aur_struct = pkgnames_table.take (pkgname_found);
-									vcs_packages.append (new AURPackage.from_struct ((owned) aur_struct));
+									AURPackage? aur_pkg = pkgnames_table.take (pkgname_found);
+									vcs_packages.append (aur_pkg);
 								}
 							} catch (GLib.Error e) {
 								stderr.printf ("Error: %s\n", e.message);
@@ -2080,10 +1937,10 @@ namespace Pamac {
 				unowned string new_version = pkg_info.get_string_member ("Version");
 				unowned string old_version = alpm_handle.localdb.get_pkg (name).version;
 				if (Alpm.pkg_vercmp (new_version, old_version) == 1) {
-					updates.append (new AURPackage.from_struct (initialise_aur_struct (pkg_info)));
+					updates.append (initialise_aur_pkg (pkg_info));
 				} else if (!pkg_info.get_member ("OutOfDate").is_null ()) {
 					// get out of date packages
-					outofdate.append (new AURPackage.from_struct (initialise_aur_struct (pkg_info)));
+					outofdate.append (initialise_aur_pkg (pkg_info));
 				}
 			});
 			return new AURUpdates ((owned) updates, (owned) outofdate);
diff --git a/src/manager_window.vala b/src/manager_window.vala
index 2fc805d354416c77978e0341c87735a11a24a80d..1db5040541077223988786b2b02e224c5f17e099 100644
--- a/src/manager_window.vala
+++ b/src/manager_window.vala
@@ -173,10 +173,10 @@ namespace Pamac {
 	}
 
 	int sort_pkgs_by_size (Package pkg_a, Package pkg_b) {
-		if (pkg_a.size > pkg_b.size) {
+		if (pkg_a.installed_size > pkg_b.installed_size) {
 			return -1;
 		}
-		if (pkg_b.size > pkg_a.size) {
+		if (pkg_b.installed_size > pkg_a.installed_size) {
 			return 1;
 		}
 		return sort_pkgs_by_name (pkg_a, pkg_b);
@@ -1515,7 +1515,7 @@ namespace Pamac {
 				label.ellipsize = Pango.EllipsizeMode.END;
 				label.xalign = 0;
 				row.version_box.pack_start (label);
-				row.size_label.label = GLib.format_size (pkg.size);
+				row.size_label.label = GLib.format_size (pkg.installed_size);
 			}
 			row.repo_label.label = pkg.repo;
 			Gdk.Pixbuf pixbuf;
diff --git a/src/package.vala b/src/package.vala
index ee4f31c7faa8557d377438e439491042156d4508..bb40f6f089a3d84c2af5d70e3ae1528a96b0a505 100644
--- a/src/package.vala
+++ b/src/package.vala
@@ -19,64 +19,75 @@
 
 namespace Pamac {
 	public class Package: Object {
-		PackageStruct pkg_struct;
-		public string name { get {return pkg_struct.name;} }
-		public string app_name { get {return pkg_struct.app_name;} }
-		public string version { get {return pkg_struct.version;} }
-		public string installed_version { get {return pkg_struct.installed_version;} }
-		public string desc { get {return pkg_struct.desc;} }
-		public string repo { get {return pkg_struct.repo;}
-							internal set {pkg_struct.repo = value;}
-							}
-		public uint64 size { get {return pkg_struct.size;} }
-		public uint64 download_size { get {return pkg_struct.download_size;} }
-		public string icon { get {return pkg_struct.icon;} }
-		public uint64 builddate { get {return pkg_struct.builddate;} }
-		public uint64 installdate { get {return pkg_struct.installdate;} }
-		internal Package () {
-			pkg_struct = PackageStruct () {
-				name = "",
-				app_name = "",
-				version = "",
-				installed_version = "",
-				desc = "",
-				repo = "",
-				icon = ""
-			};
+		public string name { get; internal set; default = "";}
+		public string app_name { get; internal set; default = "";}
+		public string version { get; internal set; default = "";}
+		public string installed_version { get; internal set; default = "";}
+		public string desc { get; internal set; default = "";}
+		public string repo { get; internal set; default = "";}
+		public uint64 installed_size { get; internal set; }
+		public uint64 download_size { get; internal set; }
+		public string icon { get; internal set; default = "";}
+		public uint64 builddate { get; internal set; }
+		public uint64 installdate { get; internal set; }
+		internal Package () {}
+		internal Package.from_struct (PackageStruct pkg_struct) {
+			name = pkg_struct.name;
+			app_name = pkg_struct.app_name;
+			version = pkg_struct.version;
+			installed_version = pkg_struct.installed_version;
+			desc = pkg_struct.desc;
+			repo = pkg_struct.repo;
+			icon = pkg_struct.icon;
+			installed_size = pkg_struct.installed_size;
+			download_size = pkg_struct.download_size;
+			builddate = pkg_struct.builddate;
+			installdate = pkg_struct.installdate;
 		}
-		internal Package.from_struct (owned PackageStruct pkg_struct) {
-			this.pkg_struct = (owned) pkg_struct;
+		internal Package dup () {
+			var pkg = new Package ();
+			pkg.name = this.name;
+			pkg.app_name = this.app_name;
+			pkg.version = this.version;
+			pkg.installed_version = this.installed_version;
+			pkg.desc = this.desc;
+			pkg.repo = this.repo;
+			pkg.icon = this.icon;
+			pkg.installed_size = this.installed_size;
+			pkg.download_size = this.download_size;
+			pkg.builddate = this.builddate;
+			pkg.installdate = this.installdate;
+			return pkg;
 		}
 	}
 
 	public class PackageDetails: Object {
-		PackageDetailsStruct pkg_struct;
-		public string name { get {return pkg_struct.name;} }
-		public string app_name { get {return pkg_struct.app_name;} }
-		public string version { get {return pkg_struct.version;} }
-		public string installed_version { get {return pkg_struct.installed_version;} }
-		public string desc { get {return pkg_struct.desc;} }
-		public string long_desc { get {return pkg_struct.long_desc;} }
-		public string repo { get {return pkg_struct.repo;} }
-		public uint64 size { get {return pkg_struct.size;} }
-		public string url { get {return pkg_struct.url;} }
-		public string icon { get {return pkg_struct.icon;} }
-		public string screenshot { get {return pkg_struct.screenshot;} }
-		public string packager { get {return pkg_struct.packager;} }
-		public uint64 builddate { get {return pkg_struct.builddate;} }
-		public uint64 installdate { get {return pkg_struct.installdate;} }
-		public string reason { get {return pkg_struct.reason;} }
-		public string has_signature { get {return pkg_struct.has_signature;} }
-		List<string> licenses_priv;
-		List<string> depends_priv;
-		List<string> optdepends_priv;
-		List<string> requiredby_priv;
-		List<string> optionalfor_priv;
-		List<string> provides_priv;
-		List<string> replaces_priv;
-		List<string> conflicts_priv;
-		List<string> groups_priv;
-		List<string> backups_priv;
+		internal List<string> licenses_priv;
+		internal List<string> depends_priv;
+		internal List<string> optdepends_priv;
+		internal List<string> requiredby_priv;
+		internal List<string> optionalfor_priv;
+		internal List<string> provides_priv;
+		internal List<string> replaces_priv;
+		internal List<string> conflicts_priv;
+		internal List<string> groups_priv;
+		internal List<string> backups_priv;
+		public string name { get; internal set; default = "";}
+		public string app_name { get; internal set; default = "";}
+		public string version { get; internal set; default = "";}
+		public string installed_version { get; internal set; default = "";}
+		public string desc { get; internal set; default = "";}
+		public string long_desc { get; internal set; default = "";}
+		public string repo { get; internal set; default = "";}
+		public string url { get; internal set; default = "";}
+		public string icon { get; internal set; default = "";}
+		public string screenshot { get; internal set; default = "";}
+		public string packager { get; internal set; default = "";}
+		public uint64 installed_size { get; internal set; }
+		public uint64 builddate { get; internal set; }
+		public uint64 installdate { get; internal set; }
+		public string reason { get; internal set; default = "";}
+		public string has_signature { get; internal set; default = "";}
 		public List<string> licenses { get {return licenses_priv;} }
 		public List<string> depends { get {return depends_priv;} }
 		public List<string> optdepends { get {return optdepends_priv;} }
@@ -88,20 +99,6 @@ namespace Pamac {
 		public List<string> groups { get {return groups_priv;} }
 		public List<string> backups { get {return backups_priv;} }
 		internal PackageDetails () {
-			pkg_struct = PackageDetailsStruct () {
-				name = "",
-				app_name = "",
-				version = "",
-				desc = "",
-				long_desc = "",
-				repo = "",
-				url = "",
-				icon = "",
-				screenshot = "",
-				packager = "",
-				reason = "",
-				has_signature = ""
-			};
 			licenses_priv = new List<string> ();
 			depends_priv = new List<string> ();
 			optdepends_priv = new List<string> ();
@@ -113,96 +110,50 @@ namespace Pamac {
 			groups_priv = new List<string> ();
 			backups_priv = new List<string> ();
 		}
-		internal PackageDetails.from_struct (owned PackageDetailsStruct pkg_struct_) {
-			pkg_struct = (owned) pkg_struct_;
-			licenses_priv = new List<string> ();
-			depends_priv = new List<string> ();
-			optdepends_priv = new List<string> ();
-			requiredby_priv = new List<string> ();
-			optionalfor_priv = new List<string> ();
-			provides_priv = new List<string> ();
-			replaces_priv = new List<string> ();
-			conflicts_priv = new List<string> ();
-			groups_priv = new List<string> ();
-			backups_priv = new List<string> ();
-			foreach (unowned string str in pkg_struct.licenses) {
-				licenses_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.depends) {
-				depends_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.optdepends) {
-				optdepends_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.requiredby) {
-				requiredby_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.optionalfor) {
-				optionalfor_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.provides) {
-				provides_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.replaces) {
-				replaces_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.conflicts) {
-				conflicts_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.groups) {
-				groups_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.backups) {
-				backups_priv.append (str);
-			}
-		}
 	}
 
 	public class AURPackage: Object {
-		AURPackageStruct pkg_struct;
-		public string name { get {return pkg_struct.name;} }
-		public string version { get {return pkg_struct.version;} }
-		public string installed_version { get {return pkg_struct.installed_version;} }
-		public string desc { get {return pkg_struct.desc;} }
-		public double popularity { get {return pkg_struct.popularity;} }
-		public string packagebase { get {return pkg_struct.packagebase;} }
-		public uint64 lastmodified { get {return pkg_struct.lastmodified;} }
-		public uint64 outofdate { get {return pkg_struct.outofdate;} }
-		internal AURPackage () {
-			pkg_struct = AURPackageStruct () {
-				name = "",
-				version = "",
-				installed_version = "",
-				desc = "",
-				packagebase = ""
-			};
-		}
-		internal AURPackage.from_struct (owned AURPackageStruct pkg_struct) {
-			this.pkg_struct = (owned) pkg_struct;
+		public string name { get; internal set; default = "";}
+		public string version { get; internal set; default = "";}
+		public string installed_version { get; internal set; default = "";}
+		public string desc { get; internal set; default = "";}
+		public double popularity { get; internal set; }
+		public string packagebase { get; internal set; default = "";}
+		public uint64 lastmodified { get; internal set; }
+		public uint64 outofdate { get; internal set; }
+		internal AURPackage () {}
+		internal AURPackage.from_struct (AURPackageStruct pkg_struct) {
+			name = pkg_struct.name;
+			version = pkg_struct.version;
+			desc = pkg_struct.desc;
+			installed_version = pkg_struct.installed_version;
+			packagebase = pkg_struct.packagebase;
+			popularity = pkg_struct.popularity;
+			lastmodified = pkg_struct.lastmodified;
+			outofdate = pkg_struct.outofdate;
 		}
 	}
 
 	public class AURPackageDetails: Object {
-		AURPackageDetailsStruct pkg_struct;
-		public string name { get {return pkg_struct.name;} }
-		public string version { get {return pkg_struct.version;} }
-		public string desc { get {return pkg_struct.desc;} }
-		public double popularity { get {return pkg_struct.popularity;} }
-		public string packagebase { get {return pkg_struct.packagebase;} }
-		public string url { get {return pkg_struct.url;} }
-		public string maintainer { get {return pkg_struct.maintainer;} }
-		public uint64 firstsubmitted { get {return pkg_struct.firstsubmitted;} }
-		public uint64 lastmodified { get {return pkg_struct.lastmodified;} }
-		public uint64 outofdate { get {return pkg_struct.outofdate;} }
-		public uint64 numvotes  { get {return pkg_struct.numvotes;} }
-		List<string> licenses_priv;
-		List<string> depends_priv;
-		List<string> makedepends_priv;
-		List<string> checkdepends_priv;
-		List<string> optdepends_priv;
-		List<string> provides_priv;
-		List<string> replaces_priv;
-		List<string> conflicts_priv;
+		public string name { get; internal set; default = "";}
+		public string version { get; internal set; default = "";}
+		public string desc { get; internal set; default = "";}
+		public double popularity { get; internal set; }
+		public string packagebase { get; internal set; default = "";}
+		public string url { get; internal set; default = "";}
+		public string maintainer { get; internal set; default = "";}
+		public uint64 firstsubmitted { get; internal set; }
+		public uint64 lastmodified { get; internal set; }
+		public uint64 outofdate { get; internal set; }
+		public uint64 numvotes  { get; internal set; }
+		internal List<string> licenses_priv;
+		internal List<string> depends_priv;
+		internal List<string> makedepends_priv;
+		internal List<string> checkdepends_priv;
+		internal List<string> optdepends_priv;
+		internal List<string> provides_priv;
+		internal List<string> replaces_priv;
+		internal List<string> conflicts_priv;
 		public List<string> licenses { get {return licenses_priv;} }
 		public List<string> depends { get {return depends_priv;} }
 		public List<string> makedepends { get {return makedepends_priv;} }
@@ -212,14 +163,6 @@ namespace Pamac {
 		public List<string> replaces { get {return replaces_priv;} }
 		public List<string> conflicts { get {return conflicts_priv;} }
 		internal AURPackageDetails () {
-			pkg_struct = AURPackageDetailsStruct () {
-				name = "",
-				version = "",
-				desc = "",
-				packagebase = "",
-				url = "",
-				maintainer = ""
-			};
 			licenses_priv = new List<string> ();
 			depends_priv = new List<string> ();
 			makedepends_priv = new List<string> ();
@@ -229,41 +172,6 @@ namespace Pamac {
 			replaces_priv = new List<string> ();
 			conflicts_priv = new List<string> ();
 		}
-		internal AURPackageDetails.from_struct (owned AURPackageDetailsStruct pkg_struct_) {
-			this.pkg_struct = (owned) pkg_struct_;
-			licenses_priv = new List<string> ();
-			depends_priv = new List<string> ();
-			makedepends_priv = new List<string> ();
-			checkdepends_priv = new List<string> ();
-			optdepends_priv = new List<string> ();
-			provides_priv = new List<string> ();
-			replaces_priv = new List<string> ();
-			conflicts_priv = new List<string> ();
-			foreach (unowned string str in pkg_struct.licenses) {
-				licenses_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.depends) {
-				depends_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.makedepends) {
-				makedepends_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.checkdepends) {
-				checkdepends_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.optdepends) {
-				optdepends_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.provides) {
-				provides_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.replaces) {
-				replaces_priv.append (str);
-			}
-			foreach (unowned string str in pkg_struct.conflicts) {
-				conflicts_priv.append (str);
-			}
-		}
 	}
 
 	public class TransactionSummary: Object {
diff --git a/src/transaction-cli.vala b/src/transaction-cli.vala
index e0d20411c8a2162a7070efb906b9f829115627c5..5bfedfb51f5732e1bd20d950495040c10cc50a83 100644
--- a/src/transaction-cli.vala
+++ b/src/transaction-cli.vala
@@ -350,7 +350,7 @@ namespace Pamac {
 			// first pass to compute pkgs size and strings length
 			if (summary.to_remove.length () > 0) {
 				foreach (unowned Package pkg in summary.to_remove) {
-					rsize += pkg.size;
+					rsize += pkg.installed_size;
 					if (pkg.name.length > name_length) {
 						name_length = pkg.name.length;
 					}
@@ -366,7 +366,7 @@ namespace Pamac {
 				foreach (unowned Package pkg in summary.to_downgrade) {
 					dsize += pkg.download_size;
 					var installed_pkg = database.get_installed_pkg (pkg.name);
-					isize += ((int64) pkg.size - (int64) installed_pkg.size);
+					isize += ((int64) pkg.installed_size - (int64) installed_pkg.installed_size);
 					if (pkg.name.length > name_length) {
 						name_length = pkg.name.length;
 					}
@@ -398,7 +398,7 @@ namespace Pamac {
 				foreach (unowned Package pkg in summary.to_install) {
 					dsize += pkg.download_size;
 					var installed_pkg = database.get_installed_pkg (pkg.name);
-					isize += ((int64) pkg.size - (int64) installed_pkg.size);
+					isize += ((int64) pkg.installed_size - (int64) installed_pkg.installed_size);
 					if (pkg.name.length > name_length) {
 						name_length = pkg.name.length;
 					}
@@ -428,7 +428,7 @@ namespace Pamac {
 				foreach (unowned Package pkg in summary.to_upgrade) {
 					dsize += pkg.download_size;
 					var installed_pkg = database.get_installed_pkg (pkg.name);
-					isize += ((int64) pkg.size - (int64) installed_pkg.size);
+					isize += ((int64) pkg.installed_size - (int64) installed_pkg.installed_size);
 					if (pkg.name.length > name_length) {
 						name_length = pkg.name.length;
 					}
diff --git a/src/transaction.vala b/src/transaction.vala
index 6bbc7fa52cdb28cc7af870114b31a47850d7ad1e..bec2c6774377cfd0fa297a0de2859297a3cbaf58 100644
--- a/src/transaction.vala
+++ b/src/transaction.vala
@@ -412,23 +412,23 @@ namespace Pamac {
 					string desc = "";
 					string arch = Posix.utsname ().machine;
 					var pkgnames_found = new SList<string> ();
-					var global_depends = new GenericArray<string> ();
+					var global_depends = new List<string> ();
 					var global_checkdepends = new SList<string> ();
 					var global_makedepends = new SList<string> ();
-					var global_conflicts = new GenericArray<string> ();
-					var global_provides = new GenericArray<string> ();
-					var global_replaces = new GenericArray<string> ();
-					var global_validpgpkeys = new GenericArray<string> ();
-					var pkgnames_table = new HashTable<string, AURPackageDetailsStruct?> (str_hash, str_equal);
+					var global_conflicts = new List<string> ();
+					var global_provides = new List<string> ();
+					var global_replaces = new List<string> ();
+					var global_validpgpkeys = new SList<string> ();
+					var pkgnames_table = new HashTable<string, AURPackageDetails> (str_hash, str_equal);
 					while ((line = yield dis.read_line_async ()) != null) {
 						if ("pkgbase = " in line) {
 							pkgbase = line.split (" = ", 2)[1];
 						} else if ("pkgdesc = " in line) {
 							desc = line.split (" = ", 2)[1];
 							if (!current_section_is_pkgbase) {
-								unowned AURPackageDetailsStruct? details_struct = pkgnames_table.get (current_section);
-								if (details_struct != null) {
-									details_struct.desc = desc;
+								unowned AURPackageDetails? details = pkgnames_table.get (current_section);
+								if (details != null) {
+									details.desc = desc;
 								}
 							}
 						} else if ("pkgver = " in line) {
@@ -453,16 +453,16 @@ namespace Pamac {
 								string depend = line.split (" = ", 2)[1];
 								if (current_section_is_pkgbase){
 									if ("checkdepends" in line) {
-										global_checkdepends.append (depend);
+										global_checkdepends.append ((owned) depend);
 									} else if ("makedepends" in line) {
-										global_makedepends.append (depend);
+										global_makedepends.append ((owned) depend);
 									} else {
-										global_depends.add (depend);
+										global_depends.append ((owned) depend);
 									}
 								} else {
-									unowned AURPackageDetailsStruct? details_struct = pkgnames_table.get (current_section);
-									if (details_struct != null) {
-										details_struct.depends += depend;
+									unowned AURPackageDetails? details = pkgnames_table.get (current_section);
+									if (details != null) {
+										details.depends_priv.append ((owned) depend);
 									}
 								}
 							}
@@ -470,11 +470,11 @@ namespace Pamac {
 							if ("provides = " in line || "provides_%s = ".printf (arch) in line) {
 								string provide = line.split (" = ", 2)[1];
 								if (current_section_is_pkgbase) {
-									global_provides.add (provide);
+									global_provides.append ((owned) provide);
 								} else {
-									unowned AURPackageDetailsStruct? details_struct = pkgnames_table.get (current_section);
-									if (details_struct != null) {
-										details_struct.provides += provide;
+									unowned AURPackageDetails? details = pkgnames_table.get (current_section);
+									if (details != null) {
+										details.provides_priv.append ((owned) provide);
 									}
 								}
 							}
@@ -482,11 +482,11 @@ namespace Pamac {
 							if ("conflicts = " in line || "conflicts_%s = ".printf (arch) in line) {
 								string conflict = line.split (" = ", 2)[1];
 								if (current_section_is_pkgbase) {
-									global_conflicts.add (conflict);
+									global_conflicts.append ((owned) conflict);
 								} else {
-									unowned AURPackageDetailsStruct? details_struct = pkgnames_table.get (current_section);
-									if (details_struct != null) {
-										details_struct.conflicts += conflict;
+									unowned AURPackageDetails? details = pkgnames_table.get (current_section);
+									if (details != null) {
+										details.conflicts_priv.append ((owned) conflict);
 									}
 								}
 							}
@@ -494,31 +494,30 @@ namespace Pamac {
 							if ("replaces = " in line || "replaces_%s = ".printf (arch) in line) {
 								string replace = line.split (" = ", 2)[1];
 								if (current_section_is_pkgbase) {
-									global_replaces.add (replace);
+									global_replaces.append ((owned) replace);
 								} else {
-									unowned AURPackageDetailsStruct? details_struct = pkgnames_table.get (current_section);
-									if (details_struct != null) {
-										details_struct.replaces += replace;
+									unowned AURPackageDetails? details = pkgnames_table.get (current_section);
+									if (details != null) {
+										details.replaces_priv.append ((owned) replace);
 									}
 								}
 							}
 						// grab validpgpkeys to check if they are imported
 						} else if ("validpgpkeys" in line) {
 							if ("validpgpkeys = " in line) {
-								global_validpgpkeys.add (line.split (" = ", 2)[1]);
+								global_validpgpkeys.append (line.split (" = ", 2)[1]);
 							}
 						} else if ("pkgname = " in line) {
 							string pkgname_found = line.split (" = ", 2)[1];
 							current_section = pkgname_found;
 							current_section_is_pkgbase = false;
 							if (!pkgnames_table.contains (pkgname_found)) {
-								var details_struct = AURPackageDetailsStruct () {
-									name = pkgname_found,
-									version = version.str,
-									desc = desc,
-									packagebase = pkgbase
-								};
-								pkgnames_table.insert (pkgname_found, (owned) details_struct);
+								var details = new AURPackageDetails ();
+								details.name = pkgname_found;
+								details.version = version.str;
+								details.desc = desc;
+								details.packagebase = pkgbase;
+								pkgnames_table.insert (pkgname_found, details);
 								pkgnames_found.append ((owned) pkgname_found);
 							}
 						}
@@ -528,33 +527,33 @@ namespace Pamac {
 					}
 					// create fake aur db entries
 					foreach (unowned string pkgname_found in pkgnames_found) {
-						unowned AURPackageDetailsStruct? details_struct = pkgnames_table.get (pkgname_found);
+						unowned AURPackageDetails? details = pkgnames_table.get (pkgname_found);
 						// populate empty list will global ones
-						if (global_depends.length > 0 && details_struct.depends.length == 0) {
-							details_struct.depends = (owned) global_depends.data;
+						if (global_depends.length () > 0 && details.depends.length () == 0) {
+							details.depends_priv = (owned) global_depends;
 						}
-						if (global_provides.length > 0 && details_struct.provides.length == 0) {
-							details_struct.provides = (owned) global_provides.data;
+						if (global_provides.length () > 0 && details.provides.length () == 0) {
+							details.provides_priv = (owned) global_provides;
 						}
-						if (global_conflicts.length > 0 && details_struct.conflicts.length == 0) {
-							details_struct.conflicts = (owned) global_conflicts.data;
+						if (global_conflicts.length () > 0 && details.conflicts.length () == 0) {
+							details.conflicts_priv = (owned) global_conflicts;
 						}
-						if (global_replaces.length > 0 && details_struct.replaces.length == 0) {
-							details_struct.replaces = (owned) global_replaces.data;
+						if (global_replaces.length () > 0 && details.replaces.length () == 0) {
+							details.replaces_priv = (owned) global_replaces;
 						}
 						// add checkdepends and makedepends in depends
 						if (global_checkdepends.length () > 0 ) {
 							foreach (unowned string depend in global_checkdepends) {
-								details_struct.depends += depend;
+								details.depends_priv.append (depend);
 							}
 						}
 						if (global_makedepends.length () > 0 ) {
 							foreach (unowned string depend in global_makedepends) {
-								details_struct.depends += depend;
+								details.depends_priv.append (depend);
 							}
 						}
 						// check deps
-						foreach (unowned string dep_string in details_struct.depends) {
+						foreach (unowned string dep_string in details.depends) {
 							var pkg = database.find_installed_satisfier (dep_string);
 							if (pkg.name == "") {
 								pkg = database.find_sync_satisfier (dep_string);
@@ -567,7 +566,7 @@ namespace Pamac {
 							}
 						}
 						// write desc file
-						string pkgdir = "%s-%s".printf (pkgname_found, details_struct.version);
+						string pkgdir = "%s-%s".printf (pkgname_found, details.version);
 						string pkgdir_path = "%s/%s".printf (aurdb_path, pkgdir);
 						aur_desc_list.add (pkgdir);
 						var file = GLib.File.new_for_path (pkgdir_path);
@@ -582,53 +581,53 @@ namespace Pamac {
 						// creating a DataOutputStream to the file
 						var dos = new DataOutputStream (file.create (FileCreateFlags.REPLACE_DESTINATION));
 						// fake filename
-						dos.put_string ("%FILENAME%\n" + "%s-%s-any.pkg.tar.xz\n\n".printf (pkgname_found, details_struct.version));
+						dos.put_string ("%FILENAME%\n" + "%s-%s-any.pkg.tar.xz\n\n".printf (pkgname_found, details.version));
 						// name
 						dos.put_string ("%NAME%\n%s\n\n".printf (pkgname_found));
 						// version
-						dos.put_string ("%VERSION%\n%s\n\n".printf (details_struct.version));
+						dos.put_string ("%VERSION%\n%s\n\n".printf (details.version));
 						// base
-						dos.put_string ("%BASE%\n%s\n\n".printf (details_struct.packagebase));
+						dos.put_string ("%BASE%\n%s\n\n".printf (details.packagebase));
 						// desc
-						dos.put_string ("%DESC%\n%s\n\n".printf (details_struct.desc));
+						dos.put_string ("%DESC%\n%s\n\n".printf (details.desc));
 						// arch (double %% before ARCH to escape %A)
 						dos.put_string ("%%ARCH%\n%s\n\n".printf (arch));
 						// depends
-						if (details_struct.depends.length > 0) {
+						if (details.depends.length () > 0) {
 							dos.put_string ("%DEPENDS%\n");
-							foreach (unowned string depend in details_struct.depends) {
+							foreach (unowned string depend in details.depends) {
 								dos.put_string ("%s\n".printf (depend));
 							}
 							dos.put_string ("\n");
 						}
 						// conflicts
-						if (details_struct.conflicts.length > 0) {
+						if (details.conflicts.length () > 0) {
 							dos.put_string ("%CONFLICTS%\n");
-							foreach (unowned string conflict in details_struct.conflicts) {
+							foreach (unowned string conflict in details.conflicts) {
 								dos.put_string ("%s\n".printf (conflict));
 							}
 							dos.put_string ("\n");
 						}
 						// provides
-						if (details_struct.provides.length > 0) {
+						if (details.provides.length () > 0) {
 							dos.put_string ("%PROVIDES%\n");
-							foreach (unowned string provide in details_struct.provides) {
+							foreach (unowned string provide in details.provides) {
 								dos.put_string ("%s\n".printf (provide));
 							}
 							dos.put_string ("\n");
 						}
 						// replaces
-						if (details_struct.replaces.length > 0) {
+						if (details.replaces.length () > 0) {
 							dos.put_string ("%REPLACES%\n");
-							foreach (unowned string replace in details_struct.replaces) {
+							foreach (unowned string replace in details.replaces) {
 								dos.put_string ("%s\n".printf (replace));
 							}
 							dos.put_string ("\n");
 						}
 					}
 					// check signature
-					if (global_validpgpkeys.length > 0) {
-						yield check_signature (pkgname, global_validpgpkeys.data);
+					if (global_validpgpkeys.length () > 0) {
+						yield check_signature (pkgname, global_validpgpkeys);
 					}
 				} catch (GLib.Error e) {
 					stderr.printf ("Error: %s\n", e.message);
@@ -640,7 +639,7 @@ namespace Pamac {
 			}
 		}
 
-		async void check_signature (string pkgname, string[] keys) {
+		async void check_signature (string pkgname, SList<string> keys) {
 			foreach (unowned string key in keys) {
 				var launcher = new SubprocessLauncher (SubprocessFlags.STDOUT_SILENCE | SubprocessFlags.STDERR_SILENCE);
 				try {