diff --git a/debug/org.eclipse.cdt.debug.core/ChangeLog b/debug/org.eclipse.cdt.debug.core/ChangeLog
index 4dfb56e038d..76dbace4fb5 100644
--- a/debug/org.eclipse.cdt.debug.core/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.core/ChangeLog
@@ -1,3 +1,17 @@
+2003-01-10 Mikhail Khodjaiants
+	Implementation of address breakpoints.
+	* ICAddressBreakpoint.java
+	* ICDebugTarget.java
+	* IDisassemblyStorage.java
+	* CDebugModel.java
+	* ICBreakpointManager.java
+	* CAddressBreakpoint.java
+	* CFunctionBreakpoint.java
+	* CDebugTarget.java
+	* CStackFrame.java
+	* DisassemblyManager.java
+	* DisassemblyStorage.java
+
 2003-01-06 Alain Magloire
 
     * build.properties: Patch from Judy Green.
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java
index aa2fa3ee447..19a1a74adef 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/CDebugModel.java
@@ -18,6 +18,7 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDIExpression;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIMemoryBlock;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
 import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
+import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICDebugTargetType;
 import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
@@ -25,6 +26,7 @@ import org.eclipse.cdt.debug.core.model.ICWatchpoint;
 import org.eclipse.cdt.debug.core.model.IFormattedMemoryBlock;
 import org.eclipse.cdt.debug.internal.core.CDebugUtils;
 import org.eclipse.cdt.debug.internal.core.ICDebugInternalConstants;
+import org.eclipse.cdt.debug.internal.core.breakpoints.CAddressBreakpoint;
 import org.eclipse.cdt.debug.internal.core.breakpoints.CLineBreakpoint;
 import org.eclipse.cdt.debug.internal.core.breakpoints.CWatchpoint;
 import org.eclipse.cdt.debug.internal.core.model.CDebugTarget;
@@ -305,6 +307,60 @@ public class CDebugModel
 		return new CLineBreakpoint( resource, attributes, add );
 	}
 
+	public static ICAddressBreakpoint addressBreakpointExists( IResource resource, long address ) throws CoreException
+	{
+		String modelId = getPluginIdentifier();
+		String markerType = CAddressBreakpoint.getMarkerType();
+		IBreakpointManager manager = DebugPlugin.getDefault().getBreakpointManager();
+		IBreakpoint[] breakpoints = manager.getBreakpoints( modelId );
+		for ( int i = 0; i < breakpoints.length; i++ )
+		{
+			if ( !( breakpoints[i] instanceof ICAddressBreakpoint ) )
+			{
+				continue;
+			}
+			ICAddressBreakpoint breakpoint = (ICAddressBreakpoint)breakpoints[i];
+			if ( breakpoint.getMarker().getType().equals( markerType ) )
+			{
+				if ( breakpoint.getMarker().getResource().getLocation().toOSString().equals( resource.getLocation().toOSString() ) )
+				{
+					try
+					{
+						if ( Long.parseLong( breakpoint.getAddress() ) == address )
+						{
+							return breakpoint;
+						}
+					}
+					catch( NumberFormatException e )
+					{
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	public static ICAddressBreakpoint createAddressBreakpoint( IResource resource,
+															   int lineNumber, 
+															   long address, 
+															   boolean enabled,
+															   int ignoreCount, 
+															   String condition, 
+															   boolean add ) throws DebugException
+	{
+		HashMap attributes = new HashMap( 10 );
+		attributes.put( ICBreakpoint.ID, getPluginIdentifier() );
+//		attributes.put( IMarker.LINE_NUMBER, new Integer( lineNumber ) );
+		attributes.put( IMarker.CHAR_START, new Integer( 0 ) );
+		attributes.put( IMarker.CHAR_END, new Integer( 0 ) );
+		attributes.put( IMarker.LINE_NUMBER, new Integer( -1 ) );
+		attributes.put( ICAddressBreakpoint.ADDRESS, Long.toString( address ) );
+		attributes.put( ICBreakpoint.ENABLED, new Boolean( enabled ) );
+		attributes.put( ICBreakpoint.IGNORE_COUNT, new Integer( ignoreCount ) );
+		attributes.put( ICBreakpoint.CONDITION, condition );
+		return new CAddressBreakpoint( resource, attributes, add );
+	}
+
 	public static ICWatchpoint watchpointExists( IResource resource, boolean write, boolean read, String expression ) throws CoreException
 	{
 		String modelId = getPluginIdentifier();
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICBreakpointManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICBreakpointManager.java
new file mode 100644
index 00000000000..9287c047204
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/ICBreakpointManager.java
@@ -0,0 +1,19 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+package org.eclipse.cdt.debug.core;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.debug.core.model.IBreakpoint;
+
+/**
+ * Enter type comment.
+ * 
+ * @since: Jan 7, 2003
+ */
+public interface ICBreakpointManager extends IAdaptable
+{
+	long getBreakpointAddress( IBreakpoint breakpoint );
+}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICAddressBreakpoint.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICAddressBreakpoint.java
index 129e943ddf6..3c310252706 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICAddressBreakpoint.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICAddressBreakpoint.java
@@ -15,6 +15,13 @@ import org.eclipse.core.runtime.CoreException;
  */
 public interface ICAddressBreakpoint extends ICLineBreakpoint
 {
+	/**
+	 * Breakpoint attribute storing the address this breakpoint suspends 
+	 * execution at (value <code>"org.eclipse.cdt.debug.core.address"</code>).
+	 * This attribute is a <code>String</code>.
+	 */
+	public static final String ADDRESS = "org.eclipse.cdt.debug.core.address"; //$NON-NLS-1$	
+
 	/**
 	 * Returns the address this breakpoint suspends execution at.
 	 * 
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
index 6321873f8cd..5a5aebb2a61 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/model/ICDebugTarget.java
@@ -5,6 +5,7 @@
  */
 package org.eclipse.cdt.debug.core.model;
 
+import org.eclipse.cdt.debug.core.ICBreakpointManager;
 import org.eclipse.debug.core.model.IDebugTarget;
 
 /**
@@ -20,6 +21,7 @@ public interface ICDebugTarget extends IDebugTarget,
 									   IRestart,
 									   IRunToLine,
 									   IState,
-									   ISwitchToThread
+									   ISwitchToThread,
+									   ICBreakpointManager
 {
 }
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IDisassemblyStorage.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IDisassemblyStorage.java
index 388ad1229ce..809c7fd6c61 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IDisassemblyStorage.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/core/sourcelookup/IDisassemblyStorage.java
@@ -37,4 +37,11 @@ public interface IDisassemblyStorage extends IStorage
 	 * @return the line number for given address
 	 */
 	int getLineNumber( long address ) ;
+
+	/**
+	 * Returns the address of instruction at given line.
+	 * @param lineNumber - a line number 
+	 * @return the address of instruction at given line
+	 */
+	long getAddress( int lineNumber ) ;
 }
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/DisassemblyStorage.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/DisassemblyStorage.java
index c5b488ddb47..f53065f3721 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/DisassemblyStorage.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/DisassemblyStorage.java
@@ -223,4 +223,16 @@ public class DisassemblyStorage implements IDisassemblyStorage
 		}
 		return null;
 	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage#getAddress(int)
+	 */
+	public long getAddress( int lineNumber )
+	{
+		if ( fInstructions.length > lineNumber && lineNumber >= 0 )
+		{
+			return fInstructions[lineNumber].getAdress();
+		}
+		return 0;
+	}
 }
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CAddressBreakpoint.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CAddressBreakpoint.java
index ae94648639e..6d630dc79ef 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CAddressBreakpoint.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CAddressBreakpoint.java
@@ -21,14 +21,7 @@ import org.eclipse.debug.core.DebugException;
  */
 public class CAddressBreakpoint extends CBreakpoint	implements ICAddressBreakpoint
 {
-	private static final String C_ADDRESS_BREAKPOINT = "org.eclipse.jdt.debug.cAddressBreakpointMarker"; //$NON-NLS-1$
-
-	/**
-	 * Breakpoint attribute storing the address this breakpoint suspends 
-	 * execution at (value <code>"org.eclipse.cdt.debug.core.address"</code>).
-	 * This attribute is a <code>String</code>.
-	 */
-	protected static final String ADDRESS = "org.eclipse.cdt.debug.core.address"; //$NON-NLS-1$	
+	private static final String C_ADDRESS_BREAKPOINT = "org.eclipse.cdt.debug.core.cAddressBreakpointMarker"; //$NON-NLS-1$
 
 	/**
 	 * Constructor for CAddressBreakpoint.
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CFunctionBreakpoint.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CFunctionBreakpoint.java
index 09e2f170138..ae5a8a6178a 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CFunctionBreakpoint.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CFunctionBreakpoint.java
@@ -21,7 +21,7 @@ import org.eclipse.debug.core.DebugException;
  */
 public class CFunctionBreakpoint extends CBreakpoint implements ICFunctionBreakpoint
 {
-	private static final String C_FUNCTION_BREAKPOINT = "org.eclipse.jdt.debug.cFunctionBreakpointMarker"; //$NON-NLS-1$
+	private static final String C_FUNCTION_BREAKPOINT = "org.eclipse.cdt.debug.core.cFunctionBreakpointMarker"; //$NON-NLS-1$
 
 	/**
 	 * Breakpoint attribute storing the function this breakpoint suspends 
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
index 68947a6940d..7dc3d43ecc1 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CDebugTarget.java
@@ -18,6 +18,7 @@ import org.eclipse.cdt.core.model.ICElement;
 import org.eclipse.cdt.core.model.ICFile;
 import org.eclipse.cdt.debug.core.CDebugCorePlugin;
 import org.eclipse.cdt.debug.core.CDebugModel;
+import org.eclipse.cdt.debug.core.ICBreakpointManager;
 import org.eclipse.cdt.debug.core.ICMemoryManager;
 import org.eclipse.cdt.debug.core.cdi.CDIException;
 import org.eclipse.cdt.debug.core.cdi.ICDIBreakpointHit;
@@ -46,10 +47,12 @@ import org.eclipse.cdt.debug.core.cdi.event.ICDIRestartedEvent;
 import org.eclipse.cdt.debug.core.cdi.event.ICDIResumedEvent;
 import org.eclipse.cdt.debug.core.cdi.event.ICDISuspendedEvent;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIBreakpoint;
+import org.eclipse.cdt.debug.core.cdi.model.ICDILocationBreakpoint;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIObject;
 import org.eclipse.cdt.debug.core.cdi.model.ICDITarget;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIThread;
 import org.eclipse.cdt.debug.core.cdi.model.ICDIWatchpoint;
+import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICDebugTarget;
 import org.eclipse.cdt.debug.core.model.ICDebugTargetType;
@@ -385,9 +388,9 @@ public class CDebugTarget extends CDebugElement
 	 */
 	public boolean supportsBreakpoint( IBreakpoint breakpoint )
 	{
-/*
 		if ( !getConfiguration().supportsBreakpoints() )
 			return false;
+/*
 		if ( breakpoint instanceof ICBreakpoint )
 		{
 			ISourceLocator sl =  getSourceLocator();
@@ -399,7 +402,17 @@ public class CDebugTarget extends CDebugElement
 		}
 		return false;
 */
-		return getConfiguration().supportsBreakpoints();
+		if ( breakpoint instanceof ICAddressBreakpoint )
+		{
+			return supportsAddressBreakpoint( (ICAddressBreakpoint)breakpoint );
+		}
+		return true;
+	}
+
+	private boolean supportsAddressBreakpoint( ICAddressBreakpoint breakpoint )
+	{
+		return ( getExecFile() != null && 
+				 getExecFile().getLocation().toOSString().equals( breakpoint.getMarker().getResource().getLocation().toOSString() ) );		
 	}
 
 	/* (non-Javadoc)
@@ -628,7 +641,11 @@ public class CDebugTarget extends CDebugElement
 		{
 			try
 			{
-				if ( breakpoint instanceof ICLineBreakpoint )
+				if ( breakpoint instanceof ICAddressBreakpoint )
+				{
+					setAddressBreakpoint( (ICAddressBreakpoint)breakpoint );
+				}
+				else if ( breakpoint instanceof ICLineBreakpoint )
 				{
 					setLineBreakpoint( (ICLineBreakpoint)breakpoint );
 				}
@@ -844,6 +861,8 @@ public class CDebugTarget extends CDebugElement
 			return this;
 		if ( adapter.equals( IRunToLine.class ) )
 			return this;
+		if ( adapter.equals( ICBreakpointManager.class ) )
+			return this;
 		if ( adapter.equals( DisassemblyManager.class ) )
 			return fDisassemblyManager;
 		return super.getAdapter( adapter );
@@ -1614,6 +1633,38 @@ public class CDebugTarget extends CDebugElement
 		}
 	}
 	
+	private void setAddressBreakpoint( ICAddressBreakpoint breakpoint ) throws DebugException
+	{
+		ICDIBreakpointManager bm = getCDISession().getBreakpointManager();
+		try
+		{
+			ICDILocation location = bm.createLocation( Long.parseLong( breakpoint.getAddress() ) );
+			ICDICondition condition = bm.createCondition( breakpoint.getIgnoreCount(), breakpoint.getCondition() );
+			ICDIBreakpoint cdiBreakpoint = bm.setLocationBreakpoint( ICDIBreakpoint.REGULAR, location, condition, null );
+			if ( !getBreakpoints().containsKey( breakpoint ) )
+			{
+				getBreakpoints().put( breakpoint, cdiBreakpoint );
+				((CBreakpoint)breakpoint).incrementInstallCount();
+				if ( !breakpoint.isEnabled() )
+				{
+					cdiBreakpoint.setEnabled( false );
+				}
+			}
+		}
+		catch( CoreException ce )
+		{
+			requestFailed( "Operation failed. Reason: ", ce );
+		}
+		catch( CDIException e )
+		{
+			requestFailed( "Operation failed. Reason: ", e );
+		}
+		catch( NumberFormatException e )
+		{
+			requestFailed( "Operation failed. Reason: ", e );
+		}
+	}
+	
 	private void setWatchpoint( ICWatchpoint watchpoint ) throws DebugException
 	{
 		ICDIBreakpointManager bm = getCDISession().getBreakpointManager();
@@ -1900,9 +1951,12 @@ public class CDebugTarget extends CDebugElement
 	protected int getRealSourceMode()
 	{
 		ISourceLocator sl = getSourceLocator();
-		if ( sl != null && sl instanceof CSourceManager )
+		if ( sl != null && 
+			 sl instanceof IAdaptable && 
+			 ((IAdaptable)sl).getAdapter( ICSourceLocator.class ) != null &&
+			 ((IAdaptable)sl).getAdapter( ICSourceLocator.class ) instanceof CSourceManager )
 		{
-			return ((CSourceManager)sl).getRealMode();
+			return ((CSourceManager)((IAdaptable)sl).getAdapter( ICSourceLocator.class )).getRealMode();
 		}
 		return ISourceMode.MODE_SOURCE;
 	}
@@ -2035,4 +2089,27 @@ public class CDebugTarget extends CDebugElement
 	{
 		return fDisassemblyManager;
 	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.cdt.debug.core.ICBreakpointManager#getBreakpointAddress(IBreakpoint)
+	 */
+	public long getBreakpointAddress( IBreakpoint breakpoint )
+	{
+		ICDIBreakpoint cdiBreakpoint = findCDIBreakpoint( breakpoint );
+		if ( cdiBreakpoint != null && cdiBreakpoint instanceof ICDILocationBreakpoint )
+		{
+			try
+			{
+				ICDILocation location = ((ICDILocationBreakpoint)cdiBreakpoint).getLocation();
+				if ( location != null )
+				{
+					return location.getAddress();
+				}
+			}
+			catch( CDIException e )
+			{
+			}
+		}
+		return 0;
+	}
 }
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java
index 38333c2c2ef..0859c81f417 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/model/CStackFrame.java
@@ -22,6 +22,7 @@ import org.eclipse.cdt.debug.core.cdi.model.ICDIVariable;
 import org.eclipse.cdt.debug.core.model.IRestart;
 import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
 import org.eclipse.cdt.debug.core.sourcelookup.ICSourceLocator;
+import org.eclipse.core.runtime.IAdaptable;
 import org.eclipse.debug.core.DebugException;
 import org.eclipse.debug.core.model.IRegisterGroup;
 import org.eclipse.debug.core.model.ISourceLocator;
@@ -178,8 +179,9 @@ public class CStackFrame extends CDebugElement
 		if ( isSuspended() )
 		{
 			ISourceLocator locator = ((CDebugTarget)getDebugTarget()).getSourceLocator();
-			if ( locator != null && locator instanceof ICSourceLocator )
-				return ((ICSourceLocator)locator).getLineNumber( this );
+			if ( locator != null && locator instanceof IAdaptable && 
+				 ((IAdaptable)locator).getAdapter( ICSourceLocator.class ) != null )
+				return ((ICSourceLocator)((IAdaptable)locator).getAdapter( ICSourceLocator.class )).getLineNumber( this );
 			if ( getCDIStackFrame() != null && getCDIStackFrame().getLocation() != null )
 				return getCDIStackFrame().getLocation().getLineNumber();
 		}
diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/DisassemblyManager.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/DisassemblyManager.java
index d677e6fba5d..017cd176848 100644
--- a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/DisassemblyManager.java
+++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/sourcelookup/DisassemblyManager.java
@@ -61,6 +61,20 @@ public class DisassemblyManager
 		}
 		return null;
 	}
+
+	public Object getSourceElement( long address )
+	{
+		DisassemblyStorage storage = null;
+		if ( getDisassemblyStorage() != null && getDisassemblyStorage().containsAddress( address ) )
+		{
+			storage = getDisassemblyStorage();
+		}
+		else
+		{
+			storage = loadDisassemblyStorage( address );
+		}			
+		return storage;
+	}
 	
 	private void setDebugTarget( CDebugTarget target )
 	{
@@ -144,6 +158,38 @@ public class DisassemblyManager
 		}
 		return getDisassemblyStorage();
 	}
+
+	private DisassemblyStorage loadDisassemblyStorage( long address )
+	{
+		setDisassemblyStorage( null );
+		if ( getDebugTarget() != null && getDebugTarget().isSuspended() )
+		{
+			ICDISourceManager sm = getDebugTarget().getCDISession().getSourceManager();
+			if ( sm != null )
+			{
+				ICDIInstruction[] instructions = new ICDIInstruction[0];
+				if ( instructions.length == 0 )
+				{
+					if ( address >= 0 )
+					{
+						try
+						{
+							instructions = getFunctionInstructions( sm.getInstructions( address, address + DISASSEMBLY_BLOCK_SIZE ) );
+						}
+						catch( CDIException e )
+						{
+							CDebugCorePlugin.log( e );
+						}
+					}
+				}
+				if ( instructions.length > 0 )
+				{
+					setDisassemblyStorage( new DisassemblyStorage( getDebugTarget(), instructions ) );
+				}
+			}
+		}
+		return getDisassemblyStorage();
+	}
 	
 	private ICDIInstruction[] getFunctionInstructions( ICDIInstruction[] rawInstructions )
 	{
diff --git a/debug/org.eclipse.cdt.debug.ui/ChangeLog b/debug/org.eclipse.cdt.debug.ui/ChangeLog
index c11052b5527..e9159c0590f 100644
--- a/debug/org.eclipse.cdt.debug.ui/ChangeLog
+++ b/debug/org.eclipse.cdt.debug.ui/ChangeLog
@@ -1,3 +1,25 @@
+2003-01-10 Mikhail Khodjaiants
+	Implementation of address breakpoints.
+	* CDebugImages.java
+	* CDTDebugModelPresentation.java
+	* BreakpointLocationVerifier.java
+	* CBreakpointPreferencePage.java
+	* ManageBreakpointActionDelegate.java
+	* ManageBreakpointRulerAction.java
+	* ManageBreakpointRulerActionDelegate.java
+	* DisassemblyDocumentProvider.java
+	* DisassemblyEditor.java
+	* DisassemblyEditorInput.java
+	* DisassemblyMarkerAnnotation.java
+	* DisassemblyMarkerAnnotationModel.java
+	* CDebugUIPlugin.java
+	* plugin.properties
+	* plugin.xml
+	
+	New icons:
+	* full/obj16/addrbrkp_obj.gif
+	* full/obj16/addrbrkpd_obj.gif
+
 2003-01-06 Alain Magloire
 
 	* build.properties: Patch from Judy Green.
diff --git a/debug/org.eclipse.cdt.debug.ui/icons/full/obj16/addrbrkp_obj.gif b/debug/org.eclipse.cdt.debug.ui/icons/full/obj16/addrbrkp_obj.gif
new file mode 100644
index 00000000000..80eb70008cd
Binary files /dev/null and b/debug/org.eclipse.cdt.debug.ui/icons/full/obj16/addrbrkp_obj.gif differ
diff --git a/debug/org.eclipse.cdt.debug.ui/icons/full/obj16/addrbrkpd_obj.gif b/debug/org.eclipse.cdt.debug.ui/icons/full/obj16/addrbrkpd_obj.gif
new file mode 100644
index 00000000000..5f6c10598b4
Binary files /dev/null and b/debug/org.eclipse.cdt.debug.ui/icons/full/obj16/addrbrkpd_obj.gif differ
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.properties b/debug/org.eclipse.cdt.debug.ui/plugin.properties
index a1f969f3383..f7a72711b3e 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.properties
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.properties
@@ -48,3 +48,5 @@ NaturalVariableFormatAction.label=Natural
 CDebugActionGroup.name=C/C++ Debug
 
 SourcePropertyPage.name=Source Lookup
+
+DisassemblyEditor.name=Disassembly Editor
diff --git a/debug/org.eclipse.cdt.debug.ui/plugin.xml b/debug/org.eclipse.cdt.debug.ui/plugin.xml
index 4e07ecef686..176cbe6437a 100644
--- a/debug/org.eclipse.cdt.debug.ui/plugin.xml
+++ b/debug/org.eclipse.cdt.debug.ui/plugin.xml
@@ -720,5 +720,16 @@
             id="org.eclipse.cdt.debug.ui.sourcelookup.SourcePropertyPage">
       </page>
    </extension>
+   <extension
+         id="org.eclipse.cdt.debug.ui.editors"
+         point="org.eclipse.ui.editors">
+      <editor
+            name="%DisassemblyEditor.name"
+            extensions="dasm"
+            icon="icons/full/obj16/disassembly_obj.gif"
+            class="org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditor"
+            id="org.eclipse.cdt.debug.ui.DisassemblyEditor">
+      </editor>
+   </extension>
 
 </plugin>
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDTDebugModelPresentation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDTDebugModelPresentation.java
index 4523e6e905c..4a1da0df45e 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDTDebugModelPresentation.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDTDebugModelPresentation.java
@@ -25,9 +25,12 @@ import org.eclipse.cdt.debug.core.model.ICLineBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICValue;
 import org.eclipse.cdt.debug.core.model.ICWatchpoint;
 import org.eclipse.cdt.debug.core.model.IDummyStackFrame;
+import org.eclipse.cdt.debug.core.model.IExecFileInfo;
 import org.eclipse.cdt.debug.core.model.IStackFrameInfo;
 import org.eclipse.cdt.debug.core.model.IState;
 import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
+import org.eclipse.cdt.debug.internal.core.CDebugUtils;
+import org.eclipse.cdt.debug.internal.core.sourcelookup.DisassemblyManager;
 import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput;
 import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
 import org.eclipse.cdt.internal.ui.util.ExternalEditorInput;
@@ -126,19 +129,24 @@ public class CDTDebugModelPresentation extends LabelProvider
 	 */
 	public IEditorInput getEditorInput( Object element )
 	{
-		IFile file = null;
 		if ( element instanceof IMarker )
 		{
 			IResource resource = ((IMarker)element).getResource();
 			if ( resource instanceof IFile )
-				file = (IFile)resource; 
+				return new FileEditorInput( (IFile)resource ); 
 		}
 		if ( element instanceof IFile )
-			file = (IFile)element;
+		{
+			return new FileEditorInput( (IFile)element );
+		}
+		if ( element instanceof ICAddressBreakpoint )
+		{
+			return getDisassemblyEditorInput( (ICAddressBreakpoint)element );
+		}
 		if ( element instanceof ICLineBreakpoint )
-			file = (IFile)((ICLineBreakpoint)element).getMarker().getResource().getAdapter( IFile.class );
-		if ( file != null ) 
-			return new FileEditorInput( file );
+		{
+			return new FileEditorInput( (IFile)((ICLineBreakpoint)element).getMarker().getResource().getAdapter( IFile.class ) );
+		}
 		if ( element instanceof FileStorage )
 		{
 			return new ExternalEditorInput( (IStorage)element );
@@ -491,6 +499,10 @@ public class CDTDebugModelPresentation extends LabelProvider
 
 	protected Image getBreakpointImage( ICBreakpoint breakpoint ) throws CoreException
 	{
+		if ( breakpoint instanceof ICAddressBreakpoint )
+		{
+			return getAddressBreakpointImage( (ICAddressBreakpoint)breakpoint );
+		}
 		if ( breakpoint instanceof ICLineBreakpoint )
 		{
 			return getLineBreakpointImage( (ICLineBreakpoint)breakpoint );
@@ -517,6 +529,21 @@ public class CDTDebugModelPresentation extends LabelProvider
 		return fDebugImageRegistry.get( descriptor );
 	}
 
+	protected Image getAddressBreakpointImage( ICAddressBreakpoint breakpoint ) throws CoreException
+	{
+		int flags = computeBreakpointAdornmentFlags( breakpoint );
+		CImageDescriptor descriptor = null;
+		if ( breakpoint.isEnabled() )
+		{
+			descriptor = new CImageDescriptor( CDebugImages.DESC_OBJS_ADDRESS_BREAKPOINT_ENABLED,  flags );
+		}
+		else
+		{
+			descriptor = new CImageDescriptor( CDebugImages.DESC_OBJS_ADDRESS_BREAKPOINT_DISABLED,  flags );
+		}
+		return fDebugImageRegistry.get( descriptor );
+	}
+
 	protected Image getWatchpointImage( ICWatchpoint watchpoint ) throws CoreException
 	{
 		int flags = computeBreakpointAdornmentFlags( watchpoint );
@@ -549,15 +576,14 @@ public class CDTDebugModelPresentation extends LabelProvider
 
 	protected String getBreakpointText( IBreakpoint breakpoint, boolean qualified ) throws CoreException
 	{
-
-		if ( breakpoint instanceof ICLineBreakpoint )
-		{
-			return getLineBreakpointText( (ICLineBreakpoint)breakpoint, qualified );
-		}
 		if ( breakpoint instanceof ICAddressBreakpoint )
 		{
 			return getAddressBreakpointText( (ICAddressBreakpoint)breakpoint, qualified );
 		}
+		if ( breakpoint instanceof ICLineBreakpoint )
+		{
+			return getLineBreakpointText( (ICLineBreakpoint)breakpoint, qualified );
+		}
 		if ( breakpoint instanceof ICFunctionBreakpoint )
 		{
 			return getFunctionBreakpointText( (ICFunctionBreakpoint)breakpoint, qualified );
@@ -591,7 +617,12 @@ public class CDTDebugModelPresentation extends LabelProvider
 
 	protected String getAddressBreakpointText( ICAddressBreakpoint breakpoint, boolean qualified ) throws CoreException
 	{
-		return null;
+		StringBuffer label = new StringBuffer();
+		appendResourceName( breakpoint, label, qualified );
+		appendAddress( breakpoint, label );
+		appendIgnoreCount( breakpoint, label );
+		appendCondition( breakpoint, label );
+		return label.toString();
 	}
 
 	protected String getFunctionBreakpointText( ICFunctionBreakpoint breakpoint, boolean qualified ) throws CoreException
@@ -605,7 +636,7 @@ public class CDTDebugModelPresentation extends LabelProvider
 		if ( !path.isEmpty() )
 			label.append( qualified ? path.toOSString() : path.lastSegment() );
 		return label;
-}
+	}
 	
 	protected StringBuffer appendLineNumber( ICLineBreakpoint breakpoint, StringBuffer label ) throws CoreException
 	{
@@ -621,6 +652,21 @@ public class CDTDebugModelPresentation extends LabelProvider
 		return label;
 	}
 
+	protected StringBuffer appendAddress( ICAddressBreakpoint breakpoint, StringBuffer label ) throws CoreException
+	{
+		try
+		{
+			long address = Long.parseLong( breakpoint.getAddress() );
+			label.append( " [address: " );
+			label.append( CDebugUtils.toHexAddressString( address ) );
+			label.append( ']' );
+		}
+		catch( NumberFormatException e )
+		{
+		}
+		return label;
+	}
+
 	protected StringBuffer appendIgnoreCount( ICBreakpoint breakpoint, StringBuffer label ) throws CoreException
 	{
 		int ignoreCount = breakpoint.getIgnoreCount();
@@ -723,4 +769,33 @@ public class CDTDebugModelPresentation extends LabelProvider
 	{
 		return fDebugImageRegistry.get( new CImageDescriptor( DebugUITools.getImageDescriptor( IDebugUIConstants.IMG_OBJS_EXPRESSION ),  0 ) );
 	}
+
+	protected DisassemblyEditorInput getDisassemblyEditorInput( ICAddressBreakpoint breakpoint )
+	{
+		IDebugTarget[] targets = DebugPlugin.getDefault().getLaunchManager().getDebugTargets();
+		for ( int i = 0; i < targets.length; ++i )
+		{
+			IResource resource = breakpoint.getMarker().getResource();
+			if ( resource != null && resource instanceof IFile && 
+				 targets[i].getAdapter( IExecFileInfo.class )!= null &&
+				 ((IFile)resource).getLocation().toOSString().equals( ((IExecFileInfo)targets[i].getAdapter( IExecFileInfo.class )).getExecFile().getLocation().toOSString() ) )
+			{
+				if ( targets[i].getAdapter( DisassemblyManager.class ) != null )
+				{
+					try
+					{
+						long address = Long.parseLong( breakpoint.getAddress() );
+						return new DisassemblyEditorInput( (IStorage)(((DisassemblyManager)targets[i].getAdapter( DisassemblyManager.class )).getSourceElement( address ) ) );
+					}
+					catch( NumberFormatException e )
+					{
+					}
+					catch( CoreException e )
+					{
+					}
+				}
+			}
+		}
+		return null;
+	}
 }
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugImages.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugImages.java
index 17b508b44ee..eb8de36dd8f 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugImages.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/CDebugImages.java
@@ -48,6 +48,8 @@ public class CDebugImages
 	 */	
 	public static final String IMG_OBJS_BREAKPOINT_INSTALLED = NAME_PREFIX + "installed_ovr.gif"; //$NON-NLS-1$
 	public static final String IMG_OBJS_BREAKPOINT_INSTALLED_DISABLED = NAME_PREFIX + "installed_ovr_disabled.gif"; //$NON-NLS-1$
+	public static final String IMG_OBJS_ADDRESS_BREAKPOINT_ENABLED = NAME_PREFIX + "addrbrkp_obj.gif";	//$NON-NLS-1$
+	public static final String IMG_OBJS_ADDRESS_BREAKPOINT_DISABLED = NAME_PREFIX + "addrbrkpd_obj.gif";	//$NON-NLS-1$
 	public static final String IMG_OBJS_WATCHPOINT_ENABLED = NAME_PREFIX + "readwrite_obj.gif";	//$NON-NLS-1$
 	public static final String IMG_OBJS_WATCHPOINT_DISABLED = NAME_PREFIX + "readwrite_obj_disabled.gif";	//$NON-NLS-1$
 	public static final String IMG_OBJS_READ_WATCHPOINT_ENABLED = NAME_PREFIX + "read_obj.gif";	//$NON-NLS-1$
@@ -93,6 +95,8 @@ public class CDebugImages
 
 	public static final ImageDescriptor DESC_OBJS_BREAKPOINT_INSTALLED = createManaged( T_OVR, IMG_OBJS_BREAKPOINT_INSTALLED );
 	public static final ImageDescriptor DESC_OBJS_BREAKPOINT_INSTALLED_DISABLED = createManaged( T_OVR, IMG_OBJS_BREAKPOINT_INSTALLED_DISABLED );
+	public static final ImageDescriptor DESC_OBJS_ADDRESS_BREAKPOINT_ENABLED = createManaged( T_OBJ, IMG_OBJS_ADDRESS_BREAKPOINT_ENABLED );
+	public static final ImageDescriptor DESC_OBJS_ADDRESS_BREAKPOINT_DISABLED = createManaged( T_OBJ, IMG_OBJS_ADDRESS_BREAKPOINT_DISABLED );
 	public static final ImageDescriptor DESC_OBJS_WATCHPOINT_ENABLED = createManaged( T_OBJ, IMG_OBJS_WATCHPOINT_ENABLED );
 	public static final ImageDescriptor DESC_OBJS_WATCHPOINT_DISABLED = createManaged( T_OBJ, IMG_OBJS_WATCHPOINT_DISABLED );
 	public static final ImageDescriptor DESC_OBJS_READ_WATCHPOINT_ENABLED = createManaged( T_OBJ, IMG_OBJS_READ_WATCHPOINT_ENABLED );
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/BreakpointLocationVerifier.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/BreakpointLocationVerifier.java
index 9ac68e79815..6ee353e13f1 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/BreakpointLocationVerifier.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/BreakpointLocationVerifier.java
@@ -20,9 +20,15 @@ public class BreakpointLocationVerifier
 	 * valid location for a breakpoint in the given document, or -1 if a valid location
 	 * cannot be found.
 	 */
-	public int getValidBreakpointLocation( IDocument doc, int lineNumber ) 
+	public int getValidLineBreakpointLocation( IDocument doc, int lineNumber ) 
 	{
 		// for now
 		return lineNumber + 1;
 	}
+
+	public int getValidAddressBreakpointLocation( IDocument doc, int lineNumber ) 
+	{
+		// for now
+		return lineNumber;
+	}
 }
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPreferencePage.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPreferencePage.java
index 56512447f9f..c459701ff49 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPreferencePage.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/CBreakpointPreferencePage.java
@@ -5,8 +5,10 @@
  */
 package org.eclipse.cdt.debug.internal.ui.actions;
 
+import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICBreakpoint;
 import org.eclipse.cdt.debug.core.model.ICWatchpoint;
+import org.eclipse.cdt.debug.internal.core.CDebugUtils;
 import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.debug.core.model.ILineBreakpoint;
@@ -287,7 +289,27 @@ public class CBreakpointPreferencePage extends FieldEditorPreferencePage
 	 */
 	private void createTypeSpecificLabelFieldEditors( ICBreakpoint breakpoint )
 	{
-		if ( breakpoint instanceof ILineBreakpoint )
+		if ( breakpoint instanceof ICAddressBreakpoint )
+		{
+			ICAddressBreakpoint abrkpt = (ICAddressBreakpoint)breakpoint;
+			String address = "Not available";
+			try
+			{
+				address = CDebugUtils.toHexAddressString( Long.parseLong( abrkpt.getAddress() ) );
+			}
+			catch( CoreException e )
+			{
+			}
+			catch( NumberFormatException e )
+			{
+			}
+			if ( address != null )
+			{
+				addField( createLabelEditor( getFieldEditorParent(), "Address: ", address ) );
+			}
+			setTitle( "C/C++ Address Breakpoint Properties" );
+		}
+		else if ( breakpoint instanceof ILineBreakpoint )
 		{
 			String fileName = breakpoint.getMarker().getResource().getLocation().toOSString();
 			if ( fileName != null )
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointActionDelegate.java
index 9bda93e3c94..87a4c8e61ae 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointActionDelegate.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointActionDelegate.java
@@ -195,7 +195,7 @@ public class ManageBreakpointActionDelegate implements IWorkbenchWindowActionDel
 				return;
 			IDocument document = getTextEditor().getDocumentProvider().getDocument( editorInput );
 			BreakpointLocationVerifier bv = new BreakpointLocationVerifier();
-			int lineNumber = bv.getValidBreakpointLocation( document, ((ITextSelection)selection).getStartLine());
+			int lineNumber = bv.getValidLineBreakpointLocation( document, ((ITextSelection)selection).getStartLine());
 			if ( lineNumber > -1 )
 			{
 				try
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java
index d3a6bcd4d24..2a752a153bc 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerAction.java
@@ -10,6 +10,8 @@ import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.cdt.debug.core.CDebugModel;
+import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
+import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput;
 import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IMarker;
@@ -102,7 +104,7 @@ public class ManageBreakpointRulerAction extends Action implements IUpdate
 			try
 			{
 				IMarker[] markers = null;
-				if ( resource instanceof IFile )
+				if ( resource instanceof IFile && !(getTextEditor().getEditorInput() instanceof DisassemblyEditorInput) )
 				{
 					markers = resource.findMarkers( IBreakpoint.BREAKPOINT_MARKER,
 													true,
@@ -229,31 +231,16 @@ public class ManageBreakpointRulerAction extends Action implements IUpdate
 	protected void addMarker()
 	{
 		IEditorInput editorInput = getTextEditor().getEditorInput();
-		IDocument document = getDocument();
 		int rulerLine = getVerticalRulerInfo().getLineOfLastMouseButtonActivity();
 		try
 		{
-			BreakpointLocationVerifier bv = new BreakpointLocationVerifier();
-			int lineNumber = bv.getValidBreakpointLocation( document, rulerLine );
-			if ( lineNumber > 0 )
+			if ( editorInput instanceof IFileEditorInput )
 			{
-				String fileName = null;
-				if ( editorInput instanceof IFileEditorInput )
-				{
-					fileName = ((IFileEditorInput)editorInput).getFile().getLocation().toString();
-				}
-				if ( fileName != null )
-				{
-					if ( CDebugModel.lineBreakpointExists( fileName, lineNumber ) == null )
-					{
-						CDebugModel.createLineBreakpoint( ((IFileEditorInput)editorInput).getFile(),
-														  lineNumber,
-														  true,
-														  0,
-														  "",
-														  true );
-					}
-				}
+				createLineBreakpoint( (IFileEditorInput)editorInput, rulerLine );
+			}
+			else if ( editorInput.getAdapter( DisassemblyEditorInput.class ) != null )
+			{
+				createAddressBreakpoint( (DisassemblyEditorInput)editorInput.getAdapter( DisassemblyEditorInput.class ), rulerLine );
 			}
 		}
 		catch( DebugException e )
@@ -266,6 +253,46 @@ public class ManageBreakpointRulerAction extends Action implements IUpdate
 		}
 	}
 
+	private void createLineBreakpoint( IFileEditorInput editorInput, int rulerLine ) throws CoreException
+	{
+		IDocument document = getDocument();
+		BreakpointLocationVerifier bv = new BreakpointLocationVerifier();
+		int lineNumber = bv.getValidLineBreakpointLocation( document, rulerLine );
+		if ( lineNumber > -1 )
+		{
+			String fileName = editorInput.getFile().getLocation().toString();
+			if ( fileName != null )
+			{
+				if ( CDebugModel.lineBreakpointExists( fileName, lineNumber ) == null )
+				{
+					CDebugModel.createLineBreakpoint( editorInput.getFile(), lineNumber, true, 0, "", true );
+				}
+			}
+		}
+	}
+
+	private void createAddressBreakpoint( DisassemblyEditorInput editorInput, int rulerLine ) throws CoreException
+	{
+		IDocument document = getDocument();
+		BreakpointLocationVerifier bv = new BreakpointLocationVerifier();
+		int lineNumber = bv.getValidAddressBreakpointLocation( document, rulerLine );
+		if ( lineNumber > -1 )
+		{
+			IResource resource = (IResource)editorInput.getAdapter( IResource.class );
+			if ( resource != null )
+			{
+				if ( editorInput.getStorage() != null )
+				{
+					long address = ((IDisassemblyStorage)editorInput.getStorage()).getAddress( lineNumber );
+					if ( address != 0 && CDebugModel.addressBreakpointExists( resource, address ) == null )
+					{
+						CDebugModel.createAddressBreakpoint( resource, lineNumber, address, true, 0, "", true );
+					}
+				}
+			}
+		}
+	}
+
 	protected void removeMarkers( List markers )
 	{
 		IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java
index 9313b1b2ad6..a56f01aa174 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/actions/ManageBreakpointRulerActionDelegate.java
@@ -22,6 +22,7 @@ public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDele
 {
 	static final private String C_EDITOR_ID = "org.eclipse.cdt.ui.editor.CEditor"; //$NON-NLS-1$
 	static final private String ASM_EDITOR_ID = "org.eclipse.cdt.ui.editor.asm.AsmEditor"; //$NON-NLS-1$
+	static final private String DISASSEMBLY_EDITOR_ID = "org.eclipse.cdt.debug.ui.DisassemblyEditor"; //$NON-NLS-1$
 
 	/**
 	 * @see IEditorActionDelegate#setActiveEditor(IAction, IEditorPart)
@@ -31,7 +32,7 @@ public class ManageBreakpointRulerActionDelegate extends AbstractRulerActionDele
 		if ( targetEditor != null )
 		{
 			String id = targetEditor.getSite().getId();
-			if ( !id.equals( C_EDITOR_ID ) && !id.equals( ASM_EDITOR_ID ) )
+			if ( !id.equals( C_EDITOR_ID ) && !id.equals( ASM_EDITOR_ID ) && !id.equals( DISASSEMBLY_EDITOR_ID ) )
 				targetEditor = null;
 		}
 		super.setActiveEditor( callerAction, targetEditor );
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyDocumentProvider.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyDocumentProvider.java
new file mode 100644
index 00000000000..dc217d6dba9
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyDocumentProvider.java
@@ -0,0 +1,44 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+package org.eclipse.cdt.debug.internal.ui.editors;
+
+import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.text.source.IAnnotationModel;
+import org.eclipse.ui.editors.text.StorageDocumentProvider;
+
+/**
+ * Enter type comment.
+ * 
+ * @since: Jan 6, 2003
+ */
+public class DisassemblyDocumentProvider extends StorageDocumentProvider
+{
+	/**
+	 * Constructor for DisassemblyDocumentProvider.
+	 */
+	public DisassemblyDocumentProvider()
+	{
+		super();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#createAnnotationModel(Object)
+	 */
+	protected IAnnotationModel createAnnotationModel( Object element ) throws CoreException
+	{
+		if ( element != null && element instanceof DisassemblyEditorInput ) 
+		{
+			IResource resource = (IResource)((DisassemblyEditorInput)element).getAdapter( IResource.class );
+			IStorage storage = ((DisassemblyEditorInput)element).getStorage();
+			if ( resource != null && storage != null && storage instanceof IDisassemblyStorage )
+				return new DisassemblyMarkerAnnotationModel( (IDisassemblyStorage)storage, resource );
+		}
+		return super.createAnnotationModel( element );
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditor.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditor.java
new file mode 100644
index 00000000000..4b7b7c093b5
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditor.java
@@ -0,0 +1,26 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+package org.eclipse.cdt.debug.internal.ui.editors;
+
+import org.eclipse.cdt.debug.ui.CDebugUIPlugin;
+import org.eclipse.cdt.internal.ui.editor.asm.AsmTextEditor;
+
+/**
+ * Enter type comment.
+ * 
+ * @since: Jan 6, 2003
+ */
+public class DisassemblyEditor extends AsmTextEditor
+{
+	/**
+	 * Constructor for DisassemblyEditor.
+	 */
+	public DisassemblyEditor()
+	{
+		super();
+		setDocumentProvider( CDebugUIPlugin.getDefault().getDisassemblyDocumentProvider() );
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditorInput.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditorInput.java
index 5e5787bcdb1..060f38fdbd4 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditorInput.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyEditorInput.java
@@ -21,7 +21,7 @@ import org.eclipse.ui.IStorageEditorInput;
  */
 public class DisassemblyEditorInput implements IStorageEditorInput
 {
-	private final static String FILE_NAME_EXTENSION = ".s";
+	private final static String FILE_NAME_EXTENSION = ".dasm";
 	protected IStorage fStorage;
 
 	/**
@@ -111,6 +111,10 @@ public class DisassemblyEditorInput implements IStorageEditorInput
 				// ignore
 			}
 		}
+		if ( adapter.equals( DisassemblyEditorInput.class ) )
+		{
+			return this;
+		}
 		return null;
 	}
 
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyMarkerAnnotation.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyMarkerAnnotation.java
new file mode 100644
index 00000000000..08e66b3a3c2
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyMarkerAnnotation.java
@@ -0,0 +1,53 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+package org.eclipse.cdt.debug.internal.ui.editors;
+
+import org.eclipse.cdt.debug.internal.core.breakpoints.CAddressBreakpoint;
+import org.eclipse.cdt.debug.internal.core.breakpoints.CLineBreakpoint;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.debug.ui.DebugUITools;
+import org.eclipse.debug.ui.IDebugModelPresentation;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+import org.eclipse.ui.texteditor.MarkerUtilities;
+
+/**
+ * Enter type comment.
+ * 
+ * @since: Jan 6, 2003
+ */
+public class DisassemblyMarkerAnnotation extends MarkerAnnotation
+{
+	private IDebugModelPresentation fPresentation;
+
+	/**
+	 * Constructor for DisassemblyMarkerAnnotation.
+	 * @param marker
+	 */
+	public DisassemblyMarkerAnnotation( IMarker marker )
+	{
+		super( marker );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.MarkerAnnotation#initialize()
+	 */
+	protected void initialize()
+	{
+		IMarker marker = getMarker();
+
+		if ( MarkerUtilities.isMarkerType( marker, CLineBreakpoint.getMarkerType() ) ||
+			  MarkerUtilities.isMarkerType( marker, CAddressBreakpoint.getMarkerType() ) )
+		{
+			if ( fPresentation == null )
+				fPresentation = DebugUITools.newDebugModelPresentation();
+
+			setLayer( 4 );
+			setImage( fPresentation.getImage( marker ) );
+			return;
+		}
+		super.initialize();
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyMarkerAnnotationModel.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyMarkerAnnotationModel.java
new file mode 100644
index 00000000000..2a5174d4d6e
--- /dev/null
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/internal/ui/editors/DisassemblyMarkerAnnotationModel.java
@@ -0,0 +1,310 @@
+/*
+ *(c) Copyright QNX Software Systems Ltd. 2002.
+ * All Rights Reserved.
+ * 
+ */
+package org.eclipse.cdt.debug.internal.ui.editors;
+
+import java.util.ArrayList;
+
+import org.eclipse.cdt.debug.core.ICBreakpointManager;
+import org.eclipse.cdt.debug.core.model.ICAddressBreakpoint;
+import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
+import org.eclipse.cdt.debug.internal.core.breakpoints.CAddressBreakpoint;
+import org.eclipse.cdt.debug.internal.core.breakpoints.CLineBreakpoint;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IMarker;
+import org.eclipse.core.resources.IMarkerDelta;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.debug.core.DebugPlugin;
+import org.eclipse.debug.core.IBreakpointManager;
+import org.eclipse.debug.core.model.IBreakpoint;
+import org.eclipse.debug.core.model.IDebugTarget;
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.Position;
+import org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel;
+import org.eclipse.ui.texteditor.MarkerAnnotation;
+
+/**
+ * Enter type comment.
+ * 
+ * @since: Jan 9, 2003
+ */
+public class DisassemblyMarkerAnnotationModel extends AbstractMarkerAnnotationModel
+{
+	/**
+	 * Internal resource change listener.
+	 */
+	class ResourceChangeListener implements IResourceChangeListener
+	{
+		/*
+		 * @see IResourceChangeListener#resourceChanged
+		 */
+		public void resourceChanged( IResourceChangeEvent e )
+		{
+			IResourceDelta delta = e.getDelta();
+			try
+			{
+				if ( delta != null )
+					delta.accept( getResourceDeltaVisitor() );
+			}
+			catch( CoreException x )
+			{
+				doHandleCoreException( x, "Resource Changed" );
+			}
+		}
+	};
+
+	/**
+	 * Internal resource delta visitor.
+	 */
+	class ResourceDeltaVisitor implements IResourceDeltaVisitor
+	{
+		/*
+		 * @see IResourceDeltaVisitor#visit
+		 */
+		public boolean visit( IResourceDelta delta ) throws CoreException
+		{
+			if ( delta != null && /*getResource().equals( delta.getResource() )*/delta.getResource() instanceof IFile )
+			{
+				update( delta.getMarkerDeltas() );
+				return false;
+			}
+			return true;
+		}
+	};
+
+	/** The workspace */
+	private IWorkspace fWorkspace;
+
+	/** The resource */
+	private IResource fResource;
+
+	/** The resource change listener */
+	private IResourceChangeListener fResourceChangeListener = new ResourceChangeListener();
+
+	/** The resource delta visitor */
+	private IResourceDeltaVisitor fResourceDeltaVisitor = new ResourceDeltaVisitor();
+
+	private IDisassemblyStorage fStorage = null;
+
+	/**
+	 * Constructor for DisassemblyMarkerAnnotationModel.
+	 */
+	public DisassemblyMarkerAnnotationModel( IDisassemblyStorage storage, IResource resource )
+	{
+		fResource = resource;
+		fWorkspace = resource.getWorkspace();
+		fStorage = storage;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#retrieveMarkers()
+	 */
+	protected IMarker[] retrieveMarkers() throws CoreException
+	{
+		if ( fStorage == null )
+			return null;
+		IDebugTarget target = fStorage.getDebugTarget();
+		if ( target != null )
+		{
+			IBreakpointManager bm = DebugPlugin.getDefault().getBreakpointManager();
+			IBreakpoint[] brkpts = bm.getBreakpoints();
+			ArrayList list = new ArrayList( brkpts.length );
+			for ( int i = 0; i < brkpts.length; ++i )
+			{
+				if ( target.supportsBreakpoint( brkpts[i] ) && isAcceptable( brkpts[i].getMarker() ) )
+				{
+					list.add( brkpts[i].getMarker() );
+				}
+			}
+			return (IMarker[])list.toArray( new IMarker[list.size()] );
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#deleteMarkers(IMarker[])
+	 */
+	protected void deleteMarkers( final IMarker[] markers ) throws CoreException
+	{
+		fWorkspace.run( new IWorkspaceRunnable()
+							{
+								public void run( IProgressMonitor monitor ) throws CoreException
+								{
+									for ( int i = 0; i < markers.length; ++i )
+									{
+										markers[i].delete();
+									}
+								}
+							}, null );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#listenToMarkerChanges(boolean)
+	 */
+	protected void listenToMarkerChanges( boolean listen )
+	{
+		if ( listen )
+			fWorkspace.addResourceChangeListener( fResourceChangeListener );
+		else
+			fWorkspace.removeResourceChangeListener( fResourceChangeListener );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#isAcceptable(IMarker)
+	 */
+	protected boolean isAcceptable( IMarker marker )
+	{
+		try
+		{
+			return ( marker.getType().equals( CLineBreakpoint.getMarkerType() ) ||
+					 marker.getType().equals( CAddressBreakpoint.getMarkerType() ) );
+		}
+		catch( CoreException e )
+		{
+		}
+		return false;
+	}
+
+	protected IResourceDeltaVisitor getResourceDeltaVisitor()
+	{
+		return fResourceDeltaVisitor;
+	}
+
+	/**
+	 * Updates this model to the given marker deltas.
+	 *
+	 * @param markerDeltas the list of marker deltas
+	 */
+	protected void update( IMarkerDelta[] markerDeltas )
+	{
+		if ( markerDeltas.length == 0 )
+			return;
+
+		for( int i = 0; i < markerDeltas.length; i++ )
+		{
+			IMarkerDelta delta = markerDeltas[i];
+			switch( delta.getKind() )
+			{
+				case IResourceDelta.ADDED :
+					addMarkerAnnotation( delta.getMarker() );
+					break;
+				case IResourceDelta.REMOVED :
+					removeMarkerAnnotation( delta.getMarker() );
+					break;
+				case IResourceDelta.CHANGED :
+					modifyMarkerAnnotation( delta.getMarker() );
+					break;
+			}
+		}
+
+		fireModelChanged();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#createPositionFromMarker(IMarker)
+	 */
+	protected Position createPositionFromMarker( IMarker marker )
+	{
+		try
+		{
+			if ( marker.getType().equals( CLineBreakpoint.getMarkerType() ) )
+			{
+				return createPositionFromLineBreakpoint( marker );
+			}
+			if ( marker.getType().equals( CAddressBreakpoint.getMarkerType() ) )
+			{
+				return createPositionFromAddressBreakpoint( marker );
+			}
+		}
+		catch( CoreException e )
+		{
+		}
+		return null;
+	}
+
+	private Position createPositionFromLineBreakpoint( IMarker marker )
+	{
+		if ( fStorage == null )
+			return null;
+		IDebugTarget target = fStorage.getDebugTarget();
+		if ( target != null && target.getAdapter( ICBreakpointManager.class ) != null )
+		{
+			ICBreakpointManager bm = (ICBreakpointManager)target.getAdapter( ICBreakpointManager.class );
+			long address = bm.getBreakpointAddress( DebugPlugin.getDefault().getBreakpointManager().getBreakpoint( marker ) );
+			if ( address != 0 )
+			{
+				return createPositionFromAddress( address );
+			}
+		}
+		return null;
+	}
+
+	private Position createPositionFromAddressBreakpoint( IMarker marker ) throws CoreException
+	{
+		try
+		{
+			return createPositionFromAddress( Long.parseLong( marker.getAttribute( ICAddressBreakpoint.ADDRESS, "0" ) ) );
+		}
+		catch( NumberFormatException e )
+		{
+		}
+		return null;
+	}
+
+	private Position createPositionFromAddress( long address )
+	{
+		try
+		{
+			int start = -1;
+			int line = fStorage.getLineNumber( address );
+			if ( line > 0 && fDocument != null ) 
+			{
+				start = fDocument.getLineOffset( line - 1 );
+				if ( start > -1 )
+				{
+					return new Position( start, fDocument.getLineLength( line - 1 ) );
+				}
+			}
+		}
+		catch ( BadLocationException x ) 
+		{
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#createMarkerAnnotation(IMarker)
+	 */
+	protected MarkerAnnotation createMarkerAnnotation( IMarker marker )
+	{
+		return new DisassemblyMarkerAnnotation( marker );
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.ui.texteditor.AbstractMarkerAnnotationModel#getMarkerPosition(IMarker)
+	 */
+	public Position getMarkerPosition( IMarker marker )
+	{
+		return createPositionFromMarker( marker );
+	}
+
+	protected void doHandleCoreException( CoreException e, String message )
+	{
+		handleCoreException( e, message );
+	}
+	
+	protected IResource getResource()
+	{
+		return fResource;
+	}
+}
diff --git a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
index e13348e5db0..f1a8ed54fcd 100644
--- a/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
+++ b/debug/org.eclipse.cdt.debug.ui/src/org/eclipse/cdt/debug/ui/CDebugUIPlugin.java
@@ -11,6 +11,7 @@ import org.eclipse.cdt.debug.core.sourcelookup.IDisassemblyStorage;
 import org.eclipse.cdt.debug.internal.ui.CDTDebugModelPresentation;
 import org.eclipse.cdt.debug.internal.ui.CDebugImageDescriptorRegistry;
 import org.eclipse.cdt.debug.internal.ui.ColorManager;
+import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyDocumentProvider;
 import org.eclipse.cdt.debug.internal.ui.editors.DisassemblyEditorInput;
 import org.eclipse.cdt.debug.internal.ui.preferences.CDebugPreferencePage;
 import org.eclipse.cdt.debug.internal.ui.preferences.MemoryViewPreferencePage;
@@ -65,6 +66,9 @@ public class CDebugUIPlugin extends AbstractUIPlugin implements ISelectionListen
 
 	private CDebugImageDescriptorRegistry fImageDescriptorRegistry;
 
+	// Document provider for disassembly editor	
+	private DisassemblyDocumentProvider fDisassemblyDocumentProvider = null;
+
 	/**
 	 * The constructor.
 	 */
@@ -462,4 +466,14 @@ public class CDebugUIPlugin extends AbstractUIPlugin implements ISelectionListen
 		}
 		return false;
 	}
+
+	/**
+	 * Returns the document provider used for the disassembly editor
+	 */
+	public DisassemblyDocumentProvider getDisassemblyDocumentProvider() 
+	{
+		if ( fDisassemblyDocumentProvider == null )
+			fDisassemblyDocumentProvider = new DisassemblyDocumentProvider();
+		return fDisassemblyDocumentProvider;
+	}
 }