diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 733a53c83af051bd25fe4d9380707ff8453d9f75..0e9b731a6238faeb8435c70ac7ec30f57d2b4c7f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2004-06-12  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
+
+	PR fortran/14923
+	* gfortran.fortran-torture/execute/date_time_1.f90: New test.
+
 2004-06-12  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
 	PR fortran/14957
diff --git a/gcc/testsuite/gfortran.fortran-torture/execute/date_time_1.f90 b/gcc/testsuite/gfortran.fortran-torture/execute/date_time_1.f90
new file mode 100644
index 0000000000000000000000000000000000000000..78310c1d81ac257cbf2cc25a38b146259ca988e3
--- /dev/null
+++ b/gcc/testsuite/gfortran.fortran-torture/execute/date_time_1.f90
@@ -0,0 +1,26 @@
+! Check the DATE_AND_TIME intrinsic.
+! Call teh intrinsic with a variety of arguments, but does not check the
+! returned values.
+CHARACTER(8) :: d, d1
+CHARACTER(10) :: t, t1
+CHARACTER(5) :: z, z1
+INTEGER :: v(8), v1(8)
+
+CALL DATE_AND_TIME
+
+CALL DATE_AND_TIME(DATE=d)
+CALL DATE_AND_TIME(TIME=t)
+CALL DATE_AND_TIME(ZONE=z)
+
+CALL DATE_AND_TIME(VALUES=v)
+
+CALL DATE_AND_TIME(DATE=d, TIME=t)
+CALL DATE_AND_TIME(DATE=d, VALUES=v)
+CALL DATE_AND_TIME(TIME=t, ZONE=z)
+
+CALL DATE_AND_TIME(DATE=d, TIME=t, ZONE=z)
+CALL DATE_AND_TIME(TIME=t, ZONE=z, VALUES=v)
+
+CALL DATE_AND_TIME(DATE=d, TIME=t, ZONE=z, VALUES=v)
+
+END
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index 3a4e4a8bf3e3b1a035e6e9eabde62938f5800f6e..8cf4131eae1127027e6f40b81be7eceda169bd27 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,12 @@
+2004-06-12  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
+	    Steven Bosscher  <stevenb@suse.de>
+
+	PR fortran/14923
+	* intrinsics/date_and_time.c: New file.
+	* Makefile.am (gfor_helper_src): Add intrinsics/date_and_time.c.
+	* Makefile.in, aclocal.m4: Regenerate.
+	* libgfortran.h: Prototype date_and_time().
+
 2004-06-12  Bud Davis  <bdavis9659@comcast.net>
 
 	PR fortran/15665
diff --git a/libgfortran/Makefile.am b/libgfortran/Makefile.am
index f77335d5f9c4c6f26cdc4f4c7f47834867d9ef2e..63bf6b5afe69088307f40c482162b77eaafcf5df 100644
--- a/libgfortran/Makefile.am
+++ b/libgfortran/Makefile.am
@@ -39,6 +39,7 @@ intrinsics/abort.c \
 intrinsics/args.c \
 intrinsics/cpu_time.c \
 intrinsics/cshift0.c \
+intrinsics/date_and_time.c \
 intrinsics/eoshift0.c \
 intrinsics/eoshift2.c \
 intrinsics/ishftc.c \
diff --git a/libgfortran/Makefile.in b/libgfortran/Makefile.in
index 9401231c684a5fba4851377612d524fe92fa5af1..f30ae3077c6faf068dab4ce70346ee55c61e4653 100644
--- a/libgfortran/Makefile.in
+++ b/libgfortran/Makefile.in
@@ -119,11 +119,11 @@ am__objects_32 = backspace.lo close.lo endfile.lo format.lo inquire.lo \
 	list_read.lo lock.lo open.lo read.lo rewind.lo transfer.lo \
 	unit.lo unix.lo write.lo
 am__objects_33 = associated.lo abort.lo args.lo cpu_time.lo cshift0.lo \
-	eoshift0.lo eoshift2.lo ishftc.lo pack_generic.lo size.lo \
-	spread_generic.lo string_intrinsics.lo random.lo \
-	reshape_generic.lo reshape_packed.lo selected_kind.lo \
-	system_clock.lo transpose_generic.lo unpack_generic.lo \
-	in_pack_generic.lo in_unpack_generic.lo
+	date_and_time.lo eoshift0.lo eoshift2.lo ishftc.lo \
+	pack_generic.lo size.lo spread_generic.lo string_intrinsics.lo \
+	random.lo reshape_generic.lo reshape_packed.lo \
+	selected_kind.lo system_clock.lo transpose_generic.lo \
+	unpack_generic.lo in_pack_generic.lo in_unpack_generic.lo
 am__objects_34 =
 am__objects_35 = _abs_c4.lo _abs_c8.lo _abs_i4.lo _abs_i8.lo \
 	_abs_r4.lo _abs_r8.lo _exp_r4.lo _exp_r8.lo _exp_c4.lo \
@@ -311,6 +311,7 @@ intrinsics/abort.c \
 intrinsics/args.c \
 intrinsics/cpu_time.c \
 intrinsics/cshift0.c \
+intrinsics/date_and_time.c \
 intrinsics/eoshift0.c \
 intrinsics/eoshift2.c \
 intrinsics/ishftc.c \
@@ -2001,6 +2002,15 @@ cshift0.obj: intrinsics/cshift0.c
 cshift0.lo: intrinsics/cshift0.c
 	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cshift0.lo `test -f 'intrinsics/cshift0.c' || echo '$(srcdir)/'`intrinsics/cshift0.c
 
+date_and_time.o: intrinsics/date_and_time.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o date_and_time.o `test -f 'intrinsics/date_and_time.c' || echo '$(srcdir)/'`intrinsics/date_and_time.c
+
+date_and_time.obj: intrinsics/date_and_time.c
+	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o date_and_time.obj `if test -f 'intrinsics/date_and_time.c'; then $(CYGPATH_W) 'intrinsics/date_and_time.c'; else $(CYGPATH_W) '$(srcdir)/intrinsics/date_and_time.c'; fi`
+
+date_and_time.lo: intrinsics/date_and_time.c
+	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o date_and_time.lo `test -f 'intrinsics/date_and_time.c' || echo '$(srcdir)/'`intrinsics/date_and_time.c
+
 eoshift0.o: intrinsics/eoshift0.c
 	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o eoshift0.o `test -f 'intrinsics/eoshift0.c' || echo '$(srcdir)/'`intrinsics/eoshift0.c
 
diff --git a/libgfortran/libgfortran.h b/libgfortran/libgfortran.h
index a4c27597280952bffa5662355d42689777de62ef..4eba606a666ea932fb4a06bf66158b0d02eb31cf 100644
--- a/libgfortran/libgfortran.h
+++ b/libgfortran/libgfortran.h
@@ -390,6 +390,12 @@ void internal_unpack_4 (gfc_array_i4 *, const GFC_INTEGER_4 *);
 #define internal_unpack_8 prefix(internal_unpack_8)
 void internal_unpack_8 (gfc_array_i8 *, const GFC_INTEGER_8 *);
 
+/* date_and_time.c */
+
+#define date_and_time prefix(date_and_time)
+void date_and_time (char *, char *, char *, gfc_array_i4 *,
+                   GFC_INTEGER_4, GFC_INTEGER_4, GFC_INTEGER_4);
+
 /* string_intrinsics.c */
 
 #define compare_string prefix(compare_string)