###############################################################################
# Copyright (c) 2009, 2013, Oracle and/or its affiliates. All rights reserved.
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
# DEALINGS IN THE SOFTWARE.
#

diff --git a/modules/om/generic/omGeneric.c b/modules/om/generic/omGeneric.c
index 64ef7b7..7b40cb1 100644
--- a/modules/om/generic/omGeneric.c
+++ b/modules/om/generic/omGeneric.c
@@ -175,6 +175,11 @@ init_fontset(
 	if((font_set->substitute = init_fontdata(data->substitute,
 				   data->substitute_num)) == NULL)
 	    goto err;
+
+	/* Add for load_option */
+	font_set->delay_loading = data->delay_loading;
+	font_set->no_checking = data->no_checking;
+
 	font_set->substitute_num = data->substitute_num;
 	if((font_set->vmap = init_fontdata(data->vmap,
 			     data->vmap_num)) == NULL)
@@ -283,6 +288,10 @@ load_font(
 	if (font_set->font_name == NULL)
 	    continue;
 
+	/* no font structure is requeried here. don't load font now. */
+	if ((font_set->font != NULL) || (font_set->delay_loading))
+	    continue;
+
         if (load_fontset_data (oc, font_set) != True)
 	    return False;
 #ifndef TESTVERSION
@@ -332,12 +341,24 @@ load_font_info(
 	    continue;
 
 	if (font_set->info == NULL) {
+	     /* Handle for delay loading. */
+            if (font_set->delay_loading)
+		continue;
 	    fn_list = XListFontsWithInfo(dpy, font_set->font_name, 1, &fn_num,
 					 &font_set->info);
 	    if (font_set->info == NULL)
 		return False;
 
+#ifdef SUNSOFT
+            if (fn_num > 0) {
+                font_set->info->fid = XLoadFont(dpy, font_set->font_name);
+            }
+            if (fn_list) {
+                XFreeFontNames(fn_list);
+            }
+#else
 	    XFreeFontNames(fn_list);
+#endif
 	}
     }
 
@@ -453,7 +474,7 @@ init_core_part(
     count = length = 0;
 
     for ( ; font_set_num-- > 0; font_set++) {
-	if (font_set->font_name == NULL)
+	if (font_set->font_name == NULL || font_set->delay_loading) /* if delay_loading, continue */
 	    continue;
 
 	length += strlen(font_set->font_name) + 1;
@@ -483,7 +504,7 @@ init_core_part(
     font_set_num = gen->font_set_num;
 
     for (count = 0; font_set_num-- > 0; font_set++) {
-	if (font_set->font_name == NULL)
+	if (font_set->font_name == NULL || font_set->delay_loading) /* if delay_loading, continue */
 	    continue;
 
 	font_set->id = count;
@@ -1261,7 +1282,7 @@ set_missing_list(
     count = length = 0;
 
     for ( ; font_set_num-- > 0; font_set++) {
-	if (font_set->info || font_set->font) {
+	if (font_set->info || font_set->font || font_set->no_checking) {
 	    continue;
 	}
 
@@ -1308,7 +1329,7 @@ set_missing_list(
     font_set_num = gen->font_set_num;
 
     for ( ; font_set_num-- > 0; font_set++) {
-	if (font_set->info || font_set->font) {
+	if (font_set->info || font_set->font || font_set->no_checking) {
 	    continue;
 	}
 
@@ -2092,6 +2113,20 @@ init_om(
 	}
         read_vw(lcd,data,num);
 	length += strlen(data->font_data->name) + 1;
+
+	/* For load_option */
+	data->delay_loading = False;
+	data->no_checking = False;
+	snprintf(buf, BUFSIZ, "fs%d.font.load_option", num);
+	_XlcGetResource(lcd, "XLC_FONTSET", buf, &value, &count);
+	if (count > 0) {
+	    if (!strcmp(*value, "delay_check")) {
+	        data->delay_loading = True;
+	    } else if (!strcmp(*value, "delay_nocheck")) {
+	        data->delay_loading = True;
+	        data->no_checking = True;
+	    }
+	}
     }
 
     /* required charset list */
diff --git a/modules/om/generic/omXChar.c b/modules/om/generic/omXChar.c
index c9bbb8e..4f80ce0 100644
--- a/modules/om/generic/omXChar.c
+++ b/modules/om/generic/omXChar.c
@@ -285,6 +285,12 @@ load_font(
     XOC oc,
     FontSet font_set)
 {
+    /* Give up displaying any characters of this missing charset. */
+    if (font_set->delay_loading == False && font_set->font != NULL) {
+        return False;
+    }
+
+    /* In case of delay loading, load font here. */
     font_set->font = XLoadQueryFont(oc->core.om->core.display,
 			oc->core.font_info.font_name_list[font_set->id]);
     if (font_set->font == NULL)
@@ -330,8 +336,10 @@ _XomConvert(
     if (font_set == NULL)
 	return -1;
 
-    if (font_set->font == NULL && load_font(oc, font_set) == False)
-	return -1;
+    if (font_set->font == NULL || font_set->delay_loading) {
+        if (load_font(oc, font_set) == False)
+            return -1;
+    }
 
     length = *to_left - cs_left;
 
diff --git a/src/XomGeneric.h b/src/XomGeneric.h
index d6f182d..d8eaf89 100644
--- a/src/XomGeneric.h
+++ b/src/XomGeneric.h
@@ -81,6 +81,9 @@ typedef struct _OMDataRec {
     XlcCharSet 	*charset_list;
     int 	font_data_count;
     FontData 	font_data;
+    /* For load_option */
+    Bool delay_loading;
+    Bool no_checking;
     /* For VW/UDC */
     int substitute_num;
     FontData substitute;
@@ -120,6 +123,9 @@ typedef struct _FontSetRec {
     XFontStruct 	*font;
     XlcSide 		side;
     Bool 		is_xchar2b;
+    /* For load_option */
+    Bool delay_loading;
+    Bool no_checking;
     /* For VW/UDC */
     int 		substitute_num;
     FontData 		substitute;