diff --git a/dict/src/lib/plugin.h b/dict/src/lib/plugin.h
index a8199bd..6ad8cc6 100644
--- a/dict/src/lib/plugin.h
+++ b/dict/src/lib/plugin.h
@@ -65,6 +65,8 @@ struct StarDictPluginSystemService {
 	show_netdict_resp_func_t show_netdict_resp;
 	typedef void (*lookup_dict_func_t)(size_t dictid, const char *word, char ****Word, char *****WordData);
 	lookup_dict_func_t lookup_dict;
+	typedef void (*multi_lookup_dict_func_t)(size_t dictid, const char *word, char **dict_name, char *****Word, char ******WordData);
+	multi_lookup_dict_func_t multi_lookup_dict;
 	typedef void (*FreeResultData_func_t)(size_t dictmask_size, char ***pppWord, char ****ppppWordData);
 	FreeResultData_func_t FreeResultData;
 	typedef void (*ShowPangoTips_func_t)(const char *word, const char *text);
diff --git a/dict/src/lib/pluginmanager.cpp b/dict/src/lib/pluginmanager.cpp
index c2043f5..7cdfbf6 100644
--- a/dict/src/lib/pluginmanager.cpp
+++ b/dict/src/lib/pluginmanager.cpp
@@ -530,6 +530,11 @@ void StarDictVirtualDictPlugins::lookup(size_t iPlugin, const gchar *word, char
 	oPlugins[iPlugin]->lookup(word, pppWord, ppppWordData);
 }
 
+void StarDictVirtualDictPlugins::multi_lookup(size_t iPlugin, const gchar *word, char **dict_name, char ****pppWord, char *****ppppWordData)
+{
+	oPlugins[iPlugin]->multi_lookup(word, dict_name, pppWord, ppppWordData);
+}
+
 const char *StarDictVirtualDictPlugins::dict_name(size_t iPlugin)
 {
 	return oPlugins[iPlugin]->dict_name();
@@ -571,6 +576,11 @@ void StarDictVirtualDictPlugin::lookup(const char *word, char ***pppWord, char *
 	obj->lookup_func(word, pppWord, ppppWordData);
 }
 
+void StarDictVirtualDictPlugin::multi_lookup(const char *word, char **dict_name, char ****pppWord, char *****ppppWordData)
+{
+	obj->multi_lookup_func(word, dict_name, pppWord, ppppWordData);
+}
+
 const char *StarDictVirtualDictPlugin::dict_name()
 {
 	return obj->dict_name;
diff --git a/dict/src/lib/pluginmanager.h b/dict/src/lib/pluginmanager.h
index e06fcf5..da67ca8 100644
--- a/dict/src/lib/pluginmanager.h
+++ b/dict/src/lib/pluginmanager.h
@@ -70,6 +70,7 @@ public:
 	~StarDictVirtualDictPlugins();
 	void add(StarDictPluginBaseObject *baseobj, StarDictVirtualDictPlugInObject *virtualdict_plugin_obj);
 	void lookup(size_t iPlugin, const gchar *word, char ***pppWord, char ****ppppWordData);
+	void multi_lookup(size_t iPlugin, const gchar *word, char **dict_name, char ****pppWord, char *****ppppWordData);
 	size_t ndicts() { return oPlugins.size(); }
 	const char *dict_name(size_t iPlugin);
 	const char *dict_id(size_t iPlugin);
diff --git a/dict/src/stardict.cpp b/dict/src/stardict.cpp
index 99b0d6e..64b88e7 100644
--- a/dict/src/stardict.cpp
+++ b/dict/src/stardict.cpp
@@ -244,6 +244,26 @@ void AppCore::lookup_dict(size_t dictid, const char *sWord, char ****Word, char
 	g_free(iIndex);
 }
 
+void AppCore::multi_lookup_dict(size_t dictid, const char *sWord, char **dict_name, char *****Word, char ******WordData)
+{
+	while (*dict_name) {
+		InstantDictIndex instance_dict_index;
+		instance_dict_index.type = InstantDictType_LOCAL;
+		instance_dict_index.index = dictid;
+		std::vector<InstantDictIndex> dictmask;
+		dictmask.push_back(instance_dict_index);
+		bool bFound = false;
+		gchar ***pppWord = (gchar ***)g_malloc(sizeof(gchar **) * dictmask.size());
+		gchar ****ppppWordData = (gchar ****)g_malloc(sizeof(gchar ***) * dictmask.size());
+		CurrentIndex *iIndex = (CurrentIndex *)g_malloc(sizeof(CurrentIndex) * dictmask.size());
+		gpAppFrame->BuildResultData(dictmask, sWord, iIndex, NULL, 0, pppWord, ppppWordData, bFound, 2);
+		**Word = pppWord;
+		**WordData = ppppWordData;
+		g_free(iIndex);
+		dict_name++;
+	}
+}
+
 void AppCore::ShowPangoTips(const char *word, const char *text)
 {
 	gpAppFrame->oFloatWin.ShowPangoTips(word, text);
@@ -314,6 +334,7 @@ void AppCore::Create(const gchar *queryword)
 	oStarDictPluginSystemService.netdict_save_cache_resp = netdict_save_cache_resp;
 	oStarDictPluginSystemService.show_netdict_resp = show_netdict_resp;
 	oStarDictPluginSystemService.lookup_dict = lookup_dict;
+	oStarDictPluginSystemService.multi_lookup_dict = multi_lookup_dict;
 	oStarDictPluginSystemService.FreeResultData = FreeResultData;
 	oStarDictPluginSystemService.ShowPangoTips = ShowPangoTips;
 	std::list<DictItemId> plugin_new_install_list;
diff --git a/dict/src/stardict.h b/dict/src/stardict.h
index 02ac498..ecce875 100644
--- a/dict/src/stardict.h
+++ b/dict/src/stardict.h
@@ -195,6 +195,7 @@ public:
 	static void set_news(const char *news, const char *links);
 	static void show_netdict_resp(const char *dict, NetDictResponse *resp, bool ismainwin);
 	static void lookup_dict(size_t dictid, const char *sWord, char ****Word, char *****WordData);
+	static void multi_lookup_dict(size_t dictid, const char *sWord, char **dict_name, char *****Word, char ******WordData);
 	static void ShowPangoTips(const char *word, const char *text);
 };
 
diff --git a/dict/stardict-plugins/stardict-multi-cmd-plugin/stardict_multi_cmd.cpp b/dict/stardict-plugins/stardict-multi-cmd-plugin/stardict_multi_cmd.cpp
index c660577..012e5bb 100644
--- a/dict/stardict-plugins/stardict-multi-cmd-plugin/stardict_multi_cmd.cpp
+++ b/dict/stardict-plugins/stardict-multi-cmd-plugin/stardict_multi_cmd.cpp
@@ -35,6 +35,11 @@ static std::list<std::string> Command_List;
 
 static void multi_lookup(const char *text, char **dict_name, char ****pppWord, char *****ppppWordData)
 {
+	dict_name = (gchar **)g_malloc(sizeof(gchar *)*1);
+	pppWord = (gchar ****)g_malloc(sizeof(gchar *)*1);
+	ppppWordData = (gchar *****)g_malloc(sizeof(gchar **)*(1));
+
+	size_t dict_count = 0;
 	for(std::list<std::string>::const_iterator it = Command_List.begin(); it != Command_List.end(); ++it) {
 		if (it->empty()) {
 			continue;
@@ -76,15 +81,23 @@ static void multi_lookup(const char *text, char **dict_name, char ****pppWord, c
 			pango += *it;
 			pango += _("</span> program is not found! Please install it!</b>");
 		}
-		*dict_name = (gchar **)g_malloc(sizeof(gchar *)*2);
-		*pppWord = (gchar **)g_malloc(sizeof(gchar *)*2);
-		(*pppWord)[0] = g_strdup(it->c_str());
-		(*pppWord)[1] = NULL;
-		*ppppWordData = (gchar ***)g_malloc(sizeof(gchar **)*(1));
-		(*ppppWordData)[0] = (gchar **)g_malloc(sizeof(gchar *)*2);
-		(*ppppWordData)[0][0] =  plugin_service->build_dictdata('g', pango.c_str());
-		(*ppppWordData)[0][1] = NULL;
+		dict_count++;
+		std::string dict_name1 = _("Multi Command - ");
+		dict_name1 += it->c_str();
+		dict_name = (gchar **)g_realloc(dict_name, sizeof(gchar *)*dict_count);
+		pppWord = (gchar ****)g_realloc(pppWord, sizeof(gchar *)*dict_count);
+		ppppWordData = (gchar *****)g_realloc(ppppWordData, sizeof(gchar **)*(dict_count));
+		dict_name[dict_count-1] = (gchar *)g_strdup(dict_name1.c_str());
+		pppWord[dict_count-1] = (gchar ***)g_malloc(sizeof(gchar *)*2);
+		pppWord[dict_count-1][0] = (gchar **)g_strdup(text);
+		pppWord[dict_count-1][1] = NULL;
+		ppppWordData[dict_count-1] = (gchar ****)g_malloc(sizeof(gchar **)*(1));
+		ppppWordData[dict_count-1][0] = (gchar ***)g_malloc(sizeof(gchar *)*2);
+		ppppWordData[dict_count-1][0][0] =  (gchar **)plugin_service->build_dictdata('g', pango.c_str());
+		ppppWordData[dict_count-1][0][1] = (gchar **)NULL;
 	}
+	dict_name = (gchar **)g_realloc(dict_name, dict_count+1);
+	dict_name[dict_count] = (gchar *)'\0';
 }
 
 void on_cmd_path_defaultbutton_clicked(GtkWidget *widget, GtkTextBuffer *buffer)
