diff -r 0af70fb03853 src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppImageBuilder.java
--- a/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppImageBuilder.java	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/linux/classes/jdk/jpackage/internal/LinuxAppImageBuilder.java	Wed Jul 17 10:02:38 2019 +0200
@@ -89,7 +89,7 @@
         this.appDir = root.resolve("app");
         this.appModsDir = appDir.resolve("mods");
         this.runtimeDir = root.resolve("runtime");
-        this.binDir = root.resolve("bin");
+        this.binDir = root.resolve(EXECUTABLE_DIR.fetchFrom(config));
         this.mdir = runtimeDir.resolve("lib");
         this.params = new HashMap<>();
         config.entrySet().stream().forEach(e -> params.put(
diff -r 0af70fb03853 src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.cpp
--- a/src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.cpp	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.cpp	Wed Jul 17 10:02:38 2019 +0200
@@ -75,9 +75,9 @@
     return result;
 }
 
-TString LinuxPlatform::GetPackageLauncherDirectory() {
+TString LinuxPlatform::GetPackageLauncherDirectory(TString executableDir) {
     return FilePath::IncludeTrailingSeparator(
-            GetPackageRootDirectory()) + _T("bin");
+            GetPackageRootDirectory()) + executableDir;
 }
 
 TString LinuxPlatform::GetPackageRuntimeBinDirectory() {
diff -r 0af70fb03853 src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.h
--- a/src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.h	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/linux/native/libapplauncher/LinuxPlatform.h	Wed Jul 17 10:02:38 2019 +0200
@@ -45,7 +45,7 @@
     virtual ~LinuxPlatform(void);
 
     TString GetPackageAppDirectory();
-    TString GetPackageLauncherDirectory();
+    TString GetPackageLauncherDirectory(TString executableDir);
     TString GetPackageRuntimeBinDirectory();
 
     virtual void ShowMessage(TString title, TString description);
diff -r 0af70fb03853 src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.h
--- a/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.h	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.h	Wed Jul 17 10:02:38 2019 +0200
@@ -56,7 +56,7 @@
     virtual TString GetAppName();
 
     TString GetPackageAppDirectory();
-    TString GetPackageLauncherDirectory();
+    TString GetPackageLauncherDirectory(TString executableDir);
     TString GetPackageRuntimeBinDirectory();
 
     virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
diff -r 0af70fb03853 src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.mm
--- a/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.mm	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/macosx/native/libapplauncher/MacPlatform.mm	Wed Jul 17 10:02:38 2019 +0200
@@ -100,7 +100,7 @@
             GetPackageRootDirectory()) + _T("Java");
 }
 
-TString MacPlatform::GetPackageLauncherDirectory() {
+TString MacPlatform::GetPackageLauncherDirectory(TString executableDir) {
     return FilePath::IncludeTrailingSeparator(
             GetPackageRootDirectory()) + _T("MacOS");
 }
diff -r 0af70fb03853 src/jdk.jpackage/share/classes/jdk/jpackage/internal/AbstractAppImageBuilder.java
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/AbstractAppImageBuilder.java	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/AbstractAppImageBuilder.java	Wed Jul 17 10:02:38 2019 +0200
@@ -212,6 +212,7 @@
                             + mainClass.replace("\\", "/"));
                 }
             }
+            out.println("app.executabledir=" + EXECUTABLE_DIR.fetchFrom(params));
 
             out.println();
             out.println("[JavaOptions]");
diff -r 0af70fb03853 src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/Arguments.java	Wed Jul 17 10:02:38 2019 +0200
@@ -144,6 +144,8 @@
         }),
 
         DESCRIPTION ("description", "d", OptionCategories.PROPERTY),
+        
+        EXECUTABLE_DIR ("executable-dir", OptionCategories.PROPERTY),
 
         VENDOR ("vendor", OptionCategories.PROPERTY),
 
diff -r 0af70fb03853 src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/StandardBundlerParam.java	Wed Jul 17 10:02:38 2019 +0200
@@ -222,6 +222,15 @@
                             : I18N.getString("param.description.default"),
                     (s, p) -> s
             );
+    
+    static final StandardBundlerParam<String> EXECUTABLE_DIR =
+            new StandardBundlerParam<>(
+                    Arguments.CLIOptions.EXECUTABLE_DIR.getId(),
+                    String.class,
+                    p -> "bin",
+                    (s, p) -> s
+            );
+    
 
     static final StandardBundlerParam<String> COPYRIGHT =
             new StandardBundlerParam<>(
diff -r 0af70fb03853 src/jdk.jpackage/share/classes/jdk/jpackage/internal/ValidOptions.java
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ValidOptions.java	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ValidOptions.java	Wed Jul 17 10:02:38 2019 +0200
@@ -94,6 +94,7 @@
             (Platform.getPlatform() == Platform.MAC) ?  USE.ALL : USE.INSTALL);
 
         if (Platform.getPlatform() == Platform.WINDOWS) {
+            options.put(CLIOptions.EXECUTABLE_DIR.getId(), USE.LAUNCHER);
             options.put(CLIOptions.WIN_CONSOLE_HINT.getId(), USE.LAUNCHER);
 
             options.put(CLIOptions.WIN_MENU_HINT.getId(), USE.INSTALL);
@@ -120,6 +121,7 @@
         }
 
         if (Platform.getPlatform() == Platform.LINUX) {
+            options.put(CLIOptions.EXECUTABLE_DIR.getId(), USE.LAUNCHER);
             options.put(CLIOptions.LINUX_BUNDLE_NAME.getId(), USE.INSTALL);
             options.put(CLIOptions.LINUX_DEB_MAINTAINER.getId(), USE.INSTALL);
             options.put(CLIOptions.LINUX_RPM_LICENSE_TYPE.getId(), USE.INSTALL);
diff -r 0af70fb03853 src/jdk.jpackage/share/native/libapplauncher/Package.cpp
--- a/src/jdk.jpackage/share/native/libapplauncher/Package.cpp	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/native/libapplauncher/Package.cpp	Wed Jul 17 10:02:38 2019 +0200
@@ -63,8 +63,6 @@
     FBootFields->FJavaOptions.SetAllowDuplicates(true);
     FBootFields->FPackageRootDirectory = platform.GetPackageRootDirectory();
     FBootFields->FPackageAppDirectory = platform.GetPackageAppDirectory();
-    FBootFields->FPackageLauncherDirectory =
-            platform.GetPackageLauncherDirectory();
     FBootFields->FAppDataDirectory = platform.GetAppDataDirectory();
 
     std::map<TString, TString> keys = platform.GetKeys();
@@ -72,6 +70,12 @@
     // Read from configure.cfg/Info.plist
     AutoFreePtr<ISectionalPropertyContainer> config =
             platform.GetConfigFile(platform.GetConfigFileName());
+    
+    TString executableDir;
+    config->GetValue(keys[CONFIG_SECTION_APPLICATION], 
+            keys[CONFIG_EXECUTABLEDIR_KEY], executableDir);    
+    FBootFields->FPackageLauncherDirectory =
+            platform.GetPackageLauncherDirectory(executableDir);
 
     config->GetValue(keys[CONFIG_SECTION_APPLICATION],
             keys[JPACKAGE_APP_DATA_DIR], FBootFields->FPackageAppDataDirectory);
diff -r 0af70fb03853 src/jdk.jpackage/share/native/libapplauncher/Platform.cpp
--- a/src/jdk.jpackage/share/native/libapplauncher/Platform.cpp	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/native/libapplauncher/Platform.cpp	Wed Jul 17 10:02:38 2019 +0200
@@ -76,7 +76,6 @@
             }
         }
     }
-
     return result;
 }
 
@@ -138,6 +137,8 @@
             _T("app.classpath")));
     keys.insert(std::map<TString, TString>::value_type(CONFIG_MODULEPATH_KEY,
             _T("app.modulepath")));
+    keys.insert(std::map<TString, TString>::value_type(CONFIG_EXECUTABLEDIR_KEY,
+            _T("app.executabledir")));    
     keys.insert(std::map<TString, TString>::value_type(APP_NAME_KEY,
             _T("app.name")));
     keys.insert(std::map<TString, TString>::value_type(JAVA_RUNTIME_KEY,
diff -r 0af70fb03853 src/jdk.jpackage/share/native/libapplauncher/Platform.h
--- a/src/jdk.jpackage/share/native/libapplauncher/Platform.h	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/share/native/libapplauncher/Platform.h	Wed Jul 17 10:02:38 2019 +0200
@@ -57,6 +57,7 @@
 #define CONFIG_MAINCLASSNAME_KEY  _T("CONFIG_MAINCLASSNAME_KEY")
 #define CONFIG_CLASSPATH_KEY      _T("CONFIG_CLASSPATH_KEY")
 #define CONFIG_MODULEPATH_KEY     _T("CONFIG_MODULEPATH_KEY")
+#define CONFIG_EXECUTABLEDIR_KEY  _T("CONFIG_EXECUTABLEDIR_KEY")
 #define APP_NAME_KEY              _T("APP_NAME_KEY")
 #define CONFIG_SPLASH_KEY         _T("CONFIG_SPLASH_KEY")
 #define CONFIG_APP_MEMORY         _T("CONFIG_APP_MEMORY")
@@ -193,7 +194,7 @@
     virtual TString GetAppDataDirectory() = 0;
 
     virtual TString GetPackageAppDirectory() = 0;
-    virtual TString GetPackageLauncherDirectory() = 0;
+    virtual TString GetPackageLauncherDirectory(TString executableDir) = 0;
     virtual TString GetPackageRuntimeBinDirectory() = 0;
     virtual TString GetAppName() = 0;
 
diff -r 0af70fb03853 src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsAppImageBuilder.java
--- a/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsAppImageBuilder.java	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/windows/classes/jdk/jpackage/internal/WindowsAppImageBuilder.java	Wed Jul 17 10:02:38 2019 +0200
@@ -126,7 +126,7 @@
         this.appModsDir = appDir.resolve("mods");
         this.runtimeDir = root.resolve("runtime");
         this.mdir = runtimeDir.resolve("lib");
-        this.binDir = root.resolve("bin");
+        this.binDir = root.resolve(EXECUTABLE_DIR.fetchFrom(config));
         Files.createDirectories(appDir);
         Files.createDirectories(runtimeDir);
     }
diff -r 0af70fb03853 src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.cpp
--- a/src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.cpp	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.cpp	Wed Jul 17 10:02:38 2019 +0200
@@ -150,9 +150,9 @@
             GetPackageRootDirectory()) + _T("app");
 }
 
-TString WindowsPlatform::GetPackageLauncherDirectory() {
+TString WindowsPlatform::GetPackageLauncherDirectory(TString executableDir) {
     return  FilePath::IncludeTrailingSeparator(
-            GetPackageRootDirectory()) + _T("bin");
+            GetPackageRootDirectory()) + executableDir;
 }
 
 TString WindowsPlatform::GetPackageRuntimeBinDirectory() {
diff -r 0af70fb03853 src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.h
--- a/src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.h	Mon Jul 15 09:44:36 2019 -0400
+++ b/src/jdk.jpackage/windows/native/libapplauncher/WindowsPlatform.h	Wed Jul 17 10:02:38 2019 +0200
@@ -53,7 +53,7 @@
     virtual TString GetAppName();
     virtual TString GetBundledJavaLibraryFileName(TString RuntimePath);
     TString GetPackageAppDirectory();
-    TString GetPackageLauncherDirectory();
+    TString GetPackageLauncherDirectory(TString executableDir);
     TString GetPackageRuntimeBinDirectory();
 
     virtual ISectionalPropertyContainer* GetConfigFile(TString FileName);
