diff --git a/src/main/java/org/apache/easyant/core/ant/listerners/BuildExecutionTimer.java b/src/main/java/org/apache/easyant/core/ant/listerners/BuildExecutionTimer.java
index 430f3f7..305adc3 100644
--- a/src/main/java/org/apache/easyant/core/ant/listerners/BuildExecutionTimer.java
+++ b/src/main/java/org/apache/easyant/core/ant/listerners/BuildExecutionTimer.java
@@ -53,7 +53,7 @@
 
     // build start time
     // to be initialized in buildStarted method
-    protected long buildStartTime;
+    private long buildStartTime;
 
     public static class ExecutionResult {
         /**
diff --git a/src/main/java/org/apache/easyant/core/report/EasyAntReport.java b/src/main/java/org/apache/easyant/core/report/EasyAntReport.java
index 4d22c62..a9851bc 100644
--- a/src/main/java/org/apache/easyant/core/report/EasyAntReport.java
+++ b/src/main/java/org/apache/easyant/core/report/EasyAntReport.java
@@ -227,7 +227,7 @@
             } else if (module.equals(moduleRep.getModuleRevisionId().getName())) {
                 retVal = moduleRep;
                 break;
-            } else if (moduleRep.as != null && moduleRep.as.equals(module)) {
+            } else if (moduleRep.getAs() != null && moduleRep.getAs().equals(module)) {
                 retVal = moduleRep;
                 break;
             }
diff --git a/src/main/java/org/apache/easyant/core/report/ImportedModuleReport.java b/src/main/java/org/apache/easyant/core/report/ImportedModuleReport.java
index 0bc0dae..91f2993 100644
--- a/src/main/java/org/apache/easyant/core/report/ImportedModuleReport.java
+++ b/src/main/java/org/apache/easyant/core/report/ImportedModuleReport.java
@@ -20,15 +20,15 @@
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 
 public class ImportedModuleReport {
-    String module = null;
-    String organisation = null;
-    String revision = null;
-    String moduleMrid = null;
-    String type = null;
-    String as = null;
-    boolean mandatory = false;
+    private String module = null;
+    private String organisation = null;
+    private String revision = null;
+    private String moduleMrid = null;
+    private String type = null;
+    private String as = null;
+    private boolean mandatory = false;
 
-    EasyAntReport easyantReport = null;
+    private EasyAntReport easyantReport = null;
 
     public String getModule() {
         return module;
diff --git a/src/main/java/org/apache/easyant/tasks/findclasspath/AbstractFindClassPathStrategy.java b/src/main/java/org/apache/easyant/tasks/findclasspath/AbstractFindClassPathStrategy.java
index 52b25bf..93a2a24 100644
--- a/src/main/java/org/apache/easyant/tasks/findclasspath/AbstractFindClassPathStrategy.java
+++ b/src/main/java/org/apache/easyant/tasks/findclasspath/AbstractFindClassPathStrategy.java
@@ -27,8 +27,8 @@
 import org.apache.tools.ant.types.Reference;
 
 public abstract class AbstractFindClassPathStrategy extends DataType {
-    public String pathid;
-    protected Path path;
+    private String pathid;
+    private Path path;
     private AbstractFindClassPathStrategy nextStrategy;
 
     public boolean check() {
diff --git a/src/main/java/org/apache/easyant/tasks/findclasspath/BasicConfigurationStrategy.java b/src/main/java/org/apache/easyant/tasks/findclasspath/BasicConfigurationStrategy.java
index ad5e7c4..fecafd1 100644
--- a/src/main/java/org/apache/easyant/tasks/findclasspath/BasicConfigurationStrategy.java
+++ b/src/main/java/org/apache/easyant/tasks/findclasspath/BasicConfigurationStrategy.java
@@ -21,7 +21,7 @@
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.types.Reference;
 
-public class BasicConfigurationStrategy extends AbstractFindClassPathStrategy{
+public class BasicConfigurationStrategy extends AbstractFindClassPathStrategy {
     private String organisation;
     private String module;
     private String revision;
@@ -29,9 +29,8 @@
     protected String settingsRef;
 
     protected boolean doCheck() {
-        log("Checking plugin configuration ...",Project.MSG_VERBOSE);
-        loadCachePath(getOrganisation(), getModule(), getRevision(), getConf(),
-                getSettingsReference());
+        log("Checking plugin configuration ...", Project.MSG_VERBOSE);
+        loadCachePath(getOrganisation(), getModule(), getRevision(), getConf(), getSettingsReference());
         return true;
     }
 
@@ -69,7 +68,7 @@
 
     public String getSettingsRef() {
         if (settingsRef == null) {
-            settingsRef= EasyAntMagicNames.EASYANT_IVY_INSTANCE;
+            settingsRef = EasyAntMagicNames.EASYANT_IVY_INSTANCE;
         }
         return settingsRef;
     }
@@ -77,12 +76,9 @@
     public void setSettingsRef(String settingsRef) {
         this.settingsRef = settingsRef;
     }
-    
+
     public Reference getSettingsReference() {
-        return new Reference(getProject(),getSettingsRef());
+        return new Reference(getProject(), getSettingsRef());
     }
-    
-    
-    
 
 }
diff --git a/src/main/java/org/apache/easyant/tasks/findclasspath/EnvironmentStrategy.java b/src/main/java/org/apache/easyant/tasks/findclasspath/EnvironmentStrategy.java
index 12d6bbb..bc09ca7 100644
--- a/src/main/java/org/apache/easyant/tasks/findclasspath/EnvironmentStrategy.java
+++ b/src/main/java/org/apache/easyant/tasks/findclasspath/EnvironmentStrategy.java
@@ -24,9 +24,9 @@
 
 public class EnvironmentStrategy extends AbstractFindClassPathStrategy {
 
-    String env;
-    String layout = "/lib";
-    String filter;
+    private String env;
+    private String layout = "/lib";
+    private String filter;
 
     public String getEnv() {
         return env;
@@ -35,7 +35,6 @@
     public void setEnv(String env) {
         this.env = env;
     }
-    
 
     public String getLayout() {
         return layout;
@@ -44,7 +43,6 @@
     public void setLayout(String layout) {
         this.layout = layout;
     }
-    
 
     public String getFilter() {
         return filter;
@@ -64,7 +62,7 @@
 
         if (getEnv() != null && System.getenv(getEnv()) != null) {
             log(getEnv() + " found !", Project.MSG_VERBOSE);
-            File libDir = new File(System.getenv(getEnv()),getLayout());
+            File libDir = new File(System.getenv(getEnv()), getLayout());
             FileSet fileSet = new FileSet();
             fileSet.setDir(libDir);
             fileSet.setIncludes(getFilter());
diff --git a/src/main/java/org/apache/easyant/tasks/findclasspath/ProjectDependencyStrategy.java b/src/main/java/org/apache/easyant/tasks/findclasspath/ProjectDependencyStrategy.java
index 006344a..262dbb7 100644
--- a/src/main/java/org/apache/easyant/tasks/findclasspath/ProjectDependencyStrategy.java
+++ b/src/main/java/org/apache/easyant/tasks/findclasspath/ProjectDependencyStrategy.java
@@ -52,7 +52,7 @@
     @Override
     public String getSettingsRef() {
         if (settingsRef == null) {
-            settingsRef = IvyInstanceHelper.getProjectIvyInstanceName(getProject());
+            setSettingsRef(IvyInstanceHelper.getProjectIvyInstanceName(getProject()));
         }
         return settingsRef;
     }
@@ -104,48 +104,36 @@
         public boolean checkProjectDependencies() {
             execute();
             try {
-                ResolutionCacheManager cacheMgr = getIvyInstance()
-                        .getResolutionCacheManager();
+                ResolutionCacheManager cacheMgr = getIvyInstance().getResolutionCacheManager();
                 String[] confs = splitConfs(getConf());
                 String resolveId = getResolveId();
                 if (resolveId == null) {
-                    resolveId = ResolveOptions
-                            .getDefaultResolveId(getResolvedModuleId());
+                    resolveId = ResolveOptions.getDefaultResolveId(getResolvedModuleId());
                 }
                 XmlReportParser parser = new XmlReportParser();
                 for (int i = 0; i < confs.length; i++) {
-                    File report = cacheMgr
-                            .getConfigurationResolveReportInCache(resolveId,
-                                    confs[i]);
+                    File report = cacheMgr.getConfigurationResolveReportInCache(resolveId, confs[i]);
                     parser.parse(report);
 
                     Artifact[] artifacts = parser.getArtifacts();
                     for (int j = 0; j < artifacts.length; j++) {
                         Artifact artifact = artifacts[j];
                         ModuleRevisionId mrid = artifact.getModuleRevisionId();
-                        if (mrid.getOrganisation().equals(
-                                getOrganisationToFind())) {
+                        if (mrid.getOrganisation().equals(getOrganisationToFind())) {
                             if (mrid.getName().equals(getModuleToFind())) {
-                                log(mrid.getOrganisation() + "#"
-                                        + mrid.getName()
-                                        + " found in project dependencies !",
+                                log(mrid.getOrganisation() + "#" + mrid.getName() + " found in project dependencies !",
                                         Project.MSG_DEBUG);
                                 // use this version
-                                loadCachePath(getOrganisationToFind(),
-                                        getModuleToFind(), mrid.getRevision(),
+                                loadCachePath(getOrganisationToFind(), getModuleToFind(), mrid.getRevision(),
                                         getConfToFind(), getSettingsReference());
                                 return true;
                             } else {
                                 // if only organization is found in project
                                 // dependencies use the same version with the
                                 // required module
-                                log(
-                                        "Only organisation : "
-                                                + mrid.getOrganisation()
-                                                + " was found in project dependencies !",
-                                        Project.MSG_DEBUG);
-                                loadCachePath(mrid.getOrganisation(),
-                                        getModuleToFind(), mrid.getRevision(),
+                                log("Only organisation : " + mrid.getOrganisation()
+                                        + " was found in project dependencies !", Project.MSG_DEBUG);
+                                loadCachePath(mrid.getOrganisation(), getModuleToFind(), mrid.getRevision(),
                                         getConfToFind(), getSettingsReference());
                                 return true;
 
@@ -155,8 +143,7 @@
                     }
                 }
             } catch (Exception ex) {
-                throw new BuildException(
-                        "impossible to check project dependencies: " + ex, ex);
+                throw new BuildException("impossible to check project dependencies: " + ex, ex);
             }
             return false;
         }
