diff -urN epm-3.7-old//bsd.c epm-3.7/bsd.c
--- misc/epm-3.7/bsd.c	2003-01-14 17:05:01.000000000 +0000
+++ misc/build/epm-3.7/bsd.c	2010-04-19 22:52:32.000000000 +0000
@@ -26,6 +26,13 @@
 
 #include "epm.h"
 
+void cr2semicolon(char *command)
+{
+  int len, i;
+  len=strlen(command);
+  for (i=0;i<len;i++)
+    if(*(command+i)=='\n') *(command+i)=';';
+}
 
 /*
  * 'make_bsd()' - Make a FreeBSD software distribution package.
@@ -149,8 +156,17 @@
 
   for (i = dist->num_depends, d = dist->depends; i > 0; i --, d ++)
   {
+#ifdef __FreeBSD__
+    if (d->type == DEPEND_REQUIRES) {
+      if (dist->relnumber)
+	  fprintf(fp, "@pkgdep %s-%s-%d-%s", d->product, dist->version, dist->relnumber, platname);
+      else
+	  fprintf(fp, "@pkgdep %s-%s-%s", d->product, dist->version, platname);
+    }
+#else
     if (d->type == DEPEND_REQUIRES)
       fprintf(fp, "@pkgdep %s", d->product);
+#endif
     else
 #ifdef __FreeBSD__
      /*
@@ -179,9 +195,11 @@
 	        "         by the BSD packager.\n", stderr);
           break;
       case COMMAND_POST_INSTALL :
+      cr2semicolon(c->command);
           fprintf(fp, "@exec %s\n", c->command);
 	  break;
       case COMMAND_PRE_REMOVE :
+      cr2semicolon(c->command);
           fprintf(fp, "@unexec %s\n", c->command);
 	  break;
       case COMMAND_POST_REMOVE :
@@ -199,7 +217,7 @@
       */
 
       fprintf(fp, "@exec /bin/mkdir -p %s\n", file->dst);
-      fprintf(fp, "@exec /bin/chown %s:%s %s\n", file->user, file->group,
+      fprintf(fp, "@exec /usr/sbin/chown %s:%s %s\n", file->user, file->group,
               file->dst);
       fprintf(fp, "@exec /bin/chmod %04o %s\n", file->mode, file->dst);
     }
@@ -326,12 +344,13 @@
   if (Verbosity)
     puts("Building FreeBSD pkg binary distribution...");
 
-  if (run_command(NULL, "pkg_create -p / -s %s -c %s -d %s -f %s %s",
+  if (run_command(NULL, "/usr/sbin/pkg_create -p / -s %s -c %s -d %s -f %s %s",
                   current, commentname, descrname, plistname, name))
     return (1);
 
-  if (run_command(NULL, "mv %s.tgz %s", name, directory))
-    return (1);
+  if (run_command(NULL, "mv %s.tbz %s", name, directory))
+    if (run_command(NULL, "mv %s.tgz %s", name, directory))
+      return (1);
 
  /*
   * Remove temporary files...
diff -urN epm-3.7-old//configure epm-3.7/configure
--- misc/epm-3.7/configure	2003-07-24 01:20:54.000000000 +0000
+++ misc/build/epm-3.7/configure	2010-04-19 22:52:32.000000000 +0000
@@ -1238,6 +1238,11 @@
 fi
 fi;
 
+# Check whether --enable-fltk or --disable-fltk was given.
+if test "${enable_fltk+set}" = set; then
+  enableval="$enable_fltk"
+fi;
+
 
 # Check whether --with-docdir or --without-docdir was given.
 if test "${with_docdir+set}" = set; then
@@ -4904,36 +4909,38 @@
 fi
 
 
-# Extract the first word of "fltk-config", so it can be a program name with args.
-set dummy fltk-config; ac_word=$2
-echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
-if test "${ac_cv_path_FLTKCONFIG+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  case $FLTKCONFIG in
-  [\\/]* | ?:[\\/]*)
-  ac_cv_path_FLTKCONFIG="$FLTKCONFIG" # Let the user override the test with a path.
-  ;;
-  *)
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
-    ac_cv_path_FLTKCONFIG="$as_dir/$ac_word$ac_exec_ext"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
+if eval "test x$enable_fltk = xyes"; then
+  # Extract the first word of "fltk-config", so it can be a program name with args.
+  set dummy fltk-config; ac_word=$2
+  echo "$as_me:$LINENO: checking for $ac_word" >&5
+  echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+  if test "${ac_cv_path_FLTKCONFIG+set}" = set; then
+    echo $ECHO_N "(cached) $ECHO_C" >&6
+  else
+    case $FLTKCONFIG in
+    [\\/]* | ?:[\\/]*)
+    ac_cv_path_FLTKCONFIG="$FLTKCONFIG" # Let the user override the test with a path.
+    ;;
+    *)
+    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+  for as_dir in $PATH
+  do
+    IFS=$as_save_IFS
+    test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+    if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+      ac_cv_path_FLTKCONFIG="$as_dir/$ac_word$ac_exec_ext"
+      echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
+      break 2
+    fi
+  done
+  done
+  
+    ;;
+  esac
   fi
-done
-done
-
-  ;;
-esac
+  FLTKCONFIG=$ac_cv_path_FLTKCONFIG
 fi
-FLTKCONFIG=$ac_cv_path_FLTKCONFIG
 
 if test -n "$FLTKCONFIG"; then
   echo "$as_me:$LINENO: result: $FLTKCONFIG" >&5
@@ -4950,8 +4957,10 @@
 	INSTALL_GUIS=""
 	INSTALL_OSX=""
 
+if eval "test x$enable_fltk = xyes"; then
 	{ echo "$as_me:$LINENO: WARNING: Sorry, setup GUI requires FLTK 1.1.x." >&5
 echo "$as_me: WARNING: Sorry, setup GUI requires FLTK 1.1.x." >&2;}
+fi
 else
 	CXXFLAGS="`$FLTKCONFIG --cflags` ${CXXFLAGS}"
 	GUIS="setup uninst"
diff -urN epm-3.7-old//deb.c epm-3.7/deb.c
--- misc/epm-3.7/deb.c	2003-01-15 14:29:24.000000000 +0000
+++ misc/build/epm-3.7/deb.c	2010-04-19 22:53:34.000000000 +0000
@@ -26,6 +26,28 @@
 
 #include "epm.h"
 
+/*
+ * 'add_size()' - Append Installed-Size tag to DEBIAN/control file
+ */
+ 
+int                             /* O - 0 = success, 1 = fail */
+add_size(FILE       *fpControl, /* Control file stream */
+         const char *directory) /* Directory containing all files to package */
+{
+    FILE *fp;
+    char command[1024];
+    
+    snprintf(command, sizeof(command), "du -k -s %s", directory);
+    fp = popen(command, "r");
+    if( NULL != fp )
+    {
+        char size[1024];
+        fscanf(fp, "%s .", size);
+        fprintf(fpControl, "Installed-Size: %s\n", size);
+        return pclose(fp);
+    }
+    return 1;
+}
 
 /*
  * 'make_deb()' - Make a Debian software distribution package.
@@ -61,18 +83,37 @@
   if (Verbosity)
     puts("Creating Debian distribution...");
 
+  /*
+   * Use debian default naming scheme
+   */
+
+  if (!strcmp(platform->machine, "intel"))
+#ifdef __FreeBSD_kernel__
+    platname = "kfreebsd-i386";
+#else
+    platname = "i386";
+#endif
+  else if (!strcmp(platform->machine, "x86_64"))
+#ifdef __FreeBSD_kernel__
+    platname = "kfreebsd-amd64";
+#else
+    platname = "amd64";
+#endif
+  else if (!strcmp(platform->machine, "ppc"))
+    platname = "powerpc";
+
   if (dist->relnumber)
   {
     if (platname[0])
-      snprintf(name, sizeof(name), "%s-%s-%d-%s", prodname, dist->version, dist->relnumber,
+      snprintf(name, sizeof(name), "%s_%s-%d_%s", prodname, dist->version, dist->relnumber,
               platname);
     else
-      snprintf(name, sizeof(name), "%s-%s-%d", prodname, dist->version, dist->relnumber);
+      snprintf(name, sizeof(name), "%s_%s-%d", prodname, dist->version, dist->relnumber);
   }
   else if (platname[0])
-    snprintf(name, sizeof(name), "%s-%s-%s", prodname, dist->version, platname);
+    snprintf(name, sizeof(name), "%s_%s_%s", prodname, dist->version, platname);
   else
-    snprintf(name, sizeof(name), "%s-%s", prodname, dist->version);
+    snprintf(name, sizeof(name), "%s_%s", prodname, dist->version);
 
  /*
   * Write the control file for DPKG...
@@ -108,8 +141,20 @@
   * (which we change in get_platform to a common name)
   */
 
-  if (strcmp(platform->machine, "intel") == 0)
+  if (!strcmp(platform->machine, "intel"))
+#ifdef __FreeBSD_kernel__
+    fputs("Architecture: kfreebsd-i386\n", fp);
+#else
     fputs("Architecture: i386\n", fp);
+#endif
+  else if (!strcmp(platform->machine, "x86_64"))
+#ifdef __FreeBSD_kernel__
+    fputs("Architecture: kfreebsd-amd64\n", fp);
+#else
+    fputs("Architecture: amd64\n", fp);
+#endif
+  else if (!strcmp(platform->machine, "ppc"))
+    fputs("Architecture: powerpc\n", fp);
   else
     fprintf(fp, "Architecture: %s\n", platform->machine);
 
@@ -148,9 +193,9 @@
       putc('\n', fp);
     }
   }
-
+  
   fclose(fp);
-
+  
  /*
   * Write the preinst file for DPKG...
   */
@@ -417,6 +462,27 @@
     }
   }
 
+  
+  /* 
+   * Calculate and append Installed-Size to DEBIAN/control
+   */
+   
+  if (Verbosity)
+    puts("Calculating Installed-Size...");
+  
+  snprintf(filename, sizeof(filename), "%s/%s/DEBIAN/control", directory, name);
+  if ((fp = fopen(filename, "a")) == NULL)
+  {
+    fprintf(stderr, "epm: Unable to Installed-Size to file \"%s\" - %s\n", filename,
+            strerror(errno));
+    return (1);
+  }
+
+  snprintf(filename, sizeof(filename), "%s/%s", directory, name);  
+  add_size(fp, filename);
+  fclose(fp);
+ 
+
  /*
   * Build the distribution from the spec file...
   */
diff -urN epm-3.7-old//dist.c epm-3.7/dist.c
--- misc/epm-3.7/dist.c	2003-08-07 14:14:40.000000000 +0000
+++ misc/build/epm-3.7/dist.c	2010-04-19 22:52:32.000000000 +0000
@@ -394,8 +394,13 @@
   strcpy(platform->machine, "mips");
 #elif defined(__hpux)
   strcpy(platform->machine, "hppa");
-#elif defined(_AIX) || defined(__APPLE__)
+#elif defined(_AIX)
   strcpy(platform->machine, "powerpc");
+#elif defined(__APPLE__)
+  if (strstr(platform->machine, "86") != NULL)
+    strcpy(platform->machine, "intel");
+  else
+    strcpy(platform->machine, "powerpc");  
 #else
   for (temp = platform->machine; *temp != '\0'; temp ++)
     if (*temp == '-' || *temp == '_')
@@ -407,7 +412,12 @@
       *temp = tolower(*temp);
 
   if (strstr(platform->machine, "86") != NULL)
-    strcpy(platform->machine, "intel");
+  {
+    if (strstr(platform->machine, "64") != NULL)
+      strcpy(platform->machine, "x86_64");
+    else
+      strcpy(platform->machine, "intel");
+  }
   else if (strncmp(platform->machine, "sun", 3) == 0)
     strcpy(platform->machine, "sparc");
 #endif /* __sgi */
diff -urN epm-3.7-old//epm.c epm-3.7/epm.c
--- misc/epm-3.7/epm.c	2003-10-28 14:48:30.000000000 +0000
+++ misc/build/epm-3.7/epm.c	2010-04-19 22:52:32.000000000 +0000
@@ -547,6 +547,7 @@
 {
   puts(EPM_VERSION);
   puts("Copyright 1999-2003 by Easy Software Products.");
+  puts("Patched for OpenOffice.org");
   puts("");
   puts("EPM is free software and comes with ABSOLUTELY NO WARRANTY; for details");
   puts("see the GNU General Public License in the file COPYING or at");
diff -urN epm-3.7-old//file.c epm-3.7/file.c
--- misc/epm-3.7/file.c	2003-07-23 21:41:08.000000000 +0000
+++ misc/build/epm-3.7/file.c	2010-04-19 22:52:32.000000000 +0000
@@ -108,7 +108,6 @@
   fclose(dstfile);
 
   chmod(dst, mode);
-  chown(dst, owner, group);
 
   return (0);
 }
@@ -138,7 +137,6 @@
       {
 	mkdir(buffer, 0777);
 	chmod(buffer, mode | 0700);
-	chown(buffer, owner, group);
       }
     }
 
@@ -151,7 +149,6 @@
   {
     mkdir(buffer, 0777);
     chmod(buffer, mode | 0700);
-    chown(buffer, owner, group);
   }
 
   return (0);
diff -urN epm-3.7-old//osx.c epm-3.7/osx.c
--- misc/epm-3.7/osx.c	2003-07-23 21:41:08.000000000 +0000
+++ misc/build/epm-3.7/osx.c	2010-04-19 22:52:32.000000000 +0000
@@ -373,7 +373,7 @@
   else
     snprintf(filename, sizeof(filename), "%s/%s", current, directory);
 
-  run_command(NULL, "/Developer/Applications/PackageMaker.app/"
+  run_command(NULL, "/Developer/Applications/Utilities/PackageMaker.app/"
                     "Contents/MacOS/PackageMaker -build "
 		    "-p %s/%s.pkg -f %s/Package -r %s/Resources -d %s/%s-desc.plist -i %s/%s-info.plist",
 	      filename, prodname, filename, filename, filename, prodname, filename, prodname);
diff -urN epm-3.7-old//pkg.c epm-3.7/pkg.c
--- misc/epm-3.7/pkg.c	2002-12-17 18:57:56.000000000 +0000
+++ misc/build/epm-3.7/pkg.c	2010-04-19 22:52:32.000000000 +0000
@@ -429,75 +429,6 @@
 
   fclose(fp);
 
- /*
-  * Build the distribution from the prototype file...
-  */
-
-  if (Verbosity)
-    puts("Building PKG binary distribution...");
-
-  if (run_command(NULL, "pkgmk -o -f %s/%s.prototype -d %s/%s",
-                  directory, prodname, current, directory))
-    return (1);
-
- /*
-  * Tar and compress the distribution...
-  */
-
-  if (Verbosity)
-    puts("Creating tar.gz file for distribution...");
-
-  snprintf(filename, sizeof(filename), "%s/%s.tar.gz", directory, name);
-
-  if ((tarfile = tar_open(filename, 1)) == NULL)
-    return (1);
-
-  snprintf(filename, sizeof(filename), "%s/%s", directory, prodname);
-
-  if (tar_directory(tarfile, filename, prodname))
-  {
-    tar_close(tarfile);
-    return (1);
-  }
-
-  tar_close(tarfile);
-
- /*
-  * Make a package stream file...
-  */
-
-  if (Verbosity)
-    puts("Copying into package stream file...");
-
-  if (run_command(directory, "pkgtrans -s %s/%s %s.pkg %s",
-                  current, directory, name, prodname))
-    return (1);
-
- /*
-  * Remove temporary files...
-  */
-
-  if (!KeepFiles)
-  {
-    if (Verbosity)
-      puts("Removing temporary distribution files...");
-
-    snprintf(filename, sizeof(filename), "%s/%s.pkginfo", directory, prodname);
-    unlink(filename);
-    snprintf(filename, sizeof(filename), "%s/%s.depend", directory, prodname);
-    unlink(filename);
-    snprintf(filename, sizeof(filename), "%s/%s.prototype", directory, prodname);
-    unlink(filename);
-    if (preinstall[0])
-      unlink(preinstall);
-    if (postinstall[0])
-      unlink(postinstall);
-    if (preremove[0])
-      unlink(preremove);
-    if (postremove[0])
-      unlink(postremove);
-  }
-
   return (0);
 }
 
diff -urN epm-3.7-old//qprintf.c epm-3.7/qprintf.c
--- misc/epm-3.7-old/qprintf.c	2003-01-27 21:48:03.000000000 +0000
+++ misc/build/epm-3.7/qprintf.c	2010-04-19 22:52:32.000000000 +0000
@@ -181,12 +181,19 @@
 
             for (i = slen; i > 0; i --, s ++, bytes ++)
 	    {
+#if defined(__FreeBSD__)
+	      if (strchr("`~!#%^&*()[{]}\\|;\'\"<>? ", *s))
+	      {
+	        putc('\\', fp);
+		bytes ++;
+	      }
+#else
 	      if (strchr("`~!#$%^&*()[{]}\\|;\'\"<>? ", *s))
 	      {
 	        putc('\\', fp);
 		bytes ++;
 	      }
-
+#endif
 	      putc(*s, fp);
 	    }
 
diff -urN epm-3.7-old//rpm.c epm-3.7/rpm.c
--- misc/epm-3.7/rpm.c	2003-10-01 19:27:15.000000000 +0000
+++ misc/build/epm-3.7/rpm.c	2010-04-19 22:52:32.000000000 +0000
@@ -38,7 +38,7 @@
          dist_t         *dist,		/* I - Distribution information */
 	 struct utsname *platform)	/* I - Platform information */
 {
-  int		i;			/* Looping var */
+  int		i,n;			/* Looping vars */
   FILE		*fp;			/* Spec file */
   char		name[1024];		/* Full product name */
   char		specname[1024];		/* Spec filename */
@@ -160,6 +160,8 @@
       fprintf(fp, "Requires: %s", dname);
     else if (d->type == DEPEND_PROVIDES)
       fprintf(fp, "Provides: %s", dname);
+    else if (d->type == DEPEND_REPLACES)
+      fprintf(fp, "Obsoletes: %s", dname);
     else
       fprintf(fp, "Conflicts: %s", dname);
 
@@ -186,15 +188,33 @@
   for (i = 0; i < dist->num_descriptions; i ++)
     fprintf(fp, "%s\n", dist->descriptions[i]);
 
-  fputs("%pre\n", fp);
+  /*
+   * %pre
+   */
+  n = 0;
   for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
+  {
     if (c->type == COMMAND_PRE_INSTALL)
+    {
+      if (1 == ++n)  /* Only write %pre if there is at least one command */
+        fputs("%pre\n", fp);
       fprintf(fp, "%s\n", c->command);
+    }
+  }
 
-  fputs("%post\n", fp);
+  /*
+   * %post
+   */
+  n = 0;
   for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
+  {
     if (c->type == COMMAND_POST_INSTALL)
+    {
+      if (1 == ++n)  /* Only write %post if there is at least one command */
+        fputs("%post\n", fp);
       fprintf(fp, "%s\n", c->command);
+    }
+  }
 
   for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
     if (tolower(file->type) == 'i')
@@ -202,6 +222,8 @@
 
   if (i)
   {
+    if (1 == ++n)  /* If not previously done so, write %post here */
+      fputs("%post\n", fp);
     fputs("if test \"x$1\" = x1; then\n", fp);
     fputs("	echo Setting up init scripts...\n", fp);
 
@@ -259,13 +281,17 @@
     fputs("fi\n", fp);
   }
 
-  fputs("%preun\n", fp);
+  /*
+   * %preun
+   */
+  n = 0;
   for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
     if (tolower(file->type) == 'i')
       break;
 
   if (i)
   {
+    fputs("%preun\n", fp); ++n; /* Need to write %preun here */
     fputs("if test \"x$1\" = x0; then\n", fp);
     fputs("	echo Cleaning up init scripts...\n", fp);
 
@@ -315,13 +341,29 @@
   }
 
   for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
+  {
     if (c->type == COMMAND_PRE_REMOVE)
+    {
+      if (1 == ++n)  /* Only write %preun if not previously done so */
+        fputs("%preun\n", fp);
+	    
       fprintf(fp, "%s\n", c->command);
+    }
+  }
 
-  fputs("%postun\n", fp);
+  /*
+   * %post
+   */
+  n = 0;
   for (i = dist->num_commands, c = dist->commands; i > 0; i --, c ++)
+  {
     if (c->type == COMMAND_POST_REMOVE)
+    {
+      if (1 == ++n)  /* Only write %post if there is at least one command */
+        fputs("%postun\n", fp);
       fprintf(fp, "%s\n", c->command);
+    }
+  }
 
   fputs("%files\n", fp);
   for (i = dist->num_files, file = dist->files; i > 0; i --, file ++)
@@ -415,53 +457,6 @@
     }
   }
 
- /*
-  * Build the distribution from the spec file...
-  */
-
-  if (Verbosity)
-    puts("Building RPM binary distribution...");
-
-  if (strcmp(platform->machine, "intel") == 0)
-  {
-    if (run_command(NULL, EPM_RPMBUILD " %s -bb " EPM_RPMARCH "i386 %s",
-                    Verbosity == 0 ? "--quiet" : "", specname))
-      return (1);
-  }
-  else if (run_command(NULL, EPM_RPMBUILD " %s -bb " EPM_RPMARCH "%s %s",
-                       Verbosity == 0 ? "--quiet" : "", platform->machine,
-		       specname))
-    return (1);
-
- /*
-  * Move the RPM to the local directory and rename the RPM using the
-  * product name specified by the user...
-  */
-
-  if (strcmp(platform->machine, "intel") == 0)
-    run_command(NULL, "/bin/mv %s/RPMS/i386/%s-%s-%d.i386.rpm %s/%s.rpm",
-        	rpmdir, prodname, dist->version, dist->relnumber,
-		directory, name);
-  else
-    run_command(NULL, "/bin/mv %s/RPMS/%s/%s-%s-%d.%s.rpm %s/%s.rpm",
-        	rpmdir, platform->machine, prodname, dist->version,
-		dist->relnumber, platform->machine, directory, name);
-
- /*
-  * Remove temporary files...
-  */
-
-  if (!KeepFiles)
-  {
-    if (Verbosity)
-      puts("Removing temporary distribution files...");
-
-    run_command(NULL, "/bin/rm -rf %s/RPMS", directory);
-    run_command(NULL, "/bin/rm -rf %s/buildroot", directory);
-
-    unlink(specname);
-  }
-
   return (0);
 }
 
