Index: src/java/org/apache/commons/lang/time/DateUtils.java
===================================================================
--- src/java/org/apache/commons/lang/time/DateUtils.java	(revision 556250)
+++ src/java/org/apache/commons/lang/time/DateUtils.java	(working copy)
@@ -647,19 +647,20 @@
 
         // truncate seconds
         int seconds = val.get(Calendar.SECOND);
-        if (!done && (!round || seconds < 30)) {
-            time = time - (seconds * 1000L);
-            if (field == Calendar.MINUTE) {
-                done = true;
-            }
+        if (!done && (!round || seconds < 30) && field < Calendar.SECOND) {
+                time = time - (seconds * 1000L);
+                if (field == Calendar.MINUTE) {
+                    done = true;
+                }
         }
 
         // truncate minutes
         int minutes = val.get(Calendar.MINUTE);
-        if (!done && (!round || minutes < 30)) {
-            time = time - (minutes * 60000L);
+        if (!done && (!round || minutes < 30) && field < Calendar.MINUTE) {
+                time = time - (minutes * 60000L);
         }
 
+
         // reset time
         if (date.getTime() != time) {
             date.setTime(time);
Index: src/test/org/apache/commons/lang/time/DateUtilsTest.java
===================================================================
--- src/test/org/apache/commons/lang/time/DateUtilsTest.java	(revision 556250)
+++ src/test/org/apache/commons/lang/time/DateUtilsTest.java	(working copy)
@@ -693,6 +693,69 @@
     }
 
     /**
+     * Tests the Changes Made by LANG-346 to the DateUtils.modify() private method invoked
+     * by DateUtils.round().
+     */
+    public void testRoundLang346() throws Exception
+    {
+        TimeZone.setDefault(defaultZone);
+        dateTimeParser.setTimeZone(defaultZone);
+        Calendar testCalendar = Calendar.getInstance();
+        testCalendar.set(2007, 6, 2, 8, 8, 50);
+        Date date = testCalendar.getTime();
+        assertEquals("Minute Round Up Failed",
+                     dateTimeParser.parse("July 2, 2007 08:09:00.000"),
+                     DateUtils.round(date, Calendar.MINUTE));
+
+        testCalendar.set(2007, 6, 2, 8, 8, 20);
+        date = testCalendar.getTime();
+        assertEquals("Minute No Round Failed",
+                     dateTimeParser.parse("July 2, 2007 08:08:00.000"),
+                     DateUtils.round(date, Calendar.MINUTE));
+
+        testCalendar.set(2007, 6, 2, 8, 8, 50);
+        testCalendar.set(Calendar.MILLISECOND, 600);
+        date = testCalendar.getTime();
+
+        assertEquals("Second Round Up with 600 Milli Seconds Failed",
+                     dateTimeParser.parse("July 2, 2007 08:08:51.000"),
+                     DateUtils.round(date, Calendar.SECOND));
+
+        testCalendar.set(2007, 6, 2, 8, 8, 50);
+        testCalendar.set(Calendar.MILLISECOND, 200);
+        date = testCalendar.getTime();
+        assertEquals("Second Round Down with 200 Milli Seconds Failed",
+                     dateTimeParser.parse("July 2, 2007 08:08:50.000"),
+                     DateUtils.round(date, Calendar.SECOND));
+
+        testCalendar.set(2007, 6, 2, 8, 8, 20);
+        testCalendar.set(Calendar.MILLISECOND, 600);
+        date = testCalendar.getTime();
+        assertEquals("Second Round Up with 200 Milli Seconds Failed",
+                     dateTimeParser.parse("July 2, 2007 08:08:21.000"),
+                     DateUtils.round(date, Calendar.SECOND));
+
+        testCalendar.set(2007, 6, 2, 8, 8, 20);
+        testCalendar.set(Calendar.MILLISECOND, 200);
+        date = testCalendar.getTime();
+        assertEquals("Second Round Down with 200 Milli Seconds Failed",
+                     dateTimeParser.parse("July 2, 2007 08:08:20.000"),
+                     DateUtils.round(date, Calendar.SECOND));
+
+        testCalendar.set(2007, 6, 2, 8, 8, 50);
+        date = testCalendar.getTime();
+        assertEquals("Hour Round Down Failed",
+                     dateTimeParser.parse("July 2, 2007 08:00:00.000"),
+                     DateUtils.round(date, Calendar.HOUR));
+
+        testCalendar.set(2007, 6, 2, 8, 31, 50);
+        date = testCalendar.getTime();
+        assertEquals("Hour Round Up Failed",
+                     dateTimeParser.parse("July 2, 2007 09:00:00.000"),
+                     DateUtils.round(date, Calendar.HOUR));
+    }
+
+    /**
      * Tests various values with the trunc method
      */
     public void testTruncate() throws Exception {
