diff --git a/doc/man/ade-info.1 b/doc/man/ade-info.1
index 56d404f48742738e9eb38e28b4bea7612cc30e55..2c1dd2a41bea8acfe3631521f7910781b02c19c5 100644
--- a/doc/man/ade-info.1
+++ b/doc/man/ade-info.1
@@ -12,6 +12,7 @@ ade-info \- Print information about an entity
 .SH SYNOPSIS
 .sp
 .nf
+\fIade info\fR --bundle <bundle>
 \fIade info\fR --device [<user>[:<pass>]@]<hostname>[:<port>]
 \fIade info\fR --project
 \fIade info\fR --sdk
@@ -25,6 +26,12 @@ Retrieve information about a sysroot or another ADE object\&.
 .SH OPTIONS
 .sp
 .PP
+\fI\-\-bundle\fR
+.RS 4
+Return ID and version of given bundle\&.
+.sp
+.RE
+.PP
 \fI\-\-device\fR
 .RS 4
 Return image version of given device (e.g. user@apertis)\&.
diff --git a/tools/ade b/tools/ade
index 862f99fde51b24cc0a4045863072535e163b56ce..3fa0c497216b1402c85615814ce5af0d9f1dee75 100755
--- a/tools/ade
+++ b/tools/ade
@@ -31,6 +31,7 @@ import urllib
 import xdg.BaseDirectory
 
 from contextlib import contextmanager, closing
+from gi.repository import GLib, Gio
 from urllib.error import URLError
 from urllib.parse import urlparse
 from urllib.request import urlopen, urlretrieve
@@ -744,8 +745,10 @@ class Bundle:
         bundle = Bundle(path, project.bundle_id, project.version)
 
         with tempfile.TemporaryDirectory() as tmpdir:
+            builddir = os.path.join(tmpdir, 'build')
             bundledir = os.path.join(tmpdir, 'bundle')
             repodir = os.path.join(tmpdir, 'repo')
+            os.makedirs(builddir)
             os.makedirs(bundledir)
 
             with open(os.path.join(bundledir, 'metadata'), 'w') as f:
@@ -753,8 +756,9 @@ class Bundle:
                 f.write("name={0}\n".format(bundle.id))
                 f.write("X-Apertis-BundleVersion={0}".format(bundle.version))
             os.makedirs(os.path.join(bundledir, 'export'))
-            os.makedirs(os.path.join(bundledir, 'files'))
-            project.install(os.path.join(bundledir, 'files'))
+            project.install(builddir)
+            shutil.copytree(os.path.join(builddir, 'Application', bundle.id),
+                            os.path.join(bundledir, 'files'))
 
             cmd = ['flatpak', 'build-export', repodir, bundledir]
             ret = subprocess.run(cmd)
@@ -768,6 +772,25 @@ class Bundle:
 
         return bundle
 
+    def from_file(path):
+        bundle_file = Gio.File.new_for_path(path)
+
+        m = GLib.MappedFile.new(path, False)
+        b = m.get_bytes()
+        m.unref()
+
+        varianttype = GLib.VariantType.new('(a{sv}tayay(a{sv}aya(say)sstayay)aya(uayttay)a(yaytt))')
+        bundle = GLib.Variant.new_from_bytes(varianttype, b, False)
+        bundle.ref_sink()
+        metadata = bundle.get_child_value(0).lookup_value('metadata', None).get_string()
+
+        parser = configparser.ConfigParser()
+        parser.read_string(metadata)
+
+        return Bundle(path,
+                parser['Application']['name'],
+                parser['Application']['X-Apertis-BundleVersion'])
+
 
 class Ade:
 
@@ -787,6 +810,7 @@ class Ade:
         self.sysroot = None
         self.device = None
         self.project = False
+        self.bundle = None
 
         self.bundle_id = None
 
@@ -877,6 +901,11 @@ class Ade:
                 self.target = Project()
             except InvalidProjectError as e:
                 self.die("Invalid project: {0}".format(e))
+        elif self.bundle:
+            try:
+                self.target = Bundle.from_file(self.bundle)
+            except InvalidBundleError as e:
+                self.die("Invalid bundle: {0}".format(e))
         else:
             self.die("No target (simulator, sysroot or device) specified")
 
@@ -1094,6 +1123,12 @@ class Ade:
                 print("ProjectName:{0}".format(self.target.name))
                 print("BundleId:{0}".format(self.target.bundle_id))
                 print("AppVersion:{0}".format(self.target.version))
+        elif isinstance(target, Bundle):
+            self.info("* BundleId: {0}".format(self.target.id))
+            self.info("* Version: {0}".format(self.target.version))
+            if self.format == 'parseable':
+                print("BundleId:{0}".format(self.target.id))
+                print("AppVersion:{0}".format(self.target.version))
 
     def do_configure(self):
         target = self.get_target()
@@ -1171,6 +1206,7 @@ if __name__ == '__main__':
     group.add_argument('--sysroot', help="Use sysroot as target (e.g. apertis-16.12-armhf)")
     group.add_argument('--device', help="Use device as target (e.g. user:pass@apertis)")
     group.add_argument('--project', help="Use current directory project as target", action='store_true')
+    group.add_argument('--bundle', help="Use bundle file as target")
 
     # Sysroot parser
     sysroot_parser = subparsers.add_parser('sysroot', help='Sysroot related commands')