diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/Debug.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/Debug.java
index 92f7b7f..237d374 100644
--- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/Debug.java
+++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/Debug.java
@@ -347,7 +347,9 @@
 						printStackTrace(nested);
 					}
 				} catch (IllegalAccessException e) {
+					// nothing
 				} catch (InvocationTargetException e) {
+					// nothing
 				}
 			}
 		}
diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java
index f8adb40..8a93649 100644
--- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java
+++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/EclipseDebugTrace.java
@@ -31,6 +31,71 @@
 	public static final String PROP_TRACE_SIZE_MAX = "eclipse.trace.size.max"; //$NON-NLS-1$
 	/** The system property used to specify the maximum number of backup trace files to use */
 	public static final String PROP_TRACE_FILE_MAX = "eclipse.trace.backup.max"; //$NON-NLS-1$
+	/** The trace message for a thread stack dump */
+	protected final static String MESSAGE_THREAD_DUMP = "Thread Stack dump: "; //$NON-NLS-1$
+	/** The trace message for a method completing with a return value */
+	protected final static String MESSAGE_EXIT_METHOD_WITH_RESULTS = "Exiting method with result: "; //$NON-NLS-1$
+	/** The trace message for a method completing with no return value */
+	protected final static String MESSAGE_EXIT_METHOD_NO_RESULTS = "Exiting method with a void return"; //$NON-NLS-1$
+	/** The trace message for a method starting with a set of arguments */
+	protected final static String MESSAGE_ENTER_METHOD_WITH_PARAMS = "Entering method with parameters: ("; //$NON-NLS-1$
+	/** The trace message for a method starting with no arguments */
+	protected final static String MESSAGE_ENTER_METHOD_NO_PARAMS = "Entering method with no parameters"; //$NON-NLS-1$
+	/** The version attribute written to the header of the trace file */
+	protected final static String TRACE_FILE_VERSION_COMMENT = "version: "; //$NON-NLS-1$
+	/** The version value written to the header of the trace file */
+	protected final static String TRACE_FILE_VERSION = "1.0"; //$NON-NLS-1$
+	/** The new session identifier to be written whenever a new session starts */
+	protected final static String TRACE_NEW_SESSION = "!SESSION "; //$NON-NLS-1$
+	/** The date attribute written to the header of the trace file to show when this file was created */
+	protected final static String TRACE_FILE_DATE = "Time of creation: "; //$NON-NLS-1$
+	/** Trace date formatter using the pattern: yyyy-MM-dd HH:mm:ss.SSS  */
+	protected final static SimpleDateFormat TRACE_FILE_DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); //$NON-NLS-1$
+	/** The comment character used by the trace file */
+	protected final static String TRACE_COMMENT = "#"; //$NON-NLS-1$
+	/** The delimiter used to separate trace elements such as the time stamp, message, etc */
+	protected final static String TRACE_ELEMENT_DELIMITER = "|"; //$NON-NLS-1$
+	/** OS-specific line separator */
+	protected static final String LINE_SEPARATOR;
+	static {
+		String s = System.getProperty("line.separator"); //$NON-NLS-1$
+		LINE_SEPARATOR = s == null ? "\n" : s; //$NON-NLS-1$
+	}
+	/** The value written to the trace file if a null object is being traced */
+	public final static String NULL_VALUE = "<null>"; //$NON-NLS-1$
+	/**  */
+	private final static SecureAction secureAction = (SecureAction) AccessController.doPrivileged(SecureAction.createSecureAction());
+	/** A lock object used to synchronize access to the trace file */
+	protected final static Object writeLock = new Object();
+
+	/******************* Tracing file attributes **************************/
+	/** The default size a trace file can grow before it is rotated */
+	public static final int DEFAULT_TRACE_FILE_SIZE = 1000; // The value is in KB.
+	/** The default number of backup trace files */
+	public static final int DEFAULT_TRACE_FILES = 10;
+	/** The minimum size limit for trace file rotation */
+	public static final int DEFAULT_TRACE_FILE_MIN_SIZE = 10;
+	/** The extension used for log files */
+	public static final String TRACE_FILE_EXTENSION = ".trace"; //$NON-NLS-1$
+	/** The extension markup to use for backup log files*/
+	public static final String BACKUP_MARK = ".bak_"; //$NON-NLS-1$
+	/** The maximum size that a trace file should grow (0 = unlimited) */
+	protected int maxTraceFileSize = DEFAULT_TRACE_FILE_SIZE; // The value is in KB.
+	/** The maximum number of trace files that should be saved */
+	protected int maxTraceFiles = DEFAULT_TRACE_FILES;
+	/** The index of the currently backed-up trace file */
+	protected int backupTraceFileIndex = 0;
+
+	/** An optional argument to specify the name of the class used by clients to trace messages.  If no trace class is specified
+	 * then the class calling this API is assumed to be the class being traced.
+	*/
+	protected Class traceClass = null;
+	/** The symbolic name of the bundle being traced */
+	protected String bundleSymbolicName = null;
+	/** A flag to determine if the message being written is done to a new file (i.e. should the header information be written) */
+	protected static boolean newSession = true;
+	/** DebugOptions are used to determine if the specified bundle symbolic name + option-path has debugging enabled */
+	protected DebugOptions debugOptions = null;
 
 	/**
 	 * Construct a new EclipseDebugTrace for the specified bundle symbolic name and write messages to the specified
@@ -57,7 +122,7 @@
 		this.traceClass = traceClass;
 		this.debugOptions = debugOptions;
 		this.bundleSymbolicName = bundleSymbolicName;
-		this.readLogProperties();
+		readLogProperties();
 	}
 
 	/**
@@ -70,9 +135,9 @@
 		if (optionPath == null)
 			return true;
 		boolean debugEnabled = false;
-		if (this.debugOptions.isDebugEnabled()) {
-			final String option = this.bundleSymbolicName + optionPath;
-			debugEnabled = this.debugOptions.getBooleanOption(option, false);
+		if (debugOptions.isDebugEnabled()) {
+			final String option = bundleSymbolicName + optionPath;
+			debugEnabled = debugOptions.getBooleanOption(option, false);
 		}
 		return debugEnabled;
 	}
@@ -83,9 +148,9 @@
 	 */
 	public void trace(final String optionPath, final String message) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, message, this.traceClass);
-			this.writeRecord(record);
+		if (isDebuggingEnabled(optionPath)) {
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, message, traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -95,9 +160,9 @@
 	 */
 	public void trace(final String optionPath, final String message, final Throwable error) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, message, error, this.traceClass);
-			this.writeRecord(record);
+		if (isDebuggingEnabled(optionPath)) {
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, message, error, traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -107,9 +172,9 @@
 	 */
 	public void traceEntry(final String optionPath) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, EclipseDebugTrace.MESSAGE_ENTER_METHOD_NO_PARAMS, this.traceClass);
-			this.writeRecord(record);
+		if (isDebuggingEnabled(optionPath)) {
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, EclipseDebugTrace.MESSAGE_ENTER_METHOD_NO_PARAMS, traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -119,8 +184,8 @@
 	 */
 	public void traceEntry(final String optionPath, final Object methodArgument) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
-			this.traceEntry(optionPath, new Object[] {methodArgument});
+		if (isDebuggingEnabled(optionPath)) {
+			traceEntry(optionPath, new Object[] {methodArgument});
 		}
 	}
 
@@ -130,7 +195,7 @@
 	 */
 	public void traceEntry(final String optionPath, final Object[] methodArguments) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
+		if (isDebuggingEnabled(optionPath)) {
 			final StringBuffer messageBuffer = new StringBuffer(EclipseDebugTrace.MESSAGE_ENTER_METHOD_WITH_PARAMS);
 			if (methodArguments != null) {
 				int i = 0;
@@ -145,8 +210,8 @@
 				}
 				messageBuffer.append(")"); //$NON-NLS-1$
 			}
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, messageBuffer.toString(), this.traceClass);
-			this.writeRecord(record);
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, messageBuffer.toString(), traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -156,9 +221,9 @@
 	 */
 	public void traceExit(final String optionPath) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, EclipseDebugTrace.MESSAGE_EXIT_METHOD_NO_RESULTS, this.traceClass);
-			this.writeRecord(record);
+		if (isDebuggingEnabled(optionPath)) {
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, EclipseDebugTrace.MESSAGE_EXIT_METHOD_NO_RESULTS, traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -168,15 +233,15 @@
 	 */
 	public void traceExit(final String optionPath, final Object result) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
+		if (isDebuggingEnabled(optionPath)) {
 			final StringBuffer messageBuffer = new StringBuffer(EclipseDebugTrace.MESSAGE_EXIT_METHOD_WITH_RESULTS);
 			if (result == null) {
 				messageBuffer.append(EclipseDebugTrace.NULL_VALUE);
 			} else {
 				messageBuffer.append(result.toString());
 			}
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, messageBuffer.toString(), this.traceClass);
-			this.writeRecord(record);
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, messageBuffer.toString(), traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -186,13 +251,13 @@
 	 */
 	public void traceDumpStack(final String optionPath) {
 
-		if (this.isDebuggingEnabled(optionPath)) {
+		if (isDebuggingEnabled(optionPath)) {
 			final StringBuffer messageBuffer = new StringBuffer(EclipseDebugTrace.MESSAGE_THREAD_DUMP);
 			StackTraceElement[] elements = new Exception().getStackTrace();
 			// the first element in this stack trace is going to be this class, so ignore it
 			// the second element in this stack trace is going to either be the caller or the trace class.  Ignore it only if a traceClass is defined
 			// the rest of the elements should be included in the file array
-			int firstIndex = (this.traceClass == null) ? 1 : 2;
+			int firstIndex = (traceClass == null) ? 1 : 2;
 			int endIndex = elements.length - firstIndex;
 			final StackTraceElement[] newElements = new StackTraceElement[endIndex];
 			int i = 0;
@@ -201,9 +266,9 @@
 				i++;
 				firstIndex++;
 			}
-			messageBuffer.append(this.convertStackTraceElementsToString(newElements));
-			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(this.bundleSymbolicName, optionPath, messageBuffer.toString(), this.traceClass);
-			this.writeRecord(record);
+			messageBuffer.append(convertStackTraceElementsToString(newElements));
+			final FrameworkDebugTraceEntry record = new FrameworkDebugTraceEntry(bundleSymbolicName, optionPath, messageBuffer.toString(), traceClass);
+			writeRecord(record);
 		}
 	}
 
@@ -242,18 +307,18 @@
 
 		if (entry != null) {
 			synchronized (EclipseDebugTrace.writeLock) {
-				final File tracingFile = this.debugOptions.getFile(); // the tracing file may be null if it has not been set
+				final File tracingFile = debugOptions.getFile(); // the tracing file may be null if it has not been set
 				Writer traceWriter = null;
 				try {
 					// check to see if the file should be rotated
-					this.checkTraceFileSize(tracingFile);
+					checkTraceFileSize(tracingFile);
 					// open the trace file
-					traceWriter = this.openWriter(tracingFile);
+					traceWriter = openWriter(tracingFile);
 					if (EclipseDebugTrace.newSession) {
-						this.writeSession(traceWriter);
+						writeSession(traceWriter);
 						EclipseDebugTrace.newSession = false;
 					}
-					this.writeMessage(traceWriter, entry);
+					writeMessage(traceWriter, entry);
 					// flush the writer
 					traceWriter.flush();
 				} catch (Exception ex) {
@@ -263,7 +328,7 @@
 				} finally {
 					// close the trace writer
 					if (tracingFile != null) {
-						this.closeWriter(traceWriter);
+						closeWriter(traceWriter);
 					}
 				}
 			}
@@ -277,20 +342,20 @@
 
 		String newMaxTraceFileSize = secureAction.getProperty(PROP_TRACE_SIZE_MAX);
 		if (newMaxTraceFileSize != null) {
-			this.maxTraceFileSize = Integer.parseInt(newMaxTraceFileSize);
-			if (this.maxTraceFileSize != 0 && this.maxTraceFileSize < DEFAULT_TRACE_FILE_MIN_SIZE) {
+			maxTraceFileSize = Integer.parseInt(newMaxTraceFileSize);
+			if (maxTraceFileSize != 0 && maxTraceFileSize < DEFAULT_TRACE_FILE_MIN_SIZE) {
 				// If the value is '0', then it means no size limitation.
 				// Also, make sure no inappropriate(too small) assigned value.
-				this.maxTraceFileSize = DEFAULT_TRACE_FILE_MIN_SIZE;
+				maxTraceFileSize = DEFAULT_TRACE_FILE_MIN_SIZE;
 			}
 		}
 
 		String newMaxLogFiles = secureAction.getProperty(PROP_TRACE_FILE_MAX);
 		if (newMaxLogFiles != null) {
-			this.maxTraceFiles = Integer.parseInt(newMaxLogFiles);
-			if (this.maxTraceFiles < 1) {
+			maxTraceFiles = Integer.parseInt(newMaxLogFiles);
+			if (maxTraceFiles < 1) {
 				// Make sure no invalid assigned value. (at least >= 1)
-				this.maxTraceFiles = DEFAULT_TRACE_FILES;
+				maxTraceFiles = DEFAULT_TRACE_FILES;
 			}
 		}
 	}
@@ -305,17 +370,17 @@
 
 		// 0 file size means there is no size limit
 		boolean isBackupOK = true;
-		if (this.maxTraceFileSize > 0) {
+		if (maxTraceFileSize > 0) {
 			if ((traceFile != null) && traceFile.exists()) {
-				if ((traceFile.length() >> 10) > this.maxTraceFileSize) { // Use KB as file size unit.
+				if ((traceFile.length() >> 10) > maxTraceFileSize) { // Use KB as file size unit.
 					final String traceFileName = traceFile.getAbsolutePath();
 
 					// Delete old backup file that will be replaced.
 					String backupFilename = ""; //$NON-NLS-1$
 					if (traceFileName.toLowerCase().endsWith(TRACE_FILE_EXTENSION)) {
-						backupFilename = traceFileName.substring(0, traceFileName.length() - TRACE_FILE_EXTENSION.length()) + BACKUP_MARK + this.backupTraceFileIndex + TRACE_FILE_EXTENSION;
+						backupFilename = traceFileName.substring(0, traceFileName.length() - TRACE_FILE_EXTENSION.length()) + BACKUP_MARK + backupTraceFileIndex + TRACE_FILE_EXTENSION;
 					} else {
-						backupFilename = traceFileName + BACKUP_MARK + this.backupTraceFileIndex;
+						backupFilename = traceFileName + BACKUP_MARK + backupTraceFileIndex;
 					}
 					final File backupFile = new File(backupFilename);
 					if (backupFile.exists()) {
@@ -343,18 +408,18 @@
 					*/
 					Writer traceWriter = null;
 					try {
-						traceWriter = this.openWriter(traceFile);
-						this.writeComment(traceWriter, "This is a continuation of trace file " + backupFile.getAbsolutePath()); //$NON-NLS-1$
-						this.writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_DATE + EclipseDebugTrace.TRACE_FILE_DATE_FORMATTER.format(new Date(System.currentTimeMillis())));
+						traceWriter = openWriter(traceFile);
+						writeComment(traceWriter, "This is a continuation of trace file " + backupFile.getAbsolutePath()); //$NON-NLS-1$
+						writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_DATE + EclipseDebugTrace.TRACE_FILE_DATE_FORMATTER.format(new Date(System.currentTimeMillis())));
 						traceWriter.flush();
 					} catch (IOException ioEx) {
 						ioEx.printStackTrace();
 					} finally {
 						if (traceFile != null) {
-							this.closeWriter(traceWriter);
+							closeWriter(traceWriter);
 						}
 					}
-					this.backupTraceFileIndex = (++this.backupTraceFileIndex) % this.maxTraceFiles;
+					backupTraceFileIndex = (++backupTraceFileIndex) % maxTraceFiles;
 				}
 			}
 		}
@@ -405,12 +470,12 @@
 	 */
 	protected void writeSession(final Writer traceWriter) throws IOException {
 
-		this.writeComment(traceWriter, EclipseDebugTrace.TRACE_NEW_SESSION + this.getFormattedDate());
-		this.writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_VERSION_COMMENT + EclipseDebugTrace.TRACE_FILE_VERSION);
-		this.writeComment(traceWriter, "The following option strings are specified for this debug session:"); //$NON-NLS-1$ 
+		writeComment(traceWriter, EclipseDebugTrace.TRACE_NEW_SESSION + this.getFormattedDate());
+		writeComment(traceWriter, EclipseDebugTrace.TRACE_FILE_VERSION_COMMENT + EclipseDebugTrace.TRACE_FILE_VERSION);
+		writeComment(traceWriter, "The following option strings are specified for this debug session:"); //$NON-NLS-1$ 
 		final String[] allOptions = FrameworkDebugOptions.getDefault().getAllOptions();
 		for (int i = 0; i < allOptions.length; i++) {
-			this.writeComment(traceWriter, "\t" + allOptions[i]); //$NON-NLS-1$
+			writeComment(traceWriter, "\t" + allOptions[i]); //$NON-NLS-1$
 		}
 	}
 
@@ -493,12 +558,12 @@
 		Writer traceWriter = null;
 		if (traceFile != null) {
 			try {
-				traceWriter = this.logForStream(secureAction.getFileOutputStream(traceFile, true));
+				traceWriter = logForStream(secureAction.getFileOutputStream(traceFile, true));
 			} catch (IOException ioEx) {
-				traceWriter = this.logForStream(System.out);
+				traceWriter = logForStream(System.out);
 			}
 		} else {
-			traceWriter = this.logForStream(System.out);
+			traceWriter = logForStream(System.out);
 		}
 		return traceWriter;
 	}
@@ -520,70 +585,4 @@
 			traceWriter = null;
 		}
 	}
-
-	/** The trace message for a thread stack dump */
-	protected final static String MESSAGE_THREAD_DUMP = "Thread Stack dump: "; //$NON-NLS-1$
-	/** The trace message for a method completing with a return value */
-	protected final static String MESSAGE_EXIT_METHOD_WITH_RESULTS = "Exiting method with result: "; //$NON-NLS-1$
-	/** The trace message for a method completing with no return value */
-	protected final static String MESSAGE_EXIT_METHOD_NO_RESULTS = "Exiting method with a void return"; //$NON-NLS-1$
-	/** The trace message for a method starting with a set of arguments */
-	protected final static String MESSAGE_ENTER_METHOD_WITH_PARAMS = "Entering method with parameters: ("; //$NON-NLS-1$
-	/** The trace message for a method starting with no arguments */
-	protected final static String MESSAGE_ENTER_METHOD_NO_PARAMS = "Entering method with no parameters"; //$NON-NLS-1$
-	/** The version attribute written to the header of the trace file */
-	protected final static String TRACE_FILE_VERSION_COMMENT = "version: "; //$NON-NLS-1$
-	/** The version value written to the header of the trace file */
-	protected final static String TRACE_FILE_VERSION = "1.0"; //$NON-NLS-1$
-	/** The new session identifier to be written whenever a new session starts */
-	protected final static String TRACE_NEW_SESSION = "!SESSION "; //$NON-NLS-1$
-	/** The date attribute written to the header of the trace file to show when this file was created */
-	protected final static String TRACE_FILE_DATE = "Time of creation: "; //$NON-NLS-1$
-	/** Trace date formatter using the pattern: yyyy-MM-dd HH:mm:ss.SSS  */
-	protected final static SimpleDateFormat TRACE_FILE_DATE_FORMATTER = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); //$NON-NLS-1$
-	/** The comment character used by the trace file */
-	protected final static String TRACE_COMMENT = "#"; //$NON-NLS-1$
-	/** The delimiter used to separate trace elements such as the time stamp, message, etc */
-	protected final static String TRACE_ELEMENT_DELIMITER = "|"; //$NON-NLS-1$
-	/** OS-specific line separator */
-	protected static final String LINE_SEPARATOR;
-	static {
-		String s = System.getProperty("line.separator"); //$NON-NLS-1$
-		LINE_SEPARATOR = s == null ? "\n" : s; //$NON-NLS-1$
-	}
-	/** The value written to the trace file if a null object is being traced */
-	public final static String NULL_VALUE = "<null>"; //$NON-NLS-1$
-	/**  */
-	private final static SecureAction secureAction = (SecureAction) AccessController.doPrivileged(SecureAction.createSecureAction());
-	/** A lock object used to synchronize access to the trace file */
-	protected final static Object writeLock = new Object();
-
-	/** An optional argument to specify the name of the class used by clients to trace messages.  If no trace class is specified
-	 * then the class calling this API is assumed to be the class being traced.
-	*/
-	protected Class traceClass = null;
-	/** The symbolic name of the bundle being traced */
-	protected String bundleSymbolicName = null;
-	/** A flag to determine if the message being written is done to a new file (i.e. should the header information be written) */
-	protected static boolean newSession = true;
-	/** DebugOptions are used to determine if the specified bundle symbolic name + option-path has debugging enabled */
-	protected DebugOptions debugOptions = null;
-
-	/******************* Tracing file attributes **************************/
-	/** The default size a trace file can grow before it is rotated */
-	public static final int DEFAULT_TRACE_FILE_SIZE = 1000; // The value is in KB.
-	/** The default number of backup trace files */
-	public static final int DEFAULT_TRACE_FILES = 10;
-	/** The minimum size limit for trace file rotation */
-	public static final int DEFAULT_TRACE_FILE_MIN_SIZE = 10;
-	/** The extension used for log files */
-	public static final String TRACE_FILE_EXTENSION = ".trace"; //$NON-NLS-1$
-	/** The extension markup to use for backup log files*/
-	public static final String BACKUP_MARK = ".bak_"; //$NON-NLS-1$
-	/** The maximum size that a trace file should grow (0 = unlimited) */
-	protected int maxTraceFileSize = DEFAULT_TRACE_FILE_SIZE; // The value is in KB.
-	/** The maximum number of trace files that should be saved */
-	protected int maxTraceFiles = DEFAULT_TRACE_FILES;
-	/** The index of the currently backed-up trace file */
-	protected int backupTraceFileIndex = 0;
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java
index 94669bf..a057932 100644
--- a/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java
+++ b/bundles/org.eclipse.osgi/supplement/src/org/eclipse/osgi/framework/debug/FrameworkDebugTraceEntry.java
@@ -14,208 +14,8 @@
  * A framework trace entry is a bean containing all of the attributes for a single trace message.
  */
 public class FrameworkDebugTraceEntry {
-
-	/**
-	 * Construct a new FrameworkTraceRecord object
-	 * 
-	 * @param bundleSymbolicName
-	 *            The symbolic name of the bundle being traced
-	 * @param optionPath
-	 *            The trace optionPath
-	 * @param message
-	 *            The trace message
-	 * @param traceClass
-	 *            The class that calls the trace API
-	 */
-	public FrameworkDebugTraceEntry(final String bundleSymbolicName, final String optionPath, final String message, final Class traceClass) {
-		this(bundleSymbolicName, optionPath, message, null, traceClass);
-	}
-
-	/**
-	 * Construct a new FrameworkTraceRecord object
-	 * 
-	 * @param bundleSymbolicName
-	 *            The symbolic name of the bundle being traced
-	 * @param optionPath
-	 *            The trace optionPath
-	 * @param message
-	 *            The trace message
-	 * @param error
-	 *            An exception to be traced
-	 * @param traceClass
-	 *            The class that calls the trace API 
-	 */
-	public FrameworkDebugTraceEntry(String bundleSymbolicName, final String optionPath, final String message, final Throwable error, final Class traceClass) {
-		this.threadName = Thread.currentThread().getName();
-		if (optionPath == null) {
-			this.optionPath = FrameworkDebugTraceEntry.DEFAULT_OPTION_PATH;
-		} else {
-			this.optionPath = optionPath;
-		}
-		this.timestamp = System.currentTimeMillis();
-		this.bundleSymbolicName = bundleSymbolicName;
-		this.message = message;
-		this.throwable = error;
-
-		String determineClassName = null;
-		String determineMethodName = null;
-		int determineLineNumber = 0;
-		// dynamically determine the class name, method name, and line number of the method calling the trace framework
-		StackTraceElement[] stackElements = new Exception().getStackTrace();
-		int i = 0;
-		while (i < stackElements.length) {
-			String fullClassName = stackElements[i].getClassName();
-			if (!fullClassName.equals(Thread.class.getName()) && !fullClassName.equals(FrameworkDebugTraceEntry.class.getName()) && !fullClassName.equals(EclipseDebugTrace.class.getName())) {
-				/*
-				 * The first class which is non-JDK or framework related has been hit.
-				 * If a traceClass has been specified then this current stack element
-				 * is likely that class so we should find out who called it.  If a
-				 * trace class has not been specified, or has been specified and this
-				 * stack element is not that class, then we assume this stack element
-				 * is the caller of the trace API. 
-				 */
-				if ((traceClass == null) || !fullClassName.equals(traceClass.getName())) {
-					determineClassName = stackElements[i].getClassName();
-					determineMethodName = stackElements[i].getMethodName();
-					determineLineNumber = stackElements[i].getLineNumber();
-				}
-				break;
-			}
-			i++;
-		}
-
-		this.className = determineClassName;
-		this.methodName = determineMethodName;
-		this.lineNumber = determineLineNumber;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	public String toString() {
-
-		final StringBuffer buffer = new StringBuffer(this.threadName);
-		buffer.append(" "); //$NON-NLS-1$
-		buffer.append(this.timestamp);
-		buffer.append(" "); //$NON-NLS-1$
-		buffer.append(this.bundleSymbolicName);
-		buffer.append(" "); //$NON-NLS-1$
-		buffer.append(this.optionPath);
-		buffer.append(" "); //$NON-NLS-1$
-		buffer.append(this.className);
-		buffer.append(" "); //$NON-NLS-1$
-		buffer.append(this.methodName);
-		buffer.append(" "); //$NON-NLS-1$
-		buffer.append(this.lineNumber);
-		if (this.message != null) {
-			buffer.append(": "); //$NON-NLS-1$
-			buffer.append(this.message);
-		}
-		if (this.throwable != null) {
-			buffer.append(this.throwable);
-		}
-		return buffer.toString();
-	}
-
-	/**
-	 * Accessor to the threads name
-	 * 
-	 * @return the name of the thread
-	 */
-	public final String getThreadName() {
-
-		return this.threadName;
-	}
-
-	/**
-	 * Accessor to the timestamp for this trace record
-	 * 
-	 * @return the date
-	 */
-	public final long getTimestamp() {
-
-		return this.timestamp;
-	}
-
-	/**
-	 * Accessor for the symbolic name of the bundle being traced
-	 * 
-	 * @return The symbolic name of the bundle being traced
-	 */
-	public final String getBundleSymbolicName() {
-
-		return this.bundleSymbolicName;
-	}
-
-	/**
-	 * Accessor for the trace message
-	 * 
-	 * @return the trace message
-	 */
-	public final String getMessage() {
-
-		return this.message;
-	}
-
-	/**
-	 * Accessor for the trace exception. This may be null if there is no exception.
-	 * 
-	 * @return the trace exception or null if none was defined.
-	 */
-	public final Throwable getThrowable() {
-
-		return this.throwable;
-	}
-
-	/**
-	 * Accessor for the name of the class being traced.
-	 * 
-	 * @return The name of the class being traced.
-	 */
-	public final String getClassName() {
-
-		return this.className;
-	}
-
-	/**
-	 * Accessor for the method being traced.
-	 * 
-	 * @return The name of the method being traced.
-	 */
-	public final String getMethodName() {
-
-		return this.methodName;
-	}
-
-	/**
-	 * Accessor for the option-path being traced. The <i>&lt;option-path&gt;</i> part of the debug option string
-	 * required for the Eclipse debugging framework.
-	 * 
-	 * <pre>
-	 *    Examples:
-	 *       1) If a trace string com.ibm.myplugin.core/debug=true is specified then 'debug' is the option-path value.
-	 *       2) If a trace string com.ibm.myplugin.core/debug/perf=true is specified then 'debug/perf' is the option-path value.
-	 * </pre>
-	 * 
-	 * 
-	 * @return The option-path being traced.
-	 */
-	public final String getOptionPath() {
-
-		return this.optionPath;
-	}
-
-	/**
-	 * Return the line number in the class/method where the trace originator
-	 * 
-	 * @return The line number from the class and method where the trace request originated
-	 */
-	public final int getLineNumber() {
-
-		return this.lineNumber;
-	}
+	/** If a bundles symbolic name is not specified then the default value of /debug can be used */
+	public final static String DEFAULT_OPTION_PATH = "/debug"; //$NON-NLS-1$
 
 	/**
 	 * The name of the thread executing the code
@@ -263,6 +63,205 @@
 	 */
 	private final Throwable throwable;
 
-	/** If a bundles symbolic name is not specified then the default value of /debug can be used */
-	public final static String DEFAULT_OPTION_PATH = "/debug"; //$NON-NLS-1$
+	/**
+	 * Construct a new FrameworkTraceRecord object
+	 * 
+	 * @param bundleSymbolicName
+	 *            The symbolic name of the bundle being traced
+	 * @param optionPath
+	 *            The trace optionPath
+	 * @param message
+	 *            The trace message
+	 * @param traceClass
+	 *            The class that calls the trace API
+	 */
+	public FrameworkDebugTraceEntry(final String bundleSymbolicName, final String optionPath, final String message, final Class traceClass) {
+		this(bundleSymbolicName, optionPath, message, null, traceClass);
+	}
+
+	/**
+	 * Construct a new FrameworkTraceRecord object
+	 * 
+	 * @param bundleSymbolicName
+	 *            The symbolic name of the bundle being traced
+	 * @param optionPath
+	 *            The trace optionPath
+	 * @param message
+	 *            The trace message
+	 * @param error
+	 *            An exception to be traced
+	 * @param traceClass
+	 *            The class that calls the trace API 
+	 */
+	public FrameworkDebugTraceEntry(String bundleSymbolicName, final String optionPath, final String message, final Throwable error, final Class traceClass) {
+		threadName = Thread.currentThread().getName();
+		if (optionPath == null) {
+			this.optionPath = FrameworkDebugTraceEntry.DEFAULT_OPTION_PATH;
+		} else {
+			this.optionPath = optionPath;
+		}
+		timestamp = System.currentTimeMillis();
+		this.bundleSymbolicName = bundleSymbolicName;
+		this.message = message;
+		throwable = error;
+
+		String determineClassName = null;
+		String determineMethodName = null;
+		int determineLineNumber = 0;
+		// dynamically determine the class name, method name, and line number of the method calling the trace framework
+		StackTraceElement[] stackElements = new Exception().getStackTrace();
+		int i = 0;
+		while (i < stackElements.length) {
+			String fullClassName = stackElements[i].getClassName();
+			if (!fullClassName.equals(Thread.class.getName()) && !fullClassName.equals(FrameworkDebugTraceEntry.class.getName()) && !fullClassName.equals(EclipseDebugTrace.class.getName())) {
+				/*
+				 * The first class which is non-JDK or framework related has been hit.
+				 * If a traceClass has been specified then this current stack element
+				 * is likely that class so we should find out who called it.  If a
+				 * trace class has not been specified, or has been specified and this
+				 * stack element is not that class, then we assume this stack element
+				 * is the caller of the trace API. 
+				 */
+				if ((traceClass == null) || !fullClassName.equals(traceClass.getName())) {
+					determineClassName = stackElements[i].getClassName();
+					determineMethodName = stackElements[i].getMethodName();
+					determineLineNumber = stackElements[i].getLineNumber();
+				}
+				break;
+			}
+			i++;
+		}
+
+		className = determineClassName;
+		methodName = determineMethodName;
+		lineNumber = determineLineNumber;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+
+		final StringBuffer buffer = new StringBuffer(threadName);
+		buffer.append(" "); //$NON-NLS-1$
+		buffer.append(timestamp);
+		buffer.append(" "); //$NON-NLS-1$
+		buffer.append(bundleSymbolicName);
+		buffer.append(" "); //$NON-NLS-1$
+		buffer.append(optionPath);
+		buffer.append(" "); //$NON-NLS-1$
+		buffer.append(className);
+		buffer.append(" "); //$NON-NLS-1$
+		buffer.append(methodName);
+		buffer.append(" "); //$NON-NLS-1$
+		buffer.append(lineNumber);
+		if (message != null) {
+			buffer.append(": "); //$NON-NLS-1$
+			buffer.append(message);
+		}
+		if (throwable != null) {
+			buffer.append(throwable);
+		}
+		return buffer.toString();
+	}
+
+	/**
+	 * Accessor to the threads name
+	 * 
+	 * @return the name of the thread
+	 */
+	public final String getThreadName() {
+
+		return threadName;
+	}
+
+	/**
+	 * Accessor to the timestamp for this trace record
+	 * 
+	 * @return the date
+	 */
+	public final long getTimestamp() {
+
+		return timestamp;
+	}
+
+	/**
+	 * Accessor for the symbolic name of the bundle being traced
+	 * 
+	 * @return The symbolic name of the bundle being traced
+	 */
+	public final String getBundleSymbolicName() {
+
+		return bundleSymbolicName;
+	}
+
+	/**
+	 * Accessor for the trace message
+	 * 
+	 * @return the trace message
+	 */
+	public final String getMessage() {
+
+		return message;
+	}
+
+	/**
+	 * Accessor for the trace exception. This may be null if there is no exception.
+	 * 
+	 * @return the trace exception or null if none was defined.
+	 */
+	public final Throwable getThrowable() {
+
+		return throwable;
+	}
+
+	/**
+	 * Accessor for the name of the class being traced.
+	 * 
+	 * @return The name of the class being traced.
+	 */
+	public final String getClassName() {
+
+		return className;
+	}
+
+	/**
+	 * Accessor for the method being traced.
+	 * 
+	 * @return The name of the method being traced.
+	 */
+	public final String getMethodName() {
+
+		return methodName;
+	}
+
+	/**
+	 * Accessor for the option-path being traced. The <i>&lt;option-path&gt;</i> part of the debug option string
+	 * required for the Eclipse debugging framework.
+	 * 
+	 * <pre>
+	 *    Examples:
+	 *       1) If a trace string com.ibm.myplugin.core/debug=true is specified then 'debug' is the option-path value.
+	 *       2) If a trace string com.ibm.myplugin.core/debug/perf=true is specified then 'debug/perf' is the option-path value.
+	 * </pre>
+	 * 
+	 * 
+	 * @return The option-path being traced.
+	 */
+	public final String getOptionPath() {
+
+		return optionPath;
+	}
+
+	/**
+	 * Return the line number in the class/method where the trace originator
+	 * 
+	 * @return The line number from the class and method where the trace request originated
+	 */
+	public final int getLineNumber() {
+
+		return lineNumber;
+	}
 }
\ No newline at end of file
