Author Archives: C. Anthony Caragol

Reminder: Etiquette Is a Large Part of Skype Adoption Methodology

“Presence is the kindness users provide in engaged communication.” –Thomas Poett

Presence isn’t dead or dying, and with Skype for Business it can be one of the most impactful features added by a deployment.  However, any time a new tool such as Microsoft Lync or Skype for Business has been deployed, user adoption planning and training is key.  One component of this that must not be overlooked is simple etiquette, especially when it comes to presence.  Microsoft does an excellent job of providing automated presence information based upon your Exchange calendar, keyboard idle time, phone use, etc.  But, like any IM platform, these can be overridden.  When they are overridden with false values to avoid contact, the impact can be lost.  Educating your users on why this is an important feature, how to properly use it, and why it impacts others is critical.

If you are not including Etiquete as part of your adoption package, it’s time to include it.  Microsoft has recognized this and have been pushing this since the days of Live Communications Server as well as in more recent RASK kits…



Skype for Business Tip: Move Audio Call from Mobile Client to Desktop/Deskphone

This one confounded me for a while as it comes up on the occasional RFP and other PBX vendors are known to handle it well.

The scenario is as follows: You’ve answered your call on your mobile device using VoIP, but you’re now back at your desk and want to use your Lync or Skype for Business desk phone.

If it’s a conference call, you can just rejoin the conference from another endpoint, but for a one-on-one call, I didn’t think this was possible as you can’t easily park the call and there’s no obvious other way to accomplish it.

Thanks to Habib Mankal ( Office Server and Services MVP (formerly Skype MVP) for pointing out a solution!

Simply transfer the call to your own Skype user.  The mobile client will notify you that it’s transferring the call, and you can pick up the call on another endpoint.  The calling party may potentially hear hold music so it’s not seamless, but it’s an option.

If the call is not a VoIP call and you’ve answered the call using your cell service, this functionality does not appear to work that same at this point, at least from an iPhone.  If you can transfer the call from your cell phone, that would be your option there.

If you’d like to see this feature more properly implemented; please vote for it here:

There are other feedback requests that say similar things, but with few votes or not quite the same.  Please vote it up, this feature would be huge.



Breaking News: New Color AudioCodes 450HD is Coming!

The long awaited color phone from AudioCodes is going to be hitting us very soon.  For those who have deployed color phones, you know that AudioCodes phones for Lync and Skype for Business are solid and packed with features, but until now there hasn’t be a color screen available.  There’s not a lot of public information just yet, but I managed to snag a pic or two (some I can’t show you yet) and some details.

Unofficially a few features:

  • 5’’ high res Color Touch + expansion module support
  • Integrated Bluetooth (for wireless headsets and mobile HFP (hands-free profile)
  • Ability to connect up to 3 expansion modules – maybe not available at release

However, as you know, this isn’t GA yet and details are slim. Everything could change by the time it’s released, but I couldn’t resist sharing the bits I’ve found so far, enjoy!


Can’t Find Skype Online Cloud PBX?

Recently, a lot of our clients and people out on the Internet are dipping their toes in the water of Skype for Business Online Cloud PBX.  This is included with E5, but if you don’t need the full E5 suite, you can add it as an add-on to the E3 licensing level in Office 365.  But what if it’s not there?  Or perhaps you have E5 but PSTN Calling isn’t there (assuming your tenant is in a country it’s currently sold).  You might ask, “How do I find Cloud PBX?” when it’s not an option in the add subscriptions portion of your tenant?

Typically you would navigate to Billing->Subscriptions->Add subscriptions or just click the Purchase Services link in the left pane.


However, once there Cloud PBX, PSTN Calling, and PSTN Conferencing do not exist as options.   We had this same issue and after a call with Microsoft, we’ve learned that the portal website isn’t “fully updated” and it doesn’t recognize E3 licenses purchased through volume licensing, enterprise agreements (EA), or internal user licenses.  The trick to get these options to appear at the time of this blog writing is to purchase a single annual E3 license through the portal, and call Microsoft to refund it.  This should be a short term workaround, so I would ask you to call Microsoft before you begin this procedure.

Once you’ve added this single E3 (or E5 or whatever you have chosen), the flag should be set in the portal and you should now see the options to continue.


Now that we see it, we can add it and select PSTN Calling on the way.


All that’s left is to assign the licenses to your users and dive into Cloud PBX!

Reminder: Quarterly Skype for Business User’s Groups

This is your quarterly reminder that the US Skype for Business Users Groups are coming up.

Going forward, you need to register at  The Meetup site will no longer be used.

These are always a great time and a great place to network with your peers and make those relationships.  I’ll be there as well as many experts, there will a Cloud PBX discussion and Polycom reps on site to show off interoperability and some cool devices.


  • January 21 – Chicago, IL
  • January 26 – Cincinnati, OH
  • January 19 – Philadelphia, PA
  • January 19  – Los Angeles, CA
  • January 26  – Nashville, TN
  • January 21 – Silicon Valley, CA
  • January 28 – Kansas City, MO
  • February 16 – Detroit, MI
  • February 4 – Boise, ID
  • January 27 – Milwaukee, WI
  • February 11 – Seattle, WA
  • February 10 – Portland, OR
  • February 3 – New York, NY
  • February 18 – Charlotte, NC
  • February 10 – Atlanta, GA
  • January 28- Baltimore, MD

Call Forwarding Added Back to Skype for Business for iOS

In my previous article: I noted that many features were removed from the Lync iOS application for iPhone and iPad when it was upgraded to the Skype for Business application.  One of my most used features, call forwarding, was pulled.  This feature has now been officially put back in place.


As you can see, it’s where you would expect it to be below.  This is a very welcome re-addition to the application, but I feel, and Microsoft I believe understands, that there’s still a long way to go.  In the new “mobile first” world, I also feel we’re a bit behind in this department.



I’m still patiently waiting for my second most used feature, PowerPoint sharing, to be added back in.  At the moment, we can use desktop sharing instead.  However, if the presenter isn’t one who works with your firm, asking for them to switch to desktop sharing for their slide deck can be embarrassing.


Once we’re back on par with some of the features we had in the past, I’m excited to see some added new functionality.  I’m hoping to see seamless transfers of audio between the smartphone and other clients and more feature parity with the full client (including e911).

Let me know your thoughts as well, but remember, real feedback should go to Microsoft at

Lync and Skype Response Groups; Alert Time vs Queue Time-out


I realize that there are other blogs that discuss this, and my apologies to the owners, but TechNet itself isn’t so clear and this comes up in the forums regularly.  I wanted to clarify just what is Lync and Skype for Business Response Group (RGS) group alert time vs queue time-out as well as discuss their relationship.   I feel it is best to do so through the use of scenarios. Please feel free to comment below if you feel I missed something.

Group Alert Time

This setting is simply how long the entire group will be tried in seconds before it gives up.  It does not mean how long each group member’s phone will ring.  This setting becomes more clear when we look at it in relationship to the queue.

Queue Time-out

This setting is the total amount of time all groups in the queue will be tried.  There are scenarios where the time in the queue is actually longer than the queue time-out is set, and this can be observed in scenario B below.

Scenarios and Examples

It’s easier to explain this through the use of individual scenarios, so I will attempt to outline this below.

Scenario A – Single group in a queue with queue time-out set to be longer than group alert time

In this scenario, the group will ring for the alert time seconds defined in the group and stop.  Since the queue time-out has not been reached, the group will ring again.  This will repeat until the time-out has been reached.  This scenario is handy for when you want the call to fail to another member of the group after a set time-frame.  For example, if you have a four-member group set as round robin, with an alert time of 10 seconds, and your queue time-out is forty seconds, each available member of the group will hear the phone ring assuming nobody picks up.

Scenario B – Single group in a queue with queue time-out set to be shorter than group alert time

In this scenario, even though the time-out is reached the ringing will continue until the group’s alert time has been reached.  For example, if the queue time-out is 10 seconds, but the group’s alert time is 30 seconds, the phone will ring for 30 seconds before the queue acts on the time-out.  This is typically due to a misconfiguration rather than a planned scenario.

Scenario C – Multiple groups in a queue with queue time-out set to be longer than the sum of the group alert times

In this scenario, multiple groups are set up and ordered within the queue.  The first group will be tried until it’s alert time is reached, and since the queue time-out has not been reached, the next group will then be tried.  After each group is tried, a check to see if we’re past the time-out is made.  Since we are not, the first group will be tried again and so-on.

Scenario D – Multiple groups in a queue with queue time-out set to be shorter than the sum of the group alert times

In this scenario, multiple groups are again set up and ordered within the queue.  The first group will be tried until it’s alert time is reached (similar to scenario B, this can extend the queue time-out), and a check is made to see if we’re past the time-out.  If so, we perform our time-out call action.  If not, we move to the next group and try it for it’s full alert time.  At the end, we check to see if we’ve passed the time out and move forward.


Hopefully that cleared a few things up for a few searchers out there, if so or if not leave a comment below.



Yes, Analog Is Still a Big Deal, Enter the AudioCodes MediaPack 1288

It’s a new world, it’s a new model, SIP is king and Unified Communications has supplanted standalone telephony.  We are always connected, we have endless choice for effective communication,  we can start large video conferences from a disposable device in our pockets, we live in the future.  So why am I so excited about this new high density analog gateway from AudioCodes?

In a perfect world, analog would be dead, but we live in the real world with legacy processes EmergencyLight
and systems that need to be brought forward.  Large enterprises, higher education, healthcare, and other organizations still have analog needs that need to be filled in a UC world.  Imagine a university campus filled with emergency blue light call boxes, press a button and you’re on the line with police.  That’s analog. Imagine rooms upon rooms filled with hospitality phones that are extremely costly to replace or have no good SIP equivalent.  More analog.  Until now, the high density analog options for Skype for Business or Lync were rough.  The biggest supported gateway had a mere 24 ports.  Sure, you could maintain many gateways but the complexity multiplies.  It sadly came up that maintaining a trunk to a legacy TDM system was often a reasonable answer.

But finally we have a new option, the AudioCodes MediaPack 1288.  This 3U device can start with 144 analog FXS ports and scale to 216 or 288 depending on the number of line-cards (up to 4) added.  Each of those line cards has three 50-pin champ connectors which can connect to a punch down block or an RJ11 adaptor.  For those emergency phones, it supports long haul connections over 4 and a half miles (your ethernet cable won’t make it).   When you’re used to stacking gateways and maintaining multiple routes, this unit means the world.

For fun, here’s a sneak peek at the unit below with a single line-card. I have to make this clear, this picture is unofficial and the look may change by GA, meaning yours might look a bit different.


If you’re looking for more info, AudioCodes’ site has the specs:

QuickTip: Old Tracing Files and OCSLogger

I’ve run across this in a few implementations now. You go to run the OCSLogger on an older Lync server and there seems to be way too much data in there, old data in fact.  You can see in the below image, I ran the logger for literally 2 seconds, but somehow have 9 SIPStack files. This can happen when trace files refuse to be deleted or overwritten.


The quick answer is to close your logger, find your tracing folder (often C:\Windows\Tracing) and move the old ETL files, or all the files in the directory somewhere else.


You should now be able to start the logger fresh.

Move Your Lync/Skype Users Faster

Hypothesis and Assumption

The other night during an upgrade, I had to move 35,000 Lync users from one pool to another Skype for Business pool.  Because it was an upgrade, this wasn’t a simple Invoke-CSPoolFailover situation.  Running a Get-CSUser  | Move-CSUser command suggested the move time was going to be just short of 8 hours, well outside of our maintenance window and well into the morning where users would arrive and potentially notice.

I’ve long suspected that multi-threading the move would help, and I typically run the move across many servers out of hope and superstition, but I could never say for sure if it was real or my imagination that users seemed to move faster.  Since the back end is mirrored, all of these threads on all of these servers are really ultimately beating on the same back end server, was that the bottleneck?  This night was a good night to find out if it was faster for sure.


I have six servers in the new Skype for Business pool, breaking the users equally across all of these servers, running 4 threads per server I was able to complete all moves within 2 hours.  A HUGE 4x improvement.

I was still curious, was it because I split it across six servers, or was splitting it across multiple threads enough?  I set up a lab with a similar number of users and ran the moves there.   There were four groups of users with names starting with A, B, C, or D respectively.

Running the following command would take about 40 minutes in each direction:

Download Measure1.txt
measure-command {Get-CsUser -Filter {Registrarpool -eq ''}|move-csuser -target}

However splitting the command up on the same server into four threads sped the move time up so the moves completed on an average of 14 minutes total, nearly 3x faster.

Download Measure2.txt
measure-command {Get-CsUser -Filter {FirstName -like 'a*' -and registrarpool -eq ''}|move-csuser -target}
measure-command {Get-CsUser -Filter {FirstName -like 'b*' -and registrarpool -eq ''}|move-csuser -target}
measure-command {Get-CsUser -Filter {FirstName -like 'c*' -and registrarpool -eq ''}|move-csuser -target}
measure-command {Get-CsUser -Filter {FirstName -like 'd*' -and registrarpool -eq ''}|move-csuser -target}

Splitting the move across four servers didn’t seem to improve the performance much over the existing tests, though in fairness my lab is limited and runs on a single virtual host.  I’d love someone to test further with a real environment, and I will myself, but these large moves don’t happen every night so I’ll need some time before another very large test can occur.


  • Is it worth splitting user moves into multiple processes?  YES!
  • Is it worth splitting across multiple servers?  I strongly suspect so.
  • Is it worth trying to find the point of diminishing returns?  Probably not, we’re talking about hours of time and not days, every system is different so while it’s a fun exercise, it’s somewhat fruitless and therefore not published here.
  • Is it worth creating a script that can programmaticly divide the users to be moved into perfectly equal parts for each thread because you’re a PowerShell nerd?  Not likely, I fought this with myself… we’re again talking about hours of time here, not days.  That said, here’s a sample that splits it up by first name and opens threads in new PowerShell windows, just cut and paste a chunk into an Administrative Skype for Business Management Shell window and let it do the rest of the work for you.
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'a*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'b*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'c*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'd*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'e*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'f*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'g*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'h*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'i*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'j*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'k*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'l*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'm*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'n*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'o*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'p*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'q*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'r*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 's*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 't*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'u*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'v*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'w*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'x*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'y*' -and registrarpool -eq ''}|move-csuser -target;pause"
start-process powershell -ArgumentList "Get-CsUser -Filter {FirstName -like 'z*' -and registrarpool -eq ''}|move-csuser -target;pause"

And for fun, here’s an image of me running the measure-command with results in my own lab: