diff -r 63748ba51c2e modules/local_fonts/local_fonts.module
--- a/modules/local_fonts/local_fonts.module	Wed Jul 11 14:39:47 2012 +0700
+++ b/modules/local_fonts/local_fonts.module	Wed Jul 11 17:33:22 2012 +0700
@@ -28,6 +28,14 @@
     'type' => MENU_LOCAL_TASK,
   );
 
+  $items['admin/config/user-interface/fontyourface/import_local_fonts'] = array(
+    'title' => 'Batch Import Local Font',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('local_fonts_import_form'),
+    'access arguments' => array('administer @font-your-face'),
+    'type' => MENU_LOCAL_TASK,
+  );
+
   $items['admin/appearance/fontyourface/local_fonts/delete/%'] = array(
     'title' => 'Delete Local Font',
     'page callback' => 'drupal_get_form',
@@ -83,6 +91,117 @@
 } // local_fonts_delete_button_submit
 
 /**
+ * Mass import fontface...
+ *
+ * font name must have some suffix like this:
+ *   _I: Italic
+ *   _B: Bold
+ *   _R: Regular
+ *   _BI: Bold Italic
+ */
+function local_fonts_import_form($form, &$form_state) {
+	if (!isset($form_state['storage']['files'])) {
+		$form_state['storage']['step'] = 'choose';
+		$form_state['storage']['next_step'] = 'preview';
+		$form['directory'] = array(
+				'#type' => 'textfield',
+				'#title' => t('Directory'),
+				'#required' => TRUE,
+		);
+
+		$form['actions'] = array('#type' => 'actions');
+		$form['actions']['submit'] = array(
+				'#type' => 'submit',
+				'#value' => t('Preview')
+		);
+		$form['actions']['cancel'] = array(
+				'#type' => 'link',
+				'#title' => t('Cancel'),
+				'#href' => isset($_GET['destination']) ? $_GET['destination'] : 'admin/content/file',
+		);
+	}
+	else {
+		$form['preview'] = array(
+				'#markup' => theme('item_list', array('items' => array_keys($form_state['storage']['files']))),
+		);
+
+		$form = confirm_form($form, t('Import these files?'), 'admin/config/user-interface/fontyourface/local_fonts/import');
+	}
+	return $form;
+}
+
+
+/**
+ * Validate the local font import form
+ * @param unknown_type $form
+ * @param unknown_type $form_state
+ */
+function local_fonts_import_form_validate($form, &$form_state) {
+	if ($form_state['values']['op'] != t('Confirm')) {
+		// Find all files with extension:
+		$directory = $form_state['values']['directory'];
+		$pattern = '*.{eot,svg,ttf,woff}';
+		if (!is_dir($directory)) {
+			form_set_error('directory', t('The provided directory does not exist.'));
+		}
+		$pattern = !empty($pattern) ? $pattern :  '*';
+		$files = glob("$directory/$pattern", GLOB_BRACE);
+		$fonts = array();
+		foreach ($files as $filepath){
+			$filename = pathinfo($filepath, PATHINFO_FILENAME);
+			$ext = pathinfo($filepath, PATHINFO_EXTENSION);
+			// Check to see if the current font has the style?
+			$css_family = pathinfo($filename, PATHINFO_BASENAME);
+			$css_weight = 'normal';
+			$css_style = 'normal';
+			if (stripos($filename, '_BI')) {
+				$css_weight = 'bold';
+				$css_style = 'italic';
+				$css_family = substr($css_family, 0, strlen($css_family) - 3);
+			} elseif (stripos($filename, '_I')) {
+				$css_style = 'italic';
+				$css_family = substr($css_family, 0, strlen($css_family) - 2);
+			} elseif (stripos($filename, '_B')) {
+				$css_weight = 'bold';
+				$css_family = substr($css_family, 0, strlen($css_family) - 2);
+			} elseif (stripos($filename, '_R')) {
+				$css_family = substr($css_family, 0, strlen($css_family) - 2);
+			}
+			$fonts[$css_family . '-' . $css_style . '-' . $css_weight][$ext] = array('filepath' => $filepath, 'css_family' => $css_family, 'filename' => $filename, 'ext' => $ext, 'css_weight' => $css_weight, 'css_style' => $css_style);
+		}
+		if (empty($files)) {
+			form_set_error('pattern', t('No files were found in %directory matching %pattern', array('%directory' => $directory, '%pattern' => $pattern)));
+		}
+		$form_state['storage']['files'] = $fonts;
+	}
+}
+/**
+ * Handle the local import form
+ * @param unknown_type $form
+ * @param unknown_type $form_state
+ */
+function local_fonts_import_form_submit($form, &$form_state) {
+	if ($form_state['values']['op'] == t('Confirm')) {
+		$files = $form_state['storage']['files'];
+		$ops = array();
+		foreach ($files as $file){
+			$ops[] = array(
+					'local_fonts_import',
+					array($file)
+			);
+		}
+		$batch = array(
+				'title' => t('Importing'),
+				'operations' => $ops,
+				'finished' => 'local_fonts_import_batch_import_complete',
+		);
+		batch_set($batch);
+		return;
+	}
+	$form_state['rebuild'] = TRUE;
+}
+
+/**
  * Form for submitting a local font.
  */
 function local_fonts_add_form($form, $form_state) {
@@ -165,6 +284,155 @@
   return $form;
 
 } // local_fonts_add_form
+
+/**
+ * BatchAPI callback op for media import
+ */
+function local_fonts_import($font) {
+	global $user;
+	$stream_wrappers = file_get_stream_wrappers();
+	if($stream_wrappers['public']) {
+		$scheme = 'public';
+	}
+	$files = array();
+	foreach ($font as $ext => $values){
+		$font_path = strtr(preg_replace('#[^a-zA-Z0-9]+#', ' ', $values['css_family']), ' ', '_') . '-' . $values['css_style'] . '-' . $values['css_weight'];
+		$font_family = $values['css_family'];
+		$font_style = $values['css_style'];
+		$font_weight = $values['css_weight'];
+		$local_fonts_directory = dirname($_SERVER['SCRIPT_FILENAME']) . '/' . file_stream_wrapper_get_instance_by_scheme('public')->getDirectoryPath() . '/fontyourface/local_fonts';
+		$destination_directory = $local_fonts_directory . '/' . $font_path;
+
+		$validators['file_validate_extensions'][] = 'eot ttf svg woff css';
+		$files[$ext] = $values['filepath'];
+	}
+
+	$combined_sources = array();
+	$src = '';
+
+	if (
+			(file_prepare_directory($local_fonts_directory, FILE_CREATE_DIRECTORY)) &&
+			(file_prepare_directory($destination_directory, FILE_CREATE_DIRECTORY))
+	) {
+
+		$destination_directory = $scheme . '://' . 'fontyourface/local_fonts/' . $font_path;
+		$destination_css_file = $destination_directory . '/stylesheet.css';
+
+		foreach ($files as $key => $filename) {
+
+			$format = $key;
+
+			// Everything but TTF matches the extension.
+
+			if ($format == 'ttf') {
+				$format = 'truetype';
+			} // if
+
+			$uri = file_stream_wrapper_uri_normalize(drupal_realpath($filename));
+			if (!empty($filename)) {
+				// Create a file object.
+				$file = new stdClass();
+				$file->fid = NULL;
+				$file->uri = $uri;
+				$file->filename = drupal_basename($uri);
+				$file->filemime = file_get_mimetype($file->uri);
+				$file->uid      = $user->uid;
+				$file->status   = FILE_STATUS_PERMANENT;
+
+				if ($file = file_copy($file, $destination_directory . '/' . $file->filename, FILE_EXISTS_REPLACE)) {
+
+					// Copy the temporary file to permanent location.
+
+					$file->status = FILE_STATUS_PERMANENT;
+					$file = file_save($file);
+
+					if ($format == 'eot') {
+
+						// EOT gets special treatment to trick IE
+						// into working right.
+
+						$src .= '  src: url("' . $file->filename . '");' . "\n";
+						$combined_sources[] = 'url("' . $file->filename . '?#iefix") format("embedded-opentype")';
+
+					} // if
+					elseif ($format == 'svg') {
+
+						// Get the font ID from the SVG file.
+						$svg = file_get_contents($file->uri);
+						$hash = '';
+
+						if (preg_match('#<font([^>]+)>#i', $svg, $font_tag_match)) {
+
+							if (preg_match('#id="([^"]+)"#i', $font_tag_match[1], $id_match)) {
+								$hash = $id_match[1];
+							} // if
+							elseif (preg_match("#id='([^']+)'#i", $font_tag_match[1], $id_match)) {
+								$hash = $id_match[1];
+							} // elseif
+
+						} // if
+
+						$url = $file->filename . '#' . $hash;
+						$combined_sources[] = 'url("' . $url . '") format("' . $format . '")';
+
+					} // elseif
+					else {
+
+						$combined_sources[] = 'url("' . $file->filename . '") format("' . $format . '")';
+
+					} // else
+
+				} // if
+
+			} // if
+
+		} // foreach
+
+		if (count($combined_sources) > 0) {
+
+			// Add a fake local font name first to prevent name conflicts with local fonts.
+
+			$src .= '  src: ' . implode(', ', $combined_sources) . ';' . "\n";
+
+		} // if
+
+		$generated_css = '@font-face {' . "\n";
+		$generated_css .= "  font-family: '" . $font_family . "';" . "\n";
+		$generated_css .= $src;
+		$generated_css .= '  font-style: ' . $font_style . ';' . "\n";
+		$generated_css .= '  font-weight: ' . $font_weight . ';' . "\n";
+		$generated_css .= '}' . "\n";
+		$css_file = file_unmanaged_save_data($generated_css, $destination_css_file, FILE_EXISTS_REPLACE);
+
+		$local_font = new stdClass;
+		$local_font->name = $font_family . ' ' . $font_style . ' ' . $font_weight;
+		$local_font->url = 'http://localhost/#' . md5($local_font->name);
+		$local_font->css_family = $font_family;
+		$local_font->css_style = $font_style;
+		$local_font->css_weight = $font_weight;
+		$local_font->provider = 'local_fonts';
+		$local_font->metadata = serialize(array('path' => $destination_css_file));
+		$local_font->tags = array();
+
+		fontyourface_save_font($local_font);
+		return TRUE;
+
+
+	} // if
+
+}
+
+/**
+ * BatchAPI complete callback for media import.
+ */
+function local_fonts_import_batch_import_complete($success, $results, $operations) {
+	if (isset($results['errors'])) {
+		drupal_set_message(theme('item_list', array('items' => $results['errors'])), 'error');
+	}
+	if (isset($results['success'])) {
+		drupal_set_message(theme('item_list', array('items' => $results['success'])));
+	}
+}
 
 /**
  * Implements hook_form_validate().
@@ -351,6 +619,9 @@
   drupal_goto('admin/config/user-interface/fontyourface');
 
 } // local_fonts_add_form_submit
+/**
+ * Implements hook_form_submit().
+ */
 
 /**
  * Form for deleting a local font.
