An Enterprising Future

Firefox 60 was released today with support for enterprise policies, including Windows Group Policy. If you’ve followed me or my blog for any length of time, you know that advocating for Firefox in the enterprise has been something that I’ve been doing a very long time.

My first post about Firefox in the enterprise was published on March 15, 2007 and was about Firefox 2.

The first version of the CCK Wizard was released on May 11, 2006 and was for Firefox 1.5

So, to say that I’m happy about this particular release would be an understatement. I’m absolutely ecstatic that Mozilla decided that adding support for enterprise features was important.

But I have to admit something; over the years in my zeal to get enterprise support into Firefox, I’ve encouraged just about every method possible to get customizations into Firefox. As a result, I know there are many installations of Firefox that use methods that are definitely not recommended anymore, especially now that we have real policy support. So, I want to take a moment to encourage everyone:

Please investigate using the new policy manager to replace any method you’ve used in the past, including the distribution directory, AutoConfig and CCK2. If you find things that you are not able to do with the policy engine, please let us know. There’s a possibility that some of these methods might not work in the future, so we’d like to find out now what we need to do to make things working.

If you find bugs or have feature requests, please report them on Github or in Bugzilla.

A couple other notes that might be useful:

  1. Updates to the policy code and additional policies are being allowed on the ESR. You will not be stuck with the existing implementation until the next major ESR. As we implement policies, they will be uplifted into the next minor ESR update.
  2. We are continuing to update the policy code to bring it as close as we can to CCK2 functionality.
  3. We are working on better support for macOS and Linux. We are investigating Managed Preferences on macOS and we are looking into reading the policies.json file from a different location on Linux (etc/opt/firefox).
  4. MSI is on our radar, but we’re not making any commitments at this time.

So now, let’s address the elephant in the room – CCK2.

First off, to support Firefox 60, I released a new version of the CCK2 yesterday. It’s not perfect, but it fixes some of the major issues (bookmarks and error popups). You should get automatically updated to this release. You’ll need repackage your configurations to get these fixes.

But what about the future?

CCK2 uses AutoConfig as the underlying technology to customize Firefox. We currently have plans to sandbox AutoConfig on Rapid Release starting with Firefox 62. This will mean the CCK2 will definitely not work with Rapid Release starting with Firefox 62.

On the ESR, I plan to keep CCK2 working, but I will not be implementing any new features except as they relate to making it easier to migrate to the policy manager. One example of that is providing the ability to remove all bookmarks added by CCK2. Once Firefox 52 is out of support, I will probably migrate CCK2 to use the policy manager internally. To enable that, we are investigating allow policies to be specified via AutoConfig as JSON files.

I always knew there would come a time when the CCK2 would not work anymore. My biggest concern was that there wouldn’t be a replacement. But I’m confident with the policy management support that we’ve implemented that we can make things even better.

I appreciate the support and encouragement folks have given me over the years with regards to the CCK2. I’m glad that the work that I’ve done will live on in the new policy manager on Firefox.

One final note. You will start to see a lot of my older blog posts disappear. This because I don’t want to recommend people use those methods anymore. The official place to get documentation and support is support.mozilla.org.


Comments

57 responses to “An Enterprising Future”

  1. […] ecstatic that Mozilla decided that adding support for enterprise features was important." https://mike.kaply.com/2018/05/09/an-enterprising-future/ #mozilla #firefox […]

  2. Gunér Avatar
    Gunér

    Hi, have been waiting for the 60.0 esr (64 bit) release to be able to try out your tool. But I got a “could not be installed because it is not compatible with Firefox 60.0.” Pop-up stop. How do I resolve this?
    Thanx from Sweden

    1. Mike Kaply Avatar
      Mike Kaply

      The CCK2 extension is a legacy extension so it requires Firefox 52. You use the wizard on 52 ESR, but the results are used with Firefox 60.

      Although I do not recommend using the CCK2 if you can use our new policy engine instead.

  3. Hannes Avatar
    Hannes

    Hello Mike,
    first of all, thank you for all your effort you put in (since years) to make this version finally the start for something hassle-free in an enterprise environment.

    But I think itwould be nice to have some clarification because of the different methods that can be used now to customize Firefox (GPO and config-file), so it would be nice to have an answer for the following questions.

    1) Is GPO support only on ESR version or on Rapid Release, too?

    2) Does the Firefox ESR 60 installer already contain the GPO (.adm or .admx) for Windows or do I have to donwload them manually from Github? If the second one, do I have to manually check for updated GPOs regularly?

    3) What is the hierarchical order that Firefox ESR 60 checks for preconfigurations during startup?
    So e.g. does it first of all checks GPO and than (CCK2) config files? Will the CCK2 setting only work when the corresponding GPO is not configured?

    Would be nice to have some clarification!
    Kind regards
    Hannes

    1. Mike Kaply Avatar
      Mike Kaply

      GPO support is in ESR and Rapid Release. Some policies are ESR only right now.

      The installer does not contain the ADMX files. They must be downloaded separately. (This is consistent with other applications).

      The order in which configurations are applied is dependent on the configuration, so I can’t give you an answer one way or another. The CCK2 and GPO use different mechanism.

      I would not recommend setting any feature in both CCK2 and GPO.

  4. Wolfgang Avatar
    Wolfgang

    Hi Mike, the link “https://mike.kaply.com/updates/cck2wizard/cck2wizard-latest.xpi” does point to CCK2 version 2.3.5 and not to version 2.4. But after building version 2.4 from github source it can not be installed on firefox version 60.0esr (64 bit) error message “could not be installed because it is not compatible with Firefox 60.0.” (As Gunér already wrote) !!
    Do you have a solution for that problem already?

    1. Wolfgang Avatar
      Wolfgang

      Hello Mike, it would be very nice if you could give me an feedback to my comment above, thanks.

    2. Mike Kaply Avatar
      Mike Kaply

      I named the release incorrectly. It should be 2.2.4 and that is the version that cck2wizard-latest.xpi points to.

      The CCK2 extension can only be used on Firefox 52. The configuration that is generated works with Firefox 60.

      1. Wolfgang Avatar
        Wolfgang

        Ok, thank you for clearing up.
        You say “I recommend using our policy engine if possible though, not CCK2.”, but the problem is that the current policy engine has a big lack in supported configuration options.
        Are there plans to extend the possible configuration options and if yes which and when?

        1. Mike Kaply Avatar
          Mike Kaply

          Yes, we are writing new policies now and they will be going into ESR updates.

          What policies are missing for you? Have you reported them in GitHub or Bugzilla?

  5. Richard Avatar
    Richard

    I’m experiencing the same problem reported by Gunér and Wolfgang.

    Attempting to install the CCK2 plugin reports:
    “could not be installed because it is not compatible with Firefox 60.0.”

    I used the following links to download the CCK2.

    https://mike.kaply.com/updates/cck2wizard/cck2wizard-latest.xpi noted here:
    “First off, to support Firefox 60, I released a new version of the CCK2 yesterday. It’s not perfect, but it fixes some of the major issues (bookmarks and error popups). You should get automatically updated to this release. You’ll need repackage your configurations to get these fixes.”

    https://mike.kaply.com/cck2/

    Thank

    1. Mike Kaply Avatar
      Mike Kaply

      The CCK2 Wizard can only be used on Firefox 52 because it is a legacy extension. It generates configurations that work on Firefox 60.

      I recommend using our policy engine if possible though, not CCK2.

  6. Richard Avatar
    Richard

    I’m working with the policies.json file supported by ESR 60.

    Some of the settings are working. Others are not. I suspect a problem with my policies.json file. It is a correctly formatted JSON file, but I think I have keyed in something that Firefox does not like.

    Some questionss from the noob.

    1. Are you aware of a error/event log that I can inspect for policies.json issues?
    2. I assumed settings that are not needed should not be included in the policies.json file. For example, if I don’t need the following:

    “BlockAboutAddons”: true

    I would not include it in the policies.json file. Is this correct?

    3. I assumed that individual settings within, for example, the Homepage: option can be excluded:

    Homepage”: {
    “URL”: “http://example.com/”,
    “Locked”: true,
    “Additional”: [“http://example.org/”,
    “http://example.edu/”]
    }

    For example, this (removing the additional parameter) would be a valid entry:

    Homepage”: {
    “URL”: “http://example.com/”,
    “Locked”: true,
    }

    4. Double quotes are needed to supply an empty value. For example,

    “Bookmarks”: [
    {
    “Title:” “Mike Kaply is the Dude”,
    “URL”: “https://mike.kaply.com/category/mozilla/”,
    “Favicon”: “”,
    “Placement”: [“toolbar”, “menu”],
    “Folder”: “”
    }
    ],

    I’m sure you are a busy guy. Any assistance will be greatly appreciated.

    1. Guest9000 Avatar
      Guest9000

      Some Settings like Deactivation of Auto-Updates only work with Firefox ESR. If you want to use the Rapid Release Version you can’t use all Policies.

      1. Richard Avatar
        Richard

        Roger that.

        Thanks

    2. Mike Kaply Avatar
      Mike Kaply

      1. You can turn on policy error logging by setting “browser.policies.loglevel” to “debug” in about:config.
      2. Correct. If you don’t need a policy, leave it out.
      3. Yes, they can be excluded.
      4. You don’t need to supply empty values at all. And for placement, you are choosing between the two values.

      I’m working on updating the JSON documentation to be more clear.

      1. Richard Avatar
        Richard

        Excellent,

        Thanks for you help.

      2. Hello Mike,

        The setting “browser.policies.loglevel” doesn’t exist in 60.0.1ESR.

        I need it to get the AD policy setting “Extensions to install” to work.
        Tried to automatically install uBlock Origin but can’t get it to work. Tried installing from the official Mozilla page (https://addons.mozilla.org/firefox/downloads/file/956394/ublock_origin-1.16.6-an+fx.xpi), from our network or even c:\temp but no go.

        Got any pointers maybe?

        1. Mike Kaply Avatar
          Mike Kaply

          You have to add it explicitly. Right click in about:config, select New->String and add it.

          The extension stuff is working in our testing. I’ll be curious as to what the log says.

          1. Yeah, figured that. Problem is we work in a VDI environment that is stateless so need to figure out how to add in in testing before starting Firefox.
            Will let you know, thanks.

          2. Mike Kaply Avatar
            Mike Kaply

            Were you able to figure this out?

          3. Don’t know why, but in 60.0.2 ESR it works, the add-on installs without problems.

            So…yes 🙂

  7. Luke Mason Avatar
    Luke Mason

    Could you point me in the right direction for how I can add an SSL certificate to a Mac using Policies? I did some Googling, but can’t seem to find the right policy to add to the file.

    Thanks for all your help, by the way. You do great work!

    1. Mike Kaply Avatar
      Mike Kaply

      We don’t have support for adding certs yet via policy. I’m working on that.

      1. Brandy Avatar
        Brandy

        Is there any way to add an SSL certificate to a Mac like you could with CCK2for either Rapid Release or ESR? We need it for our proxy, and having every user manually import it is not going to happen.

        1. Mike Kaply Avatar
          Mike Kaply

          This is on the list for the policy manager. Hope to have it soon.

  8. Jeff Rippy Avatar
    Jeff Rippy

    Mike, I have loved your work on CCK2 and knowing that you are part of the Firefox team makes me happy for it’s future.
    I assume the policy manager is Windows only since you mention exploring options for Mac and Linux.
    You also mentioned looking into Managed Preferences but as you will quickly find out, those are deprecated.
    Please look into Configuration Profiles to manage Firefox. That would be easy, accessible, and portable across most any Mac admin team.
    Thanks for all you do.

    1. Mike Kaply Avatar
      Mike Kaply

      The policy manager is cross platform – we use a policies.json file in the distribution directory on the other platform.

      As far as Mac goes, I’m looking at using the same thing Chrome uses (plist file with configuration). Is that configuration profiles?

      The bug is here:

      https://bugzilla.mozilla.org/show_bug.cgi?id=1445943

  9. jjurkus Avatar
    jjurkus

    So if I read this correctly, AutoConfig is not being deprecated for normal settings?
    But what about stuff in custom.js and firefox.js?
    custom.js is in %installdir%\defaults\pref\ and contains general.config.filename.

    firefox.js is somewhat larger. It refers to an url with autoadmin.global_config_url, but it also has a couple of functions for new profiles. Of course I nicked this script from your website.
    There is more than just certificate stuff in %installdir%\browser\defaults\profile.

    It’s great there is finally done something about Firefox in the enterprise like this. I’m also asking what I should ask for in new policies. Do we want to cover most use cases and should I put all my missing things on github? I kinda want to move away from autoconfig, because of my deployment options. I never use GPOs, I always deploy the registry settings those GPOs set.

    1. Mike Kaply Avatar
      Mike Kaply

      In your example, firefox.js is an AutoConfig file and will only support the standard API on Rapid Release. It will continue to work as expected for ESR.

      As far as new policies, yes, please request them on Github.

  10. Hi,

    is it possible to add preferences with policy manager ?

    1. Mike Kaply Avatar
      Mike Kaply

      We don’t allow arbitrary preference setting. We want to add policies for the things most people need to do. Please open issues at https://github.com/mozilla/policy-templates/issues/ for things you think are missing. You can also continue to use AutoConfig for preferences.

  11. Hi there
    First of all, the policy engine works great.
    – But I can’t find the policy to configure “about:config” Settings, is there any possiblity?
    Best regards
    Sam

    1. Mike Kaply Avatar
      Mike Kaply

      We don’t allow arbitrary preference setting. We want to add policies for the things most people need to do. Please open issues at https://github.com/mozilla/policy-templates/issues/ for things you think are missing. You can also continue to use AutoConfig for preferences.

      1. Thanks for the answer.
        What do you mean by “You can also continue to use AutoConfig for preferences” use the “autoconfig.js” from cck2 customizing with Version 56? This is not working by coping into the pref Folder. How do I apply those Settings?

        Best Regards Sam

        Best Regards Sam

  12. Comète Avatar
    Comète

    Hi,
    we use CCK2 since ages, thanks for this wonderful tool !
    I’m now trying to configure Firefox 60.0.2 ESR with the autoconfig mode and I’ve included 2 self-signed certificates for 2 internal web sites as we always used to do with 52.x and before, but when I access those sites, the certs aren’t used and I get the SEC_ERROR_UNKNOWN_ISSUER error.
    I’ve also tried to enable “security.enterprise_roots.enabled” and deployed my certs using a group policy, it works for IE but not for Firefox.
    If I manually add the exception it works too, but I can’t do that for 500 users…
    Is there something I missed ? I’ve read and tried many things on the web but nothing worked.

    Thanks for the help !

  13. Héctor Rodríguez Avatar
    Héctor Rodríguez

    Hi Mike, thanks for all your work related to Firefox and make the live more easyly to us.
    I recently installed & used the new Firefox 60 ESR Windows Group Policy ADMX Templates and is really amazing. However, I couldn’t find some usefull restrictions for me: “Block about:preferences”, “Block acces to files in drives…”, ( example: block acces to files in C:\ drive), between others…
    How can implement this restrictions right now? Their could be included in next versions of Windows Group Policy Templates?
    Thanks in advanced,
    Héctor.

  14. Patrick Avatar
    Patrick

    I am having problems setting intl.accept_languages using cck2. It works great with ESR 52.x but since ESR 60 it stopped working. We use the english ESR but prefer dutch pages to be shown. I haven’t found any related setting in the policies. Any idea how to proceed? Thanks.

    1. Patrick Avatar
      Patrick

      I have a workaround, if I make this setting locked or user set it works, but then any changes made in the choose languages UI by the user are lost after closing firefox. Better than nothing I guess.

      I found some references in bugzilla: Bug 1039212 from 1014. It was fixed in ESR 52 and is now back in ESR 60. Not a cck2 bug but a FF bug.

  15. I need to prepare Firefox 60.x ESR for several companies and need to block display of passwords but need to allow remove username/passwords. I know I could stop access to the whole password manager but this is not a solution for us since users need to delete individual accesses.

    In Firefox 52 ESR and before we used to put a file userContent.css into %ProgramFiles%\Mozilla Firefox\defaults\profile\chrome\ which automatically copies it into Firefox user profile directory in subfolder \chrome\ for every new profile / new user.

    But for Firefox 60 ESR I have not found any solution to copy files automatically for new profiles and I search and test it for days.

    If possible I would prefer to put that configuration in place for ALL users in %ProgramFiles%\Mozilla Firefox\ without a chance for the user to change it.

    The file userContent.css shows:
    @namespace xul “http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul”;
    @-moz-document url(chrome://passwordmgr/content/passwordManager.xul){
    #SignonViewerDialog #removeAllSignons {display:none!important}
    #SignonViewerDialog #togglePasswords {display:none!important}
    }
    #context-copypassword { display:none!important; }
    #context-editpassword { display:none!important; }

  16. Jean-Sebastien Frenette Avatar
    Jean-Sebastien Frenette

    I’m still using CCK2 to configure many things that GPO doesn’t configure:

    “disableCrashReporter”: true,
    “disableTelemetry”: true,
    “disableFirefoxHealthReportUpload”: true,
    “disableFirefoxHealthReport”: true,
    “dontShowRights”: true,
    “disableHeartbeat”: true,
    “autoconfig”: {
    “disableProfileMigrator”: true
    },
    “id”: “STM_Firefox_Quantum_For_Enterprise_60.0.0_ESR_x64”,
    “preferences”: {
    “browser.cache.disk_cache_ssl”: {
    “value”: false,
    “locked”: true
    },
    “browser.download.manager.scanWhenDone”: {
    “value”: true,
    “locked”: true
    },
    “browser.formfill.enable”: {
    “value”: false
    },
    “browser.helperApps.alwaysAsk.force”: {
    “value”: true,
    “locked”: true
    },
    “browser.newtabpage.activity-stream.feeds.telemetry”: {
    “value”: false,
    “locked”: true
    },
    “browser.newtabpage.activity-stream.telemetry”: {
    “value”: false,
    “locked”: true
    },
    “browser.ping-centre.telemetry”: {
    “value”: false,
    “locked”: true
    },
    “browser.urlbar.daysBeforeHidingSuggestionsPrompt”: {
    “value”: 0,
    “locked”: true
    },
    “browser.urlbar.filter.javascript”: {
    “value”: true,
    “locked”: true
    },
    “capability.policy.default.checkloaduri.enabled”: {
    “value”: “allAccess”,
    “locked”: true
    },
    “capability.policy.localfilelinks.sites”: {
    “value”: “\\\\corpo.stm.info”,
    “locked”: true
    },
    “dom.ipc.plugins.flash.subprocess.crashreporter.enabled”: {
    “value”: false,
    “locked”: true
    },
    “extensions.blocklist.interval”: {
    “value”: 90000,
    “locked”: true
    },
    “intl.accept_languages”: {
    “value”: “fr-ca, fr, fr-fr, en-us, en”
    },
    “media.peerconnection.enabled”: {
    “value”: false,
    “locked”: true
    },
    “media.peerconnection.use_document_iceservers”: {
    “value”: false,
    “locked”: true
    },
    “network.IDN_show_punycode”: {
    “value”: true,
    “locked”: true
    },
    “privacy.sanitize.sanitizeOnShutdown”: {
    “value”: true
    },
    “security.dialog_enable_delay”: {
    “value”: 2000,
    “locked”: true
    },
    “security.ssl.require_safe_negotiation”: {
    “value”: false,
    “locked”: true
    },
    “security.ssl.treat_unsafe_negotiation_as_broken”: {
    “value”: true,
    “locked”: true
    },
    “security.ssl3.rsa_des_ede3_sha”: {
    “value”: false,
    “locked”: true
    },
    “security.tls.version.min”: {
    “value”: 1,
    “locked”: true
    },
    “signon.autofillForms”: {
    “value”: false
    },
    “signon.rememberSignons”: {
    “value”: false
    },
    “webgl.disabled”: {
    “value”: true,
    “locked”: true
    }

    IS there any hope that GPO or something else will be available? Also, with GPO, it’s forced configuration while I have many “default only” configuration

  17. Firstly thanks for all your work on CCK2 over the years and your more recent input with FF group policy. This seems like the right way to go but naturally doesn’t appear as extensive yet as CCK2.

    Am I right in thinking now that CCK2 is incompatible now with Rapid Release 62? In which case, whilst it’s great to see the option to disable private browsing in policy manager, we still need more control to prevent history deletion. I can see that ‘DisableForgetButton’ is available but this doesn’t prevent the user right clicking on history and selecting ‘Forget’ or ‘Delete’. Are there any other ways to achieve this in RR62 at the moment or will these features be added shortly to your knowledge?

    1. Mike Kaply Avatar
      Mike Kaply

      The CCK2 will still work with Rapid Release 62 once I fix a couple bugs. The original plan was to sandbox Autoconfig which would break it, but for now sandboxed Autoconfig is still behind a pref.

      I’m curious how you accomplished preventing history deletion using the CCK2?

      I do have a plan to prevent history deletion as a policy.

  18. Hello Mike, regarding your comment below:

    “The CCK2 will still work with Rapid Release 62 once I fix a couple bugs”

    Should we be expecting a new CCk2 release, that will work for Firefox 62?

    1. Mike Kaply Avatar
      Mike Kaply

      Sorry for the delay. I just released this. I can no longer sign the CCK2 on AMO, so you’ll have to set the preference xpinstall.signatures.required to false to get the update.

  19. Guillaume Boucher Avatar
    Guillaume Boucher

    Hi, up to Firefox 61.0.2, I have been using the cck2 autoconfig files to deploy Firefox. In the last version, 61.0.2, Firefox opens normally. Then, after a few seconds on let say YouTube, Firefox then closes without any error message, crash log, etc. I get this problem on multiple computers where I work. They are all on Windows 7 x64 Ent SP1. I tried to do a clean install by uninstalling Firefox then deleting the folders “C:\Program Files (x86)\Mozilla Firefox” and “%AppData%\Roaming\Mozilla”. Again, Firefox opens normally then crash after a few seconds without any error messages, logs or warning in the Windows Event Log viewer. I also tried to install the latest version of Firefox 62 by using the GPO “Homepage” and nothing else. Again, Firefox opens up normally then close after a few seconds. Am I missing something here? What can force Firefox to just close on multiple computers with very different hardware and software applications? Any help would be appreciated!

    1. Mike Kaply Avatar
      Mike Kaply

      OK, that’s really strange. Does it happen if you don’t have the CCK2 installed?

      1. Guillaume Boucher Avatar
        Guillaume Boucher

        Hi Mike, I finally found the reason behind these crashes. It had nothing to do with cck2. In fact, Firefox was crashing because of the application NetOP Vision Pro from Danware, which wasn’t able to handle the new versions. I’m in the process of correcting this.

        Thanks again for your help & for cck2!
        Guillaume

        1. Mike Kaply Avatar
          Mike Kaply

          That’s interesting. Do you know if it was injecting a DLL or something like that?

  20. Brian Martin Avatar
    Brian Martin

    We need a way at a minimum to deploy the address for a .pac file, lock that screen down to the end user as well as deploy a trusted root certificate and lock that down as well on macOS platforms. Ideally I would like to manage Firefox on the Mac with mobile config files similar to Chrome and have Firefox use the macOS keychain for its certs.

    1. Mike Kaply Avatar
      Mike Kaply

      We already have pac file support in the policy engine. We have done Mac keychain support, it will be in Firefox 63. We are working on Mac config files now.

      1. Brian Martin Avatar
        Brian Martin

        Grabbed the current beta of 63b7 and cannot find any reference to the keychain support for macOS being added.

        On the positive side, I was able to use this add-on to configure everything else (including using the macOS PAC file defined in the network stack) I deployed with CCK2 other than the Certificate Authority cert I needed to add: https://addons.mozilla.org/en-US/firefox/addon/enterprise-policy-generator/

        Looking forward the Firefox 63 will have the ability to use certificates imported into the Mac keychain system as opposed to having to define them in Firefox itself. I just would like to kick the tires to see where/how to configure that if at all possible.

        Kind regards and thank you for all the work you’ve done to help sysadmins deploy and manage Firefox.

      2. Thank you! Thank you! Thank you! the Mac Keychain support is working finally!! I for one am deeply appreciative!

        1. Brian Martin Avatar
          Brian Martin

          How did you get it working…is there anything I must do within Firefox to have it use the Mac’s keychain…specifically regarding certs

  21. How to block C:/ drive access on Firefox ESR with new version

  22. Hi,

    I’m migrating from CCK2 to policies.js, is it possible to remove the bookmarks created by CCK2 on an existing profile? because when I recreate them with policies on an existing profile, they are displayed twice. (firefox ESR 60.5.0)

    Thanks !

  23. Hello All
    Thanks for checking out my writing blog . My name is Nannie.
    I have worked since high school in this niche. My interest in writing started at a young age. I wrote journaled as a child and eventually went on to work with my school newspaper.
    This early tryst into reporting eventually led me to academic writing. There is plenty of work for skilled writers. I specialize in research papers , but have the skills to do all types of academic writing.
    Email me for more information about rates and a price quote. I’m looking forward to helping you.

    Academic Writer – Nannie Morris – elearninag.com Confederation

Leave a Reply

Your email address will not be published. Required fields are marked *