try to use ebtablesd/ebtablesu scheme
diff --git a/Makefile b/Makefile
index 00e377d..7d74f8a 100644
--- a/Makefile
+++ b/Makefile
@@ -112,13 +112,14 @@
 
 tmp1:=$(shell printf $(BINDIR) | sed 's/\//\\\//g')
 tmp2:=$(shell printf $(SYSCONFIGDIR) | sed 's/\//\\\//g')
+tmp3:=$(shell printf $(PIPE) | sed 's/\//\\\//g')
 .PHONY: scripts
 scripts: ebtables-save ebtables-restore ebtables.sysv ebtables-config
 	cat ebtables-save | sed 's/__EXEC_PATH__/$(tmp1)/g' > ebtables-save_
 	install -m 0755 -o root -g root ebtables-save_ $(BINDIR)/ebtables-save
-	cat ebtables-restore | sed 's/__EXEC_PATH__/$(tmp1)/g' > ebtables-restore_
+	cat ebtables-restore | sed 's/__EXEC_PATH__/$(tmp1)/g' | sed 's/__PIPE__/$(tmp3)/g' > ebtables-restore_
 	install -m 0755 -o root -g root ebtables-restore_ $(BINDIR)/ebtables-restore
-	cat ebtables.sysv | sed 's/__EXEC_PATH__/$(tmp1)/g' | sed 's/__SYSCONFIG__/$(tmp2)/g'> ebtables.sysv_
+	cat ebtables.sysv | sed 's/__EXEC_PATH__/$(tmp1)/g' | sed 's/__SYSCONFIG__/$(tmp2)/g' > ebtables.sysv_
 	install -m 0755 -o root -g root ebtables.sysv_ $(INITDIR)/ebtables
 	cat ebtables-config | sed 's/__SYSCONFIG__/$(tmp1)/g' > ebtables-config_
 	install -m 0600 -o root -g root ebtables-config_ $(SYSCONFIGDIR)/ebtables-config
diff --git a/ebtables-restore b/ebtables-restore
index abe049d..7c2ea88 100644
--- a/ebtables-restore
+++ b/ebtables-restore
@@ -9,6 +9,7 @@
 my $ebtables = "__EXEC_PATH__/ebtables";
 my $table = "";
 my $rc;
+my $child;
 my $line;
 
 # ==============================
@@ -34,20 +35,58 @@
 }
 # ==============================
 
-unless (-x $ebtables) { print "ERROR: $ebtables isn't executable\n"; exit -1; };
+if (-x "__EXEC_PATH__/ebtablesd" && -x "__EXEC_PATH__/ebtablesu") {
+    `killall ebtablesd 2>/dev/null`;
+    $child = fork();
+    if ($child == 0) {
+        $rc = `__EXEC_PATH__/ebtablesd`;
+	if (!($rc eq "")) {
+            exit -1;
+        }
+        exit 0;
+    }
+    $ebtables = "__EXEC_PATH__/ebtablesu";
+    while (!(-e "__PIPE__")) {
+        if ((kill 0) < $child) {
+            exit -1;
+        }
+    }
+} else {
+    unless (-x $ebtables) { print "ERROR: $ebtables isn't executable\n"; exit -1; };
+}
+
 $line = 0;
 while(<>) {
     $line++;
     if(m/^#/) { next; };
     if(m/^$/) { next; };
+    if ($ebtables eq "__EXEC_PATH__/ebtablesu") {
+        if ((kill 0) < $child) {
+            exit -1;
+        }
+    }
     if(m/^\*(.*)/) {
-        if (defined($ENV{'EBTABLES_SAVE_COUNTER'}) && !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes") && !($table eq "") ) {
-            $rc = `$ebtables -t $table -Z`;
-            unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+        if (!($table eq "")) {
+            if (!defined($ENV{'EBTABLES_SAVE_COUNTER'}) || !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes")) {
+                $rc = `$ebtables -t $table -Z`;
+                unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+            }
+            if ($ebtables eq "__EXEC_PATH__/ebtablesu") {
+                $rc = `$ebtables commit $table`;
+                $rc = `$ebtables free $table`;
+                unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+           }
         }
         $table = $1;
-        $rc = `$ebtables -t filter --init-table`;
-        unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+        if ($ebtables eq "__EXEC_PATH__/ebtablesu") {
+            $rc = `$ebtables open $table`;
+            unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+            $rc = `$ebtables -F`;
+            unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+        } else {
+            $rc = `$ebtables -t filter --init-table`;
+            unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+        }
         next;
     }
     if(m/^\:(.*?)\s(.*)/) {
@@ -59,7 +98,21 @@
     $rc = `$ebtables -t $table $_`;
     unless($? == 0) {print "ERROR(line $line): $rc\n"; exit -1};
 }
-if (defined($ENV{'EBTABLES_SAVE_COUNTER'}) && !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes") && !($table eq "")) {
-    $rc = `$ebtables -t $table -Z`;
-    unless($? == 0) {print "ERROR: '-t $table -Z' failed\n"; exit -1};
+
+if (!($table eq "")) {
+    if (!defined($ENV{'EBTABLES_SAVE_COUNTER'}) || !($ENV{'EBTABLES_SAVE_COUNTER'} eq "yes")) {
+        $rc = `$ebtables -t $table -Z`;
+        unless($? == 0) {print "ERROR: '-t $table -Z' failed\n"; exit -1};
+    }
+    if ($ebtables eq "__EXEC_PATH__/ebtablesu") {
+        $rc = `$ebtables commit $table`;
+        unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+    }
+}
+
+if ($ebtables eq "__EXEC_PATH__/ebtablesu") {
+    $rc = `$ebtables quit`;
+    unless($? == 0) {print "ERROR: $rc\n"; exit -1};
+    waitpid($child,0);
+    exit 0;
 }