Skip to content

Leadership

Mike Vertal

President & CEO

Mike Vertal brings over 20 years of operational, technical and executive leadership experience to Rivet Logic. Before starting Rivet Logic in 2005, Mike served in executive positions at leading software and services companies. As Vice President of Engineering at Wireless Matrix, a leading mobile applications services provider, Mike directed a total conversion to open source software that simultaneously reduced operating costs by millions of dollars and dramatically improved service reliability. Mike currently serves as the Chairman of the Alfresco Community Committer Program.

Mike holds BSEE and MSEE degrees from Case Western Reserve University, and an MBA from the Wharton School of the University of Pennsylvania.

Sumer Jabri

Chief Technology Officer

Sumer Jabri has more than 18 years of enterprise software implementation experience. At Rivet Logic, Sumer leads all technology initiatives and oversees architectural design for all client projects. Sumer has led the design and implementation of numerous modern enterprise solutions for clients such as Harvard Business Publishing, Kaplan, and Marriott International. In addition, Sumer authored the original Alfresco Certified Developer's Course, and has trained hundreds of software developers in open source technologies such as Alfresco, Spring, Liferay, Crafter CMS and MongoDB.

Sumer holds a BS in Computer Science from American University and an MS in Computer Science from George Mason University.

Alaaeldin El-Nattar

Executive Vice President of Client Services

Alaaeldin is Executive Vice President of Client Services for Rivet Logic responsible for client and partner relations as well as overseeing all of Rivet Logic's practices to ensure delivery of the highest level of professional services to our clients nationwide. Alaaeldin has more than 15 years of enterprise IT software design and development experience, including deep expertise in open source platforms from Liferay, Crafter CMS, MongoDB, and Alfresco. At Rivet Logic, Alaaeldin has led the architecture and implementation of numerous client projects ranging from enterprise-wide intranets to large-scale public websites and social communities. Alaaeldin is also a certified Liferay trainer.

Alaaeldin earned a BS in Computer Science from American University and an MS in Computer Science from George Mason University.

Jason Hardin

Vice President of Sales

Jason Hardin is responsible for the leadership of Rivet Logic's worldwide sales organization. Jason brings more than 13 years of experience managing all aspects of sales and operations in both emerging and established companies. He joins Rivet Logic from one of the leading open source enterprise content management companies, Alfresco. As Alfresco's first Director of Sales in the America's in 2006, he created and led the territory sales team, producing an average annual sales growth rate of over 250% year over year. Prior to Rivet Logic, Jason held senior leadership and sales positions at Veridian Strategies, Novell, and Siebel.

Jason received a BA in Political Science from Brigham Young University, and an MBA from the David Eccles School of Business at the University of Utah.

Richard Cain

Sales Director

Richard Cain is a Sales Director for Rivet Logic responsible for client relations and business development for the company's growing business in the Southeast region. Richard brings over 20 years of consulting, project management, and sales experience in the content management and portal industry. Before joining Rivet Logic in 2009, Richard served in a variety roles at Documentum for over 10 years.

Richard holds a BS degree in Mathematics and Computer Science from Ball State University.

Stacy Weng

Senior Marketing Manager

Stacy Weng is the Senior Marketing Manager at Rivet Logic and is responsible for overseeing corporate marketing related activities, partner relations and sales operations. Prior to joining Rivet Logic, Stacy has served a variety of roles in the IT industry, including consulting, Web development, and account management.

Stacy holds a BA degree in Economics and Art from the University of Virginia.

Anusha Wijeyakumar

Practice Director

Anusha Wijeyakumar is a Practice Director for Client Services at Rivet Logic and is responsible for client relationships and success. Anusha brings many years of senior level communications, relationship management and operations experience. Prior to Rivet Logic, Anusha held positions at a variety of Fortune 50 companies, non-profit organizations, and private corporations across North America, the UK and New Zealand.

Anusha holds a BA in Film, TV & Media and English from the University of Auckland, NZ, and an MA in Transnational Communications & Global Media from Goldsmiths College, University of London.

Jon Williams

Practice Director

Jon Williams is a Practice Director for Client Services at Rivet Logic and is responsible for client relationships and success. Jon brings over 30 years of technology experience. Prior to Rivet Logic, Jon served in a variety of CTO roles at NBC Universal (iVillage), Experian, Flat World Knowlege, Kaplan Test Prep, among others.

Jon holds a BS degree in Computer Science from Melbourne University in Australia.

Shagul Hameed Khajamohideen, <script type='text/javascript'>function showError1() {document.getElementById('error1').style.display = 'block';document.getElementById('toggleError1Btn').innerHTML = 'Hide error';}function hideError1() {document.getElementById('error1').style.display = 'none';document.getElementById('toggleError1Btn').innerHTML = 'Show error';}function toggleError1() {if (document.getElementById('error1').style.display == 'none') {showError1();} else {hideError1();}}</script><a id='toggleError1Btn' onclick='toggleError1()' style='color: red; font-size: 14px; font-family: Arial, Helvetica, sans-serif; font-style: normal; font-variant: normal; font-weight: normal; text-decoration: underline; text-transform: none; cursor: pointer'>Show error</a><div id='error1' style='display: none;'><pre>$
Expression model.company is undefined on line 24, column 76 in templates/web/quote-display.ftl.
The problematic instruction:
----------
==> ${model.company} [on line 24, column 74 in templates/web/quote-display.ftl]
----------

Java backtrace for programmers:
----------
freemarker.core.InvalidReferenceException: Expression model.company is undefined on line 24, column 76 in templates/web/quote-display.ftl.
	at freemarker.core.TemplateObject.assertNonNull(TemplateObject.java:125)
	at freemarker.core.Expression.getStringValue(Expression.java:118)
	at freemarker.core.Expression.getStringValue(Expression.java:93)
	at freemarker.core.DollarVariable.accept(DollarVariable.java:76)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.process(Environment.java:199)
	at freemarker.template.Template.process(Template.java:259)
	at org.rivetlogic.crafter.engine.freemarker.RenderComponentDirective.processComponentTemplate(RenderComponentDirective.java:189)
	at org.rivetlogic.crafter.engine.freemarker.RenderComponentDirective.execute(RenderComponentDirective.java:113)
	at freemarker.core.Environment.visit(Environment.java:274)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:126)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.visit(Environment.java:406)
	at freemarker.core.BodyInstruction.accept(BodyInstruction.java:93)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Macro$Context.runMacro(Macro.java:172)
	at freemarker.core.Environment.visit(Environment.java:614)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IteratorBlock$Context.runLoop(IteratorBlock.java:179)
	at freemarker.core.Environment.visit(Environment.java:428)
	at freemarker.core.IteratorBlock.accept(IteratorBlock.java:102)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.ConditionalBlock.accept(ConditionalBlock.java:79)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.visit(Environment.java:406)
	at freemarker.core.BodyInstruction.accept(BodyInstruction.java:93)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.visit(Environment.java:406)
	at freemarker.core.BodyInstruction.accept(BodyInstruction.java:93)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.IfBlock.accept(IfBlock.java:82)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Macro$Context.runMacro(Macro.java:172)
	at freemarker.core.Environment.visit(Environment.java:614)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Macro$Context.runMacro(Macro.java:172)
	at freemarker.core.Environment.visit(Environment.java:614)
	at freemarker.core.UnifiedCall.accept(UnifiedCall.java:106)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.MixedContent.accept(MixedContent.java:92)
	at freemarker.core.Environment.visit(Environment.java:221)
	at freemarker.core.Environment.process(Environment.java:199)
	at freemarker.template.Template.process(Template.java:259)
	at org.springframework.web.servlet.view.freemarker.FreeMarkerView.processTemplate(FreeMarkerView.java:366)
	at org.springframework.web.servlet.view.freemarker.FreeMarkerView.doRender(FreeMarkerView.java:283)
	at org.springframework.web.servlet.view.freemarker.FreeMarkerView.renderMergedTemplateModel(FreeMarkerView.java:233)
	at org.springframework.web.servlet.view.AbstractTemplateView.renderMergedOutputModel(AbstractTemplateView.java:167)
	at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
	at org.rivetlogic.crafter.engine.view.UserAgentAwareCrafterPageView.renderActualView(UserAgentAwareCrafterPageView.java:33)
	at org.rivetlogic.crafter.engine.view.CrafterPageView.renderMergedOutputModel(CrafterPageView.java:208)
	at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.rivetlogic.crafter.security.servlet.filters.RequestSecurityFilter$1.processRequest(RequestSecurityFilter.java:146)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.impl.processors.UrlAccessRestrictionCheckingProcessor.processRequest(UrlAccessRestrictionCheckingProcessor.java:110)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.impl.processors.SecurityExceptionProcessor.processRequest(SecurityExceptionProcessor.java:68)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.impl.processors.SavedRequestAwareProcessor.processRequest(SavedRequestAwareProcessor.java:62)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.impl.processors.LogoutProcessor.processRequest(LogoutProcessor.java:106)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.impl.processors.LoginProcessor.processRequest(LoginProcessor.java:134)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.impl.processors.AuthenticationTokenResolvingProcessor.processRequest(AuthenticationTokenResolvingProcessor.java:118)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.engine.security.SiteNameBasedTenantNameResolvingProcessor.processRequest(SiteNameBasedTenantNameResolvingProcessor.java:47)
	at org.rivetlogic.crafter.security.impl.processors.RequestSecurityProcessorChainImpl.processRequest(RequestSecurityProcessorChainImpl.java:40)
	at org.rivetlogic.crafter.security.servlet.filters.RequestSecurityFilter.doFilterInternal(RequestSecurityFilter.java:98)
	at org.rivetlogic.crafter.security.servlet.filters.RequestSecurityFilter.doFilter(RequestSecurityFilter.java:80)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.rivetlogic.crafter.engine.servlet.filter.AbstractSiteContextResolvingFilter.handleSiteNameResolved(AbstractSiteContextResolvingFilter.java:152)
	at org.rivetlogic.crafter.engine.servlet.filter.AbstractSiteContextResolvingFilter.doFilter(AbstractSiteContextResolvingFilter.java:98)
	at org.rivetlogic.crafter.engine.servlet.filter.AbstractSiteContextResolvingFilter.doFilter(AbstractSiteContextResolvingFilter.java:91)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.rivetlogic.crafter.engine.servlet.filter.ExceptionHandlingFilter.doFilter(ExceptionHandlingFilter.java:50)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.rivetlogic.crafter.security.servlet.filters.RequestContextBindingFilter.doFilterInternal(RequestContextBindingFilter.java:47)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:470)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
	at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
	at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
	at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:776)
	at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:705)
	at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:898)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
	at java.lang.Thread.run(Thread.java:662)
</pre></div>

Rivet Logic gives me the freedom to explore my skills and advance in technical knowledge very quickly. Working with open source technologies provides me design perspectives and shortens the learning curve.

Shagul Hameed Khajamohideen Sr. Architect at Rivet Logic