diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
index ec679cb..33701e9 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Log.java
@@ -109,7 +109,6 @@
      */
     void warn( String content );
 
-
     /**
      * Send a message (and accompanying exception) to the user in the <b>warn</b> error level.
      * <br/>
@@ -121,6 +120,18 @@
      */
     void warn( String content, String location, int lineNumber );
 
+    /**
+     * Send a message (and accompanying exception) to the user in the <b>warn</b> error level.
+     * <br/>
+     * The error's stacktrace will be output when this error level is enabled.
+     *
+     * @param content
+     * @param location The location at which the error occurred
+     * @param lineNumber The line number at which the error occurred
+     * @param columnNumber The column number at which the error occurred
+     */
+    void warn( String content, String location, int lineNumber, int columnNumber );
+
 
     /**
      * Send a message (and accompanying exception) to the user in the <b>warn</b> error level.
@@ -168,6 +179,18 @@
      */
     void error( String content, String location, int lineNumber );
 
+    /**
+     * Send a message (and accompanying exception) to the user in the <b>error</b> error level.
+     * <br/>
+     * The error's stacktrace will be output when this error level is enabled.
+     *
+     * @param content
+     * @param location The location at which the error occurred
+     * @param lineNumber The line number at which the error occurred
+     * @param columnNumber The column number at which the error occurred
+     */
+    void error( String content, String location, int lineNumber, int columnNumber );
+    
 
     /**
      * Send a message (and accompanying exception) to the user in the <b>error</b> error level.
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
index f38a4f9..98911b2 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/Result.java
@@ -18,6 +18,7 @@
  */
 package org.apache.felix.scrplugin;
 
+import java.util.ArrayList;
 import java.util.List;
 
 
@@ -32,6 +33,9 @@
     /** The list of scr files. */
     private List<String> scrFiles;
 
+    /** The list of processed source files. */
+    private List<String> processedSourceFiles = new ArrayList<String>();
+    
     /**
      * Set the list of metatype files
      */
@@ -47,6 +51,16 @@
     }
 
     /**
+     * Adds a source file to the list of processed source files
+     * 
+	 * @param source the processed source file
+	 */
+	public void addProcessedSourceFile(String processedSourceFile) {
+		
+		this.processedSourceFiles.add(processedSourceFile);
+	}
+    
+    /**
      * Return a list of generated metatype files
      * @return A list of relative paths or <code>null</code>
      */
@@ -61,4 +75,14 @@
     public List<String> getScrFiles() {
         return scrFiles;
     }
+
+
+    /**
+     * Returns a list of processed source files
+     * 
+	 * @return the list of processed source files
+	 */
+	public List<String> getProcessedSourceFiles() {
+		return processedSourceFiles;
+	}
 }
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
index 5f59908..e1bf594 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/SCRDescriptorGenerator.java
@@ -148,9 +148,12 @@
         this.scanner = new ClassScanner(logger, iLog, project, aProcessor);
         final List<ClassDescription> scannedDescriptions = scanner.scanSources();
 
+        // create the result to hold the list of processed source files
+        final Result result = new Result();
         final List<ComponentContainer> processedContainers = new ArrayList<ComponentContainer>();
         for (final ClassDescription desc : scannedDescriptions) {
             this.logger.debug("Processing component class " + desc.getSource());
+            result.addProcessedSourceFile(desc.getSource());
 
             // check if there is more than one component definition
             if (desc.getDescriptions(ComponentDescription.class).size() > 1) {
@@ -259,9 +262,7 @@
             throw new SCRDescriptorFailureException("SCR Descriptor parsing had failures (see log)");
         }
 
-        // create result and generate files
-        final Result result = new Result();
-
+        // and generate files
         result.setMetatypeFiles(MetaTypeIO.generateDescriptors(module, this.options, this.logger));
         result.setScrFiles(ComponentDescriptorIO.generateDescriptorFiles(module, this.options, logger));
 
diff --git a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
index 8e7819c..c132fb7 100644
--- a/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
+++ b/scrplugin/generator/src/main/java/org/apache/felix/scrplugin/helper/IssueLog.java
@@ -68,9 +68,9 @@
         while (depWarnings.hasNext()) {
             final Entry entry = depWarnings.next();
             if (strictMode) {
-                log.error(entry.toString());
+                log.error(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
             } else {
-                log.warn(entry.toString());
+                log.warn(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
             }
         }
         if (this.deprecationWarnings.size() > 0) {
@@ -87,31 +87,44 @@
         while (warnings.hasNext()) {
             final Entry entry = warnings.next();
             if (strictMode) {
-                log.error(entry.toString());
+                log.error(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
             } else {
-                log.warn(entry.toString());
+                log.warn(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
             }
         }
 
         final Iterator<Entry> errors = this.errors.iterator();
         while (errors.hasNext()) {
             final Entry entry = errors.next();
-            log.error(entry.toString());
+            log.error(entry.message, entry.location, entry.lineNumber, entry.columnNumber);
         }
     }
 
     private static class Entry {
+    	
+    	static final int LINE_NUMBER_UNKNOWN = 0; 
+    	static final int COLUMN_NUMBER_UNKNOWN = 0; 
+    	
         final String message;
         final String location;
+        final int lineNumber;
+        final int columnNumber;
 
         Entry(final String message, final String location) {
-            this.message = message;
-            this.location = location;
+        	this(message, location, LINE_NUMBER_UNKNOWN, COLUMN_NUMBER_UNKNOWN);
         }
 
+        Entry(final String message, final String location, final int lineNumber, final int columnNumber) {
+        	this.message = message;
+        	this.location = location;
+        	this.lineNumber = lineNumber;
+        	this.columnNumber = columnNumber;
+        }
+        
+        
         @Override
         public String toString() {
-            return this.location + " : " + this.message;
+            return this.location + " [" + this.lineNumber+ "," + this.columnNumber+"] : " + this.message;
         }
     }
 }
diff --git a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
index 417509f..67dc831 100644
--- a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
+++ b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenLog.java
@@ -18,7 +18,10 @@
  */
 package org.apache.felix.scrplugin.mojo;
 
+import java.io.File;
+
 import org.apache.felix.scrplugin.Log;
+import org.sonatype.plexus.build.incremental.BuildContext;
 
 /**
  * The <code>MavenLog</code> class implements the {@link Log} interface using
@@ -26,10 +29,14 @@
  */
 public class MavenLog implements Log {
 
+	private static final int COLUMN_NUMBER_UNKNOWN = 0;
+	
     private final org.apache.maven.plugin.logging.Log mavenLog;
+    private final BuildContext buildContext;
 
-    MavenLog(final org.apache.maven.plugin.logging.Log mavenLog) {
+    MavenLog(final org.apache.maven.plugin.logging.Log mavenLog, BuildContext buildContext) {
         this.mavenLog = mavenLog;
+        this.buildContext = buildContext;
     }
 
     /**
@@ -67,9 +74,17 @@
     public void error(final String content,
             final String location,
             final int lineNumber) {
-        final String message = formatMessage(content, location, lineNumber);
-        mavenLog.error(message);
+    	error(content, location, lineNumber, COLUMN_NUMBER_UNKNOWN);
     }
+    
+    /**
+     * @see org.apache.felix.scrplugin.Log#error(java.lang.String, java.lang.String, int, int)
+     */
+    public void error(final String content, final String location,
+    		final int lineNumber, final int columnNumber) {
+    	buildContext.addMessage(new File(location), lineNumber, columnNumber, 
+    			content, BuildContext.SEVERITY_ERROR, null);
+    }    
 
     /**
      * @see org.apache.felix.scrplugin.Log#error(java.lang.String)
@@ -146,11 +161,20 @@
      */
     public void warn(final String content, final String location,
             final int lineNumber) {
-        final String message = formatMessage(content, location, lineNumber);
-        mavenLog.warn(message);
+        this.warn(content, location, lineNumber, COLUMN_NUMBER_UNKNOWN);
     }
 
     /**
+     * @see org.apache.felix.scrplugin.Log#warn(java.lang.String, java.lang.String, int, int)
+     */
+    public void warn(final String content, final String location,
+    		final int lineNumber, final int columnNumber) {
+    	buildContext.addMessage(new File(location), lineNumber, columnNumber, 
+    			content, BuildContext.SEVERITY_WARNING, null);
+    }
+    
+    
+    /**
      * @see org.apache.felix.scrplugin.Log#warn(java.lang.String)
      */
     public void warn(final String content) {
@@ -163,9 +187,4 @@
     public void warn(final Throwable error) {
         mavenLog.warn(error);
     }
-
-    private String formatMessage(final String content, final String location,
-            final int lineNumber) {
-        return content + " at " + location + ":" + lineNumber;
-    }
 }
diff --git a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
index 6813382..3912f73 100644
--- a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
+++ b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/MavenProjectScanner.java
@@ -35,6 +35,10 @@
 
 public class MavenProjectScanner {
 
+	private enum ScanKind {
+		ADDED_OR_UPDATED, DELETED;
+	}
+	
     private final MavenProject project;
 
     private final String includeString;
@@ -61,7 +65,13 @@
      * Return all sources.
      */
     public Collection<Source> getSources() {
-        final ArrayList<Source> files = new ArrayList<Source>();
+    	
+    	return getSourcesForScanKind(ScanKind.ADDED_OR_UPDATED);
+    }
+
+	private Collection<Source> getSourcesForScanKind(ScanKind scanKind)
+			throws AssertionError {
+		final ArrayList<Source> files = new ArrayList<Source>();
 
         @SuppressWarnings("unchecked")
         final Iterator<String> i = project.getCompileSourceRoots().iterator();
@@ -87,7 +97,23 @@
                 continue;
             }
             log.debug( "Scanning source tree " + tree );
-            final Scanner scanner = this.buildContext.newScanner(directory, false);
+            
+            final Scanner scanner;
+            switch ( scanKind ) {
+            
+            	case ADDED_OR_UPDATED:
+            		scanner = this.buildContext.newScanner(directory, false);
+            		break;
+            		
+            	case DELETED:
+            		scanner = this.buildContext.newDeleteScanner(directory);
+            		break;
+            		
+            	default:
+            		throw new AssertionError("Unhandled ScanKind " + scanKind);
+            	
+            }
+            
 
             if ( excludes != null && excludes.length > 0 ) {
                 scanner.setExcludes( excludes );
@@ -114,6 +140,16 @@
         }
 
         return files;
+	}
+    
+	/**
+	 * Returns all sources which were deleted since the previous build
+	 * 
+	 * @return the deleted sources
+	 */
+    public Collection<Source> getDeletedSources() {
+    	
+    	return getSourcesForScanKind(ScanKind.DELETED);
     }
 
     /**
diff --git a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
index ff6af89..4113a99 100644
--- a/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
+++ b/scrplugin/maven-scr-plugin/src/main/java/org/apache/felix/scrplugin/mojo/SCRDescriptorMojo.java
@@ -24,6 +24,7 @@
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
@@ -38,6 +39,7 @@
 import org.apache.felix.scrplugin.SCRDescriptorException;
 import org.apache.felix.scrplugin.SCRDescriptorFailureException;
 import org.apache.felix.scrplugin.SCRDescriptorGenerator;
+import org.apache.felix.scrplugin.Source;
 import org.apache.felix.scrplugin.SpecVersion;
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
@@ -191,13 +193,13 @@
         }
 
         // create the log for the generator
-        final org.apache.felix.scrplugin.Log scrLog = new MavenLog(getLog());
+        final org.apache.felix.scrplugin.Log scrLog = new MavenLog(getLog(), buildContext);
 
         // create project
         final MavenProjectScanner scanner = new MavenProjectScanner(
                         this.buildContext,
                 this.project, this.sourceIncludes, this.sourceExcludes, scrLog);
-
+        
         final Project project = new Project();
         // create the class loader
         project.setClassLoader(new URLClassLoader(getClassPath(), this
@@ -233,9 +235,15 @@
             final Result result = generator.execute();
             this.setServiceComponentHeader(result.getScrFiles());
             this.updateProjectResources();
-
-            // refreshing the target files does not seem to be the right thing
+            
+            // TODO - should we skip performing these operations just one descriptor file is generated?
+            this.cleanUpDeletedSources(scanner.getDeletedSources());
+            this.refreshMessages(result.getProcessedSourceFiles());
+            
+            // TODO - refreshing the target files does not seem to be the right thing ; however, new files
+            // are not refresh in Eclipse right now
             //this.updateBuildContext(result);
+            
         } catch (final SCRDescriptorException sde) {
             throw new MojoExecutionException(sde.getSourceLocation() + " : " + sde.getMessage(), sde);
         } catch (final SCRDescriptorFailureException sdfe) {
@@ -244,7 +252,40 @@
         }
     }
 
-    private void updateBuildContext(final Result result) {
+	/**
+	 * @param scrFiles
+	 */
+	private void refreshMessages(List<String> scrFiles) {
+		
+		for ( String scrFile : scrFiles )
+			buildContext.removeMessages(new File(scrFile));
+		
+	}
+	
+	private void cleanUpDeletedSources(Collection<Source> deletedSources) {
+		
+		// TODO remove duplication of file name selection - MetaTypeIO, ComponentDescriptorIO
+		
+        final File parentDir = new File(this.outputDirectory, "OSGI-INF");
+        final File mtDir = new File(parentDir, "metatype");
+		
+		for ( Source deletedSource : deletedSources ) {
+			
+			File metaTypeFile = new File(mtDir, deletedSource.getClassName() + ".xml");
+			boolean deleted = metaTypeFile.delete();
+			if ( deleted )
+				buildContext.refresh(metaTypeFile);
+			
+			File componentDescriptorFile = new File(parentDir, deletedSource.getClassName()+".xml");
+			deleted = componentDescriptorFile.delete();
+			if ( deleted )
+				buildContext.refresh(componentDescriptorFile);
+		}
+	}
+
+	
+
+	private void updateBuildContext(final Result result) {
         if ( result.getMetatypeFiles() != null ) {
             for(final String name : result.getMetatypeFiles() ) {
                 this.buildContext.refresh(new File(this.outputDirectory, name.replace('/', File.separatorChar)));
diff --git a/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java b/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
index 605e75a..076620a 100644
--- a/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
+++ b/scrplugin/scrtask/src/main/java/org/apache/felix/scrplugin/ant/AntLog.java
@@ -104,6 +104,11 @@
         warn( String.format( "%s [%s,%d]", content, location, lineNumber ) );
     }
 
+    public void warn( String content, String location, int lineNumber, int columNumber )
+    {
+    	warn( String.format( "%s [%s,%d:%d]", content, location, lineNumber , columNumber) );
+    }
+
 
     public void warn( String content, Throwable error )
     {
@@ -135,6 +140,11 @@
         error( String.format( "%s [%s,%d]", content, location, lineNumber ) );
     }
 
+    public void error( String content, String location, int lineNumber, int columnNumber )
+    {
+    	error( String.format( "%s [%s,%d:%d]", content, location, lineNumber, columnNumber ) );
+    }
+    
 
     public void error( String content, Throwable error )
     {
