diff --git a/common/tf_log.c b/common/tf_log.c
index 54c0a43..6da1e85 100644
--- a/common/tf_log.c
+++ b/common/tf_log.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
+ * Copyright (c) 2017-2018, ARM Limited and Contributors. All rights reserved.
  *
  * SPDX-License-Identifier: BSD-3-Clause
  */
@@ -36,11 +36,11 @@
 
 	prefix_str = plat_log_get_prefix(log_level);
 
-	if (prefix_str != NULL)
-		tf_string_print(prefix_str);
+	while (*prefix_str)
+		putchar(*prefix_str++);
 
 	va_start(args, fmt);
-	tf_vprintf(fmt+1, args);
+	vprintf(fmt + 1, args);
 	va_end(args);
 }
 
diff --git a/common/tf_printf.c b/common/tf_printf.c
deleted file mode 100644
index ecf058c..0000000
--- a/common/tf_printf.c
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright (c) 2014-2017, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-#include <arch.h>
-#include <arch_helpers.h>
-#include <assert.h>
-#include <debug.h>
-#include <limits.h>
-#include <stdarg.h>
-#include <stdint.h>
-
-/***********************************************************
- * The tf_printf implementation for all BL stages
- ***********************************************************/
-
-#define get_num_va_args(_args, _lcount) \
-	(((_lcount) > 1) ? va_arg(_args, long long int) :	\
-	((_lcount) ? va_arg(_args, long int) : va_arg(_args, int)))
-
-#define get_unum_va_args(_args, _lcount) \
-	(((_lcount) > 1) ? va_arg(_args, unsigned long long int) :	\
-	((_lcount) ? va_arg(_args, unsigned long int) : va_arg(_args, unsigned int)))
-
-int tf_string_print(const char *str)
-{
-	int count = 0;
-
-	assert(str);
-
-	while (*str) {
-		putchar(*str++);
-		count++;
-	}
-
-	return count;
-}
-
-static int unsigned_num_print(unsigned long long int unum, unsigned int radix,
-			      char padc, int padn)
-{
-	/* Just need enough space to store 64 bit decimal integer */
-	unsigned char num_buf[20];
-	int i = 0, rem, count = 0;
-
-	do {
-		rem = unum % radix;
-		if (rem < 0xa)
-			num_buf[i++] = '0' + rem;
-		else
-			num_buf[i++] = 'a' + (rem - 0xa);
-	} while (unum /= radix);
-
-	if (padn > 0) {
-		while (i < padn--) {
-			putchar(padc);
-			count++;
-		}
-	}
-
-	while (--i >= 0) {
-		putchar(num_buf[i]);
-		count++;
-	}
-
-	return count;
-}
-
-/*******************************************************************
- * Reduced format print for Trusted firmware.
- * The following type specifiers are supported by this print
- * %x - hexadecimal format
- * %s - string format
- * %d or %i - signed decimal format
- * %u - unsigned decimal format
- * %p - pointer format
- *
- * The following length specifiers are supported by this print
- * %l - long int (64-bit on AArch64)
- * %ll - long long int (64-bit on AArch64)
- * %z - size_t sized integer formats (64 bit on AArch64)
- *
- * The following padding specifiers are supported by this print
- * %0NN - Left-pad the number with 0s (NN is a decimal number)
- *
- * The print exits on all other formats specifiers other than valid
- * combinations of the above specifiers.
- *******************************************************************/
-int tf_vprintf(const char *fmt, va_list args)
-{
-	int l_count;
-	long long int num;
-	unsigned long long int unum;
-	char *str;
-	char padc = 0; /* Padding character */
-	int padn; /* Number of characters to pad */
-	int count = 0; /* Number of printed characters */
-
-	while (*fmt) {
-		l_count = 0;
-		padn = 0;
-
-		if (*fmt == '%') {
-			fmt++;
-			/* Check the format specifier */
-loop:
-			switch (*fmt) {
-			case 'i': /* Fall through to next one */
-			case 'd':
-				num = get_num_va_args(args, l_count);
-				if (num < 0) {
-					putchar('-');
-					unum = (unsigned long long int)-num;
-					padn--;
-				} else
-					unum = (unsigned long long int)num;
-
-				count += unsigned_num_print(unum, 10,
-							    padc, padn);
-				break;
-			case 's':
-				str = va_arg(args, char *);
-				count += tf_string_print(str);
-				break;
-			case 'p':
-				unum = (uintptr_t)va_arg(args, void *);
-				if (unum) {
-					count += tf_string_print("0x");
-					padn -= 2;
-				}
-
-				count += unsigned_num_print(unum, 16,
-							    padc, padn);
-				break;
-			case 'x':
-				unum = get_unum_va_args(args, l_count);
-				count += unsigned_num_print(unum, 16,
-							    padc, padn);
-				break;
-			case 'z':
-				if (sizeof(size_t) == 8)
-					l_count = 2;
-
-				fmt++;
-				goto loop;
-			case 'l':
-				l_count++;
-				fmt++;
-				goto loop;
-			case 'u':
-				unum = get_unum_va_args(args, l_count);
-				count += unsigned_num_print(unum, 10,
-							    padc, padn);
-				break;
-			case '0':
-				padc = '0';
-				padn = 0;
-				fmt++;
-
-				while (1) {
-					char ch = *fmt;
-					if (ch < '0' || ch > '9') {
-						goto loop;
-					}
-					padn = (padn * 10) + (ch - '0');
-					fmt++;
-				}
-			default:
-				/* Exit on any other format specifier */
-				return -1;
-			}
-			fmt++;
-			continue;
-		}
-		putchar(*fmt++);
-		count++;
-	}
-
-	return count;
-}
-
-int tf_printf(const char *fmt, ...)
-{
-	int count;
-	va_list va;
-
-	va_start(va, fmt);
-	count = tf_vprintf(fmt, va);
-	va_end(va);
-
-	return count;
-}
diff --git a/common/tf_snprintf.c b/common/tf_snprintf.c
deleted file mode 100644
index 6df1377..0000000
--- a/common/tf_snprintf.c
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-#include <debug.h>
-#include <platform.h>
-#include <stdarg.h>
-
-static void string_print(char **s, size_t n, size_t *chars_printed,
-			 const char *str)
-{
-	while (*str) {
-		if (*chars_printed < n)
-			*(*s)++ = *str;
-		(*chars_printed)++;
-		str++;
-	}
-}
-
-static void unsigned_dec_print(char **s, size_t n, size_t *chars_printed,
-			       unsigned int unum)
-{
-	/* Enough for a 32-bit unsigned decimal integer (4294967295). */
-	unsigned char num_buf[10];
-	int i = 0, rem;
-
-	do {
-		rem = unum % 10;
-		num_buf[i++] = '0' + rem;
-	} while (unum /= 10);
-
-	while (--i >= 0) {
-		if (*chars_printed < n)
-			*(*s)++ = num_buf[i];
-		(*chars_printed)++;
-	}
-}
-
-/*******************************************************************
- * Reduced snprintf to be used for Trusted firmware.
- * The following type specifiers are supported:
- *
- * %d or %i - signed decimal format
- * %s - string format
- * %u - unsigned decimal format
- *
- * The function panics on all other formats specifiers.
- *
- * It returns the number of characters that would be written if the
- * buffer was big enough. If it returns a value lower than n, the
- * whole string has been written.
- *******************************************************************/
-int tf_snprintf(char *s, size_t n, const char *fmt, ...)
-{
-	va_list args;
-	int num;
-	unsigned int unum;
-	char *str;
-	size_t chars_printed = 0;
-
-	if (n == 1) {
-		/* Buffer is too small to actually write anything else. */
-		*s = '\0';
-		n = 0;
-	} else if (n >= 2) {
-		/* Reserve space for the terminator character. */
-		n--;
-	}
-
-	va_start(args, fmt);
-	while (*fmt) {
-
-		if (*fmt == '%') {
-			fmt++;
-			/* Check the format specifier. */
-			switch (*fmt) {
-			case 'i':
-			case 'd':
-				num = va_arg(args, int);
-
-				if (num < 0) {
-					if (chars_printed < n)
-						*s++ = '-';
-					chars_printed++;
-
-					unum = (unsigned int)-num;
-				} else {
-					unum = (unsigned int)num;
-				}
-
-				unsigned_dec_print(&s, n, &chars_printed, unum);
-				break;
-			case 's':
-				str = va_arg(args, char *);
-				string_print(&s, n, &chars_printed, str);
-				break;
-			case 'u':
-				unum = va_arg(args, unsigned int);
-				unsigned_dec_print(&s, n, &chars_printed, unum);
-				break;
-			default:
-				/* Panic on any other format specifier. */
-				ERROR("tf_snprintf: specifier with ASCII code '%d' not supported.",
-				      *fmt);
-				plat_panic_handler();
-			}
-			fmt++;
-			continue;
-		}
-
-		if (chars_printed < n)
-			*s++ = *fmt;
-		fmt++;
-		chars_printed++;
-	}
-
-	va_end(args);
-
-	if (n > 0)
-		*s = '\0';
-
-	return chars_printed;
-}
