diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/AspectsConvertingParser.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/AspectsConvertingParser.java
index 5e1417b..c58d6fe 100644
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/AspectsConvertingParser.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/codeconversion/AspectsConvertingParser.java
@@ -423,6 +423,7 @@
                         String superClass = type.getSuperclassName();
                         if (declareExtends.size() > 0) {
                             superClass = (String) declareExtends.get(0);
+                            superClass = superClass.replace('$', '.');
                         }
                         if (superClass != null) {
                             sb.append(" " + EXTENDS + " " + superClass);
@@ -439,12 +440,13 @@
                         if (type.isInterface()) {
                             sb.append(" " + EXTENDS + " ");
                         } else {
-                            sb.append(" " + IMPLEMENTS);
+                            sb.append(" " + IMPLEMENTS +  " ");
                         }
                     
                         for (Iterator interfaceIter = declareImplements.iterator(); interfaceIter
                                 .hasNext();) {
                             String interName = (String) interfaceIter.next();
+                            interName = interName.replace('$', '.');
                             sb.append(" " + interName);
                             if (interfaceIter.hasNext()) {
                                 sb.append(",");
@@ -501,7 +503,7 @@
                 IType type = unit.getType(new String(currentTypeName));
                 if (type.exists()) {
                     List /*IJavaElement*/ rels = model.getRelationshipsForElement(type, AJRelationshipManager.ASPECT_DECLARATIONS);
-                    StringBuffer sb = new StringBuffer();
+                    StringBuffer sb = new StringBuffer("\n\t");
                     for (Iterator relIter = rels.iterator(); relIter.hasNext();) {
                         IJavaElement je = (IJavaElement) relIter.next();
                         IProgramElement declareElt = model.javaElementToProgramElement(je);
diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/AspectElement.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/AspectElement.java
index 13aa77d..57bca4b 100755
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/AspectElement.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/AspectElement.java
@@ -10,13 +10,18 @@
  *******************************************************************************/
 package org.eclipse.ajdt.core.javaelements;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.aspectj.asm.IHierarchy;
 import org.aspectj.asm.IProgramElement;
 import org.aspectj.asm.IProgramElement.Accessibility;
 import org.aspectj.asm.IProgramElement.ExtraInformation;
 import org.aspectj.asm.IProgramElement.Kind;
+import org.aspectj.asm.internal.ProgramElement;
+import org.aspectj.bridge.ISourceLocation;
+import org.eclipse.ajdt.core.model.AJProjectModelFactory;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IMethod;
@@ -62,6 +67,20 @@
         info.setAJKind(IProgramElement.Kind.ASPECT);
         info.setHandle(this);
         info.setSourceRangeStart(0);
+        
+        IProgramElement ipe = AJProjectModelFactory.getInstance().getModelForJavaElement(this).javaElementToProgramElement(this);
+        if (ipe != IHierarchy.NO_STRUCTURE) {
+            info.setAJExtraInfo(ipe.getExtraInfo());
+            info.setAJModifiers(ipe.getModifiers());
+            info.setFlags(getProgramElementModifiers(ipe));
+            info.setAJAccessibility(ipe.getAccessibility());
+            ISourceLocation sourceLocation = ipe.getSourceLocation();
+            info.setSourceRangeStart(sourceLocation.getOffset());
+            info.setNameSourceStart(sourceLocation.getOffset());
+            info.setNameSourceEnd(sourceLocation.getOffset() + ipe.getName().length());
+        }
+        
+        
         return info;
     }
 
@@ -374,4 +393,21 @@
 		}
 		return super.getHandleFromMemento(token, memento, workingCopyOwner);
 	}
+	
+	   static Field modfiersField = null;
+	    static int getProgramElementModifiers(IProgramElement ipe) {
+	        try {
+	            if (modfiersField == null) {
+	                modfiersField = ProgramElement.class.getDeclaredField("modifiers");
+	                modfiersField.setAccessible(true);
+	            }
+	            return modfiersField.getInt(ipe);
+	        } catch (SecurityException e) {
+	        } catch (IllegalArgumentException e) {
+	        } catch (NoSuchFieldException e) {
+	        } catch (IllegalAccessException e) {
+	        }
+	        return -1;
+	    }
+
 }
diff --git a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/IntertypeElement.java b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/IntertypeElement.java
index 6dbdfc6..eaff891 100755
--- a/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/IntertypeElement.java
+++ b/org.eclipse.ajdt.core/src/org/eclipse/ajdt/core/javaelements/IntertypeElement.java
@@ -10,11 +10,13 @@
  *******************************************************************************/
 package org.eclipse.ajdt.core.javaelements;
 
+import java.lang.reflect.Field;
 import java.util.Iterator;
 import java.util.List;
 
 import org.aspectj.asm.IHierarchy;
 import org.aspectj.asm.IProgramElement;
+import org.aspectj.asm.internal.ProgramElement;
 import org.aspectj.bridge.ISourceLocation;
 import org.eclipse.jdt.internal.core.SourceConstructorInfo;
 import org.eclipse.ajdt.core.model.AJProjectModelFactory;
@@ -52,6 +54,7 @@
             info.setName(name.toCharArray());
             info.setAJKind(ipe.getKind());
             info.setAJModifiers(ipe.getModifiers());
+            info.setFlags(getProgramElementModifiers(ipe));
             info.setAJAccessibility(ipe.getAccessibility());
             ISourceLocation sourceLocation = ipe.getSourceLocation();
             info.setSourceRangeStart(sourceLocation.getOffset());
@@ -68,6 +71,21 @@
 	    return info;
 	}
 
+	static Field modfiersField = null;
+	static int getProgramElementModifiers(IProgramElement ipe) {
+	    try {
+            if (modfiersField == null) {
+                modfiersField = ProgramElement.class.getDeclaredField("modifiers");
+                modfiersField.setAccessible(true);
+            }
+            return modfiersField.getInt(ipe);
+        } catch (SecurityException e) {
+        } catch (IllegalArgumentException e) {
+        } catch (NoSuchFieldException e) {
+        } catch (IllegalAccessException e) {
+        }
+        return -1;
+	}
 	
 	
 	/**
@@ -185,30 +203,6 @@
 	    }
 
 	
-	private String[] charArrayToStringArray(char[][] chars) {
-	    if (chars != null) {
-    	    String[] strings = new String[chars.length];
-    	    for (int i = 0; i < chars.length; i++) {
-                strings[i] = new String(chars[i]);
-            }
-    	    return strings;
-	    } else {
-	        return new String[0];
-	    }
-	}
-
-	private String[] toSignatures(char[][] strings) {
-	    if (strings != null) {
-    	    String[] sigs = new String[strings.length];
-    	    for (int i = 0; i < sigs.length; i++) {
-                sigs[i] = Signature.createTypeSignature(strings[i], true);
-            }
-    	    return sigs;
-	    } else {
-	        return new String[0];
-	    }
-	}
-	
 	/**
 	 * @author andrew
 	 * just expose all the protected setter methods
