diff --git a/runtime/bin/process.h b/runtime/bin/process.h
index adda36a..154347d 100644
--- a/runtime/bin/process.h
+++ b/runtime/bin/process.h
@@ -138,15 +138,15 @@
 
 class SignalInfo {
  public:
-  SignalInfo(int fd, int signal, SignalInfo* prev = NULL)
+  SignalInfo(int fd, int signal, SignalInfo* next = NULL)
       : fd_(fd),
         signal_(signal),
         // SignalInfo is expected to be created when in a isolate.
         port_(Dart_GetMainPortId()),
-        next_(NULL),
-        prev_(prev) {
-    if (prev_ != NULL) {
-      prev_->next_ = this;
+        next_(next),
+        prev_(NULL) {
+    if (next_ != NULL) {
+      next_->prev_ = this;
     }
   }
 
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index c13aa98..a2e6aa2 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -710,11 +710,7 @@
       return -1;
     }
   }
-  if (signal_handlers == NULL) {
-    signal_handlers = new SignalInfo(fds[1], signal);
-  } else {
-    new SignalInfo(fds[1], signal, signal_handlers);
-  }
+  signal_handlers = new SignalInfo(fds[1], signal, signal_handlers);
   return fds[0];
 }
 
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index ef0927a..75e5126 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -703,11 +703,7 @@
       return -1;
     }
   }
-  if (signal_handlers == NULL) {
-    signal_handlers = new SignalInfo(fds[1], signal);
-  } else {
-    new SignalInfo(fds[1], signal, signal_handlers);
-  }
+  signal_handlers = new SignalInfo(fds[1], signal, signal_handlers);
   return fds[0];
 }
 
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index e84b115..5c2dcb2 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -756,11 +756,7 @@
       return -1;
     }
   }
-  if (signal_handlers == NULL) {
-    signal_handlers = new SignalInfo(fds[1], signal);
-  } else {
-    new SignalInfo(fds[1], signal, signal_handlers);
-  }
+  signal_handlers = new SignalInfo(fds[1], signal, signal_handlers);
   return fds[0];
 }
 
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index 3875b4f..56d38be 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -920,10 +920,8 @@
       SetLastError(error_code);
       return -1;
     }
-    signal_handlers = new SignalInfo(write_fd, signal);
-  } else {
-    new SignalInfo(write_fd, signal, signal_handlers);
   }
+  signal_handlers = new SignalInfo(write_fd, signal, signal_handlers);
   return reinterpret_cast<intptr_t>(new FileHandle(fds[kReadHandle]));
 }
 
diff --git a/tests/standalone/io/signal_test_script.dart b/tests/standalone/io/signal_test_script.dart
index 02b2c25..07f4c03 100644
--- a/tests/standalone/io/signal_test_script.dart
+++ b/tests/standalone/io/signal_test_script.dart
@@ -6,22 +6,24 @@
 import "dart:async";
 
 void main(args) {
-  var signal;
   // This process should die if it never receives a signal.
   var timeout = new Timer(new Duration(seconds: 25), () => exit(1));
-  switch (args[0]) {
-    case 'SIGHUP': signal = ProcessSignal.SIGHUP; break;
-    case 'SIGINT': signal = ProcessSignal.SIGINT; break;
-    case 'SIGTERM': signal = ProcessSignal.SIGTERM; break;
-    case 'SIGUSR1': signal = ProcessSignal.SIGUSR1; break;
-    case 'SIGUSR2': signal = ProcessSignal.SIGUSR2; break;
-    case 'SIGWINCH': signal = ProcessSignal.SIGWINCH; break;
+  for (var arg in args) {
+    var signal;
+    switch (arg) {
+      case 'SIGHUP': signal = ProcessSignal.SIGHUP; break;
+      case 'SIGINT': signal = ProcessSignal.SIGINT; break;
+      case 'SIGTERM': signal = ProcessSignal.SIGTERM; break;
+      case 'SIGUSR1': signal = ProcessSignal.SIGUSR1; break;
+      case 'SIGUSR2': signal = ProcessSignal.SIGUSR2; break;
+      case 'SIGWINCH': signal = ProcessSignal.SIGWINCH; break;
+    }
+    signal.watch().first.then((s) {
+      if (signal != s) exit(1);
+      if (signal.toString() != arg) exit(1);
+      print(signal);
+      exit(0);
+    });
   }
-  signal.watch().first.then((s) {
-    if (signal != s) exit(1);
-    if (signal.toString() != args[0]) exit(1);
-    print('got signal');
-    timeout.cancel();
-  });
   print("ready");
 }
diff --git a/tests/standalone/io/signals_test.dart b/tests/standalone/io/signals_test.dart
index d73b01a..a811208 100644
--- a/tests/standalone/io/signals_test.dart
+++ b/tests/standalone/io/signals_test.dart
@@ -60,7 +60,7 @@
             process.kill(signal);
           }
         }, onDone: () {
-          Expect.equals('ready\ngot signal\n', output);
+          Expect.equals('ready\n$signal\n', output);
         });
       process.exitCode.then((exitCode) {
         Expect.equals(0, exitCode);
@@ -69,6 +69,34 @@
     });
 }
 
+void testMultipleSignals(List<ProcessSignal> signals) {
+  for (var signal in signals) {
+    asyncStart();
+    Process.start(Platform.executable,
+        [Platform.script.resolve('signal_test_script.dart').toFilePath()]
+            ..addAll(signals.map((s) => s.toString())))
+      .then((process) {
+        process.stdin.close();
+        process.stderr.drain();
+
+        var output = "";
+        process.stdout.transform(UTF8.decoder)
+          .listen((str) {
+            output += str;
+            if (output == 'ready\n') {
+              process.kill(signal);
+            }
+          }, onDone: () {
+            Expect.equals('ready\n$signal\n', output);
+          });
+        process.exitCode.then((exitCode) {
+          Expect.equals(0, exitCode);
+          asyncEnd();
+        });
+      });
+  }
+}
+
 
 void testListenCancel() {
   for (int i = 0; i < 10; i++) {
@@ -95,4 +123,12 @@
   testSignal(ProcessSignal.SIGUSR1);
   testSignal(ProcessSignal.SIGUSR2);
   testSignal(ProcessSignal.SIGWINCH);
+
+  testMultipleSignals([
+      ProcessSignal.SIGHUP,
+      ProcessSignal.SIGINT,
+      ProcessSignal.SIGTERM,
+      ProcessSignal.SIGUSR1,
+      ProcessSignal.SIGUSR2,
+      ProcessSignal.SIGWINCH]);
 }
diff --git a/tools/VERSION b/tools/VERSION
index 637a721..5cf5da2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -28,4 +28,4 @@
 MINOR 4
 PATCH 0
 PRERELEASE 6
-PRERELEASE_PATCH 6
+PRERELEASE_PATCH 7
