Initial load
diff --git a/test/java/lang/ThreadGroup/Daemon.java b/test/java/lang/ThreadGroup/Daemon.java
new file mode 100644
index 0000000..07247bb
--- /dev/null
+++ b/test/java/lang/ThreadGroup/Daemon.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4950216 4089701 4956093
+ * @summary Test for premature destruction of daemon threadgroups
+ */
+
+public class Daemon {
+
+    public static void main(String args[]) throws Exception {
+        ThreadGroup tg = new ThreadGroup("madbot-threads");
+        Thread myThread = new MadThread(tg,"mad");
+        ThreadGroup aGroup = new ThreadGroup(tg, "ness");
+        tg.setDaemon(true);
+        if (tg.activeCount() != 0)
+            throw new RuntimeException("activeCount");
+        aGroup.destroy();
+        if (tg.isDestroyed())
+            throw new RuntimeException("destroy");
+        try {
+            Thread anotherThread = new MadThread(aGroup, "bot");
+            throw new RuntimeException("illegal");
+        } catch (IllegalThreadStateException itse) {
+            // Correct result
+        }
+    }
+}
+
+class MadThread extends Thread {
+    String name;
+    MadThread(ThreadGroup tg, String name) {
+        super(tg, name);
+        this.name = name;
+    }
+    public void run() {
+        System.out.println("me run "+name);
+    }
+}
diff --git a/test/java/lang/ThreadGroup/SetMaxPriority.java b/test/java/lang/ThreadGroup/SetMaxPriority.java
new file mode 100644
index 0000000..b0fd10d
--- /dev/null
+++ b/test/java/lang/ThreadGroup/SetMaxPriority.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4708197 6497629
+ * @summary Test for max priority setting that matches spec
+ * @author Pete Soper
+ */
+
+public class SetMaxPriority {
+
+    public static void main(String args[]) throws Exception {
+        ThreadGroup tg = new ThreadGroup("foo");
+        ThreadGroup ptg = tg.getParent();
+        int currentMaxPriority = tg.getMaxPriority();
+        int halfMaxPriority = ptg.getMaxPriority() / 2;
+        if (halfMaxPriority - Thread.MIN_PRIORITY < 2) {
+            throw new RuntimeException("SetMaxPriority test no longer valid: starting parent max priority too close to Thread.MIN_PRIORITY");
+        }
+        tg.setMaxPriority(halfMaxPriority - 2);
+        currentMaxPriority = tg.getMaxPriority();
+        if (currentMaxPriority != halfMaxPriority - 2) {
+            throw new RuntimeException("SetMaxPriority failed: max priority not changed");
+        }
+
+        // This will fail if bug 6497629 is present because the min tests is
+        // being made with the (just lowered) max instead of the parent max,
+        // preventing the priority from being moved back up.
+        tg.setMaxPriority(currentMaxPriority + 1);
+        int newMaxPriority = tg.getMaxPriority();
+        if (newMaxPriority != currentMaxPriority + 1) {
+            throw new RuntimeException("SetMaxPriority failed: defect 6497629 present");
+        }
+
+        // Confirm that max priorities out of range on both ends have no
+        // effect.
+        for (int badPriority : new int[] {Thread.MIN_PRIORITY - 1,
+                                          Thread.MAX_PRIORITY + 1}) {
+            int oldPriority = tg.getMaxPriority();
+            tg.setMaxPriority(badPriority);
+            if (oldPriority != tg.getMaxPriority())
+                throw new RuntimeException(
+                    "setMaxPriority bad arg not ignored as specified");
+        }
+
+        System.out.println("SetMaxPriority passed");
+    }
+}
diff --git a/test/java/lang/ThreadGroup/Stop.java b/test/java/lang/ThreadGroup/Stop.java
new file mode 100644
index 0000000..75fbb87
--- /dev/null
+++ b/test/java/lang/ThreadGroup/Stop.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 1999 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4176355
+ * @summary Stopping a ThreadGroup that contains the current thread has
+ *          unpredictable results.
+ */
+
+public class Stop implements Runnable {
+    private static Thread first=null;
+    private static Thread second=null;
+    private static ThreadGroup group = new ThreadGroup("");
+
+    Stop() {
+        Thread thread = new Thread(group, this);
+        if (first == null)
+            first = thread;
+        else
+            second = thread;
+
+        thread.start();
+    }
+
+    public void run() {
+        while (true) {
+            try {
+                Thread.sleep(1000); // Give other thread a chance to start
+                if (Thread.currentThread() == first)
+                    group.stop();
+            } catch(InterruptedException e){
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (int i=0; i<2; i++)
+            new Stop();
+        Thread.sleep(3000);
+        boolean failed = second.isAlive();
+        first.stop(); second.stop();
+        if (failed)
+            throw new RuntimeException("Failure.");
+    }
+}
diff --git a/test/java/lang/ThreadGroup/Suspend.java b/test/java/lang/ThreadGroup/Suspend.java
new file mode 100644
index 0000000..6e54d3f1
--- /dev/null
+++ b/test/java/lang/ThreadGroup/Suspend.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 1999 Sun Microsystems, Inc.  All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4176355
+ * @summary Suspending a ThreadGroup that contains the current thread has
+ *          unpredictable results.
+ */
+
+public class Suspend implements Runnable {
+    private static Thread first=null;
+    private static Thread second=null;
+    private static ThreadGroup group = new ThreadGroup("");
+    private static int count = 0;
+
+    Suspend() {
+        Thread thread = new Thread(group, this);
+        if (first == null)
+            first = thread;
+        else
+            second = thread;
+
+        thread.start();
+    }
+
+    public void run() {
+        while (true) {
+            try {
+                Thread.sleep(1000); // Give other thread a chance to start
+                if (Thread.currentThread() == first)
+                    group.suspend();
+                else
+                    count++;
+            } catch(InterruptedException e){
+            }
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        for (int i=0; i<2; i++)
+            new Suspend();
+        Thread.sleep(3000);
+        boolean failed = (count > 1);
+        first.stop(); second.stop();
+        if (failed)
+            throw new RuntimeException("Failure.");
+    }
+}